From 61a0c34aef1de9bce0e0912e587546ae8ba0fa32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Simonsen?= Date: Sun, 23 Aug 2015 17:15:41 +0200 Subject: [PATCH] Since CouchPotato will not drop a release that matches by name, even if the IMDB id doesn't match, I've added to Jackett that it doesn't return releases that have an IMDB that doesn't match the one we're searching for. This should prevent CouchPotato from grabbing wrong movies (for example downloading San Andreas Quake instead of San Andreas). Updated nxtgn indexer to implement the changed interface in develop compared to master. Implemented missing imdb id on TorrentPotato, and changed JsonResponse to not include null values (to prevent imdb property being shown when we don't know it) Added thetvdb and imdb id to torznab, as they are part of the torznab specification, albeit optional. Added imdb ID for movies. Will now only look at the first 3 pages when searching. To prevent flooding server when searching for a common term. A category is now assigned to releases. Changed nxtgn banner to only be copied if newer upon build. Added support for nxtgn.org # Conflicts: # src/Jackett/Jackett.csproj --- src/Jackett/Content/logos/nxtgn.png | Bin 0 -> 28946 bytes src/Jackett/Controllers/PotatoController.cs | 3 +- src/Jackett/Indexers/NxtGn.cs | 213 ++++++++++++++++++ src/Jackett/Jackett.csproj | 4 + src/Jackett/Models/ReleaseInfo.cs | 1 + src/Jackett/Models/ResultPage.cs | 2 + .../Models/TorrentPotatoResponseItem.cs | 2 +- src/Jackett/Utils/JsonContent.cs | 2 +- src/Jackett/Utils/TorznabCapsUtil.cs | 10 + 9 files changed, 234 insertions(+), 3 deletions(-) create mode 100644 src/Jackett/Content/logos/nxtgn.png create mode 100644 src/Jackett/Indexers/NxtGn.cs diff --git a/src/Jackett/Content/logos/nxtgn.png b/src/Jackett/Content/logos/nxtgn.png new file mode 100644 index 0000000000000000000000000000000000000000..74d7e1ce806fda9c4b2a04d6cca1ddd39c0fcf40 GIT binary patch literal 28946 zcmZsCWl)^I7w*e;fu&GbD6Y$5TO5i*VR0!1mf{pG?ydzED{jS0ks?1@+}))}k>XB) z7WX1s{PsU{Ki#>>Br{1SXL6n=iPBJ0eDaw3F#rHhl$GQ(|J9rSiUb7oPm+J! z`|n=`d#j}R3IP0A0RSBa0N4Li=p6v?RA_WrM64LE0Bg0OYt;uGS)XaPq$MGkSKQ{u1Us`ePb5bO&W z61*fl#nTYAeDDe4m=buk-jJ4&E@;S#bf}g-q^$)7Up@JKNO$K=$kw95 z5+EK**F_m{EJP3diVWB$`L>EReD$ZY_!b+kln9d!0ppP{|KEn6BZ5=WO2NRGt9QAp zd5(%4P$;I;{+1rV=QLqgtBCgZdt_5TV|`;SsA%S>i*h>_{VP3s+LO!m{|a?K7k%;x^y@*~-pC=CFBJpaE-N9(P9p)bxmpMC&Jv?Pg{SZTwijcl*!Q#rezrD^j z{+D=DKQ+1exakmkYIwr%OKPkk~a-;m;v0bu^A1eH|%hk z0r-2kvICkmqBj#C=e^_7j!;yE*&rq7CsFrrrmVaWkmC(t!2hCDTub8f*Q_^Gs#F#t(;dzFCGoKUIeGZwkI^9((ytROG=G$F zeu6~F1M%W{Q1vxyUDr)YbGz$dKc0W$`uX10f0b2u zvMX{AE+j2qKEGdA?!O}A?-aLtY7p|iBwAJw?nrR}evXe%jsKjwTQf9#t7l}b$5f$M z#C0Rul`~_N^e47%?03f(D}OzPEE)wQjrbS1=wGI*dc_UQH?#Nk$uq1lNUDix8+EYV zY5kabp)5sq?(xZ^{NqA_O)4q7*vE~Ao2xOM=l)L5cznm)bDEv#M8o~!7$@00<-&|j zZZF@i1U3(D>xgxFE?t|*q?_gt9{OdlAzLY|5^QqyFHsYZWVUh7!ffVR4xaruiWyOx zxR<}jgj{ylq({?3#e_48m})(ixL{Ec zrQiMS!e^h3`zTIh4k`ZrNM`t>O0T5qc75B6`ha6a%tyVIJaH%P-5sIF0WvegQ78g~ z@L-U~PltDGcts^ZX3R)J00xTe0!fLcfb#AycjFFU)An@VWe;_82hSlOj1ZjEPc0`l z1+^O)U?ngyRg$!v92CjO{SyuGXJZgqeIQwfkwo(5sw+nLch4cP!m-g-0nnt(pPh!IW%7Uq5|3mz1BGP= zo?a7p-!g*nI^t&iRXDXG_E05xU#k|cyk;+fT~0aHFj z1Ea*<`BX$iL@UM{iXvt-hhT+luhq|@Nc)xDPLpC9oqu)&V4Twa1Ndo(iWOVmP(V20 zXaEiTO?H<4yBjLyg7r7p1pnR1aGKk+{tB|3E=HMpB~_4_3k`$;2K!2iSLUBn9(UtM z^AGz*6av^-*vMzYlPTDHB_MJctwM|D5vhwXL7SaO znJ1I3A{{o;DMdS>5X-?D=(w)1?{-26})H01^uW=R?z-AwYU11Plv4?LGoY%Zo+7)`_N?6H==v zcW#1$u~MwS%%pMvsBiPF3>b++E;sR|50?}vEkiBZnG4zSjH{r`b~mg@;^u zH2FU`@#TV)CY>-kI@l=?JI!CGzk9;*J&kzC@n3;^V6foKaM7@?kyyy;4OB*3TRmXs zYYk^b+f4;(SRbD;Y;D2cDgm)7Zf|eDziV-O5{^Hr;N?>#B{Kg#LJ>;K_~;Cm+&FNr zkErcIKl2t7xvT!WzSR|!TG8I8U%F!QmKh6F2m{b@WsIPhep<2*@Ns%FGz^9XgS$YP zhpFSxdg(<~xB&7tZ}AZTE&o;4*&@wO7^0HtRjd6wyq*lGFR6H5beX&$B7^)sWjBLsv4CB zM-1dEe}R&MJ|jrOWf08BDv3?D$`HOJEKMb52r`EyZ*gAIcVom?zNO55niLuef$`jq^ZSOcC}@S(%X7 zN*63dVF1ogOF$pAae9L};>Rr*^mlgbCu#Ez&W6l2fD-fHNL>B?HFA&p^TD`K+l4$V zDbxkH9HH0H3vtnitSE_yz~yLndamZ>Y;@MZ8x6r;5B9r5Z}kP~w%@0$Uo+g%z-8oS z41N+2U}-Jx2^qG-D1p#C7+xOc^NiC%OT|7&gA%lHvj_l*O4wNCuRaKXa1F`faHQ1T z3?xr=`Jmj9|6><3z#3f_Kb(KQfkf<=2`mNRgs@Pe-?|#H>p{s0M}ilWPexwK(_~OV ze>R>&LO>xS-AqW5fe?*Umcj9(Ma%^U1jdbl;QctQ4}nE0SP-rn5YjUPxTXmQVWEFv zj7ldYJ)y}gRgXu;@M9pevjx#&?Sa;oFO;8KahFVng2|E4E*PweRNdH|oKyjbgGh(e z-md+(*&R=6WkwE2lVAY~rVy-!D|QAV!U){fZtXCF9`uj>@^7}^v9YFMg(+hcF@cqH z4uY3nUJly6*2MEI9~XGELBv|xuDg?O?*fk_qH1A=0#aerK7 zz**68RzVVYJK1|>E|jY-xPe`Ie+*vFx#XU}r1ULi z%oLDdQgZ2jWXr@(xwFCkC$55bxkSx9n8S z?*TDrB}yb1jM4}LNTa#_TseH$b|+?(fs#X1s2pR7M)D!4=qe(E(m9i$yVtq5JFU*` z@lXv)Few%zf6Szo?u_jAxRl5GvhMxuIFn34s(U;TMU^h{L_-PC2+pgT6rm$LTUhq> z-~ZP3hW5qX^ya>>(@K-)qa@R-jJ1I7exkM@6ZmeoIX|qYdK_S=`|;8Y8*r?9Odwa& zhpagVfhohn$@0C&{vFWyRiX~WmWn+oYu{TQtTa6$5N`SO@U_^ZF@=J+->*%NA&K$k za^?V0z7k$(Pk7VJ-r40uH*scPI3UBxY4(hd)9h-VRs~6#2qOW&a(5{w>*{59r$i)S zP&BG=#Yxnl&rr-ge;+nN(XzCf`lGf1J;*5n#}pzrdEV7cm5-+g3= zjDDa^*^_uJ!h~F1rht&kLQSE2E*Nh{)%_rN!sC}H=W-7+&l-@y!(Q7STPrR zL@ZB@#$YgK`S1S7j(g|`oB02F;z;mpGg}tC1%rplMM8fETu|BUe&y|+Eb##oC*~$C z6xGav4@419spJuPCwh*&=13%tObCp6=G)%vI`NF9Q+|0XHJJ}sz@|JE3RY%PG(?|Dp&)?i&kg+; zuJf;MN%<69dje3GoJv@E{R5$f3}9iUHH@d%rBKk`>}&4hQAhcN5{$|Sot@ZQY>DLj zCJO-a2vrE@t!Xlp5i1`|o;bE=P&y?pA>n{oLKPYrK^|d~cTNLDWpTh~<9w?qRagqk z7c#t6?Csz_8<4Z853>vs&p7^=B83&y4Zs<5Us0T8{)+)eq~p7Z8R5^KhJC_S97eEc z){1PG&i@d1?!0Use^>L1x3I_7WhoPm&kX^YK z@4-<3EK(M$;MY)@&)JH7?)5T-y2-mgGjk@5tMUdBP|9#X8PG#pMonOMagakzbp|by z)NvHMb&!umZey#WBdwf+wabQV%#ZaTP-tX7E*W!`4-x0aJBLZ*+8`~x27Dy03LNvm?%73`i&_ zV_`!zo;}59AAl;^!WiDHK|@$h5Jxk|0o&mTFCMIe&J~kTBwaTxONY0MmACalHv>U7 zrIXO=svji9gE!Ha!S%OM!f3gdK|WWZ_yog;1}CicDk!1H&)D zAyC?v<&hBIe~~@0Q$y=m^MVC97z_KiwY<*H_Ivu6F~6mvIeLf&BRfc*Ip-w^dfeqN zYqP&-W2D``a}posx9i2n!vGG>gQ3AtjYTC>3uIE!8S=6IGt!MN;$R%rsY1j{9Buyy zbm25VqD!*M8V}v0QeDbUTqzKIGPxk3vq)r-A`gU-R-f>ToJ$Jm;dDW4sowsLa)Qcf zp`(>|MGRL&%r+EKgd%#C`RE)g$~hpl>%sBJl<7Ad;r51EXnq=kM4PV*J0dvwVW>o% zxrUZIN#qx+M<*=)rdVq*blrI}7O~5}9pD9U5(S*tYXGI-R0=3mj*T-3v}SsyF)9y` z@jZ`BY&$053?_!575u6Y!Kg4KfW@dHKwQw+2Ua~$sjhF(k#(u>45~Vt-Ym}Xxs7UE z^(mgPf$jagHSE0Dth~RPmt^AqF$x z8?ZZMeYD!{es}GUqP5RoYnO3beFXRu!D#i+%HXgU<^}D0ptLC}^j%aN919kMkRu;Q z6);%ReK+m{i9ha{rGC}DxMs&Z^xgNA82uYglBE11R+t#h zXCSfR&KuVaYy&TRlll1wjc0HIjo{i_-#*}Vl+tZNSfuQ5#pyQjLt$&UT4HRiX z`BmUR)9|30!iR@~0yNS!{XDa=(+fWUpuwf}J^c|Y~q9`Y=SNN&ZSjw%4e1`C-sV*ZZf2zV-?-74nPm9<{#GPp%1}USI1CCtxjTDAPVjR8Z$Rv$hqGt> z%#oaJEBSBWTSiNRWe&v^h}f^)SXgpEsl+&2c_EY&YjQo-=#df~nFq)~u5bQDUTs(X(r=yY$ z_itLoE%_3dxK^>P>p>*OE&YFBP{NU<34{H$mzPBl7%`kNA7W#bhlp3D4Y9_P0p&rf zaV`dH8E$T^B}M7zI{uD26A)hZS#VAtIK~kOn`_^!}Fx&Al~cKepQSxN{6lmX=9WO#)B- zlP7pzJuesZXN490c$T$&HsiEiK4*NhHP^AM_G=p9%mo8Wthz#!JPsrtqoGeXG~azI zu+{cAoQ)Z(qZ0f~jLSoAPkcI}{E1%8%Gh9kX&V<8w_$|EMMh5PTgK|J0YLeLNZ#gf zJ)$<%b87De=IeNcQ!YD4v7J8c6AhUU@+gOpvkEU28m}BVXxcaqzy~3#??~ zDN(k)W8cEeOO2VXX48Xsq6*aCUB-AOq9H0#ys+0AP>2RSC9&T7OeB)yX^7S=c3;y1 z+_9~SNQO4j(bV;z#BcqNe!h);QS0LFyS-oIw+jq+_d%z*cdzBlFTbSlGDP6~4*J*@ zjs6Q2WMb~;BzTiv#HW?kPa}0d5kAExd7oq*_&1bcr1+ln8rv3^FcWlY z(s8wy@HRG9XmoYafj_cF&B5^n0}t0de{QpCFT+p73*LSU2|2O-`{l|z1^=^ihP%s7 zC(5|!d;}j~eNFvC@5AoH-|O<;Q2Bl|$CJDDnBs=T-(+pRp4EY0jUU+vFMZcbs~_{t zvH+97*J>$vp3CzDoY9PyWeY)5z<6PGU_*wH^C%orR))GRj~2k?arFp=mx#?CXY>@5 zRvZ^?TT8|=v~JP&rKNN~^zMeVjKWz%0{r900fys8um|C3)N_i?^ZicOz4d`;7`t+B zQ%=G+SM!hA3bZtkH{?Z?TzE-}#5zr!6kS~+94eL@0;6R_WvNWkAcBgh$%*U!%D}6w z?9hizsq3E(IsO?nY1jl15QyYQfjJXo5Q|t83^uc3mZQT*?v|xOi@t7~X1`4fTbQ0L zL@h`DVwS1!=X3JBu578me5xC|P}XR8)TlNRO%hR&6h-yZ%lJcI__Cfqj` zvl2m13DxP-!r# zg-s*-ciuYabj|ed*nVZs;-aZZ5}biPEITMf6E+WwL}|{7Z?~f}l(4(5JZM#GYHI!) zO!OhuQSrVBVEYH%5OiP6=_=r2LK|%afUquh`)sL;zV?EG!wCB8p2~;v*~_ol%7m;N zB`0V3CDB^Nvn1hodGibNbGZ35k2{Q`L}4xF(P?LuqYaA%J_xK?8A6JRNl9BY1ZIbw0Ne< zAcbH^aQ0n6uYaSE;ZP7p_vh{6@!h4#L+W_Y1<^y^f{Fj-f_2b+deGI5=|i^n>Wk%O z9*D~BCi^{s5b~DF(2oEI&`3lN;>Y}OWhKN8FE03;73Va@mfYR_I-O@grNSscHwmZE z(Ve{X|M z?B)3uT75^c)LDNG@C5N8=EWug2eW-{R{mXyaE`siHFf5kj>UBh_9tCUAtAG3-zl}U zxE|Y|$-P!(RJfY_cjRqX%J+4Jbqv0ywIDV`2pNCeL}Q_n%f7Sz;Z*9WdU-%tJ;e<56bv0fNC zsmjTozxF6J5l57^QrF#2)49tp zZ=`P5F_Gv~5iLbIS`Zx6-bn$)$_%a42b5^A#a`8_kqYZsP>ub8TW+dLoX__%_+8(I zKbid9=HBh-w?zI2UB-@z!VF-gbuQ&ZPxuaKrP(`)4`G!QxIDtjTs5VZdE z?kU^j%fij$`}WR2%;o5ku+wNnZ|=>7iU04Rm@{}?Yus)fEx~*Fs8&VMC@*;ywRu-T z9wYr3`StyedUb0KLbz7t^`7;U*L|5&b55(=+sR7UMbrG*H-TScBY6v?<$*yn$t*v@ z>={WrY`Kll%2GXhAY*J>c{Z~4eWH`#V#Q_h#C!(Aw(d{#)KSZD%YW@xyC%0Z2~syn z&FPv|HIgEHHZrIs`Oi`L%tEfQXcA^EW6pvnS3UxC^j9sMgK-hq(OQL9(%7dKgg@@5*}be*(Y(M5>U% zVaHP_j6#H8Y_^4+;=-J>!hqdudu3wXtZ^=I${P{veJLpA^Hs}J=s<;yC7X8x;`p)w)?qX zb&Q|T#|2;FlKc_t&)ke6UbC}gfK5-ogAREuq{p5oV4I`!VJSH~>+V14#xHw&QRDY+ z4}DZ@gI_YKvctt9%*V8kND>)oOxDM%-HksWDl*I!i1~uBT!8wioJ`b7N%{ zId2w3>T8-OOdK)8q3sV#Qg=U1Zq{Ssro;SZ4=v)nj%P1QzguuJ{NsSd=uBF@9IdS@ zJ8Rsw4n*ntYp<3ULlRRofwpM~1E-4qFo$U@Yc&$J=rPu>;Jq~3Z|-FM6haR8>aWYz zH8y7ToxWB#T9umTIFos1kaiBB;d)!Q41IIKDGG4%AKA&$7y@j;mYz1Pd-^7gfp1lI_m(ugC3wxBiilozu2elt^LN9$wlg*>kD3V6V(3Ha*s0 zB-S@$;p9u5l(Jc}bZy(OeANvL4!5B}e-iFXA8sF(S0s~gp&#;7R#x)4Uuy=Jp04k7 zrOJQm`>qNhh76LVMa$tNeRq{C7tz%JPqu1>^Zu_Qcjw>wpzqc2DG=#-s*CpsawX;(X-l2R}AwwiJia8P|dHnlC_sEv}6G=v!1_R6LHK-D?A45MM z+|%5v|1VGHT`I=-!4>Su^IBum5@kR2Z~t^`+F02_jPp42&1-@V2XKWesWc=-w$_Ze zHqtkZ##%dX{~YJ|-fFtPZLRn1VILh%)Tu_1@M<|I-UMA$KJ5Tm^F8WbllqEt%M>o^Ysof2}V$^Q#1ttBJW(W$}GBrj;z(L#jhVj?$|nYX-E7zRx#US=^%) z+seZ1RQXK_^Mdpl>HzJET+zF8iVkGCgF!9U+2a0O@zZUUVspQ{&Ca&#MGV1vg<3p7 zy2rH{7Xs&p`ddRBk|@renFHoXRg3jDdBU|lJ^QCrCh4qdFNtP{qrQ*7+ZDc_jVnFA z8+y3I!9Aw?O4(MGM^cEGkQe2!W+GfVaDcu=`u_J}=kvDI^}$p^(4G1{B5L&h!hTA= zLh#v-ZfxuA2I`v@mm;aU6o+i7sWxzt_v$EX|GSjX+Q&T(ZZ5p53907C-}AqeKP^N! zDcH*1Y_vBTw_dK!Fuxp(njfa@$I@zjOTE(OM!SzjbBEi3%%$UD5ko30(PHTkDar7;p_4Z-qAD?R{p#iEGF!@ZVeKdZ|7$?#zV*( zK;N0lk+5c8NIfvzXDjCT9#tCOUpC(V#_Ze4MSrTKlC}2i|65jK2j37eQhnd8ll0#W z#{2tT>Hv>aPTfb{%9Wd}pa+Jd<0tp$Cbv>D7Qlh)req`pe2j&}SNh0&mzr82hUvb6 z5mrqZy;{s3jZkx2e)lV`bdT&VDdCg4>TNc~&vtLeADTn28SWeoqkHd+QqMi74Hoj( zrRjxdvm|o}iD0DE-Fed+&nEL+g=5di5&+@#u z%`~|S?_N6^GsR#YZh~^asjNw_)y%ZCwX@Z`#?esyp}N4oFFO~+J=vpCN?XZo#`Bac z$|nPr4<{?f@A?rkfOUC_pn`2n&3`F)v(b@4)FD%Slp+ux=f>GtxjY2BtUdsdH;Q9p z&0V-6g(%fRdP8MeFi+u#SXO&x<*jFN)Rgr}B;W#cHg$O6a~C~vDzb*oB)8f2zeDOC z43Y^G1cDAi3-7Ka}8@aU^ z_gKvA>)#Q2FUp6Gj5b%Ton735yU>F}lq|@*v!<7+2uhSTiCcRP6Ta)y%j`~Q`-(R7 zH!UGK=}ZBfG|N;dF`UVtjFizwhgh=^D*EgRp7mo$}ZkE|uvtjnM zta|_MKM@r}l(vXb+Qwt_uuX4SGfidL<({u7-S!t!e=Pzqy?vv|;*8UxP$t?mMCTa~ zca1xLl5|P-+!r|9JmMuj+mGE!7qlr=nIivYew{qkf5{U&&>yalfvXlG)(b2oIz`E7 zG=XqRZF)x__z{>-MJ6eRE43DSYtGMoL?h{IcG0&xBPbFSxZmzgG)$eO?ILfKpey{b zgvx}9c86ILMXKT)@-y(yLc!N#$^UBny`Aq)ipt|s74r9*N661Yuy~_%8_w#CT)-@E ze72^pEc`C|rQ*9ebn!mmK0?Y+>P^opV?FeEsTM;mWVM%Y+ z69d>v1YyyUgF8^4g(4Xx2m8m8;B)DK-@kJG4l)yrjef{f+t#}MzVW>q z_oH*nc7E@*omohkLy$45 zK!mtw@tNk~Q#Li?-75hMTzT2ShHH%5N^#QzN-Qv`M2x+q@Sn#tf^$wXF%kvPhSY-T z0fOS7ydvri2hFec{f>YepiftkD+Ue%G#0kowJ)ZeG^&awObO z=LM!Y_w4LyjDv?I>e%YXapSAV|73S6a}k*(dEKS?b^r7Ihp(5)oo{0v{`(rsYTj+> znc_`IoGkE&P+Rgzw;2+>V{;U*az6C&?4;;nC+KwGq4Mr_?fq=@T9d&@h8(_zDWlwW zK*54}Hdh|+Xlhxjj%$_Is)Hc?!^zd;CeOp)f$korbb7ImGvbX$EFm+8ciU1|R~v>w zu0F>KovCuR<8_{rc&^rTd$ySj!D>GWQ3W$Q6`U$k(OF+MsUV5YYIb!sjGC+^F$ zT%ee{{l@T+B+$6L^%UE!9`OP3i+T^na1-}n;}C)Qd2_EI%K~ha0~*UCY@Y6=4+n}; zMi;ZI&5g6 zn-<1=9=Nx!0*#2_kMQ=KOrqjxncTW8)8B)U#9hPKsdY7%D%yTpIdl;kqXSb4hktf6 z_Ce{MaRd3+!5yz*SpAEd#*EFH@3(}rY@9Xn+^Kzn{=iO<{PrX>LRew({-7gv& zX?Eq=lAbt^t|y60WRPN`ou@<(Q{5|=)xX2JtUWv1?9nC53X5PX`1Hs8!7kS~G8c_w zN3Y7B&Zz6Q?psUU#dMyoNL{Db?jraRh#n|dAfMztI+hcXU%`TKT&H>%p3KRQ0Z&T-?sz6tG#zIV{V4b9P;O|1q|I)SXt^ zr2K!~e4B3}0Sx{E2t@2gYLzqrC@;UR(b$K2>XQdbBo ze~J6iAJo;ex zfaL8D-->|BDdVM85!WLE1>&a_j*h6>E;Mi_gD#fsdLJ@ZaAr_G`ZgT?x?De}W7+S&uRC;>}6fO1IY$q}>9;cb_*jVI+|rM%PWXfg7K{>j=Mq zJ#vF~>h*n|Z~xP4{?3r;PtD}HHH|Vhiba1aBUV0?5>%i^6ICY%Z8C^08Y6>*x+Qvy zn@HY_46HT>O2sdM4gQ>-tfVIxKUlq?6@q-j937i+>E>x?!df~YAG!kT%v{n z{t&{x&)_&4?5~Zkr@uNiCin6cOh&9CyoJPvviFa*wZD>HYv87RSv#Gj<>zb%(V5=bOfNqS z?#QjQU;Za__}W@hfNLfsAY71olS|(A?cwsS;ha;F(~Fy36XO>*=XqN0I?wk5P{~~U zM)b>pXD%28rkIxU`0p=Iq-{qJrUbsm@SBYMQrLU8S0Ux#w{%ehOCZJzx9`1L!31g% zV$vK#B70y4SqNo)7^h<>Z)hYKI~J`?>}O5Co9!oJI`y?LpKvvzKQ{Wbdqy`PFp^pI zd!Uq$MpgG0aBz~x2f@^6JxGR)?_+7GwYy<#cX}bZn^#C(;;y;!0N=` zcFB}^U_mN$9q?)`Mmc)RosW+k%KP9!d-}zW4bZ0eMUCIMx9C z)#I(_&BoVS20O1YIs$tg)TpO1VR!mBLd?(G(ojqwDF-;UFHVOEWto#My-OK-#%I;R z{!%zx!TE6HY}uePglT*bhWH|Jy?fVaa(cGziu05hwJQ?!K^1BQC6UHb0G}IBKGGsL z+@^ooI2N_{x6X0ueRM$>7ZK*D<1FCx-wz8WjO(A9ChmY{YtIi22Ar@SP)HYAx{t$y zguEdKNC&!*iRa@l?qs}g4ko5?DF(;129J$8YY=;R&z-439b_}L>xp3-g~6^`+Sqg9 z<`M8%&`x3-D^!EFCOKUyX#J03WzfF5y;iony1?W?&k&h3{lcF-7q;AY4c;3E^%R}N z;l9kY5IGtEgolGA@@hP&Lr6zXN6?#v70;~MxNXyI0 z$>e=~MC4*W2z<8=<*0nH5fRIvJv{O74s~0*@+dE0F_s@?FaIBDn+#%l(*htuhLuD$}hxK(Vf1<+7SPJuLPUe@6 z_!hxsuv$b>)@T}$Cik$fS*;aYG>LA6_?)xzr^Wx|X2z^-W6Hy*`^_sSNbqCYO4#j< zX0#Zeun;&MwOtFq=`Q&gW1G`-@<~n1QdqbLa7cMdbJDN8mXk7c%PIM98IBteQ)T>XF_beq?>tw&j0c%;@bqEc8g&Xu(4 z{oQ@;vbTm=nM+w$G*3UO%@urmAMdB!fRl*htfA<-sK+{s_sj)Kyp;#-)4ni&3`NR` zOdgI782@dH5sT@04be>Ry?cSREaHDZ>CW@X?^gDBrTOJ=Dy^Jt$>~uq=HGjESd2ja zU`;PQBuN^tLH&*2`af9e1>^GFtZ>1g)K%1XvvMgHf$^98YMNqaJ50TyrxW(a+zijE zpzh2tgicNUfK+yNhu+rPFOHc@h!HFAptku=_o~L^!iioYskXuIBKEeV3Z%$&7u7;i zMZPK#Lt=65n}yN4yWmg9s3!j)?Wg^SCg5m^;Pl8KLzQzEiU&mjjav-K~)+p z4=1%#1?{02<0$i?0};Y8dE(5p`tJ0Lt>LJd!?<3<#siDtesj!LYh2@a?!W&LMmjO4 zs<>*9OU$u_o@F+@*1_=fXI4$}?hwP>%1s)!<93YK!l0jhX}7*9v*&W-6QHha5PBS9 z`F^JSxwNVvJ>9{Re@uOal?b)b!|L&^N$y?N1MHQ0joot;b+JM3JC87eWO(JU{Ogx5 zT}9hkZ?;U-oI0dUL$}|#O&c$9XR7eJiti>iNgwSa;Rf=F9jlI}86AtBQ_i-+6NPprihS3JNR9#pZapGn& zeN0$O&XZ#0$(@Sag?9(L9&gW7$yRS_gI125TJ|J$-E)4IJN4ce2MTnp{bXx_aDHLR zD{O9PH~Dor5G1O))%bAU8FX8lQ1aau#covkaIiOnv8r8|8t-u7{q*%{%NK{0<)ap4N7P_N z^4L=>cdLV)GrY6jFz1{;&0($aev~X&X^n}!Gc<}^VXfL`>IMhU`twr`lO(&AgAzE ziN?eb@AHaN^V)%j@mNW{SD7~7VzVGU1;L)}??X$yMdxuN9x>-$4 zH?wgJ_wp~=l2{x{L5c0<0c!&GHs$T!s1grVdE;ybKmrkEnOZhEz z-B`PFtge!t6Bt6XFS-w+o~;wH6_3rjdop#v#rpI#U$t+Qeokz?W^OjQmVgtX!j}JW z^a4MNNa{s}s}R*|7Y*GjpAk+n4f`7p`bHhKoN9SbpM5oQ`RH=@aBH<%wY))H?Cu&O z73ec$*~hF>^>_IyI;D9GV)cS_%f2`MLG^dPBW?_{l6_N|GlfeKzfZDHcW1-@*yyNw zg|m}0X!xQM%d+3?ow=*-T>)osJ&LRKwJo9*b7mMIk;PTADE00XHS=a6`t4>woRTM3 z9<_ZjeWqA@hVGlWFA)7=(iQ*X)T?fqRYFA1kVBH(kV>&hnzk{ic&j+Zo2aHx+s)yb zcEy{0%%#)MQR}m|s>9^;DR&+plYO^$$HOx;x)nDIs&U@$b&VZaSig(i{CoG`kO$4z z7+_>rZQY6?c3a?0%#TSD^yga5%LC(aM{oGjIiLsolt00tdFDt!Q;s-EdO9p>LOZEg z!BV+zb!m9f@4rEwH&t&ItKn`r%ZAoj4ngWM?z3V%7L$lwB;=)gFg)4=QWA9e=iBRC zYEJO?7MF{?%-YS>iPoU2i^GU<&)K=itV0oYBJxmg1zWn@<>gPCp~J8E_-NVkH`I5W&tyO`$ zSHFM1y)u_*^JHO(ezm9-9pQ~TXFR&ydp|o=)=uxx)kW-wU<>u1`!U*|+O7Q&O7 z=z<3~6Ml9J#?t7U^)%A$zS?zYKn&+sP@KtE55`RDXgijB&&J^>Hk1KP6&wsrW#L6h zPErlNr*0oTw~~FoY+v0b_UDQOsIWaFX}WTGw>cy5M44%7)N9$u6~vwU*{3zbE>WlT zH4ZsM;a^WZL&Gdg<9L60Ex4q{QhxfNlH_&I{mvzs?tvn)qHV!~)7&i1wno^aM_&=q z#Da-tnsB8r+2Qx$1EWI`+bOKH*0FH0$-@8UjsuQ^l=hlo6uoAt+xCVu`2tr-3_T?AvmU5hsE8274|&W!+#=SbokE zzTDlCWgEf&{4sw{HJEudA^Ahh)u#uc7-pmj?tirm_qR;BxBZ3~96L$L!I=B&s8Or4 z*||W>+E^9`+xSk^M{<-e#?;F>-$4mJW3n52_SLfT14P5oNosPrL#t#ytVe{#0m0U2 z-RjIF4wfl=%c=kvy~6Q-V|gc8`YoT=zPvX7!_4S&lrVF3;S=RlI|J_8r=ZoHxJ|v?5>tG1Xwy2SwGswTC&d~zFxSmU=>;XSqah@w{%_uKwf1Z-J}$>IohSOTS;OIZQL{qAIKYfgNMTz&?TweS zpmzvbIVEf{RsMed`FKU=N%cPh>sJJ>`^XOsLoU;n?a~j#b=Hct>xai?F=~~|%T=?v*xAbVlW57x6Ow6MrQ+xSGp6O(5Rd zlVyyF=jIbOw5|4RSLtb!9sie4{Y_l+7-{r~L}h&Rk7-x4eF7gz`X}B_y&gJAQ?ya; z7H;C=ZKq=i<5FbaG#mwO##~DviMxf)JHwKsEq=$!2A$l%z4tl= z>kivCQkB~%aYHFzKfO~9o`9R*;cR|~R%Lxyz}JiNr}p-A3@q|_0{dQm`!+R`Z;@P! zd4HKzi$e<*e8@{#*;kB=94~Z1GLVlj{n=-XJ|y;Cv%d<4PVRkN#ivK(;u6X}b-W45 z8CO7Q4SePzq|7F#W6$_Mb-e{pTtU|@I=I6?umC|OxVyW%yJv6)cXxsXhu{vu-8}^N z;4XpS3==#Adwl=B@2k4??yH%au5-Fqcb`6|rcdu)d+ozp4_byywU_ywn*-bXiMZY% zJ$eF}+6(kGH^Ka{H|u105-l{nO%iW}e>}yD&xyO{ek4^~f9lG6yK}y8(^l^m%t`eF zP~74*BZt1Syn>QH`2e3Z@c_S=)`XpWMP`huQN4A1$5JI%(Btu122-{s@16UkyWNM} zsviUTLb8`>6TZ?9(tcZ#mAE-HZF8Dh9G8ex>@G%8QrbTtlQTATf z%D180-}?HK*~&405>6k!7)m}5IHkD8CXx+h(X6&51}=vAkpz$ib}lEU9ygr!npJG@ zgj4kNf1Y#MJoY-*WfK&()ovc_%>lF(xjdCn^vpf!QM^XJmI@O8KFA*`4V=O_)p&h6 zp>sBVAWXKjJ3Q?|jtR|cRV;BQSBI;xNLipck@{1$cH*_n=UI~Osk?V)Z}Y4i{8((4 zhxe|%%dR@PmRE}z$GQKy*NIMXzN5W~5m84&u>m*%=5^pRS}#qHnqTLRA$X5m0sYYl zvTGHlL)R=b_+odHl7F!&nho`8TTf2@1Ub{|5m~#S+rG8sV)tX3S}}#+endlTLYKy# zcUkXnAi>&aFZt~u@ZW3jXjT7%xojP)S)g+S3xNyagZ9wmX|X=PM!=qmI#Q z4!9Mkn0BA#R!^eS=<8K;C%mI^!addWRI3Yq%80FDFy>2n@!`j~mf#~J?|aU(_c1EM zAqMoK%F!}n-{V!hYnYa`aPs{ARb)Mf{Cq?syR|Fs$JaOzNO3K^K_@$eAW9zIC3Chs z-Wp*QfhM|x7Dm#fBAR3%=D>|lpzXvw7dPZi{;&)c9P_#0Pd_;FQhqK<`#S z8UmwiWq@Ni4t!kkyhenAW}KWEgXLr&@Um3#=m;Z+SFJ@)^#BeX7AfP9Cl2Hj>bbuA zbCFK3(Jl8#>nLkbJ!jXfE2xx>yWM%k8@ggH6QN);P3UiP%^*R46v?5{oSg1U&ZC<$ zgQlbqQe0P?!u{#@!^=!-2I2mhpiV_g;U`MjD@xvo(qsde)Ss~d-*Wsm&;*@t&$H$0 z_^hE-DJy6zUV#nUN%~>nd`9SYPdpiC%(R3^g4)ZIhn&5kg1>^i!mH7}H$UD4IPY3A z$4GRoen7h@y{j(qC-#~145F<4M$w+MuBI!hvGyPK5tHSvz}3KSK&*q@@wls7%47OV zpvq$-h7K1>yW+8zIPBjv7i78WejYPA;e9uSLII)A2o9x%1rbmk99Y@U&=*ip@1!R^l+4S&Vsu z6VC%3b9B{-6U4aTExx|soBfQcVM+=dn^Zefo#k~GCc6Ky(+BFDB(g{Wy|CQO7UUDZrz@5{_~xeDa8fzXOx3;`sL6T zA41U9nBbJUf1Lb-2Oen|4ZTG+6RAY`h&n16G0!r`+qP5RUQ|0(8U#X0Y=y1C#|6=j z#wt~4-tmSH;vL={b|0iZn5xZt9Gi$t>;NWT?@{v#%C7eNy9XSJG{}gj?N_1`!=up- zyzwL=S8%PX4IW*NkWtK*W}2mTo!WUmd|2C!RR07(`+_Kl#~HRx%q1%Lg}b)xc5cht zSRiIUQ=5eTa|N2lp;SffH70o)5p@ZoNfJrABoGGC9@1DA@oa1jbk&xtF~XNj6=ucu zGJV8$wTnO_;F3rJ3nwhJ%v~5FQ~%rxzDT8bD4Px1yZUHT;Cp&W9b4DqEd#+aPR+sb zu9H)Lj|G?-2xq544I_-8adx*%W2qj0$%{4A9vgYELHY;Gy&e9&Ez+>uY21J;i3&i6 zL;Hv{U@_zr;O%m~l$t2KumEWuG%2**e~Kib3W1Lypd)+87U2lRm*GJ9BPpE!#iM>- zB87R)mdDvF5cbBSxJoT}OwUrQ;hRtg?%22G7!2wyZ9(+zzwz<4v)ZD<^T2V&Y0wv~ zcHVFMxJ(kLv&Ftlpe_7CTGt%K$S7F#IUR~o;@j?O8ygmk+Koql#y=eFM)9s+E(!E- zFEjVJhhErwxBA+@t|xZaGOMToTsXWr%2H2iIIEIr@ftj+LTmaxX_L}Y82}X9z3a9u zV}@H>(R?IdIe6nI{ISdKrOdFCBr~V4!b?&U#Yn-9SW82N(ZV*8TdmV@1IHI1Y;G-u zeVegi{C>th;@Gk-ljz%7%t~X%z>|ME#4^jLI z^WSi`CG6)N9xD@f0{2lg$ug6;Si74kU24I5!{SwLKKIk|s(Z%MLOAi=s3FXUx zR1+XXiUx_|vk5eNM@`t76-L`^?{LGqJbWAxfG&D>6(v;@> zE8dO)9krTXkIT(KDys}G0-lr0$sZ@31D<;~V6{%QET6kIReOF%OYk%MG6N)tTPO`+ zaOt!$ty4CSuHGifoC4?0d60HP11%2eRl&ewf?Iui-Bo$P=Yg4NqrolziKRwF?63HYoIq3wN|*NbPGZ>C1*!HisKe%# zF^i7yC-g;NakM*;4hI)WT6Iq_B?ax-$zg{Cg&%z$+r@U#$Lk&S4jdwWYX5pE{VymVJGSDV*v8J-YF- z6`CkeD#E(Uo!aGK^I%jaX2sGVbAXdtP~>$?=5lG*R(G95o9WDB4Fx6=JuNjI=E~)N zla+YCaq?$7eU+UFj20V?SDOWAztHdJb8RRZP@ep+RZh%mJ*P006O{omqaClHuAuAs zbVYZO9@^4d_>MM&JHCVU{$iWy+rn1&!`)h{4`*A^+)hwWr`N~{qDJ-z)73p}lkrf7 z%Z>^q$=>E@{pQ$E=v~-%=Dmt4YxF03u3y%K9*YUT+2IWB@(ed}$u7Pm-bII}2x^S{ z`_Dq^j>0X4+wlUQzodcL0o<}|xk?zGx7iWULp0%0Ln?tb5t4J>Pn zw+WE!joWAy;8QppUQfd>6HyTnBf*x1{iR5^yfbr_20sS-oB@*C@prXcwcsJCx+qtT zXn$+6wb+nN8f`#B$}Rm}z#tXFA&TE;A~%LTp4lGgFm)cDJVTbmM*vwgSya z5q0etq?^BIP<>_5{+^FLcAR_6vQPzhQd=*FhJ_6?&#siE#nmV+9!eUZj~BKu_zG9n z?<&c+qU2x$u~~@Ms+xmv^XZpGT?-x)N}EJ?IgkjRrRg}G$)s3Sh~vj2zvDewbI0K_ zmmmA{`(JgiMur?y4pZLk?T=;N0!DOHOv$Oe9%#KsPpz&YRF0yrV*j)5+^=5)%gc8* zV)qYQc|zWG{W8V?)=oWQR{@G>IPpqrCdXFw?}yD`A6rb^2{4C=!45Ow!|uy%$%gZ^ zQ@@Nlup=Z^XNXyeb`7xmevg_*wNXOaRBo0MG~*<@F?>cwVvU&G+#%Y_5X+^fM%jSi~}gzG6> ziE0kmX5PzN+gXq2K@m zOgcj1W#dqBJMyuv!Z)J7M&e4pJ8ZtR^uXuuXsRI`b`Y+-8usAG)+HEK!B(!JH0bZ; z%fj-C9fT|l=3V|8@bTg1UwwbRb6wZ8+!+!<%Z|+PHYsb6_-*NOjh2D*PZ*VR?~iEi{>AbaCY=P|p7!rOvA0VN2M zGUZQDlT&ImGTiH|;|vIFo@=(6>%Q);5*{-_-Mr#<37s0n`d{0yo5zwyD?AFhDG|+d zkg4UdMpjZEgPJxt9CetOCkbVKzYqJF@+(>b172Jlo8Gi%9+@guWmcL$?*dnmLo`?g3#OBxmN=dCgW;bDwq(jKvJAqn3~%MhIq1-#r6=`U*oB2!9uCdKWVK3h zk2o_NNBMXyBLT@1b2T=5;wCoxi_vkw=wGrxtfCS1(CP7X0%c)~?q0=; zn(6TRRh@GiMT1DVFfBwyq(jXUeig&G2h_r!mg#V~q8+ZiYepwdx#QmT=Y7|1T#>r< zdOlP0)C-!rt<9KJ#Hi?!CckUI={I#-0zQ}N-rGKBTLFE?w~uk4;LBm>?aoV9^IOq( zS134Tq|@{eU}62FpQsEjjJe1y!Onh~GG{0`W&uE)q``nJJx_@r@YAql zIXT(h$$divY^i~yK-N<1W5R$2*wX()`F3V+4?Ww$XsYwYi^i5?l84cxR{R(y_zT3CYzb4ndh^8kV4XmH3Ds(d5)g zKbry;imBuE!xv@xa?A8*Xa$wJ<8N$_Xe$}dWZM|Oa{-xc*pO|)@8hjgapBqN%NS%Q ze-By*b1C_ee-~f-1%hXbEz#%UrrqU69x_+=s6Z8AWtiu;h5JA~(6V!S)O@yIA{1}^ zb(mJy{QJnUmIujC^QLvjj8wQ)VP1MbC|nxI9KIg^A8=y)i~Q}s4_I#t;AjggEN%2$ zD%m<7K^bgmP{{(Z&7cT=MmEh!c5m>}-M{6S)p)1gXSeF~Qm9uNb!v%JcP4H8Hw1!H zk~Lg7do5LW*#&4l5@*aD^-Es+cE{C>kvGh^U={_jRsQdqwIYCkhg4x1xLD`q#mf;* ztZy&(8DcOcd;bi^9O&$-aj3M2#j8PsPk}GX#QzA#-WU$F%BI&hlNY!;FmL@dwiFwf zk{Qj+U~mlaw$^;vxp7EE&J#z>vBFHacXEUz9?M9zs^6b6^J$NyA*qu^U^ZQjRgP&JDb26M zlgwp!l0^ra5XiAK9hkRk&eYsv%6>!Vjo3dFw>C?kS(9DY(l|m?d!BIXHFu-)j^#b@lWjg_n8CI41g(Xgx%uzaf|LPG@bA!3U$(YNwaeY z$BK9RyHW9(+&{r-kS}<(Xthkp54+X^J9#sscI6gdSP%E@Ij%)fE4U%-iY6IKy5LVo zgdac35H^N}RikzE7=Ia&yLS*Z!k+(CaEgEo`0f$d+uAi=SbbvI=)D2JKnS<~An`GN zPkZ8xeoFYzL+>_GJabxQcYihUJ}&|oofZN>{2nqeDzB42i=FTtO%_Xe1C)F$Pl~k% zV9|3YsO*?yw;MzN;VvGWn`eZfV527pqyf`$^5Nm=c~Ohg^lIKGVOfL#xhwFfIg~@l zWzdiTF}M=rn_4u6MUYd*XlyDpO%!}>*Ph%egvs}UsH3fe$4MV>KZe(5QNn99@ zz1nourtlcKJ!(*e>g9c{7^w4!l7Wgl;9B3d;N8y)=JNP<%36vYsoGer**q?9GyVmN zjY60N7@sNA%O9HF+Vx)PfYekaV$u%R*Q6u_Ax|h2M2)_u?WGf%ngUvN z@J^`&946%?6-5ofkU=gtSVL3Sv$w$kA`ezf1TP#g@i)B3IJjA;QD*(N{_CL(do<{`z0Ob!ewkkRRAXacaL!=m-|B5f#a6sj=Y8h*>f zh*O3~6yerH6yb1{3B*zAer*)j8C8GJfR+cZ_FIFwXdxM}SPI{uy7z5fF_}`}hi0W_ zWv;e_hC&y0RdMv&JH8;*7aHJRlX_#G}Ybd9{=g`*U8Jp=p%q@>rT51pu#NvTKzYTyRzj zvMjLKEg7J0$bm;yi+z19@<7X$^?Bpr`2O zk^MKUc0uT75?z^VR>52;$TY=^UWbw{zQ*6pzptB4hd^fTFeX)3KRR@cOP>^*!m zM;eaYZ~(pnNtp&FDjDcotQ6WZ9QQwH>H9`Pihv(!h|GbW+#-l=cJ0ZxyhP*@!+2o> zA?M&fV@0~zB`r5$Agr|Ef&3g55zXC@QrXn-XydM?*v7i>!etsIc13ubnvlS{Iax%w z`ROG=bT4kC(w@x9snU4Wx(;>5_%5u0;en#oR!MX7G8L1lO)AgjHj9$TERtkuyrP7f z(#o$VHH@d!8g@dm)V~1eAEhgS0)$~S2v&g09}~nts>Scc>i99u1j&Zkq7ul!FnJ$= zRTg*<92_+*jgp@Yw&4jq2!zxKhAqycKMSFRAyZM_P%4KcTZinf*}f}EES5$LYcN!G zw~(Nw9R_`ss_|St0hx=Ep*Z8ld}ph-v_su45MTcw-1pJ_XxAd6-cwJcm4f0v zCm}BkTJ}U6$)uLh)<}U5$y3R@7mOcQH%~-GM+-$K3?z@43O z*5}@)zv)#ah<|aasZG~tLQUaaPcR@E56ki#Dq^gjfAde-s73l|D~<}JFE+2x^*fXr z%jQ9m1MiK6*2j_IOO#UU7t9XZLX_i=B^&mnBH;MJn9*Dwglh=8eZ}-Y==ZA7r*t&3 zxZTm+Zdx(ys)qqHOQCO!+COQs;u`PAARlP5WOljlW@r^gV%_vUPe@jiW=;zUs(iFr;i#0j12wDN}<{3_v)6hz@=xrP5 zu{G2gEQC>TbtBg4wGoqLOE@?!F^R)*RHIv@sXu=QGT;I5w3!XXsVSo+4efiaBuaqD z09ySSB-tTumE@ngJkdZPI;)*uqTFBMOg5!bxUVH25`8mTB0>O)m48w@2VnbY`?!tQ zgCFlUO$_eoYnRBQ)K%#AxAN}pthpu?&j4`rcf0RvG>1Z&EjDev+lxdh<&#jl=$0&HxpEs+W0C8~(tUk_}1y%2?@&~>Yy)6=^TXLqgHWE#OP9Jxk z>MnQ+UKdAOF$R`3r0@G4r>l3K2g=w2-k5=B)vtpTLv~-Nca>^MF`W6>M7*x19$?SI zD>}KV#+PNUyDRswi@r-evxl)G(dH&sN#S-~-dNw4H_3=^Q5B1t4`5HoV{^eH_ynPu z_z$1y>*Z4Wrd;rC1{XmbOIqmKz}$WRCG_s!>Fn!ieNG6^73j0CPTxJ<&ee>_EtA*| z?5@~u$zi1ZO)+9WT`&43icQQN8daa@<+W7Vs`k`s*70!Hy4CH?7X0)vQRM08MXgah z_l%qztmpFIsMy1>?X_h#E$yyQd)*c}H1MgU;ORN|vc3!QtQPc=y2KBwsgZ0qiR<}$ zQ15~|`}}ltvD4LfJ=1MD#WgD`WWrq6`+Qg_N73tZq9Jhuk9u<&x5IKIV+p2E7w1SJ z!o&_mcvH#yeBjdppp4({s;J1s#5lt*me2+n!hb|17XLe*IdM<$p(%+OiwP|y1ibhq z4BTq4th>O`%t0PCp5c{)kLrUAw7XkDDtWS{bVAb{yc~)_sX>oWjQE)9Aqbtb-IW3W zBpov|5>`0kKSx&u6S&1GWgW7CUbj5jnC}kW%u)@(Q zSQr;{wE*ZhnJ2lah zGr{pDw&zx}K>wqQ^xntzi*3=smtPO&SEH|c1u*E2NRR(n|1;YwTYcZneAe~Rg6=!x z+n;jzCSsmfP>Pp7wJSRTu;ut`3cupUHbR<{D6y9}5B*y+gTN=|?zJ+ad_^I&i2vBR z|E^(_n^e%N^3CKfD13%j^88F6YBFzE(Dn2?hAyA~;cqG(tBC8rn91^jo`BP51KBz40M$e2#|3OLs<@Q|ZygnHi(O2C6r{E@AMpxai_=$*uy) zP6DhtldfnT@EY*+(O<&o?FG6JTGcHF7K`_F#f-Mht$Ymj6e&B%ZvCeGR0@O7+F$O( z9&KLF$LZJ*#yCS5L02zN7Jn)Af07teN=SN8;qPQ8yi~>B|@Gj z?(Tfp!vXBXUK~OlVj-PoCyvkyGAI-qZufTyk#mnfMTjmh+tVMM7cxKq9MJsiro@#C zo)1>*`FiXfd=%IJ2g6@3@$35@*W0|oL8;>!y9Mb&(|*2yM<|f~q7H*rf^PThW!>+q z^sI5vru1Af^R~}p-W!F;kS0;|wXvK$cHEO5YP=)Q3dKoy zvtVU$*+exzq{Dh@%FlU%&acgsNor{qAKP-5X~ef2+oOd1qhKZ?_csgI0hbpzeH6J& zDI>k@L2?3!W!YHG?$3nl6CXY})_B0SJK-E2bDq2PcCwBA-Q7GIQUWUUzl_{FIIRg)YxYz*!$`1mES|rqZ#vx6sn5FqvsnhZw(WC=6Hk)>AWn z8Cqzo(vZ*8NG?RglSNHpNUgoo!|ztl^^P02g}rPU@kMn%{_~OlGmDI-ObNh54W%w* z7Z<;z4nk|HPX}K`oWE(TukWKF%zBi>S>jNUFq8l_B5%r)H6+n{bTfk3!GbEWiTR~DX zPkgI*ZXBK>iTO!^DW!kkDQk*Ln>z(JHgY~dTLDco=%A^|e->tcp8|LTVaxvM)odcq z5qWyR#qoDG7X&MM`N7#ygRM@mCGTxGsYFqaAlS?HG$~&WG@)sCg2b=dsCJs#sn)pw z(z382VGOZu>*Gf49<`H`1&qf-g#jFVth#?go##86o+C8Tp0f`TliP)ez^N%c-aM#UfTaJ5nD>a#Yh1wtm_PUFF8Fz8XluE|M(yPoVpc|tDCA$U z@-QL<6R+Xbee{OO=3U#|tdAU&vnlBe2HYL*C$7yW1U)Sm9Q>hp-RdW*+1L=%7YjTb zKPq^A@izSpY)e0^LiLpSZt3B|1CUE5+3bIe-+6RILj5uYv}-2AB7qmX`MaR7+!O4< z{vq+|q{4J+NGLw(l=$Z$O4NA|g|=oxu2P8xv4r%WfdHbgvL#bV1qpqyzD5P=amVN< z1%zsD_Bi?AUWjsLyd2&+N4OvW9?=Z#@6K~?@O66q%jLzzj2kFkQr7Hi*7BaQDL%kM z_|5w^lEOF+!2HmGkU$AG+Dx9{bp614TAY?M5Q4BOQI#2>Du-Xz%5@oclwok$hB)p7UF`vpBImHC8+ z#3(1{XttpH`QO=!**~x4GfUTHg_MPI-ZnnJ{WTX;g65G;n|V-qhE# zcB?*t_8zviVqlrXr}s$5$E)h(pqhYOveCXk9sA`Q{o%T4@Y#m~BP}F)`!C9ba*yp! z6wr&l`+bT6VP8(~ptkP)(|=RrwduFphj*WuuSn~AIVO%=tLL~~gRQI_{hJwScOFg) zjP!(#x(zG>-LI!C5-IoY`=6HVxm$GJHavBCm)qLa{?7MZh3nZzQO(AB({1;=bX_iy+bj8rVdXJMX#}XcnQp+AGaLVYM!UhR7a?HeQCF5 z&`6kz04Zw&LmGJ26^)VV2+dH8iuB9IJAs)Q2u+D_%<#o&OJKn~0J$2H%#Y~EeR|o_ zt~ya*i@7hr{&E0U5+JUr(AHM9fkp7%qlir9Y7R)M014!Z;hNlo3*in2pi{j=_sgMg zC046eAdeL^F@n_9t5t6bq8P$qq{MpQ%ekf>y(z|%HgFcWKs%dO9pv(`-w8-(s@VzJ zIytN;-_B7jVhC@~M11bDnIQzTJEFU5m9V(Os8mVa`;*K+2_FvF`fjY-n%mYos<&rs zFvfyt%!wr^ZO6i;7L#>>VN7waW)?@wn`7}(zYvnnbC@3l@2J@KJ!D}RZaL3v=%<6 zX@j}%UHkQ-@nMp=`Fy_54%{Jbfi%@hglF?VBbRYz&w^i-cp`wi)`bYJtq%2dSA)+t zo-BOr!u?+=A?u=vsqh@O_SySEHZ$KGPug~%RK*NkMz+~)5RPx7POADx&5$3^ur|;fSF8Uy~!V(e$A43=RQpe8%*{eZt>KNgFPeo z&bs~}yztN9GLjptGZk<#cwBOVcL(#MqtevP9|% z>N>mR(bB)6pZs5kl?*ofNLh7dk{DF%6ZdPoYl73oaw8(@|Lb# zGKsSXFTJI4Ma6N&7%D>s$AzD{-zAtM)W2~=?#^_*n`LSWqlx8a%p8F(>|dTR)c{ag zT>v%cWx}ojdo{roqZs zUf6|IVL1j;cDUF$iQ4a3*_7FhP1S$gv}|wgFgbl52Ae5H+qWvByT;;D4IL^I{l2^W z^mrNmw}rp|=OQ`IBeA{dS6L#gVN5EAt6u?~Uu1Y6Tp$1LGEd&OKQu(Wher>DkLuod zF5mGwgYM#@^O1gT5lfh|SgR`+?xOC1w_5zCWz3W0!KI-t>ASv&YU_p`aTv`rouGm0 zE>B>*1k}n`Ml5zu;t_GC(iu^J0|DH^Sf-TWviy0}$yO6VpB^{le2-27bRuNs9cF?b zMi1M~MAS@`CDI(eD$R@$%GlA^{yw2j6`-+o)zWFklm50(%>A?1kz36I{nzi)Q*cZy zWy*2ByHjgtUzb09kg?c6-i&&$`F9C7K7E*sN3;kTFci<89q6@;Qb*NFmM zaw`>!yqCSi3;vAEew&&dgw@7>5F+vT(I`2r^*UXZm66E?8XTNNwF2l>d3O-8ELW7h zx;t7Ct_$ZorY$##uhY*R4^J^OcmHT*c(UhYO5k+r>Z94q!b^-;kvYWz)2o+Yx7X=X~_lr=YsJJ!zCTW}X@8@now!(`|=g>@nL5TV$Q}?`bn4RM31UkdzL` z`{n}IGvzB4TU8a&6=9AvuINdsb0w#0@<(wmh0EI)Ip0E(^&r!Gc9!|>>0v=~F0Y=} z8&bmi>GE1F2Ztg+xWiVH#q=0{*tQeP{`yLWIy#&d6cSzxE=A_(pkGqN?+~&HVLyeT z!2gW)`H4vA-rwQ#I@Mw(Ccs(6UHLwj&Qo&=Mcs6b$&@^Q@q{QOn9kNGb+kSx?ccus zFBz*wMw+LrrO_;q9uD-{+4sJ&DY&Vo_eE947=pu%utG9w*6g#VU6q<&PH@>E<80@*taBn7>I1AB$N0pYE zP8%l+Z2$XkM{hQH_kQ&G-{f;KObgZNkRkGy1NdiGkd^sxZt;~)1%6Q)YW<{M_~Kr^ z`R9kcrwI(CSsN0s4-0I4@}+LC_EGL5HvU^?RLWzTJtjU9t72kK@hCfeajo zAN~!i!P+UrI1+VZ=r4Gf(6o>7A{VvVXN(L^MWa(`mRL)Z=%%G^4Z^z_0|ZOO(ORG` zUa3t(JrAceQGL#uT5&}eY%%`%9m1KDIu~EL%0J{*$a7!Sh6YW_j-V;uY@Pk~fsmh% zvReUAgGa@8w$0EAsXh)XGaq3_EF#CNC?d0ULw_}>nNVn*r2+AJ>5nDRD?wE%v5nAg zt}W2~q#_D?L5V^|G+?A(krwe{#MaN@Ob0&BL|~$P#&c_?pZHfiEqRUy?neG{VJMD< z%O+HEp*4f=Bf=+IZrf1)Mf>u6a4CpcF&M2R!j!?2RaM_41{F)!tY2M}NptB$)qDQP z4n4PdoB0QbTf%i5e`FOad~VVwsc^v$8usfPQ}xZ6U&3Nyf1q5U?5d>9tWI-5N3GIR z`^`i|GnwInaD8KZD>G~sD@`}9T2&&ur%2B=9o`a$WNsyFA6;F2c5tB6ZG2aK-FzL_ ze0?3ngIT@QV92UF8RWUlM)Ze$s2yYF33r<+mS5~QgfG@k=ms}|KiQq`9()Qv z*O6LoyO)F(dq%#AbPo&*M65!lMtglPEfmU5x|)-RN%1E&25%eaHv&1<`O{q^a(GP) zjjhqDBH<+&1ozddgOMVc;p$k;DG5UOBQ+thI>SaiUnMG7#lcJDS!bId?N1^u=eJ1- zK=Un_HilSn43)C3bQy(T*TEKR#}TIjs)~a|nSX|6$tPj5O+^5jNsVqJw5l*KM6q7V zFW<~;^QFfoQKvK$UDDc^7iljo2F!ZMbtTnA8hK=*#I|qkK4#&tk*3MonU=z`KzGlG zWjLk8kXjK<`Fqden^qy+r+=MD(LwdogXcM3=$A)-_u1Y=x|)OLx<8u^jWj-JnY;(01^(?mY ApplyConfiguration(JToken configJson) + { + var loginPage = await RequestStringWithCookies(LoginUrl); + CQ loginDom = loginPage.Content; + var loginPostUrl = loginDom["#login"].Attr("action"); + + configData.LoadValuesFromJson(configJson); + var pairs = new Dictionary { + { "username", configData.Username.Value }, + { "password", configData.Password.Value } + }; + // Get inital cookies + CookieHeader = string.Empty; + var response = await RequestLoginAndFollowRedirect(SiteLink + loginPostUrl, pairs, CookieHeader, true, null, LoginUrl); + + await ConfigureIfOK(response.Cookies, response.Content != null && response.Content.Contains("Velkommen tilbage"), () => + { + CQ dom = response.Content; + var messageEl = dom["inputs"]; + var errorMessage = messageEl.Text().Trim(); + throw new ExceptionWithConfigData(errorMessage, configData); + }); + + var profilePage = await RequestStringWithCookies(ProfileUrl, response.Cookies); + CQ profileDom = profilePage.Content; + var passKey = profileDom["input[name=resetkey]"].Parent().Text(); + passKey = passKey.Substring(0, passKey.IndexOf(' ')); + configData.RSSKey.Value = passKey; + SaveConfig(); + return IndexerConfigurationStatus.RequiresTesting; + } + + public async Task> PerformQuery(TorznabQuery query) + { + var releases = new List(); + var breakWhile = false; + var page = 0; + while (page < 3) + { + string episodeSearchUrl; + if (string.IsNullOrEmpty(query.GetQueryString())) + { + episodeSearchUrl = SearchUrl + "?page=" + page; + breakWhile = true; + } + else + { + var cats = MapTorznabCapsToTrackers(query); + var catsUrlPart = string.Join("&", cats.Select(c => $"c{c}=1")); + episodeSearchUrl = string.Format("{0}?search={1}&cat=0&incldead=0&{2}&page={3}", SearchUrl, HttpUtility.UrlEncode(query.GetQueryString()), catsUrlPart, page); + } + page++; + var results = await RequestStringWithCookiesAndRetry(episodeSearchUrl); + try + { + CQ dom = results.Content; + + var rows = dom["#torrent-table-wrapper > div"]; + + foreach (var row in rows.Skip(1)) + { + var release = new ReleaseInfo(); + + var qRow = row.Cq(); + var qLink = qRow.Find("#torrent-udgivelse2-users > a").First(); + var qDesc = qRow.Find("#torrent-udgivelse2-users > p").FirstOrDefault(); + + var moviesCats = new[] { 47, 38, 5, 23, 22, 33, 17, 9 }; + var seriesCats = new[] { 46, 26, 43 }; + var catUrl = qRow.Find(".torrent-icon > a").Attr("href"); + var cat = catUrl.Substring(catUrl.LastIndexOf('=') + 1); + var catNo = int.Parse(cat); + if (moviesCats.Contains(catNo)) + release.Category = TorznabCatType.Movies.ID; + else if (seriesCats.Contains(catNo)) + release.Category = TorznabCatType.TV.ID; + else + continue; + + releases.Add(release); + + var torrentUrl = qLink.Attr("href"); + var torrentId = torrentUrl.Substring(torrentUrl.LastIndexOf('=') + 1); + + release.MinimumRatio = 1; + release.MinimumSeedTime = 172800; + release.Title = qLink.Attr("title"); + release.Description = qDesc != null ? qDesc.InnerText : release.Title; + release.Guid = new Uri(SiteLink + torrentUrl); + release.Comments = new Uri(release.Guid + "#startcomments"); + + var downloadUrl = $"{SiteLink}download.php?id={torrentId}&rss&passkey={configData.RSSKey.Value}"; + release.Link = new Uri(downloadUrl); + + var qAdded = qRow.Find("#torrent-added").First(); + var addedStr = qAdded.Text().Trim(); + release.PublishDate = DateTime.ParseExact(addedStr, "dd-MM-yyyyHH:mm:ss", CultureInfo.InvariantCulture); + + release.Seeders = ParseUtil.CoerceInt(qRow.Find("#torrent-seeders").Text().Trim()); + release.Peers = ParseUtil.CoerceInt(qRow.Find("#torrent-leechers").Text().Trim()) + release.Seeders; + + var sizeStr = qRow.Find("#torrent-size").First().Text(); + release.Size = ReleaseInfo.GetBytes(sizeStr); + + var infoLink = qRow.Find("#infolink"); + var linkContainer = infoLink.Children().First().Children().First(); + var url = linkContainer.Attr("href"); + var img = linkContainer.Children().First(); + var imgUrl = img.Attr("src"); + if (imgUrl == "/pic/imdb.png") + { + release.Imdb = long.Parse(url.Substring(url.LastIndexOf('t') + 1)); + } + else if (imgUrl == "/pic/TV.png") + { + release.TheTvDbId = long.Parse(url.Substring(url.LastIndexOf('=') + 1)); + } + } + var nextPage = dom["#torrent-table-wrapper + p[align=center]"].Children().Last(); + if (!nextPage.Is("a")) + breakWhile = true; + } + catch (Exception ex) + { + OnParseError(results.Content, ex); + } + if (breakWhile) + break; + } + return releases; + } + } +} diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index 71a193b74..f01f8b875 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -185,6 +185,7 @@ + @@ -448,6 +449,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/src/Jackett/Models/ReleaseInfo.cs b/src/Jackett/Models/ReleaseInfo.cs index 4c3318075..8484ab651 100644 --- a/src/Jackett/Models/ReleaseInfo.cs +++ b/src/Jackett/Models/ReleaseInfo.cs @@ -21,6 +21,7 @@ namespace Jackett.Models public long? Size { get; set; } public string Description { get; set; } public long? RageID { get; set; } + public long? TheTvDbId { get; set; } public long? Imdb { get; set; } public int? Seeders { get; set; } public int? Peers { get; set; } diff --git a/src/Jackett/Models/ResultPage.cs b/src/Jackett/Models/ResultPage.cs index 7593ea0b6..4b70cb29b 100644 --- a/src/Jackett/Models/ResultPage.cs +++ b/src/Jackett/Models/ResultPage.cs @@ -81,6 +81,8 @@ namespace Jackett.Models ), getTorznabElement("magneturl", r.MagnetUri), getTorznabElement("rageid", r.RageID), + getTorznabElement("thetvdb", r.TheTvDbId), + getTorznabElement("imdb", r.Imdb), getTorznabElement("seeders", r.Seeders), getTorznabElement("peers", r.Peers), getTorznabElement("infohash", r.InfoHash), diff --git a/src/Jackett/Models/TorrentPotatoResponseItem.cs b/src/Jackett/Models/TorrentPotatoResponseItem.cs index 809ada2b6..9c860610a 100644 --- a/src/Jackett/Models/TorrentPotatoResponseItem.cs +++ b/src/Jackett/Models/TorrentPotatoResponseItem.cs @@ -12,7 +12,7 @@ namespace Jackett.Models public string torrent_id { get; set; } public string details_url { get; set; } public string download_url { get; set; } - // public string imdb_id { get; set; } + public string imdb_id { get; set; } public bool freeleech { get; set; } public string type { get; set; } public long size { get; set; } diff --git a/src/Jackett/Utils/JsonContent.cs b/src/Jackett/Utils/JsonContent.cs index 412962bda..17132f029 100644 --- a/src/Jackett/Utils/JsonContent.cs +++ b/src/Jackett/Utils/JsonContent.cs @@ -25,7 +25,7 @@ namespace Jackett.Utils protected override async Task SerializeToStreamAsync(Stream stream, TransportContext context) { - var json = JsonConvert.SerializeObject(_value, Formatting.Indented); + var json = JsonConvert.SerializeObject(_value, Formatting.Indented, new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore}); var writer = new StreamWriter(stream); writer.Write(json); await writer.FlushAsync(); diff --git a/src/Jackett/Utils/TorznabCapsUtil.cs b/src/Jackett/Utils/TorznabCapsUtil.cs index 6fc28e8b5..338feea56 100644 --- a/src/Jackett/Utils/TorznabCapsUtil.cs +++ b/src/Jackett/Utils/TorznabCapsUtil.cs @@ -44,6 +44,16 @@ namespace Jackett.Utils return filteredResults; } + public static IEnumerable FilterResultsToImdb(IEnumerable results, string imdb) + { + if (string.IsNullOrWhiteSpace(imdb)) + return results; + // Filter out releases that do have a valid imdb ID, that is not equal to the one we're searching for. + return + results.Where( + result => !result.Imdb.HasValue || result.Imdb.Value == 0 || ("tt" + result.Imdb.Value).Equals(imdb)); + } + private static string CleanTitle(string title) { title = title.Replace(':', ' ').Replace('.', ' ').Replace('-', ' ').Replace('_', ' ').Replace('+', ' ');