From 7f321c500b213be2c9464e9eb46cba542d0aa984 Mon Sep 17 00:00:00 2001 From: Keivan Beigi Date: Sun, 6 May 2012 09:03:23 -0700 Subject: [PATCH] Updated ET driver to v1a. --- NzbDrone.Common/NzbDrone.Common.csproj | 4 +- NzbDrone.Common/ReportingService.cs | 4 +- NzbDrone.Common/packages.config | 2 +- .../Exceptron.Driver.0.1.0.15.nupkg | Bin 0 -> 64422 bytes .../lib/net20/Exceptron.Driver.dll | Bin 0 -> 36864 bytes .../lib/net20/Exceptron.Driver.pdb | Bin 0 -> 65024 bytes .../src/ExceptionClient.cs | 127 +++ .../src/ExceptionData.cs | 12 + .../src/Message/ExceptionReport.cs | 76 ++ .../src/Message/Frame.cs | 33 + .../src/Properties/AssemblyInfo.cs | 38 + .../src/RestClient.cs | 41 + .../src/fastJSON/Getters.cs | 21 + .../src/fastJSON/JSON.cs | 910 ++++++++++++++++++ .../src/fastJSON/JsonParser.cs | 408 ++++++++ .../src/fastJSON/JsonSerializer.cs | 518 ++++++++++ .../src/fastJSON/SafeDictionary.cs | 39 + .../Exceptron.Driver.0.1.0.8.nupkg | Bin 23389 -> 0 bytes .../lib/net20/Exceptron.Driver.dll | Bin 35840 -> 0 bytes 19 files changed, 2228 insertions(+), 5 deletions(-) create mode 100644 packages/Exceptron.Driver.0.1.0.15/Exceptron.Driver.0.1.0.15.nupkg create mode 100644 packages/Exceptron.Driver.0.1.0.15/lib/net20/Exceptron.Driver.dll create mode 100644 packages/Exceptron.Driver.0.1.0.15/lib/net20/Exceptron.Driver.pdb create mode 100644 packages/Exceptron.Driver.0.1.0.15/src/ExceptionClient.cs create mode 100644 packages/Exceptron.Driver.0.1.0.15/src/ExceptionData.cs create mode 100644 packages/Exceptron.Driver.0.1.0.15/src/Message/ExceptionReport.cs create mode 100644 packages/Exceptron.Driver.0.1.0.15/src/Message/Frame.cs create mode 100644 packages/Exceptron.Driver.0.1.0.15/src/Properties/AssemblyInfo.cs create mode 100644 packages/Exceptron.Driver.0.1.0.15/src/RestClient.cs create mode 100644 packages/Exceptron.Driver.0.1.0.15/src/fastJSON/Getters.cs create mode 100644 packages/Exceptron.Driver.0.1.0.15/src/fastJSON/JSON.cs create mode 100644 packages/Exceptron.Driver.0.1.0.15/src/fastJSON/JsonParser.cs create mode 100644 packages/Exceptron.Driver.0.1.0.15/src/fastJSON/JsonSerializer.cs create mode 100644 packages/Exceptron.Driver.0.1.0.15/src/fastJSON/SafeDictionary.cs delete mode 100644 packages/Exceptron.Driver.0.1.0.8/Exceptron.Driver.0.1.0.8.nupkg delete mode 100644 packages/Exceptron.Driver.0.1.0.8/lib/net20/Exceptron.Driver.dll diff --git a/NzbDrone.Common/NzbDrone.Common.csproj b/NzbDrone.Common/NzbDrone.Common.csproj index c504c91cd..956b4825b 100644 --- a/NzbDrone.Common/NzbDrone.Common.csproj +++ b/NzbDrone.Common/NzbDrone.Common.csproj @@ -38,8 +38,8 @@ ..\Libraries\Exceptioneer.WindowsFormsClient.dll - - ..\packages\Exceptron.Driver.0.1.0.8\lib\net20\Exceptron.Driver.dll + + ..\packages\Exceptron.Driver.0.1.0.15\lib\net20\Exceptron.Driver.dll ..\packages\Newtonsoft.Json.4.5.4\lib\net40\Newtonsoft.Json.dll diff --git a/NzbDrone.Common/ReportingService.cs b/NzbDrone.Common/ReportingService.cs index 7308e3912..5133a717a 100644 --- a/NzbDrone.Common/ReportingService.cs +++ b/NzbDrone.Common/ReportingService.cs @@ -65,7 +65,7 @@ namespace NzbDrone.Common var exceptionData = new ExceptionData(); exceptionData.Exception = logEvent.Exception; - exceptionData.Location = logEvent.LoggerName; + exceptionData.Component = logEvent.LoggerName; exceptionData.Message = logEvent.FormattedMessage; exceptionData.UserId = EnvironmentProvider.UGuid.ToString().Replace("-", string.Empty); @@ -89,7 +89,7 @@ namespace NzbDrone.Common public static void SetupExceptronDriver() { - ExceptronDriver = new ExceptionClient("CB230C312E5C4FF38B4FB9644B05E60E") + ExceptronDriver = new ExceptionClient("CB230C312E5C4FF38B4FB9644B05E60G") { ApplicationVersion = new EnvironmentProvider().Version.ToString() }; diff --git a/NzbDrone.Common/packages.config b/NzbDrone.Common/packages.config index 96bcd338f..26739f2cd 100644 --- a/NzbDrone.Common/packages.config +++ b/NzbDrone.Common/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file diff --git a/packages/Exceptron.Driver.0.1.0.15/Exceptron.Driver.0.1.0.15.nupkg b/packages/Exceptron.Driver.0.1.0.15/Exceptron.Driver.0.1.0.15.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..b85bf8f9ccde1ddef76508204b7830bf57e99890 GIT binary patch literal 64422 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ɫq!aurqj=+8ko#^rRCscPJG-$Z}Ib9 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 EKPEH1u>b%7 literal 0 HcmV?d00001 diff --git a/packages/Exceptron.Driver.0.1.0.15/lib/net20/Exceptron.Driver.dll b/packages/Exceptron.Driver.0.1.0.15/lib/net20/Exceptron.Driver.dll new file mode 100644 index 0000000000000000000000000000000000000000..3ba56fc0586da9cdb7b34d8aeaea3741a1b9babf GIT binary patch literal 36864 zcmeHwd3;>Ok$=Bq-g|ReGb4>8OR~nsHe+4L2fi?1*_N@vw`F4!gFKeT_JA}`o*5Yn zAx8p2Vy+EGNFa~^;migCEIG&$FdM>#-5e$mHY7kyLN*~wl4Um`xA}dmy62E(NcQ*p z=lA=3euAm4s;=&?uCA^=-kb5-^FAsJA%uy~yYC9|Wu)}Cl;Qh>QDlc2zY-FUdA~LF z%i5Z6P3_v7&cz3^?w)M2Ki-qfWZZmwS1O(z%*4}~_=@$Len10J_3#6f4`~-iqD#GjvHp|_p)sE@LoEG}5EcA? zDODs1;I9((o=eDKAy$zgj{iF&6`rY9=Vlv_n0MxYvC z#DgMw7Wxm2ScI}Z=#kC*2Jnev={Z=>N`wKLP+zp&6we_=xv<`F2 zMKzW?o!aDvp;?hTgSb$zz(`V!5*jPt2sc z!1lQb0?o`smd{0pd~Pe~gJ|2d++{%hdIC`bwM77J_a4B26E$Cp2eVr+)?PMn0+smm zgb$f5`mxEC$QNOg?4zMD{r&1!A`acOPZ_QL>;ov6YeA7qWT#szvR?;F^3lHU67ugL zbl|DM2pF)HWH188qymExFwmHkU<3@fpJXrs26`bGjDP`Ol?+C}fX_hFoMchq%DyXe_AQX;dy~xx0}SHD4WrNVXa(8I{$! zB~+8`o{l8o96SSwaqvt)cPW7m0Oug4tj}EzU?1@zDzS~+6`=D(LP2iGaxp{*y|R_p zrUbKf)CR{L+0(>I2zYa60bW8gxiF6}yG%?$Up4BtrXflz{mFq$=)VdD$X+>&i_d2? zR=Q^c@!L^57Im7t5LTUA1G?j$1Fqw)0ZgnzSA!A5ao2(xLAxf1#CmW?U@Z{3lh{NQ zx@B6jkk>^iU)ZVMMoU2$A$iW-)EG+nXw`^%V^Lr8hOjs6yEW?3v3hJEc~7aus1>n{ zuqUyx*bb8rQw=F$ECbw>4^8>PzOWZf-LDUGe=QfKeQJF(#1x(PHQ|UjR^^AaBcghw zm3n}byCsYf_!($(1olU2us+$lV0;%{^o?L%f;~)0OOWz66Bi@S!d*mQzA^#V^^IW0 zGO?8i%m*q=i7b3BaS;HBOOh><3RT8#ReXcoL{6n++6cUzsyl*+tFh~}O)`$4D+PgO zt$GCWfMwuRQU>MV1%*7FryZ-` z5-kYQOk~04u=gOw1!apY@4=m5Se0%PiMJG792%MO;6fzgs3i`eU+}1~)VJ7+YVKOV ziIqBbmxC?fE=VH|!FGrdrB2ufd%!W=UWPPvUGn{wuzfI9Vo~qxl2R7AZMjlJ!rW}{ zTam(%!_vk+D`u73ICz)$cne!fyHda{n%F5>)ZnKkP)!YD|riN3>%2rE$xKzqp(@?_pe8 z2hPGU!`8fxwZO+|9ovgGc-<_l0J$_c0XrIqMT5;l;XpWeYtYLfztz!)XQEik`Q9UE z7aTn1UI=*#66yxgymdJqmG z_(iBI97F^UhJ)b%_V1Ts|6W`#a43j|V$n&>nQ$mP=~h}%CMel9<|$2zxn6856FW&=r=?9FJ{jg~sbTGcrX|}jqYl_JWMc>637d(vgyM`f1QGWVfM{UhpRwjg0*PUw;78eGs3UPHsFr%{ zI>Ojf*zO2O?tcQyw6*X#6oISS5y!?x1YRf-h0iUz4UEdD5BapP zwM^E--s62B>RWietb*3HmfCS5>;{lHO-d{!iIA!T?CFx-LF{PQdk?LC*APISBlCFU za4Hm_jYn$>5SYzuJ&BsZ`lx}?1_lz^X_yHtKbRQ{{{=w-JlauE%~I(Pl9_x9ACh^z zQK1UC=J%`+ahEC_l7(pdQP#(z-$LSCDM1^LmMT(@d`>z9au>;5+JcnlVxghhvHvA? zX^C!OO{gpws%u!F&^5$#lKnOOA6aY$FOWsWLgVcr3t{!8LSK=EP9xbmUDaH$3r#V| z+$?35kW8#NjOQWq8q70{N%O@hxQw!=g}r>1k*45|syg{h1JO00$*?U^)C9a8cmk^^ z8ftDwY0_18wM^^MWHJ-d?#*V{%l?OWVzyMEqQyYq+CGZV7JPpcgSzgphCNN91A`1d5@?;zSg;1g4E`hjpYWMvpavOBm|usp+lPpcdE${V!)#7QOpX~o zY`SEe7(*$4L>s1Kf#GJLOaNKMaKZ<#ptmg8O@S~ej{}8t$D;Gdu9!0B+>Cyh@dw^SYNqe9k}P0?cZ%Qccqk!ma?PX}`fajZ@_G8I# z+>e6a`cJQgoxyb|81%MaPrz%1<#De^UXvWVpjft^%q4Xo|B6Bf-Q)}wkYaIcJWpEJuQwW zcI!+}^{swG&JIuW=7@)9MrJy$( zAn&5ZGHQCW6-5F|uk1sm9yX6x-w$3v^RTBV=TUNw?53v~avn$a&|{IWau=ZhdC%e; zwu7%#g)R0VTF0^1vy~IcyANGV7dL&Gx+lbE4R;GlwZskgV@Qu60Lkr?ivaFx@yb(s z?A9iu3I1-1J5VNu-sV1zY#cq@Paw72TL5*#G80LJE;W*7^L7>I5ZQPndB4Luiq%vTY|L$w8IYGu<$enotK6R1q=y99G)l_feiWF5NDP9ZQyQvCq zEw1ooE?s8(&b%07FURRs>;Y=fSJS;08K!$5VD5eZ3H>Iw<30dR)Z085_Db)?Dgx8H zp9QPWs!hWeCIR_3~52D>`(MJvQD{RKxhd^8I=K-UE=EYdaA0`yj zE$q3K7f3o^wM@k%p(Uzu`YACP> z3Cc!rrVHDu5gfN#B1G#rR~0uqcR`eE{U&M+9*dP~HQh(i8b;|Kkjz9Mc?ws^DeRXv z357$jNl4nnbRUDH>3#vQ31-pYD7u&-F1t_8XI=b8oOPOpF(CeSZQ=C={2B4Pf7E!+ z)4J6R+tt!M{vs;!mCXpOSv(`EY&ILu2pa7#L9Y3LTF1;2O^G1LZPV0Ud1!x;_ zs>QA*^Ju5Q*#&ZPZoi<+Yzg!DX+vY4{Gz$(R*cCcvS z;5Ch1V2b5F4u%q~b-x0l#jA($Fo^?;Ef_FDU!);by*yG2K3>xQ8}NX6HlTldG3=<1uV?Cr@(B! z2W{&7{I`zU$2r%8AOR z?AG_RLbTl$S+v){`mu$FX^dj-Vf3_09wzl+8XbKG+Yy(P)!RnMqG9t!zuh=(?nbMs ztwZNx?$apMS}hCUQ7DO7+pD+d{t5ghDKjC{{Tec7stRBaY$_Xfv{hMEOP|Cnl$BI( z_bq(5NXaU$OP@w8wBGo>HCG`5kL!S^&;ielW1{XF-cBX9vjO_MK9A*TZPWZq-g!C4C7J5KPof@aP&rtUk{ulU)wL`If zRAQZ?Sl=wNrYH_3V4++w(+oRR zSWZ-L8%NfRCu_Iem^c9Q2W7k7=Vc?xO(shpkqs4^J@e7Oy!&qUI(Va;gEY@|(E&x_ z?l{{RjqP(nM&qJ(FR<{`3At*z2-Y;BulH#WEV?8a0ZGCJqZRMx28HY31u2KS%jir1y* zK9+s4Xa~tG&KEgbI0ixo89Rn4WLCA=IwMWGp1|(en&IP6YT?lxv)A7GsdA#HC+u1LoQ|`002*d*VFtzReGbrr+w&I-j4WL1% z#cMaV$N*X$u(RJT7O^8n;yH-O3heB6$K_!7eeS;k%q%a1TCtA!TJMynKg=byNw>2< zC>7_odGuj2oqVz9TPWjehKfa&eBLehb&EvLZSt&0&n#Ym=hC0i;uwSIlGYND<+4YM zEi@UtRc?jEE|S1il)Q_>Vuhy+gF(f-hmgc&l8ITPwM>ze4DI`n+|1ss7z-!>c>5V(A^#Nqmr0&4fhC1BIx*9W-0;^%s1}YFqweF z6W5m&Ei!MAOsrYbScD`#BAMX=laRz!lIg?9vRMg9;N(W?pi%Bv7p3S}rcg3UB{A(u z$Sg1kNsJK_kLs_cbiQs#f4GsT&+5Z8t6D4dN!qa(jZ|4Cc!}rHN7?k*xSBNZ)GYB` zVsU9+ORs^ioP>E|`1oBjzDjIyQ1k`J`IOs~JYF(zz561vaW#^~%Q^!*7K!hHBPW6? zg{x#WwTh))f()+4vZ4P`seeN$yqNNSr79=3^?j7W<(v6_#cC!Ndzp&ifc8Hu_5&)0 zS6NP2tjx4n#Ayc08(fY%iczw06U8t1Aa1%aF8n^`LX5W0%KZ?H(3?>7g5l$YF92?o zZbJgiE98x79&uCiTYRKdqOU++GHe&Y(dU*kK1+=10$1IUKKA~1q-|ou!NMJ>E-VM5=wOFbydRI-xY)e$c_`J$@@i2!t z8RexnG!Co%IxlW5?KBAUS6Jf)B9hEoR2ntui0TO=)pvtLb3cGc_(qk(JnrA7m zU=v#{1s|+0dOsc_*oi}^Mh*RUPB8SUg%PP4x}o~fB~Cq5@B>5CAf6;j{ZI!iSyp*s zx!1>wDo8h`2RMAKByaaT3*jsD@QJ+udj&0EpGbYY4@k4B@dHx17+%~X|B718rxfnC zX-43_4bRi1sIrt!?=Alrvb;^G4yv2z)^EJWHMA;yzHA7Zk!vkJPhNU?q<7Ip8s4vy z&NIG1lg57ZVX@?E1wT4VJop=l8@Ss-ANfxe8}A3R$N2%CvL`-_F=I#g(1{%ZA~dY3 zwz9FK`|xUAh*>mNiECJfHb<=$<6Ca7)rWV1U$lCnIAYk-Q4Y3*JCWenPKnNhK8${t zv+J@gke0;p8^zpDU^uwx5hQ-vd(k$o1;VUFjm~#t95`)yb%^YzXCSz~>VT?kGb-no+kcL%sCVI27=(y7 z@g`B0bG*}pt>HRoD<5|9V+wEBmOCwUWCyZZ%~+s$6>jE+CxZ&xJV)_3W3K9FGahSD z&-on}Oc{CUJhu{YN0xA8{Q3oCssqsEKY%R0klZX3@g9r8i`2H!a^FH$Y<67LTqDOX zd$2T47Vl^Z9NGMFci&wI)|@73LN2tHsmd* zsg^%lY&qs@u2RgKi%hF}8@-fI&SJD0F}%vSea;V>o-|v%%5)ko%GeL-)x$@r48Dq>6e$D_TSg2# z@8H$t`4ffAawDsd0fWi--yr60D8)@oWYKcGPHOg3H2)Rrv{34FPY#v%C#rVlGo|C*A;2vN{+MY5#hw@;*Fncbw0m%hJ_I=IUW;VKo8K-j*8&mqBuX;e0EShls@ zeH&vqv&!cLy^Y@OogPR8@R@@TVlRIhk$O?vQZH&dt$C{~oxQa<;hOV`bw`PnRIGbT ztaXyrs4hSy<;YprJX^_st|+had58TdxW^v??CNcPTfRDR<{yu}`z|^blVuESS#ccl z6?!MRMUyVphyNS7hUxwW2~Iqcbbm|K97(yjhVfx88*GU-w*BwGn&C_Q9!a6dAAq-F z5m5DEFnq7sR^m@cUn$PRplE2~t0J*q&qa|nLN)2RKNCtNOW*WLA!hM6VHm-eLv|M! zjDWGHz+eQ7y#)p%V5AESMvC7jq4oGijN~ckOX4qR)pU;m`i#W8Nb*B8;qB~~$^5t~ z_1W3OgyPMApKV>2zR=Z6OoLF@1PnNMzxKMciyLo50E_uHVDPm7f2GS|92;;ikoX%W zwr;p7_vQQmyc*&T4C`MQ5uf6L5FZfUUJomy^!gvYOVG z$3VCHk+-bRC2yxc9c`c6aF^F>f%xN$x%5DvS|7m&gC}5Bes}jDkkSnv=|nu(mA>P_ zk8VywO0$N_p=tWg2z@^Ve?HX{ORUm5G)t^!m}Gbn!%G>SZ!9w`F>H~{n+)G!*z0U^ zEHTFLRflBiyd=}iaI1H@*C)Q_{Sx3CfR?cRfAU%4qTq7imofZfkV-irf_GGmRaoNj z3aax6!(TECgo!hQ;Ta6KGt4u*HcX}NWcYdJe1oAU^3$*-=0&DPJ}y>8$QtJ|=VFE* zWB71{YW_CEpF~J=5uF;bgr8wNO1Y;pGy|0TVDz@AC4Lxv7VwWz;#id(*euMiq*5z^ zTVe-uuBgmZhQ#fFmUxu;cGZ6ZuVUEFa3RBuRn*E*6_x!2s-~Xa&iEt1&(tKxs3Dp98mcqF_Pq5!f+YG zRSefN+{*BLh8IpI+g>}F^t^{Tr`C~f%NXvcBYu|QWp!kSTk6Pj?yIA5dA9CPzL0pU z?)AEmI0k5m&icD+LLyyHoH0On7dYhkat6~(*6>`W5$lK z#K{`fB{467M708SOt0*3&b0@UI%hUYNc#&A#IdbFDb zu8B(+Ud5bS0&jyqCrG7^1kW|5ikE}u!NoHnk{@IEu@H^#0}P)4+z^KwiYuKfHClhR zDe5L|5~!r2?!xOYx=1VPVXYQaR#8tP&k&a=>N(^Y;&Mg3h&)qVt*E2OGsR7ks(DMB z0>8ga<=vpq0d=>c?$hUkdQeeM=v5erFDU9?^;%F*D(VNwv&FNDdK-DR_zqK-JC1Q0 z-qrm#MO7P1K^;}pOrr`j`R9t7XVilF4O3S_vsy%(HB$xtZWO)7N_=N%`ZS`h6nSGK zR`srvh#C`D80R8ZT*}my&Tg{`k3p_bRKHmZ>RLtRkvB`W=Sy4}#`$7F!QO}}W zrTB%SzKwE~;=dL367s6VpA_{P@-Twax$n-uBQGWbiux7uVxme>?;x*QG$`sA@~Xv5 zMOmII#OpRi1wFN(7AUF`d9~t9Mb#m%R;*IgG~`Vd8x%DQd6UIs$in`yb1$DKgxXuRZDm<9H;Bk8Qg{fz?A6rlHu8s1Z z)lB;t5ijOd*x#b382Brc;|f{w$JPso+%k{KeV^`G@kg~(*stRT<0cj!h^|oje`-;@>#cXkvqMou}KurF)qP}ix+5++UBJ~1Z8hWBg zIocxebEYmA-?wYD)5LUEbxi!uK3Q8Lb||XKS)iRR>RItIvA{V;J43W2NY63R>1@-M z3VJs};HkkrXQ#GIwBve%sH>el+H&y?McwKQXq{r9h4RM41J00kmY9x%s}Prqe|E0Z zR*3^RN>Sc-om;fkqMkO*pnl=pp`9ZR&=L>okItjoI#G`$o+yv^8EvB&R8)ocIc<|T zsHnL2h}I=;Q`9`~OWGFEg~u0EZm0JZZL9dcqWVCcCoY{Y^A397!us68Cx|ie39qK_ z5;Y5D-UHrLq)2>zC<4xSB~~5 z(g%NRjq0OCiu`)4NKt!Nh@GtU`XVrmhq%{w?~I;-gHBiMjrpK$&My(J^tR z|8`K@6m>RB{$5dA{8jMo107N_>Awq--%!*(|NZ($L|~cBI|#{Z#7&C2%Kxx_jX12R zoBUId_f19J$$5WP)Za7pxlXEuwEhFiwXbAK+#7fbe%W%CY~e9{BjN_(UoEMp0=99Z zs8!T+fuM1dSfQvF0#V~*Vw<8~3)C7ni~l@ZmU}DEXnb7UaZZ7nX?#N5u|`tw1X_(- z#8E{V!MVn*;{LTVuOhg}_@wyxI!T=b>Ne4}UQ$c(;P-a%k&TjC6PzMGC2lHG^Fh6# zsLjDMjZcfpO;R!$>@@BaYZP^H@Eqea;;5po3vM*-7FTSRl6Ql;M+|gH>ak!g&aJm8 z>KRb?iC=A@yeq{|gT2Q6;xCeN-VXK~pB4VCGOs$6H~wDKC~8LNa!`9E#qsPxaiyf3 zw$Kg6gW@_x%?sTO>f?%9jJ$`$rxn$Kyobd7idq$_5}y|jD{6hH7S!X4+KRk~#nXz~ zfxL&szbI-K@*WZ2Rn%VOJtBT6Dc0;!@di_0GkzHQwDG98>0Is+=RF2g6F&<5@4%mO zssCX3+cNmSSKHrG%9up=5<;f)+Jz@>t%QwnLf1(%3F%5Ff6|9@Y z>wz1h5zrLVm_Gwh$C;4$r!)T?K#$l74o*$bp#aZg`5g=|VA#u$tf2`Br5z;R&$*H# z>&Y>Pe5TOfa{OY>mE&GM`qBqRD)eHh5tbxasOSCX;DaprNX6rV&NEK~*5Vhg2tLp7 zWrnXae3RkZ4FAAT)85kN3ojt{^$cqnPGvX?@E&6k;LSz{;1sc%p%-PRh>hCgk*Sb-`38oddOTPR#v6-MIu@C59XWNK-ClA4}wql zvyi;3>RULvP@RXg>#M$J&O*Ddm@Qn}8l}TMRevxyihrnj8TO%mZ4}Q`&B2=%RBDlU zzDoCO7e7R9i>l|%s%Fn3@n2Q#fL3e{EEZ#!U^p-KGD>Y@{9?e3;<{Lm=WXqd*hA3m zen8SK4bG#?`3l2lnE$O<)#C~{v?lD7kYg=LNcZWRBH+UBwTSFrwLT2u8)o-3f+ z&y9Jk;Vs%3)qZQc{$2dw!3vgK!ICRPb*Rp|M(nRX#kxscR^0)3P4!C1P*1VXs-7eE z=?_#-!83Up#}(qK>T|5yP^#Oy8>LoShqP~0=O9lzfHhq6cKyZbA>>loHOxPx{j~ZC zNdCI|2HZV7Wj|-7xi*4P_Ov6&{bO~rXCF8(Sp<&)R@D5`8Uj8=457ti*7f@S>Mi;Z zbTjSib*g_zwAFa+J9Xj^-eBK}+zT=KOKQmGTWWULV_d_S*ikbdyU<+C6u|3icG(Z; zZwL1x_cm}I(W!T1;@O%jzF zrOpcR$J)z{>xD7-WBtw(;FdT56;Znr;G;s2PZ?X@($fN%vdjjP?=6q9X zh?>9Rq>bUpFFHx%caa}BUXBB4am(b_o$dNpC;z*%PkeLoFEMJbOuoUGrT;GSHaI^8 zzEAv`;qMrVI^y^NKgT+Jj_vcD9;>T@{bvv~Xv7bRwRH*an0O~pCEmnHE%Uy@^3Sl3 zJ;U~V24yejwyJOAl6c23~ZFaTy@@(R(LatQBwZ zt=Mn4{@<|Q{u%PW^1j7)W{()3ult?%H{uI*e+Hy>A2FV04r%+i@tr!$_qg%>x`6L# z<9Brtz+gS%o>9XvQD5tO&RER&n))fe=Z*90rvvuXV|6eF>sx%U8`lB8YAj~frx z&+)wptrqzn*PpGg!VOis_66M$^R%x3F4Ud^T%tV#xKw)%aE115z*X7{fNQkx18&e> z1?1>Ej^B#tEcp-4BNzVk@2;OocIyou=q3JX(A7}nfV_O*8smrd=W4w zz6N-?@c7%r)glBK72Ck6W66^kHZzdxQ68?|t4Uyt;3>Psd)+!2Z$1?W~3S#W3y)BlJB$aj7;7aJ$|H*u(HbhOK5V zIA@r|U(K*p+Y5XL<7ZgJ?_ju+;n@t=G2CQ*1i4!oKab%B40kcy%`nZdkKwDj1P~`Y+(K*k z_<;v->x}0_3@70xS;tK?!3x*}r$GFt!!l9eQT(UlzO@QC-R0`AS2gfDKpl6VwZIzy zbv&D{1KtRzi#T{1o*@uC2|OL&W@rRH13dZ;Ji(dB(Qunda29fOym?8m2|NvVmnQ>n zL5_xJX|sU0fv4d~IKkQA>7pG_6Q_cwD6L%t->EaHCcZt)%`3&GUjnmCebFI16>@f$-Ve@TszGsoA!?W76!E>(X zJD!uR#n!pjMb_2!!}d4qPdN8D4>~>G3%%d={+sux*BqsjNBJLJRqAC74bhp%@w_j2 zC-OQ@Aot%flJj9?{rCj%3F0$JevJaw9?+=JG%?6!|4w`xXD0kDS?l%=_NC4cod`Pyg5-U=`_n;3eQhljC&`WGh z_6?@Gh6YliGc(vPy3R=ri7sZAtR?oO^4-$@Xi=csWfbKtcl!t23|W}+N)+X7K`&PK za)v^QTQD@q7x1>8yqgtEiVdA{QFr&UWY0x-cV%Td)z>SQ6lcg_~e z-3&_RyIl67oY*|Lt3RDD_D(>x^zNa~Y}U>4G+T0fPbV06NvWR`^CtFgqD-l86Z48) zn~-(9UU2E6^(VGUlU7-b?3Wy1!y#b`Ig%!XID={F#FP?Eztv8|K&hnr72VHtE`Jfz zlu~|Azifa~md8&jae1Uf_viL7O)1L{%8~3rO0+Az3<*)aavCCGN>FIsi;hfWqBkdE_D^J@UlW<=+(c$7vwtEJ-JHloUner%+(ce)<^;Tntza;z?}EmR z#wm3GV}$XbF@RQrY)$rsQDI4#k0<(BG9+_Q#6MgxfVnZm1euy+H;o%3#Njf;VPpyM zCn`sI6S!Q(>dbzGc(J-8H5LNV%=8utWODgrrYA-5 zYyChz-H+9$cl@e^oRx_6XHoZo!{6m1mF+x`Ph~j1tPjOBZrU{^2(|ol ziSGPRhJq<M)c>}4QBv#Zy_DY1#<;>{rLEy?~WiE9}E~~2xM(8dK zRI$8bkakjbEi0@R#I{YT-6|dmT9Rpuc{rr(=2U)dD! z-Ea-sLKO8u7H=t*?@ea*$Q5_o63(V7aY(Bk>_*nYhh0#iDzg|Zj*;XQ z$%zYq=*VW1Llpg0eM~D{Ee>V5^7T<{49c`qZ4~z)G-72vQ*Dwv@=gi%RMis;lLdQ~ zWUtyh5vwb?tB*D?Np@jL75kxbcc-z0^@@SK*p(MOB{QaTWs0S9r5#N=r#i#4H=UE+ zOy`yjTmO@|tw11Tvn*?u~=Dw*4xXU(88Mi1F+dX|zCqO64+vR7jdl+N)`rE}77 zpqIIBACl#L$sC7oS(VH#(|vg|b8a?`P1%Lm{}mjyivpJvT{f8R>!o!`^ttXu9eZId zxjjr{79YUYvj_i@ieN`l6OM7&RYv8;j!~tY#4&sOQW(FiEWIU@E>*Q|uzwdCT~lb1 z_6xbe{*-Kb9n?DxTkd94Vn6LGySv3Y>>EsGQ@t{y zK*%g?S6~8c(r9zduP+OwM^_eKXI`1?LwO2QqT7|hYcQ8uo6e;BlYMF|m3Qq%u-HQp z5CWyRmn+0Vsv{@5*LG~{UeURsYn4D?r;sSRAzvQRx_bt*S!8tg;ux}5bnhvPcEueO z2R$A`X=z5;Wf)^;V~kudCm4mg1y?E@Coq||_4la`6oh!%6bW`w>S?hOHA}j8r?a^{ z$sxweOyvx!V_e0CWI9V>R0BLe{2WJB8Q4xJOpESjJ2jWUwIx=+h_6jaTh10x?O7p&` zPwtYCP|j{iAt6fc*5qEThs*ScCFu!k^pd_4Y&CYDfOmo|QqP3i(gM0bfqu~=Heki& zSt62rut@O%mku38jK|kiM@P9H_0o{{6t)IgxnF1g*<>4~G(7ywM!9m?$i~yhiS(a~fkDg36^E}n%jshof^)c2-(M3NRraS_hKY9-q=n86k+)rR<^(tNR~9DkPi8NgSlx2idN5n2Ji_tTbS@1yD+!ZF zm8e34TjkJC%vhQ3OHIf;&c<{!hgh~~WHx#RAz!uL<(4Wg>@?EJJsCHL%Z(h?!CixU z_Rwr7iAf%oIb0{vj*y#R`)*40B@Zx`D~YS&CNX5~O82GnW%e#8$ZJ2G=L81e2z4OU zGnhx41*;UDg15V8rShCAb8t{9;9ahYmz(oA0bq=<&u3I#^q{CZtIOTyGOP{MqS||| z#hx0ME_BO;Y155;L0^)-0mL(r%EGz@6$oFG&ZN}pN^8V{^}Fc~ASajIu54Nc$(2|s z3#GUwWqO>tF>O)3kQld#Wu6vG#Zi)SIZa=}*2YeN-K(gkDx%ox?4IGP6YLylGGzA1 zinxXKn+wLGJ}O*UO&W~XCF&dYyL+&-W%9Jxm+mzR+!9CWN#o1cS>!CZWb932m03o? zXuMM$mw^F75Kyi|7Fw0e^kP>FixWkM8O0%u3r?|d5EqAto4ssXr9tU*($%FD_11IyXLWh&OCE~d4ivwuJyVafC99EB+1N(VvtG8QD!+9t%> z;sv4Fg%|D%SGw8$WL_-8mJ{Q#vM;$OM>-(%&>4zOThuv4mX6KEtu18vz$E1uWoLpC z`D8l7m8m^-VSJ?M>avYJHL-f!=3a8-js;D0_N8dNxn>%48aM1BO8a>!&pR_jm$`EU z;QV=lHtMOQ+#sx0`*mq_c2m@hLxLKGtu8i|YkILXb+?Pw5AE0f8)l1GDa8@JUl?P{3 zuzWC=cl(P`OxZ27ACo_sK`zfX@__vqDzRD)C5CE$npWMi4b>jlS4~GA&eGP5u7}sU z`%|>-7uXu+23(#LLZT_!sFki7xiC06;SO|nVz*Cm6qnU*KSiwh^VD?Z=5Y9s3a?3J z_F#jJn~vPMX&@`q@_Y_l4p#|lTS}}61+p%& zc`^{OK8vZF?1Li=40X9&`zH6|I!!da~t8R zhmL+?GwctNj#p%p+4IF_#Zg>q8z!?KfI+1xLk%Q`dp><}!wJBi34_Y|eU zD@;BaSfM?wk#H2c+JIR(mQ%3kJb)R}nZb1e48w|V=~}svA|BZfyK;U$)wT{x&bg^w zn^OA*@eoVh6^T{({6HC(JV6CXLaCWTkT0W^uMnrBhn^YIv`i)YsZCYCVz51gyl~)V z5X~}jCxwexiGyF-ACTRPIb5BTDm75-sbrPS|1KA^2tOmTUhKwyX&eC4B8l&7$MKwa zo#+&J6@9^8I%SCg{P5x__z(BekRqAAz;Fx$|5Q8+o{tYbJ>HL}#z~}N^A?c-whNLe z)R%{J9P)$U^rMwLsFXN>x>Bec_fyEv6y?fuvYgX~JW*H9mnBx9jXXYLedmPQ3VChl z$;6hHqf`d}xva}B)-nVA`tTp#62MCi-9n6hXeGpOLPmCPQN7*ZQP<;8KZ_hvfjXH+ zb;PHNsbg^%)rACge+bbN#@mKAeexr`TjeN^&+!YE>&xcMocj zolc@oe6b`ry;yG!|Dslj63yc~hX)OiOraE+9%p&fUeHK*r-Pe>cEUIhpNsI>kALrD zI`rwmAd^l>A!d^asRyKmv_%heCwHJ>BMZp>Q(Fgsiv{EWWF3;*13WD*Q6FrtQCz0)j+8WJCk$eAwm7yBgFY9s^$Gk#PK!ey(oQ2yelyg`Yf^dYA&2tTo73J3Ny969!%d@kk6U7>n^i zd9LjPz)}0g&1?Y~Cgg~cf73|NI8$Gxr%4|n-#LID^&^M;oV7O67gB4h#!0nrRA zQl(oVGl6U)A&7_HDAqIp5n00p*5JFkRgqdPvWja6MI2^3x}~G^8kE96X#!y?dmgwO=aQ9T7d`lzA)P7>`b7ln(|BNIQbF{2)qZ#OMe z$OBgIjhh%NHCUP)EXXt%kXvn7;U&7|u$xdr8zd(P;eHm&tRqNSI*wRDum2#ut$> zY9gI7=>RVj>7<+p;Tqw(7Ghrv$vW0Df1_^Ile5g$@y46x#C4<{zyqUdJd|EU_MjuCm zGzU5Bt7N+d)Z@TpT8JlP6rJAm<&fE7OEp8#doO)EV57es`}mWrs+YQkTTn|wWL9|0%SbDbM%%A6Mh3E4FiRt?l+1Ey=E9CTh8m`B&>K8< zRd_52Z&B$Yi)q9UV*6yGo3<8iA=SsG!U{U^{6hRl|q?T z{CboWfMn1%%j840Szdv3fl9bk1A>R%Vpqt(f<8zjG7A~=B9+{?0xJ8*WBx6#FevUs z#%BBBrs1(urH?Wes`n93x-Gi6UCz;{24{;3l8=m?uH*>|)yq0Migk2=2d|O?-QWqG zYzOOQJqW*rsD@Zt4=$PpD?CPJDs7JxLl#^~=3zh#$F@EA7mGspxfdNdG!-$oy>Ux( z_%9H*6&4=rgqq<+e%sMyUU(4?&1%%+AYQ?D)A%{W+v_(H@i26~29IjuJ<@Rx31{>;6u_sZTn3e#j zDRO#4y%TamQawOfNJ8`%)nXwV8=8#%bgBjm+CqrBiYO~*+t?Uc$G~7>rol!s{)g(r zOK9?*jvx)+Ut+`A8w{8m%kgSL$PTL!&TYqVy!cHF!`8f(ZF=$Nu?;Xma3Z5Li-%~A zp>djAu)D0op_W6TsOOp$3oRgvY*$J|dQl&Gy-L zc#-r2%qRqTn1@HL%C;%w7ijVW{4dAo>(sZgr$cZOEO}BMIWSeK7NK=4iQGXNGtMd$ z<*sli`n5=9qwSLnn&8+wAY@lYDy3IbJ}lz+P=C>h(3$68U_CtcEnqxMFebblu1^+p z@QY<8-^K_Iz`W#86NCgYCBIi(YItSc0(UWmrqO~08MKEfiAG)pjVVbxma*4)|L0>j ze3J(eO)>RL&VLoIM=tm#idEWngC{cfQ>K0y8GAc2_S+Et`PB+}HZQ%wi~TCE8`bz> zpyE@n_&+@mkI!kJJqN$Ps)^~zdGqHkT(}_Bdg`KiyIbcim^-(1*PJ;ET9XSF?Vh)L z_pUj!PsQ&Y;MdIT+4yla{D;#pejn)grrNr2Q-Q-^J$@CZl-DtkZreXQS;)jXMmq-~ zfY2rZzlcUFTbCX?H=7*5%Mr!P1^M!#T=aza$)tPNlQb2kUpct#9(+D5#HP(FHji9< zVZ@&E{pBB7`Mr1F`P#P^Q<Z19n_Ed7g!W|`T7-Uc-1@aartqP*>ANn}TX`KocY%GdXA;){slTDkHe40ZO&tBL!nbHN)JShf zP%U(AGJp#q>d78lCE$wS1iZL-00AK`=0LC6fC5(qq|j#wt{_#`k(8zf^ED3 zb-K`a5cbWN_404C?L4;a_&Sca@bUIt$YnY(qVn31?pf)I?5~w0d;UN9cZd8P&w=^> OPip`FmHt1p!2beD=|+M8 literal 0 HcmV?d00001 diff --git a/packages/Exceptron.Driver.0.1.0.15/lib/net20/Exceptron.Driver.pdb b/packages/Exceptron.Driver.0.1.0.15/lib/net20/Exceptron.Driver.pdb new file mode 100644 index 0000000000000000000000000000000000000000..d8d8258d31d656bc54b7f4f7fb0ab3b2bf6cc991 GIT binary patch literal 65024 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 ConvertToFrames(Exception exception) + { + if (exception == null) return null; + + var stackTrace = new StackTrace(exception, true); + + var frames = stackTrace.GetFrames(); + + if (frames == null) return null; + + var result = new List(); + + for (int index = 0; index < frames.Length; index++) + { + var frame = frames[index]; + var method = frame.GetMethod(); + var declaringType = method.DeclaringType; + + var currentFrame = new Frame + { + i = index, + fn = frame.GetFileName(), + ln = frame.GetFileLineNumber(), + m = method.ToString(), + }; + + + currentFrame.m = currentFrame.m.Substring(currentFrame.m.IndexOf(' ')).Trim(); + + + if (declaringType != null) + { + currentFrame.c = declaringType.FullName; + } + + result.Add(currentFrame); + } + + + return result; + } + + public string SubmitException(ExceptionData exceptionData) + { + try + { + VerifyErrorData(exceptionData); + + var report = new ExceptionReport(); + + report.ap = _appId; + report.dn = DriverName; + report.dv = DriverVersion; + report.aver = ApplicationVersion; + + report.ext = exceptionData.Exception.GetType().FullName; + report.exm = exceptionData.Exception.Message; + report.stk = ConvertToFrames(exceptionData.Exception); + + report.cmp = exceptionData.Component; + report.uid = exceptionData.UserId; + report.env = Enviroment; + report.msg = exceptionData.Message; + report.cul = Thread.CurrentThread.CurrentCulture.Name; + report.os = Environment.OSVersion.VersionString; + + var messageString = JSON.Instance.ToJSON(report); + var response = RestClient.Put(ServerUrl, messageString); + return response; + } + catch (Exception e) + { + Trace.WriteLine("Unable to submit exception to exceptron. ", e.ToString()); + + if (ThrowsExceptions) throw; + return null; + } + } + + private void VerifyErrorData(ExceptionData exceptionData) + { + if (exceptionData == null) + throw new ArgumentNullException("exceptionData"); + + if (exceptionData.Exception == null) + throw new ArgumentException("ExceptionData.Exception Cannot be null.", "exceptionData"); + } + + } +} diff --git a/packages/Exceptron.Driver.0.1.0.15/src/ExceptionData.cs b/packages/Exceptron.Driver.0.1.0.15/src/ExceptionData.cs new file mode 100644 index 000000000..a627ea9ae --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.15/src/ExceptionData.cs @@ -0,0 +1,12 @@ +using System; + +namespace Exceptron.Driver +{ + public class ExceptionData + { + public Exception Exception { get; set; } + public string Component { get; set; } + public string UserId { get; set; } + public string Message { get; set; } + } +} \ No newline at end of file diff --git a/packages/Exceptron.Driver.0.1.0.15/src/Message/ExceptionReport.cs b/packages/Exceptron.Driver.0.1.0.15/src/Message/ExceptionReport.cs new file mode 100644 index 000000000..a83675f64 --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.15/src/Message/ExceptionReport.cs @@ -0,0 +1,76 @@ +using System.Collections.Generic; +using System.ComponentModel; + +namespace Exceptron.Driver.Message +{ + [EditorBrowsable(EditorBrowsableState.Never)] + internal class ExceptionReport + { + /// + /// API key + /// + public string ap { get; set; } + + /// + /// Application Version + /// + public string aver { get; set; } + + /// + /// User or Instance ID + /// + public string uid { get; set; } + + /// + /// Type of exception + /// + public string ext { get; set; } + + /// + /// Exception message + /// + public string exm { get; set; } + + /// + /// List of frames that make up the StackTrace of the exception + /// + public List stk { get; set; } + + /// + /// Component that experienced this exception + /// + public string cmp { get; set; } + + /// + /// Environment that this exception occurred in. + /// + /// Dev, Stage, Production + public string env { get; set; } + + /// + /// Message that was logged along with the exception. + /// + public string msg { get; set; } + + /// + /// User's culture in + /// + /// http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.name.aspx + public string cul { get; set; } + + /// + /// OS Version + /// + public string os { get; set; } + + /// + /// Name of the driver that generated and is sending this message + /// + public string dn { get; set; } + + /// + /// Version of the driver that generated and is sending this message + /// + public string dv { get; set; } + } +} \ No newline at end of file diff --git a/packages/Exceptron.Driver.0.1.0.15/src/Message/Frame.cs b/packages/Exceptron.Driver.0.1.0.15/src/Message/Frame.cs new file mode 100644 index 000000000..9d1bab7e4 --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.15/src/Message/Frame.cs @@ -0,0 +1,33 @@ +using System.ComponentModel; + +namespace Exceptron.Driver.Message +{ + [EditorBrowsable(EditorBrowsableState.Never)] + internal class Frame + { + /// + /// Order of current frame + /// + public int i { get; set; } + + /// + /// Line number of the current frame + /// + public int ln { get; set; } + + /// + /// File name of the current frame + /// + public string fn { get; set; } + + /// + /// Method name for current frame + /// + public string m { get; set; } + + /// + /// Class name for current frame + /// + public string c { get; set; } + } +} \ No newline at end of file diff --git a/packages/Exceptron.Driver.0.1.0.15/src/Properties/AssemblyInfo.cs b/packages/Exceptron.Driver.0.1.0.15/src/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..c4773ddad --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.15/src/Properties/AssemblyInfo.cs @@ -0,0 +1,38 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Exceptron.Driver")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Exceptron.Driver")] +[assembly: AssemblyCopyright("Copyright © 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a463887e-594f-4733-b227-a79f4ffb2158")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: InternalsVisibleTo("Exceptron.Driver.Tests")] +[assembly: InternalsVisibleTo("Exceptron.Api.v1a.Tests")] diff --git a/packages/Exceptron.Driver.0.1.0.15/src/RestClient.cs b/packages/Exceptron.Driver.0.1.0.15/src/RestClient.cs new file mode 100644 index 000000000..3d8fe436c --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.15/src/RestClient.cs @@ -0,0 +1,41 @@ +using System; +using System.IO; +using System.Net; +using System.Text; + +namespace Exceptron.Driver +{ + internal class RestClient + { + internal virtual string Put(string url, string content) + { + byte[] bytes = Encoding.UTF8.GetBytes(content); + var request = (HttpWebRequest)WebRequest.Create(url); + request.Method = "PUT"; + request.ContentType = "application/json"; + request.ContentLength = bytes.Length; + request.Accept = "application/json"; + + var dataStream = request.GetRequestStream(); + dataStream.Write(bytes, 0, bytes.Length); + dataStream.Close(); + + WebResponse webResponse; + + try + { + webResponse = request.GetResponse(); + } + catch (WebException ex) + { + webResponse = ex.Response; + } + + var responseStream = new StreamReader(webResponse.GetResponseStream(), Encoding.GetEncoding(1252)); + + var responseString = responseStream.ReadToEnd(); + + return responseString; + } + } +} diff --git a/packages/Exceptron.Driver.0.1.0.15/src/fastJSON/Getters.cs b/packages/Exceptron.Driver.0.1.0.15/src/fastJSON/Getters.cs new file mode 100644 index 000000000..5263a13bc --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.15/src/fastJSON/Getters.cs @@ -0,0 +1,21 @@ +//http://fastjson.codeplex.com/ + +using System; +using System.Collections.Generic; +using Exceptron.Driver.fastJSON; + +namespace Exceptron.Driver.fastJSON +{ + internal class Getters + { + public string Name; + public JSON.GenericGetter Getter; + public Type propertyType; + } + + internal class DatasetSchema + { + public List Info { get; set; } + public string Name { get; set; } + } +} diff --git a/packages/Exceptron.Driver.0.1.0.15/src/fastJSON/JSON.cs b/packages/Exceptron.Driver.0.1.0.15/src/fastJSON/JSON.cs new file mode 100644 index 000000000..09a6b317e --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.15/src/fastJSON/JSON.cs @@ -0,0 +1,910 @@ +//http://fastjson.codeplex.com/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Globalization; +using System.IO; +using System.Reflection; +using System.Reflection.Emit; +using Exceptron.Driver.fastJSON; + +namespace Exceptron.Driver.fastJSON +{ + internal delegate string Serialize(object data); + internal delegate object Deserialize(string data); + + internal class JSON + { + public readonly static JSON Instance = new JSON(); + + private JSON() + { + UseSerializerExtension = false; + SerializeNullValues = false; + UseOptimizedDatasetSchema = false; + UsingGlobalTypes = false; + } + public bool UseOptimizedDatasetSchema = true; + public bool UseFastGuid = true; + public bool UseSerializerExtension = true; + public bool IndentOutput = false; + public bool SerializeNullValues = true; + public bool UseUTCDateTime = false; + public bool ShowReadOnlyProperties = false; + public bool UsingGlobalTypes = true; + + public string ToJSON(object obj) + { + return ToJSON(obj, UseSerializerExtension, UseFastGuid, UseOptimizedDatasetSchema, SerializeNullValues); + } + + public string ToJSON(object obj, + bool enableSerializerExtensions) + { + return ToJSON(obj, enableSerializerExtensions, UseFastGuid, UseOptimizedDatasetSchema, SerializeNullValues); + } + + public string ToJSON(object obj, + bool enableSerializerExtensions, + bool enableFastGuid) + { + return ToJSON(obj, enableSerializerExtensions, enableFastGuid, UseOptimizedDatasetSchema, SerializeNullValues); + } + + public string ToJSON(object obj, + bool enableSerializerExtensions, + bool enableFastGuid, + bool enableOptimizedDatasetSchema, + bool serializeNullValues) + { + return new JSONSerializer(enableOptimizedDatasetSchema, enableFastGuid, enableSerializerExtensions, serializeNullValues, IndentOutput).ConvertToJSON(obj); + } + + public object Parse(string json) + { + return new JsonParser(json).Decode(); + } + + public T ToObject(string json) + { + return (T)ToObject(json, typeof(T)); + } + + public object ToObject(string json) + { + return ToObject(json, null); + } + + public object ToObject(string json, Type type) + { + Dictionary ht = new JsonParser(json).Decode() as Dictionary; + if (ht == null) return null; + return ParseDictionary(ht, null, type); + } + +#if CUSTOMTYPE + internal SafeDictionary _customSerializer = new SafeDictionary(); + internal SafeDictionary _customDeserializer = new SafeDictionary(); + + public void RegisterCustomType(Type type, Serialize serializer, Deserialize deserializer) + { + if (type != null && serializer != null && deserializer != null) + { + _customSerializer.Add(type, serializer); + _customDeserializer.Add(type, deserializer); + // reset property cache + _propertycache = new SafeDictionary>(); + } + } + + internal bool IsTypeRegistered(Type t) + { + Serialize s; + return _customSerializer.TryGetValue(t, out s); + } +#endif + + #region [ PROPERTY GET SET CACHE ] + SafeDictionary _tyname = new SafeDictionary(); + internal string GetTypeAssemblyName(Type t) + { + string val = ""; + if (_tyname.TryGetValue(t, out val)) + return val; + else + { + string s = t.AssemblyQualifiedName; + _tyname.Add(t, s); + return s; + } + } + + SafeDictionary _typecache = new SafeDictionary(); + private Type GetTypeFromCache(string typename) + { + Type val = null; + if (_typecache.TryGetValue(typename, out val)) + return val; + else + { + Type t = Type.GetType(typename); + _typecache.Add(typename, t); + return t; + } + } + + SafeDictionary _constrcache = new SafeDictionary(); + private delegate object CreateObject(); + private object FastCreateInstance(Type objtype) + { + try + { + CreateObject c = null; + if (_constrcache.TryGetValue(objtype, out c)) + { + return c(); + } + else + { + DynamicMethod dynMethod = new DynamicMethod("_", objtype, null, true); + ILGenerator ilGen = dynMethod.GetILGenerator(); + + ilGen.Emit(OpCodes.Newobj, objtype.GetConstructor(Type.EmptyTypes)); + ilGen.Emit(OpCodes.Ret); + c = (CreateObject)dynMethod.CreateDelegate(typeof(CreateObject)); + _constrcache.Add(objtype, c); + return c(); + } + } + catch (Exception exc) + { + throw new Exception(string.Format("Failed to fast create instance for type '{0}' from assemebly '{1}'", + objtype.FullName, objtype.AssemblyQualifiedName), exc); + } + } + + private struct myPropInfo + { + public bool filled; + public Type pt; + public Type bt; + public Type changeType; + public bool isDictionary; + public bool isValueType; + public bool isGenericType; + public bool isArray; + public bool isByteArray; + public bool isGuid; +#if !SILVERLIGHT + public bool isDataSet; + public bool isDataTable; + public bool isHashtable; +#endif + public GenericSetter setter; + public bool isEnum; + public bool isDateTime; + public Type[] GenericTypes; + public bool isInt; + public bool isLong; + public bool isString; + public bool isBool; + public bool isClass; + public GenericGetter getter; + public bool isStringDictionary; + public string Name; +#if CUSTOMTYPE + public bool isCustomType; +#endif + public bool CanWrite; + } + + SafeDictionary> _propertycache = new SafeDictionary>(); + private SafeDictionary Getproperties(Type type, string typename) + { + SafeDictionary sd = null; + if (_propertycache.TryGetValue(typename, out sd)) + { + return sd; + } + else + { + sd = new SafeDictionary(); + PropertyInfo[] pr = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); + foreach (PropertyInfo p in pr) + { + myPropInfo d = CreateMyProp(p.PropertyType, p.Name); + d.CanWrite = p.CanWrite; + d.setter = CreateSetMethod(p); + d.getter = CreateGetMethod(p); + sd.Add(p.Name, d); + } + FieldInfo[] fi = type.GetFields(BindingFlags.Public | BindingFlags.Instance); + foreach (FieldInfo f in fi) + { + myPropInfo d = CreateMyProp(f.FieldType, f.Name); + d.setter = CreateSetField(type, f); + d.getter = CreateGetField(type, f); + sd.Add(f.Name, d); + } + + _propertycache.Add(typename, sd); + return sd; + } + } + + private myPropInfo CreateMyProp(Type t, string name) + { + myPropInfo d = new myPropInfo(); + d.filled = true; + d.CanWrite = true; + d.pt = t; + d.Name = name; + d.isDictionary = t.Name.Contains("Dictionary"); + if (d.isDictionary) + d.GenericTypes = t.GetGenericArguments(); + d.isValueType = t.IsValueType; + d.isGenericType = t.IsGenericType; + d.isArray = t.IsArray; + if (d.isArray) + d.bt = t.GetElementType(); + if (d.isGenericType) + d.bt = t.GetGenericArguments()[0]; + d.isByteArray = t == typeof(byte[]); + d.isGuid = (t == typeof(Guid) || t == typeof(Guid?)); +#if !SILVERLIGHT + d.isHashtable = t == typeof(Hashtable); + d.isDataSet = t == typeof(DataSet); + d.isDataTable = t == typeof(DataTable); +#endif + + d.changeType = GetChangeType(t); + d.isEnum = t.IsEnum; + d.isDateTime = t == typeof(DateTime) || t == typeof(DateTime?); + d.isInt = t == typeof(int) || t == typeof(int?); + d.isLong = t == typeof(long) || t == typeof(long?); + d.isString = t == typeof(string); + d.isBool = t == typeof(bool) || t == typeof(bool?); + d.isClass = t.IsClass; + + if (d.isDictionary && d.GenericTypes.Length > 0 && d.GenericTypes[0] == typeof(string)) + d.isStringDictionary = true; + +#if CUSTOMTYPE + if (IsTypeRegistered(t)) + d.isCustomType = true; +#endif + return d; + } + + private delegate void GenericSetter(object target, object value); + + private static GenericSetter CreateSetMethod(PropertyInfo propertyInfo) + { + MethodInfo setMethod = propertyInfo.GetSetMethod(); + if (setMethod == null) + return null; + + Type[] arguments = new Type[2]; + arguments[0] = arguments[1] = typeof(object); + + DynamicMethod setter = new DynamicMethod("_", typeof(void), arguments, true); + ILGenerator il = setter.GetILGenerator(); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Castclass, propertyInfo.DeclaringType); + il.Emit(OpCodes.Ldarg_1); + + if (propertyInfo.PropertyType.IsClass) + il.Emit(OpCodes.Castclass, propertyInfo.PropertyType); + else + il.Emit(OpCodes.Unbox_Any, propertyInfo.PropertyType); + + il.EmitCall(OpCodes.Callvirt, setMethod, null); + il.Emit(OpCodes.Ret); + + return (GenericSetter)setter.CreateDelegate(typeof(GenericSetter)); + } + + internal delegate object GenericGetter(object obj); + + private static GenericGetter CreateGetField(Type type, FieldInfo fieldInfo) + { + DynamicMethod dynamicGet = new DynamicMethod("_", typeof(object), new Type[] { typeof(object) }, type, true); + ILGenerator il = dynamicGet.GetILGenerator(); + + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldfld, fieldInfo); + if (fieldInfo.FieldType.IsValueType) + il.Emit(OpCodes.Box, fieldInfo.FieldType); + il.Emit(OpCodes.Ret); + + return (GenericGetter)dynamicGet.CreateDelegate(typeof(GenericGetter)); + } + + private static GenericSetter CreateSetField(Type type, FieldInfo fieldInfo) + { + Type[] arguments = new Type[2]; + arguments[0] = arguments[1] = typeof(object); + + DynamicMethod dynamicSet = new DynamicMethod("_", typeof(void), arguments, type, true); + ILGenerator il = dynamicSet.GetILGenerator(); + + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + if (fieldInfo.FieldType.IsValueType) + il.Emit(OpCodes.Unbox_Any, fieldInfo.FieldType); + il.Emit(OpCodes.Stfld, fieldInfo); + il.Emit(OpCodes.Ret); + + return (GenericSetter)dynamicSet.CreateDelegate(typeof(GenericSetter)); + } + + private GenericGetter CreateGetMethod(PropertyInfo propertyInfo) + { + MethodInfo getMethod = propertyInfo.GetGetMethod(); + if (getMethod == null) + return null; + + Type[] arguments = new Type[1]; + arguments[0] = typeof(object); + + DynamicMethod getter = new DynamicMethod("_", typeof(object), arguments, true); + ILGenerator il = getter.GetILGenerator(); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Castclass, propertyInfo.DeclaringType); + il.EmitCall(OpCodes.Callvirt, getMethod, null); + + if (!propertyInfo.PropertyType.IsClass) + il.Emit(OpCodes.Box, propertyInfo.PropertyType); + + il.Emit(OpCodes.Ret); + + return (GenericGetter)getter.CreateDelegate(typeof(GenericGetter)); + } + + readonly SafeDictionary> _getterscache = new SafeDictionary>(); + internal List GetGetters(Type type) + { + List val = null; + if (_getterscache.TryGetValue(type, out val)) + return val; + + PropertyInfo[] props = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); + List getters = new List(); + foreach (PropertyInfo p in props) + { + if (!p.CanWrite && ShowReadOnlyProperties == false) continue; + + object[] att = p.GetCustomAttributes(typeof(System.Xml.Serialization.XmlIgnoreAttribute), false); + if (att != null && att.Length > 0) + continue; + + JSON.GenericGetter g = CreateGetMethod(p); + if (g != null) + { + Getters gg = new Getters(); + gg.Name = p.Name; + gg.Getter = g; + gg.propertyType = p.PropertyType; + getters.Add(gg); + } + } + + FieldInfo[] fi = type.GetFields(BindingFlags.Instance | BindingFlags.Public); + foreach (var f in fi) + { + object[] att = f.GetCustomAttributes(typeof(System.Xml.Serialization.XmlIgnoreAttribute), false); + if (att != null && att.Length > 0) + continue; + + JSON.GenericGetter g = CreateGetField(type, f); + if (g != null) + { + Getters gg = new Getters(); + gg.Name = f.Name; + gg.Getter = g; + gg.propertyType = f.FieldType; + getters.Add(gg); + } + } + + _getterscache.Add(type, getters); + return getters; + } + + private object ChangeType(object value, Type conversionType) + { + if (conversionType == typeof(int)) + return (int)CreateLong((string)value); + + else if (conversionType == typeof(long)) + return CreateLong((string)value); + + else if (conversionType == typeof(string)) + return (string)value; + + else if (conversionType == typeof(Guid)) + return CreateGuid((string)value); + + else if (conversionType.IsEnum) + return CreateEnum(conversionType, (string)value); + + return Convert.ChangeType(value, conversionType, CultureInfo.InvariantCulture); + } + #endregion + + + private object ParseDictionary(Dictionary d, Dictionary globaltypes, Type type) + { + object tn = ""; + if (d.TryGetValue("$types", out tn)) + { + UsingGlobalTypes = true; + globaltypes = new Dictionary(); + foreach (var kv in (Dictionary)tn) + { + globaltypes.Add((string)kv.Value, kv.Key); + } + } + + bool found = d.TryGetValue("$type", out tn); +#if !SILVERLIGHT + if (found == false && type == typeof(System.Object)) + { + return CreateDataset(d, globaltypes); + } +#endif + if (found) + { + if (UsingGlobalTypes) + { + object tname = ""; + if (globaltypes.TryGetValue((string)tn, out tname)) + tn = tname; + } + type = GetTypeFromCache((string)tn); + } + + if (type == null) + throw new Exception("Cannot determine type"); + + string typename = type.FullName; + object o = FastCreateInstance(type); + SafeDictionary props = Getproperties(type, typename); + foreach (string name in d.Keys) + { + if (name == "$map") + { + ProcessMap(o, props, (Dictionary)d[name]); + continue; + } + myPropInfo pi; + if (props.TryGetValue(name, out pi) == false) + continue; + if (pi.filled == true) + { + object v = d[name]; + + if (v != null) + { + object oset = null; + + if (pi.isInt) + oset = (int)CreateLong((string)v); +#if CUSTOMTYPE + else if (pi.isCustomType) + oset = CreateCustom((string)v, pi.pt); +#endif + else if (pi.isLong) + oset = CreateLong((string)v); + + else if (pi.isString) + oset = (string)v; + + else if (pi.isBool) + oset = (bool)v; + + else if (pi.isGenericType && pi.isValueType == false && pi.isDictionary == false) +#if SILVERLIGHT + oset = CreateGenericList((List)v, pi.pt, pi.bt, globaltypes); +#else + oset = CreateGenericList((ArrayList)v, pi.pt, pi.bt, globaltypes); +#endif + else if (pi.isByteArray) + oset = Convert.FromBase64String((string)v); + + else if (pi.isArray && pi.isValueType == false) +#if SILVERLIGHT + oset = CreateArray((List)v, pi.pt, pi.bt, globaltypes); +#else + oset = CreateArray((ArrayList)v, pi.pt, pi.bt, globaltypes); +#endif + else if (pi.isGuid) + oset = CreateGuid((string)v); +#if !SILVERLIGHT + else if (pi.isDataSet) + oset = CreateDataset((Dictionary)v, globaltypes); + + else if (pi.isDataTable) + oset = this.CreateDataTable((Dictionary)v, globaltypes); +#endif + + else if (pi.isStringDictionary) + oset = CreateStringKeyDictionary((Dictionary)v, pi.pt, pi.GenericTypes, globaltypes); + +#if !SILVERLIGHT + else if (pi.isDictionary || pi.isHashtable) + oset = CreateDictionary((ArrayList)v, pi.pt, pi.GenericTypes, globaltypes); +#else + else if (pi.isDictionary) + oset = CreateDictionary((List)v, pi.pt, pi.GenericTypes, globaltypes); +#endif + + else if (pi.isEnum) + oset = CreateEnum(pi.pt, (string)v); + + else if (pi.isDateTime) + oset = CreateDateTime((string)v); + + else if (pi.isClass && v is Dictionary) + oset = ParseDictionary((Dictionary)v, globaltypes, pi.pt); + + else if (pi.isValueType) + oset = ChangeType(v, pi.changeType); + +#if SILVERLIGHT + else if (v is List) + oset = CreateArray((List)v, pi.pt, typeof(object), globaltypes); +#else + else if (v is ArrayList) + oset = CreateArray((ArrayList)v, pi.pt, typeof(object), globaltypes); +#endif + else + oset = v; + + if (pi.CanWrite) + pi.setter(o, oset); + } + } + } + return o; + } + +#if CUSTOMTYPE + private object CreateCustom(string v, Type type) + { + Deserialize d; + _customDeserializer.TryGetValue(type, out d); + return d(v); + } +#endif + + private void ProcessMap(object obj, SafeDictionary props, Dictionary dic) + { + foreach (KeyValuePair kv in dic) + { + myPropInfo p = props[kv.Key]; + object o = p.getter(obj); + Type t = Type.GetType((string)kv.Value); + if (t == typeof(Guid)) + p.setter(obj, CreateGuid((string)o)); + } + } + + private long CreateLong(string s) + { + long num = 0; + bool neg = false; + foreach (char cc in s) + { + if (cc == '-') + neg = true; + else if (cc == '+') + neg = false; + else + { + num *= 10; + num += (int)(cc - '0'); + } + } + + return neg ? -num : num; + } + + private object CreateEnum(Type pt, string v) + { + // TODO : optimize create enum +#if !SILVERLIGHT + return Enum.Parse(pt, v); +#else + return Enum.Parse(pt, v, true); +#endif + } + + private Guid CreateGuid(string s) + { + if (s.Length > 30) + return new Guid(s); + else + return new Guid(Convert.FromBase64String(s)); + } + + private DateTime CreateDateTime(string value) + { + bool utc = false; + // 0123456789012345678 + // datetime format = yyyy-MM-dd HH:mm:ss + int year = (int)CreateLong(value.Substring(0, 4)); + int month = (int)CreateLong(value.Substring(5, 2)); + int day = (int)CreateLong(value.Substring(8, 2)); + int hour = (int)CreateLong(value.Substring(11, 2)); + int min = (int)CreateLong(value.Substring(14, 2)); + int sec = (int)CreateLong(value.Substring(17, 2)); + + if (value.EndsWith("Z")) + utc = true; + + if (UseUTCDateTime == false && utc == false) + return new DateTime(year, month, day, hour, min, sec); + else + return new DateTime(year, month, day, hour, min, sec, DateTimeKind.Utc).ToLocalTime(); + } + +#if SILVERLIGHT + private object CreateArray(List data, Type pt, Type bt, Dictionary globalTypes) + { + Array col = Array.CreateInstance(bt, data.Count); + // create an array of objects + for (int i = 0; i < data.Count; i++)// each (object ob in data) + { + object ob = data[i]; + if (ob is IDictionary) + col.SetValue(ParseDictionary((Dictionary)ob, globalTypes, bt), i); + else + col.SetValue(ChangeType(ob, bt), i); + } + + return col; + } +#else + private object CreateArray(ArrayList data, Type pt, Type bt, Dictionary globalTypes) + { + ArrayList col = new ArrayList(); + // create an array of objects + foreach (object ob in data) + { + if (ob is IDictionary) + col.Add(ParseDictionary((Dictionary)ob, globalTypes, bt)); + else + col.Add(ChangeType(ob, bt)); + } + return col.ToArray(bt); + } +#endif + + +#if SILVERLIGHT + private object CreateGenericList(List data, Type pt, Type bt, Dictionary globalTypes) +#else + private object CreateGenericList(ArrayList data, Type pt, Type bt, Dictionary globalTypes) +#endif + { + IList col = (IList)FastCreateInstance(pt); + // create an array of objects + foreach (object ob in data) + { + if (ob is IDictionary) + col.Add(ParseDictionary((Dictionary)ob, globalTypes, bt)); +#if SILVERLIGHT + else if (ob is List) + col.Add(((List)ob).ToArray()); +#else + else if (ob is ArrayList) + col.Add(((ArrayList)ob).ToArray()); +#endif + else + col.Add(ChangeType(ob, bt)); + } + return col; + } + + private object CreateStringKeyDictionary(Dictionary reader, Type pt, Type[] types, Dictionary globalTypes) + { + var col = (IDictionary)FastCreateInstance(pt); + Type t1 = null; + Type t2 = null; + if (types != null) + { + t1 = types[0]; + t2 = types[1]; + } + + foreach (KeyValuePair values in reader) + { + var key = values.Key;//ChangeType(values.Key, t1); + object val = null; + if (values.Value is Dictionary) + val = ParseDictionary((Dictionary)values.Value, globalTypes, t2); + else + val = ChangeType(values.Value, t2); + col.Add(key, val); + } + + return col; + } + +#if SILVERLIGHT + private object CreateDictionary(List reader, Type pt, Type[] types, Dictionary globalTypes) +#else + private object CreateDictionary(ArrayList reader, Type pt, Type[] types, Dictionary globalTypes) +#endif + { + IDictionary col = (IDictionary)FastCreateInstance(pt); + Type t1 = null; + Type t2 = null; + if (types != null) + { + t1 = types[0]; + t2 = types[1]; + } + + foreach (Dictionary values in reader) + { + object key = values["k"]; + object val = values["v"]; + + if (key is Dictionary) + key = ParseDictionary((Dictionary)key, globalTypes, t1); + else + key = ChangeType(key, t1); + + if (val is Dictionary) + val = ParseDictionary((Dictionary)val, globalTypes, t2); + else + val = ChangeType(val, t2); + + col.Add(key, val); + } + + return col; + } + + private Type GetChangeType(Type conversionType) + { + if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) + return conversionType.GetGenericArguments()[0]; + + return conversionType; + } +#if !SILVERLIGHT + private DataSet CreateDataset(Dictionary reader, Dictionary globalTypes) + { + DataSet ds = new DataSet(); + ds.EnforceConstraints = false; + ds.BeginInit(); + + // read dataset schema here + ReadSchema(reader, ds, globalTypes); + + foreach (KeyValuePair pair in reader) + { + if (pair.Key == "$type" || pair.Key == "$schema") continue; + + ArrayList rows = (ArrayList)pair.Value; + if (rows == null) continue; + + DataTable dt = ds.Tables[pair.Key]; + ReadDataTable(rows, dt); + } + + ds.EndInit(); + + return ds; + } + + private void ReadSchema(Dictionary reader, DataSet ds, Dictionary globalTypes) + { + var schema = reader["$schema"]; + + if (schema is string) + { + TextReader tr = new StringReader((string)schema); + ds.ReadXmlSchema(tr); + } + else + { + DatasetSchema ms = (DatasetSchema)ParseDictionary((Dictionary)schema, globalTypes, typeof(DatasetSchema)); + ds.DataSetName = ms.Name; + for (int i = 0; i < ms.Info.Count; i += 3) + { + if (ds.Tables.Contains(ms.Info[i]) == false) + ds.Tables.Add(ms.Info[i]); + ds.Tables[ms.Info[i]].Columns.Add(ms.Info[i + 1], Type.GetType(ms.Info[i + 2])); + } + } + } + + private void ReadDataTable(ArrayList rows, DataTable dt) + { + dt.BeginInit(); + dt.BeginLoadData(); + List guidcols = new List(); + List datecol = new List(); + + foreach (DataColumn c in dt.Columns) + { + if (c.DataType == typeof(Guid) || c.DataType == typeof(Guid?)) + guidcols.Add(c.Ordinal); + if (UseUTCDateTime && (c.DataType == typeof(DateTime) || c.DataType == typeof(DateTime?))) + datecol.Add(c.Ordinal); + } + + foreach (ArrayList row in rows) + { + object[] v = new object[row.Count]; + row.CopyTo(v, 0); + foreach (int i in guidcols) + { + string s = (string)v[i]; + if (s != null && s.Length < 36) + v[i] = new Guid(Convert.FromBase64String(s)); + } + if (UseUTCDateTime) + { + foreach (int i in datecol) + { + string s = (string)v[i]; + if (s != null) + v[i] = CreateDateTime(s); + } + } + dt.Rows.Add(v); + } + + dt.EndLoadData(); + dt.EndInit(); + } + + DataTable CreateDataTable(Dictionary reader, Dictionary globalTypes) + { + var dt = new DataTable(); + + // read dataset schema here + var schema = reader["$schema"]; + + if (schema is string) + { + TextReader tr = new StringReader((string)schema); + dt.ReadXmlSchema(tr); + } + else + { + var ms = (DatasetSchema)this.ParseDictionary((Dictionary)schema, globalTypes, typeof(DatasetSchema)); + dt.TableName = ms.Info[0]; + for (int i = 0; i < ms.Info.Count; i += 3) + { + dt.Columns.Add(ms.Info[i + 1], Type.GetType(ms.Info[i + 2])); + } + } + + foreach (var pair in reader) + { + if (pair.Key == "$type" || pair.Key == "$schema") + continue; + + var rows = (ArrayList)pair.Value; + if (rows == null) + continue; + + if (!dt.TableName.Equals(pair.Key, StringComparison.InvariantCultureIgnoreCase)) + continue; + + ReadDataTable(rows, dt); + } + + return dt; + } +#endif + } +} \ No newline at end of file diff --git a/packages/Exceptron.Driver.0.1.0.15/src/fastJSON/JsonParser.cs b/packages/Exceptron.Driver.0.1.0.15/src/fastJSON/JsonParser.cs new file mode 100644 index 000000000..569ce1769 --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.15/src/fastJSON/JsonParser.cs @@ -0,0 +1,408 @@ +//http://fastjson.codeplex.com/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; + +namespace Exceptron.Driver.fastJSON +{ + /// + /// This class encodes and decodes JSON strings. + /// Spec. details, see http://www.json.org/ + /// + /// JSON uses Arrays and Objects. These correspond here to the datatypes ArrayList and Hashtable. + /// All numbers are parsed to doubles. + /// + internal class JsonParser + { + enum Token + { + None = -1, // Used to denote no Lookahead available + Curly_Open, + Curly_Close, + Squared_Open, + Squared_Close, + Colon, + Comma, + String, + Number, + True, + False, + Null + } + + readonly char[] json; + readonly StringBuilder s = new StringBuilder(); + Token lookAheadToken = Token.None; + int index; + + internal JsonParser(string json) + { + this.json = json.ToCharArray(); + } + + public object Decode() + { + return ParseValue(); + } + + private Dictionary ParseObject() + { + Dictionary table = new Dictionary(); + + ConsumeToken(); // { + + while (true) + { + switch (LookAhead()) + { + + case Token.Comma: + ConsumeToken(); + break; + + case Token.Curly_Close: + ConsumeToken(); + return table; + + default: + { + + // name + string name = ParseString(); + + // : + if (NextToken() != Token.Colon) + { + throw new Exception("Expected colon at index " + index); + } + + // value + object value = ParseValue(); + + table[name] = value; + } + break; + } + } + } + +#if SILVERLIGHT + private List ParseArray() + { + List array = new List(); +#else + private ArrayList ParseArray() + { + ArrayList array = new ArrayList(); +#endif + ConsumeToken(); // [ + + while (true) + { + switch (LookAhead()) + { + + case Token.Comma: + ConsumeToken(); + break; + + case Token.Squared_Close: + ConsumeToken(); + return array; + + default: + { + array.Add(ParseValue()); + } + break; + } + } + } + + private object ParseValue() + { + switch (LookAhead()) + { + case Token.Number: + return ParseNumber(); + + case Token.String: + return ParseString(); + + case Token.Curly_Open: + return ParseObject(); + + case Token.Squared_Open: + return ParseArray(); + + case Token.True: + ConsumeToken(); + return true; + + case Token.False: + ConsumeToken(); + return false; + + case Token.Null: + ConsumeToken(); + return null; + } + + throw new Exception("Unrecognized token at index" + index); + } + + private string ParseString() + { + ConsumeToken(); // " + + s.Length = 0; + + int runIndex = -1; + + while (index < json.Length) + { + var c = json[index++]; + + if (c == '"') + { + if (runIndex != -1) + { + if (s.Length == 0) + return new string(json, runIndex, index - runIndex - 1); + + s.Append(json, runIndex, index - runIndex - 1); + } + return s.ToString(); + } + + if (c != '\\') + { + if (runIndex == -1) + runIndex = index - 1; + + continue; + } + + if (index == json.Length) break; + + if (runIndex != -1) + { + s.Append(json, runIndex, index - runIndex - 1); + runIndex = -1; + } + + switch (json[index++]) + { + case '"': + s.Append('"'); + break; + + case '\\': + s.Append('\\'); + break; + + case '/': + s.Append('/'); + break; + + case 'b': + s.Append('\b'); + break; + + case 'f': + s.Append('\f'); + break; + + case 'n': + s.Append('\n'); + break; + + case 'r': + s.Append('\r'); + break; + + case 't': + s.Append('\t'); + break; + + case 'u': + { + int remainingLength = json.Length - index; + if (remainingLength < 4) break; + + // parse the 32 bit hex into an integer codepoint + uint codePoint = ParseUnicode(json[index], json[index + 1], json[index + 2], json[index + 3]); + s.Append((char)codePoint); + + // skip 4 chars + index += 4; + } + break; + } + } + + throw new Exception("Unexpectedly reached end of string"); + } + + private uint ParseSingleChar(char c1, uint multipliyer) + { + uint p1 = 0; + if (c1 >= '0' && c1 <= '9') + p1 = (uint)(c1 - '0') * multipliyer; + else if (c1 >= 'A' && c1 <= 'F') + p1 = (uint)((c1 - 'A') + 10) * multipliyer; + else if (c1 >= 'a' && c1 <= 'f') + p1 = (uint)((c1 - 'a') + 10) * multipliyer; + return p1; + } + + private uint ParseUnicode(char c1, char c2, char c3, char c4) + { + uint p1 = ParseSingleChar(c1, 0x1000); + uint p2 = ParseSingleChar(c2, 0x100); + uint p3 = ParseSingleChar(c3, 0x10); + uint p4 = ParseSingleChar(c4, 1); + + return p1 + p2 + p3 + p4; + } + + private string ParseNumber() + { + ConsumeToken(); + + // Need to start back one place because the first digit is also a token and would have been consumed + var startIndex = index - 1; + + do + { + var c = json[index]; + + if ((c >= '0' && c <= '9') || c == '.' || c == '-' || c == '+' || c == 'e' || c == 'E') + { + if (++index == json.Length) throw new Exception("Unexpected end of string whilst parsing number"); + continue; + } + + break; + } while (true); + + return new string(json, startIndex, index - startIndex); + } + + private Token LookAhead() + { + if (lookAheadToken != Token.None) return lookAheadToken; + + return lookAheadToken = NextTokenCore(); + } + + private void ConsumeToken() + { + lookAheadToken = Token.None; + } + + private Token NextToken() + { + var result = lookAheadToken != Token.None ? lookAheadToken : NextTokenCore(); + + lookAheadToken = Token.None; + + return result; + } + + private Token NextTokenCore() + { + char c; + + // Skip past whitespace + do + { + c = json[index]; + + if (c > ' ') break; + if (c != ' ' && c != '\t' && c != '\n' && c != '\r') break; + + } while (++index < json.Length); + + if (index == json.Length) + { + throw new Exception("Reached end of string unexpectedly"); + } + + c = json[index]; + + index++; + + //if (c >= '0' && c <= '9') + // return Token.Number; + + switch (c) + { + case '{': + return Token.Curly_Open; + + case '}': + return Token.Curly_Close; + + case '[': + return Token.Squared_Open; + + case ']': + return Token.Squared_Close; + + case ',': + return Token.Comma; + + case '"': + return Token.String; + + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case '-': case '+': case '.': + return Token.Number; + + case ':': + return Token.Colon; + + case 'f': + if (json.Length - index >= 4 && + json[index + 0] == 'a' && + json[index + 1] == 'l' && + json[index + 2] == 's' && + json[index + 3] == 'e') + { + index += 4; + return Token.False; + } + break; + + case 't': + if (json.Length - index >= 3 && + json[index + 0] == 'r' && + json[index + 1] == 'u' && + json[index + 2] == 'e') + { + index += 3; + return Token.True; + } + break; + + case 'n': + if (json.Length - index >= 3 && + json[index + 0] == 'u' && + json[index + 1] == 'l' && + json[index + 2] == 'l') + { + index += 3; + return Token.Null; + } + break; + + } + + throw new Exception("Could not find token at index " + --index); + } + } +} diff --git a/packages/Exceptron.Driver.0.1.0.15/src/fastJSON/JsonSerializer.cs b/packages/Exceptron.Driver.0.1.0.15/src/fastJSON/JsonSerializer.cs new file mode 100644 index 000000000..439471fae --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.15/src/fastJSON/JsonSerializer.cs @@ -0,0 +1,518 @@ +//http://fastjson.codeplex.com/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Globalization; +using System.IO; +using System.Text; + +namespace Exceptron.Driver.fastJSON +{ + internal class JSONSerializer + { + private readonly StringBuilder _output = new StringBuilder(); + readonly bool useMinimalDataSetSchema; + readonly bool fastguid = true; + readonly bool useExtension = true; + readonly bool serializeNulls = true; + readonly int _MAX_DEPTH = 10; + bool _Indent = false; + bool _useGlobalTypes = true; + int _current_depth = 0; + private Dictionary _globalTypes = new Dictionary(); + + internal JSONSerializer(bool UseMinimalDataSetSchema, bool UseFastGuid, bool UseExtensions, bool SerializeNulls, bool IndentOutput) + { + this.useMinimalDataSetSchema = UseMinimalDataSetSchema; + this.fastguid = UseFastGuid; + this.useExtension = UseExtensions; + _Indent = IndentOutput; + this.serializeNulls = SerializeNulls; + if (useExtension == false) + _useGlobalTypes = false; + } + + internal string ConvertToJSON(object obj) + { + WriteValue(obj); + + string str = ""; + if (_useGlobalTypes) + { + StringBuilder sb = new StringBuilder(); + sb.Append("{\"$types\":{"); + bool pendingSeparator = false; + foreach (var kv in _globalTypes) + { + if (pendingSeparator) sb.Append(','); + pendingSeparator = true; + sb.Append("\""); + sb.Append(kv.Key); + sb.Append("\":\""); + sb.Append(kv.Value); + sb.Append("\""); + } + sb.Append("},"); + str = sb.ToString() + _output.ToString(); + } + else + str = _output.ToString(); + + return str; + } + + private void WriteValue(object obj) + { + if (obj == null || obj is DBNull) + _output.Append("null"); + + else if (obj is string || obj is char) + WriteString((string)obj); + + else if (obj is Guid) + WriteGuid((Guid)obj); + + else if (obj is bool) + _output.Append(((bool)obj) ? "true" : "false"); // conform to standard + + else if ( + obj is int || obj is long || obj is double || + obj is decimal || obj is float || + obj is byte || obj is short || + obj is sbyte || obj is ushort || + obj is uint || obj is ulong + ) + _output.Append(((IConvertible)obj).ToString(NumberFormatInfo.InvariantInfo)); + + else if (obj is DateTime) + WriteDateTime((DateTime)obj); + + else if (obj is IDictionary && obj.GetType().IsGenericType && obj.GetType().GetGenericArguments()[0] == typeof(string)) + WriteStringDictionary((IDictionary)obj); + + else if (obj is IDictionary) + WriteDictionary((IDictionary)obj); +#if !SILVERLIGHT + else if (obj is DataSet) + WriteDataset((DataSet)obj); + + else if (obj is DataTable) + this.WriteDataTable((DataTable)obj); +#endif + else if (obj is byte[]) + WriteBytes((byte[])obj); + + else if (obj is Array || obj is IList || obj is ICollection) + WriteArray((IEnumerable)obj); + + else if (obj is Enum) + WriteEnum((Enum)obj); + +#if CUSTOMTYPE + else if (JSON.Instance.IsTypeRegistered(obj.GetType())) + WriteCustom(obj); +#endif + else + WriteObject(obj); + } + +#if CUSTOMTYPE + private void WriteCustom(object obj) + { + Serialize s; + JSON.Instance._customSerializer.TryGetValue(obj.GetType(), out s); + WriteStringFast(s(obj)); + } +#endif + + private void WriteEnum(Enum e) + { + // TODO : optimize enum write + WriteStringFast(e.ToString()); + } + + private void WriteGuid(Guid g) + { + if (fastguid == false) + WriteStringFast(g.ToString()); + else + WriteBytes(g.ToByteArray()); + } + + private void WriteBytes(byte[] bytes) + { +#if !SILVERLIGHT + WriteStringFast(Convert.ToBase64String(bytes, 0, bytes.Length, Base64FormattingOptions.None)); +#else + WriteStringFast(Convert.ToBase64String(bytes, 0, bytes.Length)); +#endif + } + + private void WriteDateTime(DateTime dateTime) + { + // datetime format standard : yyyy-MM-dd HH:mm:ss + DateTime dt = dateTime; + if (JSON.Instance.UseUTCDateTime) + dt = dateTime.ToUniversalTime(); + + _output.Append("\""); + _output.Append(dt.Year.ToString("0000", NumberFormatInfo.InvariantInfo)); + _output.Append("-"); + _output.Append(dt.Month.ToString("00", NumberFormatInfo.InvariantInfo)); + _output.Append("-"); + _output.Append(dt.Day.ToString("00", NumberFormatInfo.InvariantInfo)); + _output.Append(" "); + _output.Append(dt.Hour.ToString("00", NumberFormatInfo.InvariantInfo)); + _output.Append(":"); + _output.Append(dt.Minute.ToString("00", NumberFormatInfo.InvariantInfo)); + _output.Append(":"); + _output.Append(dt.Second.ToString("00", NumberFormatInfo.InvariantInfo)); + + if (JSON.Instance.UseUTCDateTime) + _output.Append("Z"); + + _output.Append("\""); + } +#if !SILVERLIGHT + private DatasetSchema GetSchema(DataTable ds) + { + if (ds == null) return null; + + DatasetSchema m = new DatasetSchema(); + m.Info = new List(); + m.Name = ds.TableName; + + foreach (DataColumn c in ds.Columns) + { + m.Info.Add(ds.TableName); + m.Info.Add(c.ColumnName); + m.Info.Add(c.DataType.ToString()); + } + // TODO : serialize relations and constraints here + + return m; + } + + private DatasetSchema GetSchema(DataSet ds) + { + if (ds == null) return null; + + DatasetSchema m = new DatasetSchema(); + m.Info = new List(); + m.Name = ds.DataSetName; + + foreach (DataTable t in ds.Tables) + { + foreach (DataColumn c in t.Columns) + { + m.Info.Add(t.TableName); + m.Info.Add(c.ColumnName); + m.Info.Add(c.DataType.ToString()); + } + } + // TODO : serialize relations and constraints here + + return m; + } + + private string GetXmlSchema(DataTable dt) + { + using (var writer = new StringWriter()) + { + dt.WriteXmlSchema(writer); + return dt.ToString(); + } + } + + private void WriteDataset(DataSet ds) + { + _output.Append('{'); + if (useExtension) + { + WritePair("$schema", useMinimalDataSetSchema ? (object)GetSchema(ds) : ds.GetXmlSchema()); + _output.Append(','); + } + bool tablesep = false; + foreach (DataTable table in ds.Tables) + { + if (tablesep) _output.Append(","); + tablesep = true; + WriteDataTableData(table); + } + // end dataset + _output.Append('}'); + } + + private void WriteDataTableData(DataTable table) + { + _output.Append('\"'); + _output.Append(table.TableName); + _output.Append("\":["); + DataColumnCollection cols = table.Columns; + bool rowseparator = false; + foreach (DataRow row in table.Rows) + { + if (rowseparator) _output.Append(","); + rowseparator = true; + _output.Append('['); + + bool pendingSeperator = false; + foreach (DataColumn column in cols) + { + if (pendingSeperator) _output.Append(','); + WriteValue(row[column]); + pendingSeperator = true; + } + _output.Append(']'); + } + + _output.Append(']'); + } + + void WriteDataTable(DataTable dt) + { + this._output.Append('{'); + if (this.useExtension) + { + this.WritePair("$schema", this.useMinimalDataSetSchema ? (object)this.GetSchema(dt) : this.GetXmlSchema(dt)); + this._output.Append(','); + } + + WriteDataTableData(dt); + + // end datatable + this._output.Append('}'); + } +#endif + bool _firstWritten = false; + private void WriteObject(object obj) + { + Indent(); + if (_useGlobalTypes == false) + _output.Append('{'); + else + { + if (_firstWritten) + _output.Append("{"); + } + _firstWritten = true; + _current_depth++; + if (_current_depth > _MAX_DEPTH) + throw new Exception("Serializer encountered maximum depth of " + _MAX_DEPTH); + + + Dictionary map = new Dictionary(); + Type t = obj.GetType(); + bool append = false; + if (useExtension) + { + if (_useGlobalTypes == false) + WritePairFast("$type", JSON.Instance.GetTypeAssemblyName(t)); + else + { + int dt = 0; + string ct = JSON.Instance.GetTypeAssemblyName(t); + if (_globalTypes.TryGetValue(ct, out dt) == false) + { + dt = _globalTypes.Count + 1; + _globalTypes.Add(ct, dt); + } + WritePairFast("$type", dt.ToString()); + } + append = true; + } + + List g = JSON.Instance.GetGetters(t); + foreach (var p in g) + { + if (append) + _output.Append(','); + object o = p.Getter(obj); + if ((o == null || o is DBNull) && serializeNulls == false) + append = false; + else + { + WritePair(p.Name, o); + if (o != null && useExtension) + { + Type tt = o.GetType(); + if (tt == typeof(System.Object)) + map.Add(p.Name, tt.ToString()); + } + append = true; + } + } + if (map.Count > 0 && useExtension) + { + _output.Append(",\"$map\":"); + WriteStringDictionary(map); + } + _current_depth--; + Indent(); + _output.Append('}'); + _current_depth--; + + } + + private void Indent() + { + Indent(false); + } + + private void Indent(bool dec) + { + if (_Indent) + { + _output.Append("\r\n"); + for (int i = 0; i < _current_depth - (dec ? 1 : 0); i++) + _output.Append("\t"); + } + } + + private void WritePairFast(string name, string value) + { + if ((value == null) && serializeNulls == false) + return; + Indent(); + WriteStringFast(name); + + _output.Append(':'); + + WriteStringFast(value); + } + + private void WritePair(string name, object value) + { + if ((value == null || value is DBNull) && serializeNulls == false) + return; + Indent(); + WriteStringFast(name); + + _output.Append(':'); + + WriteValue(value); + } + + private void WriteArray(IEnumerable array) + { + Indent(); + _output.Append('['); + + bool pendingSeperator = false; + + foreach (object obj in array) + { + Indent(); + if (pendingSeperator) _output.Append(','); + + WriteValue(obj); + + pendingSeperator = true; + } + Indent(); + _output.Append(']'); + } + + private void WriteStringDictionary(IDictionary dic) + { + Indent(); + _output.Append('{'); + + bool pendingSeparator = false; + + foreach (DictionaryEntry entry in dic) + { + if (pendingSeparator) _output.Append(','); + + WritePair((string)entry.Key, entry.Value); + + pendingSeparator = true; + } + Indent(); + _output.Append('}'); + } + + private void WriteDictionary(IDictionary dic) + { + Indent(); + _output.Append('['); + + bool pendingSeparator = false; + + foreach (DictionaryEntry entry in dic) + { + if (pendingSeparator) _output.Append(','); + Indent(); + _output.Append('{'); + WritePair("k", entry.Key); + _output.Append(","); + WritePair("v", entry.Value); + Indent(); + _output.Append('}'); + + pendingSeparator = true; + } + Indent(); + _output.Append(']'); + } + + private void WriteStringFast(string s) + { + //Indent(); + _output.Append('\"'); + _output.Append(s); + _output.Append('\"'); + } + + private void WriteString(string s) + { + //Indent(); + _output.Append('\"'); + + int runIndex = -1; + + for (var index = 0; index < s.Length; ++index) + { + var c = s[index]; + + if (c >= ' ' && c < 128 && c != '\"' && c != '\\') + { + if (runIndex == -1) + { + runIndex = index; + } + + continue; + } + + if (runIndex != -1) + { + _output.Append(s, runIndex, index - runIndex); + runIndex = -1; + } + + switch (c) + { + case '\t': _output.Append("\\t"); break; + case '\r': _output.Append("\\r"); break; + case '\n': _output.Append("\\n"); break; + case '"': + case '\\': _output.Append('\\'); _output.Append(c); break; + default: + _output.Append("\\u"); + _output.Append(((int)c).ToString("X4", NumberFormatInfo.InvariantInfo)); + break; + } + } + + if (runIndex != -1) + { + _output.Append(s, runIndex, s.Length - runIndex); + } + + _output.Append('\"'); + } + } +} diff --git a/packages/Exceptron.Driver.0.1.0.15/src/fastJSON/SafeDictionary.cs b/packages/Exceptron.Driver.0.1.0.15/src/fastJSON/SafeDictionary.cs new file mode 100644 index 000000000..191975fb4 --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.15/src/fastJSON/SafeDictionary.cs @@ -0,0 +1,39 @@ +//http://fastjson.codeplex.com/ + +using System.Collections.Generic; + +namespace Exceptron.Driver.fastJSON +{ + internal class SafeDictionary + { + private readonly object _Padlock = new object(); + private readonly Dictionary _Dictionary = new Dictionary(); + + + public bool TryGetValue(TKey key, out TValue value) + { + return _Dictionary.TryGetValue(key, out value); + } + + public TValue this[TKey key] + { + get + { + return _Dictionary[key]; + } + } + public IEnumerator> GetEnumerator() + { + return ((ICollection>)_Dictionary).GetEnumerator(); + } + + public void Add(TKey key, TValue value) + { + lock (_Padlock) + { + if (_Dictionary.ContainsKey(key) == false) + _Dictionary.Add(key, value); + } + } + } +} diff --git a/packages/Exceptron.Driver.0.1.0.8/Exceptron.Driver.0.1.0.8.nupkg b/packages/Exceptron.Driver.0.1.0.8/Exceptron.Driver.0.1.0.8.nupkg deleted file mode 100644 index af524d2e1364db6436597796deff0db35876ab73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23389 zcmc$_c~}$K^Ec|g4&pYVAjBOV#ke6VLPj0;g&Cc30kKuYEn-wul%-omMMXqKML~^< zipyZTVN`@8E+9fgL}>+~fv|@VvXP|Iea=06fA3v>_kG^`-22z{k#xG#eY(0%ovKfL zs`}4`?K^a9)B11Pi>tpEKlt;qscoA!t$*Fy3~WQ}3fvYf9^3jk=tloGBd_)S&#C|S z4{aKlF4-5fZP4DpUBO#q+r5U2A3JWypup_`vJG3dZ}J+lXZJ?8DMKXQ)0YNrTelmZ z5xjZJj^IJ~lI_7>LpJZ;y2al-mZQ#MS*GJ8y#FmcM134!Ya)~|D);J$9$M)&pZ zV|N4xZ3x)$Kb~*mxGCeNZd^Ap&?7Kl(xge_|MPs}|2BEve`3q&+ooNcF8{Hd)Ztm$ z&Dd(P@Sg*=od1RX{-3O0N&8D4 zxRj=sEUL8*k!D4&_g%4gPuZ#DZ3~Y;iQOH zA4;}eNF9J?Qw~p(3PTFRzZHGk#XlX}`pP8!2>=0#VF2e6=pv%EQ za%s}G(ogqaP7M`ougGBTy(+CnCcJ#Mt6_bDIFa9X;?(2nNs?*# zA4gE(AXxGi^vO1DT=2wg+p=D~J#hDgasTrY*syKe|IhQ6 zVYw@*XDq2y454Byd+HD}BSFeLQVcyfUwc>L;YIZnkcZVDUS+EoO9|O1NB-ymVX#V2 zTE-=Z#V_yOkDlgtvvAvse~WjYO*VyI>X&P*kEaV~yXR&Do$NBdy_>4Kp4LgHBX>$e z1n>*d8?oI_REO_MGHf%$+mZO@_DK@b%i1WiEUcHGgUG&uW|xsDwS#PWO)b8dPvECs zC2Wkv3pKY&shzgqTcC@=ns$MN0o0wR)sKEFtGOPF4(u%bT1d>=X^SH52GogqJ+pb$Q>tm= z`*+K`T^>**DwLXs@mK-w@CNvsByG&=(V&UeNrb9a;X;7JGM&^5lr!9WV*_nSi6v7A zTYR(Fm`MkETT+dYL`itFRNWbzvX(Pv?4Oaj_#x&szn87eu-HAVj=f}0E|Sd4>wKJS zc1o}(X9?vV6GY8o>O`Al2^GN^n0sAwe)YDR$dnrKZAyVnyVkGuIsKaWX&_5tm5y^J z4TRLja48uksqjoGo2?xV)|mVXW3h&_Hz{Sa0GtD$%<9BX2Gz07{QR$+2eKm#B3m%2 z65S{LI9|c;!Gk1on&w=(gg?^3sNhYMfk4^!*sI=m;6Sbq#rLqN@+&2GG}>bTPKRoI z29|~9f^|{6#s5n~$Qv`52(2BTRnwl_;ycx}pD@-^CBEiEw%;oMA_CS};TbT?tO2dx zYCxv^Pu|6f1PZYrQ-LRIXDtKWp^}JPrSd?jq{eNgo{=_vk>t>3sj$9hdkY^5)(8Xs zy6ITK5S+TAa6BobJ|p{ZZ3mL+gqC?gF6Lp{4WFhdCU2pOD7?!1JC~xX*NzbJ#TLQg zqZW)MQO9;Rk2hLBy_Jq-w{*hSEeH_ykm(KPYXtR{kg7eBM4+fhHUmNK8}SFiddrmY zBK|gLW{PiYL8dvN2$?+jR@OZo3uZo=Tv$D4PB#|f3kEf-RW4WSI$soAJGU->D6 zTiR!Cv3cBQjAz1OT7^L-7>l$$-cf_0wLe-r8D1lNR@He-9%FRE_Ho==?onV*E;D4x z?uqz~HIeKhiAAaG3|^4Uei!Y@?n1d@l8C>+Wy-K&r5GdG;_zlad|`~WT!An2!xxSg z^`HN^x5+c16G+O?d1BjgMKMHJErVCd@sCE@R07WuZB|)>s2uGO$x^HC3~wpbCB2v> z6V4JJ0NEXod4N1bC@f4bGW{*su3}^rE6%)U=L~|A+vyZ%%1Eb9e2S!s;Zms-B9B1p zn*;|#Jm~MHn3pJovcAw4w3LTPX0yUeA=VY-&;~V}2D(Pf7{jY4fs5W;s)Fo9Gz!Ja z-qZamVp%O72@PML#qNymFz83<9Fb6MG5BG9;~R{IadTdW9(ovQCn(e78PGO$5$Uyj zASjcW)Z5Z$8rZW{v1?}>K{Y1Hl2`G(FX-RbmP$nvNkgVC!ZSsiQ;4+UgP{dtQrH>~ zInyeUPz*Y8L$5+5H9Axq5FyKdrP$+BW?NZS!kEeID}248P?=o8q<#q8S zp;hpEpdh)J@b#v4IcSlYN+!$OeW3}jYa&n}YhGwymrV-`MKedZRLEy>wH}sRu{!mp zx+-EwS3dRPoNv8^!b+dQUJGUGL#_5?rffBOQWu$e^yF@}`6fmFJM}h2H7BBJOGtDY z>($cnG;z|#47((lex=5Jre|3s1v@=ljSKZsG#310I`;^=Q36||;O)Hk&+2CKumqDy zgxcfIl7m5}U%Z4hhu_I~KfV~uFirg)n}DVnvx|Z`WBkBoY}vAhrr~hN2J#Bwvxa-r zP-4`|pwsCIg5A6qh@)mcGRI$k@`RYxmv3FBO4+4w{aNESeJy_hJG|Km7SGK{{nCZX z#VWCwNDa#~rJ?I=6%z2!c}u{TlAr&~^e+H-dH=P7I)BQ{+$Y7S|FUS95l*=o?`6=B zcSMYA@th`xbHnSsB|f~}2V-26Ns5Kt@J>QqA$AR+f*nlviMUC&;FEAH#YgJ`j7}<> zxVirNWb&Y7uQ67v%YFcLy{X2W+_08v`Rn8o{V3m4u>dNaCF5B)S$Lbf-&f< zNWIj;ENi^{CiT0}>C}z3yFlBx{8>$Skx&Pm=Uht&_}czzYcyTKI}RMp*MPm}1;?Xe z((kQl8atV6;hq&ZYwk**fexYgL2>H=byvmeH_7~;D=#DRF@Zxhd;!&J>!ZU z2y}XQ<$zazP4^L?0`I^Ya4_nl%#!GOsGB!D^|soh?`m?{n`#dMUyR2XEY)X^{6
{M5 z>YuRB(MO-k^Xx^iF=9Hm7=x6#fa~V{g%;G?{6A;=1#_JzbVSu5{GO5dYa?zGX;&1+IIWQxkg*>#(xSV zU)OdlvUtEqwn|~KLo{3Ck(~>Ud0Wh+hWldDI|-difRa`pE-#BcsDRj>2JWkK)tC zYAl)A1MPX1@pg<^y29?^wt{kxX%@+c8q^OI6!}{3K&LKQMZ;fOu6$5ilsU;3)BVvW zd#czWQ*EXma7*Zsl_mzcVGTP+7@D=6jlvmBiw3OXeQVh+5|) z^uS&e2Kc*J+~Oj&-H+veu2R@1jC1-kde)Ymhx>u!ldr{69@hRxgN%N#M$!@=cbs!a z&t3JUvO%n-GRz+1&2{qyIuqnUkydTAB8x(%Y9W+T1pw`>f9j`|1)O zPZqY-YqTR-?@Wbcd&ZuN11F4-3=cxtL}bZ?0pv+?|5~D3L416Mt61>Tf0^}EaHiaX zHq6nTe`=k0Q#tghHK?&Ch#m|_On>L|pia&9At+-a>YqJfW;d4;Z>laHP4Hgv<`lVb z>kJU9EA{yh;%S_`L$gkEIOns_XXaU}cGOy7qcOK_Pqc?J+#GVGS=~#E4){tq7RDkQ z8nH@(^QOgn9YrJE*j8vs{ajFa{QzZGMyBzuWZJqFy{%O^|(R*JFVii+5?XF`60C1 z`b*WQYjxvdf2n4AT`_F>JcV>7YJX>ObQsVq;MAk~*0ru_b0?QGc+L!LO>!JIRX&wc zu}2@ivIU$Q#|>D%805C36SWG#PJ%&GBwHO920qCQ*!~kS9$ly}l$^)gOzmTXjW=qq zU=P;gQkw}f$#S9h)(o@H(#i(LRz$~B>Y+>5fpgy0qH0>n@?*hTGlNnSB|YVQ@fe9x zbeN@buV5c#k={YyRVN=3Sls>8S#KI*lKx~jm~JO!>a z{uXR@LXJKe9bRLj?K8a!tFPD`^@UtfWL8)Gy52MAD_Qzz&*H+TL}!G ztL*zK!H}c3RW#dx?PF`CiZ)33QAUG8zoWy19GS@pzD&Z36N2Dn!lH)Hs82GBGv2_Yd>dGmkifzD=wQfb1$iMn<$vvtV2X~!1T%UMJOh)|G1AL-8_k(@v z+PBNmH^-lu&cDo<-ez5tw@*VI-CwDe0eQ zQ;)wg;1+AiZUFW_-(S!&)<>M^F?G8B{CJ!yV1J?BU4ZQBCq`QF*W$h4!84oP%~Cpg zFKCht(vYQueO}J2VI9V~#X9clj3QZ_o|*P-U7MZ5*i4$Wf&YRMT9+*N_s0-I%DeXt zkNrZVaeeA*!R`%{7MWZtRHBK4TNI>5Hr^i&39VJM1t$bL?*Fojh-;{oBZhAWh)wd zI*-P%Ix{v%fLBRd_m`Z8xetFCbaR(JO>nHGP8RHJ4c?+J`D{O3mynNr&hnws%|7eH zif$<7UAJLJF6wHi@@uFUUZOAbrZ*k09_&Zqr0SFG&(g?0_#cDvahy&gqRt3*rxy)f zX9+%_lXw4xO8ekIxd?{tL*)U-zR9)TLJ%c`s}ZNE57m zB&#}6v!e#MnL%LZ_IRg!=?}ZCTJEH+rYLC9ZWDe}RO*n6~iIBANJQ1~lSKNj7i1ynoE0P46 zF=y!GD$0%&_6&BWPE9%1mxv)(^zJ?R4^UFd&UyNB;;e1cQSVR#-Ej#8rnCVmfn%Jj zq6uP}HAZ5^K{V!8pA+>sKPNn|?~oe(%C$sv8H15iG(9DRQJf5To?GRB!}5 zW8pC&v$)F4)-uyAaY`-vPU}XaG9s?z^~Ug-Pi>mP*;FCjHm!Qtp3%IEw{<(zXB_5D7imzoi$Xe zU3Oltru4Qr>yZUkH_Cr$z4Mh_>%DhP3yku9JnhJ;atA*28_P)_&iK8M&EQH%yE`v% zj)P33*I#2m#>fkj=#34Gwtu&RQIv}Q3!a);xHI?<89xI|)V){0lf-?i=bazo{c|X6 zy(Y1Bpk#Nihn%PGeLX#Rw8%tXmr|gG-Z^6&**P!MC!hzJk`e+sU660?O{U{zOqS?m z#sHv7XBT<%Rp5dglqv8jHB9-f-`1B9+K~R}lnKn4C8Ux%MOTZ+95%BFj%_!5r+l}` zNeCUblk%u(5+{38Zfhb1=M+$BwmLx$2-@HUWuup_*|FvOE#ckTX078dq}RdwE_sqp z7jI@i+%6<`zg)$54)@YYd!~?fZ@P4grxFmlI1_d}umnk7=O+=}3j>eNl`Pk*9CGZ9 ze95kn$rL{sioiET19qE^H{Qrz7}Uto-DLKhNN$FhILRxJEfc(qCYf7i6>W+h?+J>u zpL&j*Z!LjkpaZ}F`IDS$l`eO#nXF`NDcRY2Uz7RJRMKyM1rs+Grw%y!MI-<%b0D*P za=Q3F5ItSm1`Ks&}icZ@{3!iNEOj%O|EuVh9R*K#O*xDW~(D*IoY{7 z@pVeg)*6}XU2o)A-FtJFM+l7N$@nc`Y*M$&WPI#Bs?EHCycir6>dfC_;Vg53zfdQC zA`;pORoa~~lMKwsbrKJ;8N&uHUu)}wuB7Knv+--?90 zSdkj7GjA<9LctbbmY-Ptfi^oWbj2ydLe~Y=?2LH>KQUUJf|p~e)L$g{jxe{Iin*#7 z6%qO4%KAjY7V_hVZ86S_t1CXm7RW$8ZCIA$dhYM(Wi};+kN)^1`vVBx7&nBe3UNS# z{*TjfSib$@`icp{*9Xe*1ro}k*+5^JnfJ_hUMY^YH!;#UOwE_=ugM`G2YuLONw;kJam(`Y-)yD`}AAeYyVj`4G41{oc&joh?54 zkx$768N5CP!;YC_pjv3^djAU%+b?$Z-EMXmeXBz3*fg`#Jev=lgSq2rPN zi*%3IRgBI5%at@^zQsc@k?|s@LV1pbY5mGt%CvPyO-}lUWW>aO)2Tt1bzxwgAm4p- z%K^Xszf>?uBRT$w8FqM#Mg{?@2 zQdpfIC{&QOGNA|CFt1qK9Cq{H-qYLhV}EF^PJ6tE9<=#?WDS(y{>Ep16B%D)=3}SH z&sv1BR;@L^yzuu*{AlVHp#-^5t7=OnrjWZ-zT~c90Jny<4KF=q2$Q5VQ(*^D_t0{4 zhVz>>Y}jX~ujy<`_vf$7iBSir_$ohB5xw~60xR|wrBndqv*B}g;?q@Nvd+vgr{|WQ zkawtKTjKdLy~=z>Bsn6&X0$NFl_Euw1gfW!qWF7F*<$NhXxUR$N~|ao7Gq?gx9RhV zxd-_5;V%U>@&$J759aZw4!;FH63Ke6C#Hq-o(*$v^%Il!&+}H&nRkSvfQ(oYc@GY* z%ffJ&OC`s14`2lm+5WZs<`j+SI)U-=TI?O6c0%utTnUcmq_9vk8fV@*sZ2;RM#F#5 z;7kwHKf{_`?PTsTLvXFDZ6U@Kurk?|rv!ijKh@i|V)F2pFFM)}4HM$R^-lXm$Cn81 z)Wqk*?5UV~x$C1LMPuMMVp$!M#*&dlm=H1L9XRr81)BdXN+uLH{w7-%&Dy(>0Z-cK zT;B#+QyK7xw8X38QzUHLhU0u)=aJvu}x*(wN4#lK5*7 zv{=Jnv0BnbVoz%J9F=>5me50TKm2(@UQefAt*DimrF1aQNy%r>ISu=U3X_ zqPl$*lHGK73)y$qP7=@H+8I{Gn<$*!Hppk>itFVC;;)hni~DJ(=Ayvg+f8D*KCf12 zqNp3;mc&c;y6$JUSeiXNM3q?9rQVB9x66#O1gh=N+JmnL)4v`Rp6)j&-X&76CUJZ6 zqAVTf&(ja3G%1p963OuR%hn2?Hw2}`j+~N>Lo&?w-v%|vRI>K=D{=jk6sjM!lVPua zt)d0jzCc+d+2q7Kg5f_dNKWmm&OWnZ9$BwlbZyw5yj|Tl%4N*$ZK~%hyssIXK(lnm z)|)V~ZuHgY6sq9UkqndB$a3+d-IADZ=yh1SNnA+aiVmLPP_;-6Of>I^^XE$Dhp|}l z4VQKV_hG+>U|(2Z@%u~+J9@6|js2N#f`dhCzR(P> zKJa`lSeDQrd#|;DP7{_>-q?y}6#HCVkaaG2FsPuj|GG0-@F4Am4QS4!2_do69!>~v z_Dt|`pUWwNKAky5#l(ZJRr9bRMV2MaBim=73vbOn6D=^SGu1QwcD>Vw9&Y-Q%+uYx zZ&e*~{v_LQTJuY-M_mv6_e<1)=6$f=f`$CFvlm`}G0{FR=DNgf*yWOP=D8(hQhelQ z8yye-B&X8Xl0M45`_-pDf&$l&bE7Z516QjvsZWmwx((quKdM9F zsre@HoZD-{EW^J(N>fVnSTh)V{pvWU5**WU^wztR>_P}=) zo5X%!Yzd+Qlz+(3vV@~ex38Nt+T4=E0}P*h=6_K$zt+qcqG2#&7Wut9+uNHPO2uTO zI~7S-Zve*UYOw>$H0!#1$Lcb-zwZ3>V}>cJ*O$C5)V#~R>JlYyBI=Z-+IcUL0;4I6 z-g{*KMNLv141Ovk9`T~|CD>N|UIdbGx|dPf&k@-9Dg^-Tb_!o#U1x z4U)Dc{P(uX23qIGe=njwE;2gpzEsl+P<1jSz4(4fO{@rq{0QCC&4VOI+Va!z?Tk5! zQ4`J4l;@ykwc+cZX<^eo`5cpv+tvIL7^S`rRSM3O=L8Pc(dZYIC8kRp8n~^c5P683 z;CH;j`6XpHGN~C7GO_gU!D#O^9~F`PsgTZgiMf=_&aIhW`?EIs;gOsHn3b!MBaa22 znsHS?@q-Ka9(?+_ag@OK%bhk*UvRyJ4=cV(C050;zLM~b5?sV9VLh#;!x*(_2%ExM z#qdFtJe{ibLv1Xp=0*MNKh%u<`urZ*b5E$~w<1z486?Jh%2~F>tIL#IlIwp-> z@>}HVda(X-j}FP;RqxqlvyWd$glb||d}+NIb=n5At@Ge4kHK5q4`=GO)a>9L)=vrD z-De=RapI{nI>Gl<<(&^<3-St^K|gvH7jWWwP?ojM@sPgEpv#8;Oeg{)w!ead%~95F z-bUIcoj$Z}S<{bKY{Ir5nP^ElrV{}-;LjQlT)Rv+ddx$ExVk3U+~enTm_hz?tij{@ z-wogok-+6-N)}5-uH*c+Mz!KCwc!1Y8hwq7Y|RtmMYf0~l>b&-bVlYn)JH(tnFx(P z)Di~!&+z1{T+i=iAGI^jzb{JPEehlcd|t+`8ObHIIS5mWQ)eO5&w9Ai;pri7as0v;VP=hkOa&1w|t2M&=iY;PH+ zkW?YCU-AhuCKsnmZuR$xcJsh;1E^f_YE(`aUu1c|>`mO`{h&o$LDWTFvaY=?s;Y@x zEt%pWx}4j&-9lrn=$9pfek#an`e5KAq+t%s_{sfaO!9v+adrNT?UmQ77lQJdnk*&*xcQTvciY^XyRFJ0RFEFL z^njUkewu_(@h@HlXD}O>rJ$55!ob+vGpeYG(Cmh66M3!HAZ;x_Vh(2^>BU1<50DcI zgHEq7x=qI{Q#FO&vTcIMTG89u5`4N4kSw`?pU4s`lp3`ZE=l8&V}+w=6Q=kaqgl&2 z61}ysNac~`mm@nwA%Vp$6w21IC_&jq;{laAT&H6v!jLxzu7~FQatdvPX1P_VE23T_ z7{ce!HotP#6}+Dd-nSNTZm^YRn;Xo-(jd2SSrW`Xlvr5m2=c;?O~RQ0a%vZ2$^7MJX}fu#6@X zB~XF8A!1OK!dhF;VxRS10R{_UTE^l``JJrm4!x3CElkkoupfi)jQ2Z@+@Js~LF2oZ z0OvYn6ZXnT&xBPRmJ>c@dl>Wz13>)*o9Bc)Tz++_=HMS%i#`PV-WW+;2rr3a@r_55*%EUIznF{x(GV*)hJcFDF*7f~^iI8+SX$7f*4#6u>bWWq3%Gh>3C94y$<3_xB0B)ZOS^=v7j zN`QhtzTm6`#gUp2qn6c6Rc7iS5(w<47a=$T^dKpdx{^JFgtt~!5`}~`D@&OfAvj3f zu3{n-R_GO=nl^Vo?m_iJVOF)U$EX$Im9p4qWjVE=GHNA@*OBctzOV7q^+<8qVyBu2HzOkRz#+S5oL7XqHq_$P=2WT8fHcyI{lQwK8m`%kd^3!LdfI z7VBXhP8Zccpl%UnHTKv4LX+ro2&Uw9$vFflr3_No zu2L`Y0k%G5inxvjix9VvN|9d!FjP=$aa5Gvu(8`iF`N$L)S}M-+Hpw;Qejl7ihJA4Z zrP>n!er>G+q+(n5;N77oRL5G}mxI0YufC;>y&xBfEw_$&Fn=Q7NpcFnDz-_+yA=|( zt&Z?A;)aruxC_Rw@Wy*rZiQ9Nw-}iWxMx0#Q@5-DL2Zu(EF@HaBd)M64KF>*OvD-f z>)U)mEl$#6;#XxZ1h5C!}lnZG0G^Mb`#a$g&BP`O|g< zdzgN!vFEI1P)Hq3y@MvTkbsMeust5cC_RO}>AKeWR;J-6)2HPUsF_9*-q8lKw09^W z4kIn2v<$g7{Q$7@7XXq4bvA`tujb@X!gY`Z3~JWqE`pBKugKIHKTZQf>80Ly{Goyx z*9O-J2~k+D#_rX06v(vFRtsZE^u7SRkzE2|!0nFargB%f(@b$5miv@)6Uai3+*m;hGT9a> z38nn(0IM3<>|hyTz;+{PsiH9&u+&n@S}e?NAKdXoHA;AQz`K*@p$TUyREsnN@1#Un z)kz|oj8d)ubME0L!vJKUtsG-f80nl?;Ui&C(mGpNJeGmc3ewl#pWKAsX(Sagu;AFj zrb=2o1z+klt*iAq4PddT1g7E$B)LTi2FWudt;XSJ?;uJ@lkDZB{=DP;C_RIW0j!Wp z;+w?vsKziln?%HYyqZ$7Eemf_#|bxZ5xf@PC!~RhGm%1(tvkQ8v(~*VjIz+FEoHU< zDrK}bT_WH%j?6HLD&1U*%c5Vyw31=qomOj)L)gSD&OXrJ90eV7Hd$JiXcnkwV7Rxq z*XRUlU8FWp!Q!a+7su#imJn>ISE1>$AIv+08(r9D1;&RD2^F$w0=iUcE%I3q1N<_pJT12X>sITiVqYGJqlGA5a0NGSl2EsGB zle(4S#bw_-|MrDCdFtJANr*!WXX zF$PPY0U66y$!-I3uAqJ|(_{BTmC`yDhg{1= z`8M-pZ5d=)gGcp0y`XSJFf*L{8g%>gCpJ!EjbNWte}y(&Xmhy2V!ljef1K2}hC03M z#OgQfYZl7pH?laQTjp9ysIy2&#$ezGdS44Jka{1z7WF_-6w1PobhcD6Gp6-K!fM9z z`c?~|tkcgbzswdzl@G3p{vzj}fx%En8E~KdVf*9GZ|5=e2z9t&X;yD(3U+|QwABA0&9p` zIdn%y*aj`X2TO%GoNo!f_BcS-D>xf@g|aZXb>u#E*&FR4)gX>S4tJ|@UnX(_pR`#$ z$pZQkEJB%da1V>!v-gx7HhcRHJ7!h2eGnGMBZx-Br_ z4o2t=vU~~^Lys7m6lG{nYp86NwN60c-RieEI^zs+2{emtU1$~OEQL&DqPR=3mM=L6 znk0g>4EJv=d85gc4SoL2m@}T*m4z~D@+p?BaX>HotK^H>nqobDjb(Qwo`Aw}B4F|7 zmH|j|QYR*r0JB#1RH@|TrcLtkKZR5nh1-iblMD1k#j<8kKGf$$^|I~Ob7Rza285j; zOUwt^lj#x-^W7E%W+87F1a3~=r;fF`Uxm*OYiN^=e|D_@xFf!&K3VK&HWg|wJX65q(j8M9f$1tH9mBS>Z4EGKWiK zi*Qznv6=`k>-RM3jC?H}0QR~_jK|xNAfP5iMKjhpdsy8O?8ax&{Zknd{)4O7VkXdCfu?A~^8@d_NN5hL7gglI-bNKaEJ5*VWRZg?4ai zR?pKYlPzy#U?~|z**vDeR6@9bDrC(8V@%l8t3oVdGBOGjS+&h9?1blfC3eZ9mBk|H z$(wNcVwI+IZfFHp<#Ub2DVuH+&L?{z+X@3#lVD@U_n@2$Yq6qWCR?Ex!J+O(S&KCH z4r17Kw(RmBt%zH)c%liv8WHvriUM40*%z;({=uWTL$v)pxM|ThDprE>`x~fOKlme0 zf*V_GEBNmwTIj#pDAg8#=~*IMBo&kgsqCqDiBHYcRD%Z1&`>{Og^z~u^*gSovLp9A0If)o`1mFyz_10x2#C#=cAC>1I3A^gHl6dz4#D1FE~ zfNHds?q>nVKpMv$!4vMo^Ir@Kw7a7)??EOLzsqq}S-4#vf{HysVQinnuAnfoN;D$; z)L99BKc!52I2^y7BHa!$=|?6hT!>qvnx!X6C3OX2mx-LY5XA8I^=u?zkR(welz^~j z4Z}{py_b1Rbv z;LzWQU)3o9t|03WjKDdK#@L$Y3^i&oSb^<1v%TOB7jkBI%H{_h*;^Df7Yf-{*2ltz z@zx5uU>IZ&nSp>_0J!;u+j!i;S_tRo*rph3Tbj z6_NuKj$D$9NQlOG0B>SDexjBA^?+)F60wE#M7GY@!my#)V@3^cr2I5~EV70D=L}ot z|1!e=$u8BvYkG&j?9m zI;dxCo5*xRPzyZ(bOkVzMwJY}9wv)Gz+$2@F})(-Rt8zK4Rbt| zPHM8LNQ6=0BatnL+J>@wP>t_n{e|yxYXH@Rg^;w^<8~!^xaaj8SCN((ZZE#R=(hSl8w|~#Xai33Vo7J7{D`)r1ZpHUG=nw_xInLR3QvB% zm8C7LfzXOm$8|jPdbJ)fc*^EE>X>W%G!kKwb2MhA@Y`tTK@N+#Szj>9+iGWJ*+cNx zJZdp#l^W2a5k_@004~)LTiRJ!LOz`);%-{9>&%CDDV{!_fdt>G8A6uPCR>ER4y*ql zL$@(Qvjp#)3w#ei#~kOBefavf^ud44t;Ef#KZfdu*Apisbx*M6|GxcfcsN(X@a{`F zGjn5Gg?163@Z@YaD(Ts~qA4omKR-TPYQU&dRJf^cpdPR{WTe|;lf~Qz|2B;M1)ZvY zLPQrmZ~CkaYrSl=m&NQ7F=u}S9&yNkjD-kZ!iTL=eieS#V7AoXTxXWxwT=sQlKAB@ z)Z&k>Ka*L6iQl#YbikO4qlHFhzfR5L9zz?NR!s+Eu(A$drc}+lfTlRY>%DI0=pIle2W$COIozTcM1kzmZO8D zm^%I4mih`SzP3}vCdwRZl6anaYMVtm@ryPWk+V1?`vakvdIUx(`(BMDV}89*SXZ0C z3OMLc$1BegDxJf(ZT>ZLK~{a*mW-|Hty4)~hxq+oSI^%fSN@%wyeiR@@SOJfID~lC zq+MaXcTdT>CGiPa1^lq}Se#kP$xk{ZYQ#U>r|fGGObuxg7VgCAdPi?}JZwq!(6Y2Z+vu^xo9uz8?@cu&lY=5_L z&WkOs8D48rKF<6+E`5?NwxBq%cm&^v?Je#3nD{oFs)uKDMDo7_FHKZT3J82ksP-2; zrCvADJD0lM4YJ){-(xEo!>Ds^Y%Xo=-Q&I0w8ejgd-Qiz(>&WBA*x1-5&44{CqLxr z`Lt|B`heyS&e!iIo%wWRLj9vFo4AyTVi+F&&&XvCUyAqU-RL{73)TCn?guar&fm0f zR@kyl%eJV5<1(+YL2o3b3h#yr*Vz5X3hoZL+}km5!&RZ}c1!5IE~2z`CJ-Fy$ZhYk z>e39^%W<dcSY|xZmB$|(3=?1IEdus!nox4X)@mq8D zEOP&JDp6g1?zw!ok&c*!aosgv zRxE}mp9;0o8*Ni}ji@sECyFmk-;_Hb=R>@DZ|e3d&S8(nE_~L`uFTe;?3$@$`%Zer z7#bS>xvI=qePLVPvB@13H)cevSswRqhg*&lR&RsfPZo%_9w_4-0Tq`1w_{Sp&cdqb z`TLbOleEjNlZGa4%^>Ft34bHv;j*(0&o0Quj~xH+g)RVG8fnWQ+ce(PIGlV~aDvtc ze>(w=o>C21JxoAk-tnOEF|LKUO=B}djoDqSaL@&Y5?t1h7 z8AC4$j`v%bi%&t;*FDQ8xwy<$g(uu7$gCqKNUw|{n2~ezI!L;bcyP5|K3fJYhcmC;6c}_r1CpI^l5u$Z2#fo zF>dM1w;oo{vx~NK8~o2r3{ADVf4mnOHr;jW@yL~@`+}jh!M@5}>xTV01^OTT2u?_| z!Ed|tp2G5)NmME?e0#j(+M0hI`ZO3{)c0O9>&cp`FQ)D@aYO9^I#Grb1aJqF zQ0C;8j5#(TS^e_1m_!3s#ZJvpn6H?UR@UnVcDrR=v2g&5xfDaS?>$FRcHRP3F!`HUzthkulFxm`EE=n=M&vOEE}$Q%eG&( z^upJl5rTAJ{)Y>d&ae1aD;+Q3^{LZ5xsjKW`HU)e`c@KS`&EA8!{io4c8@je2d90H z{_N1xCZG73JW#pg*~s6P9D2X7GNj)_V%CtjpP`K{9vfp8sFv&xIU0LA>;9eh->!`S zb28rDocl9!4tTugFh8|?dxr_Pn%Xbo=mNd{Guu~Z>K)ZTQCVa9=~z5!VIOW&`rR^o;JfnZE@x8?Y&|z;B9~ZskO-LLwaHznqQ{pC?){FDqxwF-y|FNz z2nf|O7n|OuAKw~7PY*0Oe5zNkYUa7ceZ-j86Njd)AHLCQWIn9iTDEjh(DWG7*$?Mq zb0$?Cp1wZz&=?y%V+pf!;nMM|;<8**j_p(oe0XP>@%HB2pYG#D%TBHHb(o$bi0AjY z;^3f8czfkL6aCM#S54H6vaD@hrk=ZG|2|Mxu6MDXSY0!q;2!C;KYDZe1Fx#PD*2d% z^_BKr27aUdaW+GTo=3{!ogD+hzyAB|kBv9PIlh~g`Td3KM|we5R8wgq<5e5`!acJ8^eO){o#Tx!v}^Dnf?bZ(X09x?^fKh`_b8bXN68fpyS_# z|E^U>7^OR8^t`Yi;a6V1tI6N=Px=SUGIq66<6Hvw7PL9)aB`aGB50@tg?~nPt?4nuy{d@cQL%+Cgx;Z0!Pt@_% z9zm%OMea2bx>3rsdm~fEEZgC8}{&y|jnoX(CV+b?U9YC@fZ zkYwCyT}n+>39H|@b@59bDP^goVsh))8fs+C)J!#(bNPKI7VEXU|KIEX+E=f6&1ueg zp7T8OJm)!QzMs$cZ8N?+vs{omW|yypS>bdW`qI%VV|IP$EbXe613t~OtgGsfj zn@^nnVv~AVL)rE#ZV{X)#hy({yrsPHduS?#%8vkm&4=> z_r_k936K=?Nz`%g_M8>7+*&SohUNvA+|QBcp(e(&Fq8T2))nt^@QN^+vRAj*uhd5p zEoXU~@1!12^4fET#Xh!Dv0rg6qO>IZ%FX`CN?Sh%$;G}j>b+7mz-YC(*;taZ%`T$b zAhhDf@;Wv{M&~^i9k9K-7eTxylr-q=o?ZGXWX|$qw6Ey^Mk*r995c;!ZnKeKjjIMO z=$m}>-VpIE&kVDMqxaa8_s+f6XuZil z)UI(ac3YOZV%;lz|IN7M7B#!%MZUePexLMKjl;FPo`Q&hoY@(-59_Vz+_dYEGKzAW zay-yz)XdP!*@X+P5MxKV^i$t8?Q|NE*q_C%_@}Gp6i7~$EKC5jh)iC8O;*;U<_=Luvv^kaCg6Lx zXomFPCr^2LT?se9`}L)=3fzM!Qi^At;T=~Z3xwHt#hwyRsfgX>TQ~Z8xh9OEb@&S- z>X!%Szje177qR3*=mI9AKEwo{nY~N$++-cApIe##)Eh3>FP%4NDmquw@pB~v{b+VH zsDN|19p6`%tuVK=Ib%R!bBq1M?)z_6htZE$oU%4lA8ab3*`ODx_}9WmukGPul!b6l z{Mkjxj+cx%;Z<`Eq5>=Ji#G3N5a9`9hEt3K1;1}qY_y&btOsMn?3VeG7Y4=;(R)YS z1}yWxP+nDNb;|>hwe=t^r9MiZYTl8xX9(~^7+H=W>SR}(FhRX&RM};xGy7}TUhaGP zG_l0^>1=AiJ@G&(NKWh$tN5!@fl^#(Q+P7;)RPh3H?9!7*(0m$*uSXWJU*GFTo>z# zSAx+JN3wT*_($4?&bi5sNaU;e9E{aaYU;2D5}<_Ph307mhcQMNA^ z!f!)PCk@@$w5uf*d!}YfaQHFX1f8!&e9*I&=&uWv%+a}8OKN#7*39;Ho9`VwoHUt| zZsky>kTQ*r32!^!Qp6NlWsk^M;2k#;y{%!S1t|D7ukg ztY|X^ydh317fi0DB|Mz5q8{SQA<{Pz?-HfasgOJ0;a8uDB_j!_*0W6~K0umV5}^@; zgqVzkB$d!Wn-CBZ{-|%3HIU-lJMfX~=Y;q^Fg^B^XfA+su_WGfIiX8aR<(dR07^OZ zB~RS{wMz$|~Mo64$&jH<{QfG2PEWn_$ zSrZ1*dp&RAe$o!!j?ho>J2H(6xS_SO@;K(-$|o{qnmhzgj0N#@ByR6czG%}m4crUG zkOG2Xxr8+p)zJbWEwnftxSRTENJZKB%6f!L<*8bAuC7%4P7QAha4A6eB{mAzJ+EN7s9uT3 z@7LmY(g|Pp&X?Fv6GmKxOvO90fqTv;5pWVLhtL!>+E%?nXb5zrUmveNXn0z#_mzww zIgD2Br1k`V17G97Ia`BKUo=8%f!7wZ8r01*{{qndWIQRF!|P6=MHD4Mq&9UHC@DZ-kC$N&alFGg0hGd`78 zcgY`!4r8c3sR&RdeD$kXuWab1Hxe<$c4VsV@2=tZ zKH$9>qIVe^y>MeiGtcJhl9w3PtZPV)Rm&mtJ}8VN8;e(pe-z?Rc!Ga#IapJ$_bp6TdAq$S<&1L#Z^d^`z^v|R*RPVD&cX);9zwNwqjoVWF<9;t z+&0`!%{b7ROa_N^w3tJAV*NHUU82K0I^wE zwg6j6wmn095|$O803{c`wi8nY9`d-kK4pdwM5?{ z{^C&=SMMi1w7nk9Y(_x@5ZMfbZgxv&QPY!~pC?FK8zj)+Q}`^)vTl*c5OERuemg#3ZV# zs{lr@Wbm2}xf9t1VeqBgZFjvDLsoUV?Bdhw>$c(cnJ?u1`SmWZTE@Aqm!$swY3oqMytztTQq6p;~6h1JEt{dl?-~P ztA&O7=WU#jgZIIerZX7)jukoLO4(sblXZ-Nec-Zpdg+1pX@A01O}ChMR~xszMcg9n zTvrkBGuBE-L32-w*h(i@QzL~`jc(edk%o9;=0fJ)(oR;~-1Uhx7T)1f8?!ubUVLss zJC8PEY`k8J&n0G+4vPzHoH6_GxI*DkXS))NY&Sj2)ZjB8o*F1KNBfx6EZV|oKvn>m zr;#TgO+E!l287~9n8}PY*W-am3;KX^997DlZ?#oH%%3fD8WNp67}HmRm%t8;gG@Ut z;dh>hY?1G#2RGxSIDRc1kNJQV!43vakw(_wQ(rS8rt6H0Q~{}TK*vhBtv|stt1@wh zb1}|IDN_5Lk6ie=l~>tFzr@u};|$e#wURTj^8z(*3gGaA!AT|6Snj)@T!&kh_bk?+ zClKz@!Pd|5#3d4*?HGY9(FS*)D|gU;xSrl@BNuh0F{K!ns_>p)K4H+rd?N!a9#m*d zfFw+}!wv0`nNut7krfm6Foo=Y;JX@ii;yY`HF4xACqwe5;~jdNCarvE$ze7w z@K$E#ie^#Ljk7qYC$x|;$&8V@Xu6!#U7#JFn$d{YU{odK3WHQ_fu9PLhu!0GbC0U6 z`9I{|;epU@f$#Na7Bfe2XHQ`Efw+RS)aU}ko1f4*J%a{WN}lyty%X|e+(JHY$JK(K z^)5T)@>qt9y;`t?fdz++o`qYQs*7LgqB^|$7v1*v|M3?PUVBztu{J-CB$*7SI!DV{ zxSm}*q&Gc_EvWg1bursNC{to!TU4GZz@&)E7HxiHuVI+(6SWKjULA2vmqyx7w9!`4 z`Kn4*2Dt@$#a%@axP+x@kyn5ZUb}CV-oz9!88@;0$J1jGuR+Z{#TVZc;If>eYYFv= z9X(cPs!Z}EKAtE@dLvu(JeRRbOf>xM4iB2)P zAUyucEG1ga9$B4o?5;Y-WASuXrbkAHW#J)XZi%;lcTP$Wha$du@xVPT{cdYa3FIsm zGiP+Q2?J4;T8KLI4@Lz-68s?+IG5U?3A_0tQG*ItlM7Xpv=yEYpNLB9!3ah{=v;*v zkJ%N3(v})C*Exfya97-Tv?Ahb?J`sIkm19|IqquZw-hwh7AzVyLs>i^Q=(2o(@(%- z&du)KPdQmb3mkVz2JHY4r8&A+hq89bM`U(R4Gd@mUe z-}BDCfAK?2v)HYqUA#Z`I0*l2ic7J(`w9IuW+{ftk$9&qYs?s=FUexk&PthwUpf2#bEr;Nh7)k%vC>JMXWO`ay0l4Ls6Sl{1R zi=XhSt8+Q#IzXoGwGvp1e>=YOukegu0s0>ytvcSQ*GJswdrGTwV8BPLYIsz{rd}*- zU;ry$8t^ zy90x^21JC0>!`Jy`Jc9XkNbR|?%2>k_%1?&LxUnXUjk5jkN<4H>jzdY=j*8e%bhyQ zmG#>Pu3VDwT~KTRk^Z$jBEm`u8tDNHE8dA!Y$&;&$>!QJXV zRmbH0Te!Ww_5DA2y#epr=D;tgzz!cS9UYqZ6AaiM`rC`D{ex5d#_#>plkfr}gMa`G-}xVu2K4D) zwC^vA{sz|l(-Z$i@4g`ae(WEscRXM+^y%xM_h~x(9^d>WrTH_M^ZSB-M(_Q+pffCE zUryx@EaWdM`8`SY^GX!@djAJk_RF69ex>}pE@X|~-@k5tdHUa9SD&B$vX9;$U1eTN T4GeXM8NlBGxEPDS)&2Kh1Z~9@ diff --git a/packages/Exceptron.Driver.0.1.0.8/lib/net20/Exceptron.Driver.dll b/packages/Exceptron.Driver.0.1.0.8/lib/net20/Exceptron.Driver.dll deleted file mode 100644 index 91083f055b40a725f92d3ba07020dec84690f33f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35840 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 JqyLv4_`m*txG(?!