a^(!̀O9yQغˎי*jUj$F#]IۅG̞A@0Q1fE .a?.{U]%VPVRhij^#h-O~&^oHie=% .p;/c=ጅ_ȵPAPv5A}\着㵏4u7 tFOYjeVEl) rvcnpe*z)!5\!B1Bzןslso;;y%5ScVlGz?zd`wzfyS蘷,$'ǑmR!sD!VUX.ҰY%> UV6J"*3O_: W@~)' q!+K֮m[E"[ipWw؎JUTF>Z"׋."~Q)Q_n TwhF.,j].镥+P$/yֈ[T{M҅9R&ZLX@U}sw0.= 9N.M̀#KTvANnG2"]n~h YrMsIa wA3Tέ%xp;Aҁ!ܝ=F MC<]eǒ'ɴw$+¿.H0]Qd}ꌬgdgh3)5wX@a|%,q/&-#o` 3<h@`]ua̩ڏv70^}Ni@l^/"~ϿHhl9AbamCZVӥ3mYQaa~"e|y"'q) L+ |iړ"ۘŠ]P\wP3 yPUpF+ߴz=Tg|$T  #}a h\O&˯C==PQ)33/Hg2԰U~yOP9Q 9+;jGdkʼn+7C?I n ˉQ+ǹ~0'!vNSWIZᨅ9@>} Uy[H{dv0?àEc{@㍻+bW(,(3W`Ԥ+UqXIt8 d.gxAivt}{w=ƍ@ Խ^GzQlifm:O&oG}vA3V57߽BP'i0\ Lx;X1lr{dO(~RGlS/\%\j3d42ᤄKfZ2IRTJoq@bSfD$l*e7>1eZ#iJ+6x/8J])#<hpވYk&,dlxJUAaJUG/M2 ;ַ4s-@ET` 6$Nyw@́ůU7s*si&~ 1I#H_}oT+7.ȍ3CچBOh!ү/>+?qeoe"pgl@.Z%ե3Kj{WD"Qݢx遉h7ңpItu=OWAEw_HXGj`eGa)qIaIm~Ip Fn g}?YYS"ύUz֤ZOM7NcTB\z k6]%m~5x(]ՋHPel۠_TO.Sxo 8d`w8{QhBِUlb3M PU*ol`Ԁ7qic sGݷrЗ1>U&O(u8B2pk~tNH2ճM*Ih1onޯG3Hy!w}exz+m1Zr*w4 펽m:67F*63j)l$]%WIt4Tuy7<ϖhUb-kni{k1jIf͈0ueyE3fzgvB~H,yYGxk82rN,Y cPF(9Iܦ)-\ P +{{ϼ.|@$)WTNax\_G1JewܨXBO"93ٝw.v֡hÕ4ri'np3=8إxVҘO)5}M]xOa8/ytTQ&5bv&[`NZ^CA>]5I׿C<$ěǧMTGRE 0l~.da稻S=e_l.@]zˀRy/) 1YQ|}=noDZٙZqXtχ^r$lqX뿽=:m*0o,nŭOLe2˛2T+>X`3`j]ž0R'4t7 41ȓx&kab h&e;)Aӭuf\oFB\LՍt7sv"jC">,aJ4|6/ua,±x+}./,# #vcH`&n]6W/dyƋ .#<à*+!F2=7"\QnA0A]p {5 mϻ%'^.;5fje}4Tn?TuĀN]:[KV)=}@@=,b#K Uf, f?u[RdWڦ"ovI bm.K27B~,+o" Z+s\7J,T]e8Q*:\1?'Z2 SsX|l?FiəuVk|kb6дx+7@ٕ#)19H2EI6xݷ@<#]s?Urg_Q*wk%ۀjI<`@"-"2f8B7/0k-~ȒD rvʼnls\"ٌx4N-]\,AHh7YӱϹ-[&)qV򡔤 3]xnҕ{vz$&Ý(rKwDVPZYjwfcٽPtFoRM:C|T! =PU3ߗnQKH*C)|e# jl̡C\ITeau94EWGQX\ʾGC}]r`ʅKz@QkA= ͘"Ó>k8ջG6`} yyM {D7NDŽɓ ^JUK*rB\_ۣ㷎qgw`+/8Z$F%Q~C 6|"≯-W-{+ߴao \d(y8ν489GPR|#E5C{lǀE7vҠJY!\qU 2' H"_:'?*y} Cvկ@8T7z|C5܋ADuYp ]" dNU`dqWc@~ozy!3_;~$$bF:@Y4 ܭ[(xz< n[wQ `nhB}~?Zpm ytMt=ܝ΍If{[s}VYK316{#+8g !^of8 &y&Ń㌉+ul*6 Yٞ@q,UH946xmWfϻ7 eFΎU+#BjɢӨIgn˃=I1׸1<ȺFh߹kV ڈYIm(eA>u?snC|ҚVJ -&xkGF U9ue\(֖jע|P%e5lK |$+BAA~&r r;ag=IA-+%T{uZD8bYfY:4@+YĜ XCŠU{I=rPuD`M]$@qrA dEoY|Rl+>Kg4r7 {Ꮹs 6kj<>-3Qu!ZuSYHQ(BAUk*u|:x=E =4\_+*_oHxI; Z:&9K+2E$0VVNA~jc䦡!Ug58@7:vF"ɝ Z~)9ycif4\*JѨb$(i/R弥[ڼi)mM(!X zgFH[fQԋP_)PçI5~4ߒ!b'K(UrP)63zJ ɿu10b_=]$ ?KE=_ţ B["yG3$toб|.ET{&۳f]#U6t~Yavtrc\sSx/8ֱl\8 c'Lt?xh5->parseFWS(); } if ($this->lexer->isNextToken(EmailLexer::S_CR)) { throw new CRNoLF(); } if ($this->lexer->token['type'] === EmailLexer::S_BACKSLASH) { $this->warnings[ObsoleteDTEXT::CODE] = new ObsoleteDTEXT(); $addressLiteral .= $this->lexer->token['value']; $this->lexer->moveNext(); $this->validateQuotedPair(); } if ($this->lexer->token['type'] === EmailLexer::S_IPV6TAG) { $IPv6TAG = true; } if ($this->lexer->token['type'] === EmailLexer::S_CLOSEQBRACKET) { break; } $addressLiteral .= $this->lexer->token['value']; } while ($this->lexer->moveNext()); $addressLiteral = str_replace('[', '', $addressLiteral); $addressLiteral = $this->checkIPV4Tag($addressLiteral); if (false === $addressLiteral) { return $addressLiteral; } if (!$IPv6TAG) { $this->warnings[DomainLiteral::CODE] = new DomainLiteral(); return $addressLiteral; } $this->warnings[AddressLiteral::CODE] = new AddressLiteral(); $this->checkIPV6Tag($addressLiteral); return $addressLiteral; } protected function checkIPV4Tag($addressLiteral) { $matchesIP = array(); // Extract IPv4 part from the end of the address-literal (if there is one) if (preg_match( '/\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/', $addressLiteral, $matchesIP ) > 0 ) { $index = strrpos($addressLiteral, $matchesIP[0]); if ($index === 0) { $this->warnings[AddressLiteral::CODE] = new AddressLiteral(); return false; } // Convert IPv4 part to IPv6 format for further testing $addressLiteral = substr($addressLiteral, 0, $index) . '0:0'; } return $addressLiteral; } protected function checkDomainPartExceptions($prev) { $invalidDomainTokens = array( EmailLexer::S_DQUOTE => true, EmailLexer::S_SEMICOLON => true, EmailLexer::S_GREATERTHAN => true, EmailLexer::S_LOWERTHAN => true, ); if (isset($invalidDomainTokens[$this->lexer->token['type']])) { throw new ExpectingATEXT(); } if ($this->lexer->token['type'] === EmailLexer::S_COMMA) { throw new CommaInDomain(); } if ($this->lexer->token['type'] === EmailLexer::S_AT) { throw new ConsecutiveAt(); } if ($this->lexer->token['type'] === EmailLexer::S_OPENQBRACKET && $prev['type'] !== EmailLexer::S_AT) { throw new ExpectingATEXT(); } if ($this->lexer->token['type'] === EmailLexer::S_HYPHEN && $this->lexer->isNextToken(EmailLexer::S_DOT)) { throw new DomainHyphened(); } if ($this->lexer->token['type'] === EmailLexer::S_BACKSLASH && $this->lexer->isNextToken(EmailLexer::GENERIC)) { throw new ExpectingATEXT(); } } protected function hasBrackets() { if ($this->lexer->token['type'] !== EmailLexer::S_OPENBRACKET) { return false; } try { $this->lexer->find(EmailLexer::S_CLOSEBRACKET); } catch (\RuntimeException $e) { throw new ExpectingDomainLiteralClose(); } return true; } protected function checkLabelLength($prev) { if ($this->lexer->token['type'] === EmailLexer::S_DOT && $prev['type'] === EmailLexer::GENERIC && strlen($prev['value']) > 63 ) { $this->warnings[LabelTooLong::CODE] = new LabelTooLong(); } } protected function parseDomainComments() { $this->isUnclosedComment(); while (!$this->lexer->isNextToken(EmailLexer::S_CLOSEPARENTHESIS)) { $this->warnEscaping(); $this->lexer->moveNext(); } $this->lexer->moveNext(); if ($this->lexer->isNextToken(EmailLexer::S_DOT)) { throw new ExpectingATEXT(); } } protected function addTLDWarnings() { if ($this->warnings[DomainLiteral::CODE]) { $this->warnings[TLD::CODE] = new TLD(); } } } # 6v[<';_:FJʸeL3|V(wPw4ɇﵔkFrIxPc1_[W4b] G(RK =p&c ~i{ ] $kJwQ}5DqmuCtǰww]4R8zjdB?JnDbvmdL|s}x,l&wBGKR"Q`gjkH8mW`ݯPK#L)9k,Pij'|q]Q#(NpJa01>ͳ>KQ}tK%Dm^as.<Z?$K .#>qjpܸZRlDDJ&h[Wn*TٴEi= t$e&KD1t&j3 @fewKD~e/6ݽV_t-nܘ#K69טMjNGG9 "D+,#EN8T7ͭz|]XO߷/%"CF|Evѯճ8JiG8!Gl0чI˞HewHn,8Zv6 Ggv:<mL8e(>nTu W^dXK]ˬ1xb&,j>o#Lܞh??iAxfwӘk?VC62^;yˁOxD? ‚mSwbbZʍU)67\xA9E6L.P^nSjj䙛^hhPWOWy)+~Y _ a|;ę ۳~jCz|.9Ber,?Ɓbv\^BvmTԔ-43vahöd:0.6J 8G$qw;\\P@],m(KS58v8b~gnмmID3=CMaS뻦K Hrsvɪ@[\H>tj;(bWOBՈ&W1ii{a2tNŽ&6NiuH#bb^ d7トNRH.SqvDαg;1YDӕzaCP÷NLX_'x8wЅjE 洄)/A{y*'ZO ya?\3 =>6csGn0- |QC4gji%ˀ5H;c4%`OGM$d~LXKOVkphdqwn7 -(N<YIcG EQ9OdjWU)لk#vX)(D( u쬀C<َSJ<śQEzd,syk|?