AӪk߭;1p=DROt˖sv-w'z𽛙8bWXb8'hG6
q$_)? -a6JZJn٨]%sđ˻)&_)tыOHk:'qs}n}kί%]LΒ>8չH ̖+PGT(7<~X;/2G:ײ1MDne20h5GTC^֩bU~3eBQ5=tLRܔo?\fL`XKZnFC<>wsHf'>v5&Zk4h[?gu8~h3#^$G?_ >ѤGHp.60in#s >0	J`-IOSd	0htJ>" p*Z+@6JAbb|LڞH[^c\G~[Krchװ*>kT#t$1KJ4h+W}仰IArІ &ʆR5+Ʃ^'귅dHQMPFYctĂ(X$O畚c=UzG>T#,K	H͹[dBg-rL(#tC4ok/3_I::l ~\wpl~J\쿤_2/giJx^Õb
5beE%=A >aaxq(5b~fx񈁭!DJgn#8s	sQ*x8#s >0	J`-IOSd	0htJ>" p*ZWj{rRȎeȄ'q4ΔÂb@o~HmKSR)5kmzLEL@Fy%}/bv8WP[t7{ uE7ߤ\K	H͹[dB5zQNTuK}U8N1\sWG_¢<<uI˳)Ď_76Ӑ;iK	H͹[dB#	'S}Ű#tC4ok/j<e>/RU{|OyJ<ܭ͇E+.Hoh.,5B͗[_F FqV02;`KԴ)e'y	)W4|:T5?(whZ.LDNMj{À	;:$&3&Bٜ?7|Ȉr kIi{%Niv'Ƶ^9yt LQς80
1-gC# k:F]2_WzʒO[D1>q~]ndTljlӠyG~+M0y[${I~]ndTl0wk\}b2!FOv	s"
~]ndTl/zF.V78W6&!?7j-) R͗[_F FqVۆoWu.+"DpV-ߤY@_0n$=V)͏JKq, 3Β4֫\$p<X'u*Me4sg=|_#pfDng!H"RkC-Ce~GY֗fuzË8oq,P|Q!r`DyM\2u:/Z_KdiS3DMff2Kgΰ`pzaɹ#H!gnN
\1'PFIuBAϫ`SZn{ P@vθ(ZY$IpM"ہ:ŭ[jV1M[,>T },iDL/!yĵ]] cXnC~-2}8"3D3>pF%xN:oVW9":ʐ=sw
lۮVB01rO	H	/oIrEzf@g@A?D9<p}N
l;(k6
 5XZ*<L/ne,'a1NBھ]fA*wJC{gR%_S㛃@VĨug)hVqJAGYrkW(X1OO&$棄Ϗ$1d<WsO+꘹oM>cOj'gLUCVqJAGY'ߛSYU"[-$mK;)z}:e1*RРw%RX<rGN&*4[>e0yɃzI}vMLt"(uRn{D/
Xc'ygn#8s	sQ
tc@@so Z9x*=3Vj: vNR2{HD*:t#t3N`$r%"2#2
=S72Vy½-@%JGDHgr3~I3#`R}LDKTˁ43!~@IG>hO5U^L+d
pt,QR}TS?W as)c'~H5- an^vGl&*u	 ME߀jiwN7?ڍrt,baJ2$X[✕˵?Q@XoBە rH}܆+$䅂z	) |C1sA	.wGB8P8#NoW[F!E [v.}WLx)CQ]GK2yY:`w?ga<c$kƢYCqTphZgLO<SOi م"sWzaz«5=lw\tPVA\q-a6+G4Us){OgWG+@	/9)s){OgWG`P3JqR6db8u1HQwS܋JLߤxq.XEO(yu(=  يlL湚(R,&9J5FMC_;eWQ$Rs){OgWGjdzNr\Dps){OgWGBW=brZSP5}˾ӓ[%NUO6hXcK]t0l﷞[:5$y	ѳ\"*Fr5Pm>*^ܚԮvڐR*C-h?cQMB3Læ|lR&Uhab:%3.泟YY,&9J5FM<XMϙayα_wb#GBh!iKN_םEJ[;#ZPGzFM.jHAQWKjfVV&h\"=Y"#	/ 	R@h.IA_g__̓3uolG%BrG*.CԚ	Q,#V)4S֬u n̉<lChY(
2V4Jx{z7?1b0y1<ъ%SAr-%}>L(H-O9uז=mGЮJCnי+9S*YBÞe5MgD^IET_JRczjpymyAwfutQ؛Y/ >z\ȭB]S
uzr(> 4ѱUӥq"P#
ځ1R3Nᾣ1#Ɏz"o|S?a`zzuԋLw!FQ#S:jk!Qتvěo9s®Xy8<X:MTPn/b3Nᾣ1#Ɏz $ret->unknown[] = $token;
                }
                continue;
            }

            if ($state === 0) {
                $ret->options = OptionsArray::parse($parser, $list, $options);

                if ($ret->options->has('AS')) {
                    for (; $list->idx < $list->count; ++$list->idx) {
                        if ($list->tokens[$list->idx]->type === Token::TYPE_DELIMITER) {
                            break;
                        }
                        $ret->unknown[] = $list->tokens[$list->idx];
                    }
                    break;
                }

                $state = 1;
            } elseif ($state === 1) {
                $ret->field = Expression::parse(
                    $parser,
                    $list,
                    array(
                        'breakOnAlias' => true,
                        'parseField' => 'column',
                    )
                );
                if ($ret->field === null) {
                    // No field was read. We go back one token so the next
                    // iteration will parse the same token, but in state 2.
                    --$list->idx;
                }
                $state = 2;
            } elseif ($state === 2) {
                if ($token->type === Token::TYPE_OPERATOR) {
                    if ($token->value === '(') {
                        ++$brackets;
                    } elseif ($token->value === ')') {
                        --$brackets;
                    } elseif (($token->value === ',') && ($brackets === 0)) {
                        break;
                    }
                } elseif (!empty(Parser::$STATEMENT_PARSERS[$token->value])) {
                    // We have reached the end of ALTER operation and suddenly found
                    // a start to new statement, but have not find a delimiter between them

                    if (!($token->value == 'SET' && $list->tokens[$list->idx - 1]->value == 'CHARACTER')) {
                        $parser->error(
                            __('A new statement was found, but no delimiter between it and the previous one.'),
                            $token
                        );
                        break;
                    }
                }
                $ret->unknown[] = $token;
            }
        }

        if ($ret->options->isEmpty()) {
            $parser->error(
                __('Unrecognized alter operation.'),
                $list->tokens[$list->idx]
            );
        }

        --$list->idx;

        return $ret;
    }

    /**
     * @param AlterOperation $component the component to be built
     * @param array          $options   parameters for building
     *
     * @return string
     */
    public static function build($component, array $options = array())
    {
        $ret = $component->options . ' ';
        if ((isset($component->field)) && ($component->field !== '')) {
            $ret .= $component->field . ' ';
        }
        $ret .= TokensList::build($component->unknown);

        return $ret;
    }
}
