
    ,h+                      % S r SSKJr  SSKJr  SSKJr  SSKJr	  SSKJ
r  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJ r!  SSKJ"r#  SSKJ$r%  SSKJ&r'  SSKJ(r)  SSKJ*r+  SSKJ,r-  SSK.r.SSK.J/r/  SSK.J0r0  SSK.J1r1  SSK.J2r2  SSK.J3r3  SSK.J4r4  SSK.J5r5  SS K.J6r6  SS!K.J7r7  SS"K.J8r8  SS#K.J9r9  SS$K.J:r:  SS%K.J;r;  S&S'K<J=r=  S&S(K<J>r>  S&S)K?J@r@  S&S*K?JArA  \.Rr                  (       a  S+S,KBJCrC  S+S-KDJErE  S+S.KFJGrG  S+S/KHJIrI  \:" S0\/S19rJ\:" S2\0S3\/4   S19rK " S4 S5\A5      rL\1" \L\5      r\1" \L\	5      r\1" \L\5      r
\1" \L\5      r\1" \L\5      r\1" \L\5      r\1" \L\5      r\1" \L\5      r\1" \L\5      r\1" \L\5      r\1" \L\5      r\1" \L\5      r\1" \L\5      r\1" \L\!5      r \1" \L\#5      r"\1" \L\%5      r$\1" \L\'5      r&\1" \L\)5      r(\1" \L\+5      r*\1" \L\-5      r, " S6 S75      rM " S8 S9\L\3\J   5      rN " S: S;\M5      rO\\"\\ 1rPS<\QS='   \\"\\\\1rRS<\QS>'   SS? jrSSS@ jrTSSA jrU\SSSB j5       rV\S\USSC j5       5       rW\SSSD j5       rX\SSSE j5       rY\SSSF j5       rZ\9(       a  \SSSG j5       r[O\Zr[\SSSH j5       r\\9(       a  \SSSI j5       r]O\\r]\U\SSSJ j5       5       r^\U\SSSK j5       5       r_\9(       a  \SSSL j5       r`O\_r`\U\SSSM j5       5       ra\U\SSSN j5       5       rb\9(       a  \SSSO j5       rcO\brc\SSSP j5       rd\SSSQ j5       re\U\SSSSR jj5       5       rf\U\SSSSS jj5       5       rg\9(       a  \SSSST jj5       rhO\grh\U\SSSSU jj5       5       ri\U\SSSSV jj5       5       rj\9(       a  \SSSSW jj5       rkO\jrk\U\SSSSX jj5       5       rl\U\SSSSY jj5       5       rm\9(       a  \S S         SSZ jj5       rnO\mrn\U\SSS[ j5       5       ro\U\SSS\ j5       5       rp\9(       a  \SSS] j5       rqO\prq\SSS^ j5       rr\SSS_ j5       rs\SSS` j5       rt          SSa jru\U\S S         SSb jj5       5       rv\U\S S         SSc jj5       5       rw\9(       a  \S S         SSd jj5       rxO\wrx\U\S S         SSe jj5       5       ry\U\S S         SSf jj5       5       rz\U\S S         SSg jj5       5       r{\U\S S         SSh jj5       5       r|\9(       a  \S S         SSi jj5       r}O\|r}\U\S S         SSj jj5       5       r~\U\S S         SSk jj5       5       r\U\S S         SSl jj5       5       r\U\S S         SSm jj5       5       r\9(       a  \S S         SSn jj5       rO\r\U\S S         SSo jj5       5       r\U\S S         SSp jj5       5       r\U\SSSq j5       5       r\U\SSSSr jj5       5       r\U\SSSSs jj5       5       r\S S         SSt jj5       r\U\SSSu j5       5       r\9(       a  \SSSv j5       rO\r\SSSw j5       r\SSSx j5       r\SSSy j5       r\SSSz j5       r\SSS{ j5       r\SSS| j5       r\9(       a  \SSS} j5       rO\r\SSS~ j5       r\9(       a  \SSS j5       rO\r\SSS j5       r\SSS j5       r\SSS j5       r\SSS j5       r\SSS j5       r\SSS j5       r\SSS j5       r\SSS j5       rSS jrSS jrSS jrSS jr\\Z\\\\&4rSS jr\\\\\\\\0rSS jr\PGRI                  \\\&/5      GRK                  \\"/5      rSS jrSS jr\\\\1r\GRI                  \\\/5      r \SSS j5       r " S S\5      r0 \VS_\WS_\sS_\tS_\S_\S_\S_\ S_\,S_\S_\S_\$S_\S_\S_\*S_\S_\S_0 \S_\S_\S_\S_\S_\S_\S_\S_\S_\S_\iS_\jS_\fS_\gS_\oS_\pS_\aS_E0 \bS_\S_\"S_\^S_\_S_\S_\S_\S_\S_\lS_\mS_\rS_\S_\ZS_\\S_\S_\&S&_E\S\S\S\dS\XS\YS\S0ErS\QS'         SS jrg)z*Defines operators used in SQL expressions.    )annotations)IntEnum)add)and_)contains)eq)floordiv)ge)getitem)gt)inv)le)lshift)lt)mod)mul)ne)neg)or_)rshift)sub)truedivN)Any)Callable)cast)Dict)Generic)Optional)overload)Set)Tuple)Type)TYPE_CHECKING)TypeVar)Union   )exc)util)Literal)Protocol   )ColumnExpressionArgument)
CacheConst)ColumnElement)
TypeEngine_T)bound_FN.c                      \ rS rSr% SrSrS\S'   \ S
         SS jj5       r\ S
         SS jj5       r S
         SS	 jjrSr	g)OperatorTypeB   zdescribe an op() function. str__name__Nc                    g Nr6   selfleftrightotherkwargss        P/var/www/auris/envauris/lib/python3.13/site-packages/sqlalchemy/sql/operators.py__call__OperatorType.__call__I        !    c                    g r:   r6   r;   s        rA   rB   rC   R        rE   c                    g r:   r6   r;   s        rA   rB   rC   [   s     rE   r:   
r=   zColumnExpressionArgument[Any]r>   Optional[Any]r?   r   r@   r   returnzColumnElement[Any]
r=   	Operatorsr>   rJ   r?   r   r@   r   rK   rM   
r=   r   r>   rJ   r?   r   r@   r   rK   rM   )
r8   
__module____qualname____firstlineno____doc__	__slots____annotations__r   rB   __static_attributes__r6   rE   rA   r4   r4   B   s    $IM  $!+! ! 	!
 ! 
! !   $  	
  
   $  	
  
 rE   r4   c                      \ rS rSrSrSrSS jrSS jrSS jr    S           SS jjr	  S       SS	 jjr
        SS
 jr\r        SS jrSrg)rM   z   a  Base of comparison and logical operators.

Implements base methods
:meth:`~sqlalchemy.sql.operators.Operators.operate` and
:meth:`~sqlalchemy.sql.operators.Operators.reverse_operate`, as well as
:meth:`~sqlalchemy.sql.operators.Operators.__and__`,
:meth:`~sqlalchemy.sql.operators.Operators.__or__`,
:meth:`~sqlalchemy.sql.operators.Operators.__invert__`.

Usually is used via its most common subclass
:class:`.ColumnOperators`.

r6   c                .    U R                  [        U5      $ )a  Implement the ``&`` operator.

When used with SQL expressions, results in an
AND operation, equivalent to
:func:`_expression.and_`, that is::

    a & b

is equivalent to::

    from sqlalchemy import and_

    and_(a, b)

Care should be taken when using ``&`` regarding
operator precedence; the ``&`` operator has the highest precedence.
The operands should be enclosed in parenthesis if they contain
further sub expressions::

    (a == 2) & (b == 4)

)operater   r<   r?   s     rA   __and__Operators.__and__   s    . ||D%((rE   c                .    U R                  [        U5      $ )a  Implement the ``|`` operator.

When used with SQL expressions, results in an
OR operation, equivalent to
:func:`_expression.or_`, that is::

    a | b

is equivalent to::

    from sqlalchemy import or_

    or_(a, b)

Care should be taken when using ``|`` regarding
operator precedence; the ``|`` operator has the highest precedence.
The operands should be enclosed in parenthesis if they contain
further sub expressions::

    (a == 2) | (b == 4)

)rY   r   rZ   s     rA   __or__Operators.__or__   s    . ||C''rE   c                ,    U R                  [        5      $ )zImplement the ``~`` operator.

When used with SQL expressions, results in a
NOT operation, equivalent to
:func:`_expression.not_`, that is::

    ~a

is equivalent to::

    from sqlalchemy import not_

    not_(a)

)rY   r   r<   s    rA   
__invert__Operators.__invert__   s      ||C  rE   Nc                6   ^ ^ [        UUUUUS9mSUU 4S jjnU$ )a!  Produce a generic operator function.

e.g.::

  somecolumn.op("*")(5)

produces::

  somecolumn * 5

This function can also be used to make bitwise operators explicit. For
example::

  somecolumn.op("&")(0xFF)

is a bitwise AND of the value in ``somecolumn``.

:param opstring: a string which will be output as the infix operator
  between this element and the expression passed to the
  generated function.

:param precedence: precedence which the database is expected to apply
 to the operator in SQL expressions. This integer value acts as a hint
 for the SQL compiler to know when explicit parenthesis should be
 rendered around a particular operation. A lower number will cause the
 expression to be parenthesized when applied against another operator
 with higher precedence. The default value of ``0`` is lower than all
 operators except for the comma (``,``) and ``AS`` operators. A value
 of 100 will be higher or equal to all operators, and -100 will be
 lower than or equal to all operators.

 .. seealso::

    :ref:`faq_sql_expression_op_parenthesis` - detailed description
    of how the SQLAlchemy SQL compiler renders parenthesis

:param is_comparison: legacy; if True, the operator will be considered
 as a "comparison" operator, that is which evaluates to a boolean
 true/false value, like ``==``, ``>``, etc.  This flag is provided
 so that ORM relationships can establish that the operator is a
 comparison operator when used in a custom join condition.

 Using the ``is_comparison`` parameter is superseded by using the
 :meth:`.Operators.bool_op` method instead;  this more succinct
 operator sets this parameter automatically, but also provides
 correct :pep:`484` typing support as the returned object will
 express a "boolean" datatype, i.e. ``BinaryExpression[bool]``.

:param return_type: a :class:`.TypeEngine` class or object that will
  force the return type of an expression produced by this operator
  to be of that type.   By default, operators that specify
  :paramref:`.Operators.op.is_comparison` will resolve to
  :class:`.Boolean`, and those that do not will be of the same
  type as the left-hand operand.

:param python_impl: an optional Python function that can evaluate
 two Python values in the same way as this operator works when
 run on the database server.  Useful for in-Python SQL expression
 evaluation functions, such as for ORM hybrid attributes, and the
 ORM "evaluator" used to match objects in a session after a multi-row
 update or delete.

 e.g.::

    >>> expr = column("x").op("+", python_impl=lambda a, b: a + b)("y")

 The operator for the above expression will also work for non-SQL
 left and right objects::

    >>> expr.operator(5, 10)
    15

 .. versionadded:: 2.0


.. seealso::

    :meth:`.Operators.bool_op`

    :ref:`types_operators`

    :ref:`relationship_custom_operator`

)python_implc                   > T" TU 5      $ r:   r6   )r?   operatorr<   s    rA   againstOperators.op.<locals>.against5  s    D%((rE   r?   r   rK   rM   )	custom_op)r<   opstring
precedenceis_comparisonreturn_typere   rh   rg   s   `      @rA   opOperators.op   s0    | #
	) 	) rE   c                &    U R                  UUSUS9$ )a  Return a custom boolean operator.

This method is shorthand for calling
:meth:`.Operators.op` and passing the
:paramref:`.Operators.op.is_comparison`
flag with True.    A key advantage to using :meth:`.Operators.bool_op`
is that when using column constructs, the "boolean" nature of the
returned expression will be present for :pep:`484` purposes.

.. seealso::

    :meth:`.Operators.op`

T)rm   rn   re   rp   )r<   rl   rm   re   s       rA   bool_opOperators.bool_op:  s&    ( ww!#	  
 	
rE   c                *    [        [        U5      5      e)a  Operate on an argument.

This is the lowest level of operation, raises
:class:`NotImplementedError` by default.

Overriding this on a subclass can allow common
behavior to be applied to all operations.
For example, overriding :class:`.ColumnOperators`
to apply ``func.lower()`` to the left and right
side::

    class MyComparator(ColumnOperators):
        def operate(self, op, other, **kwargs):
            return op(func.lower(self), func.lower(other), **kwargs)

:param op:  Operator callable.
:param \*other: the 'other' side of the operation. Will
 be a single scalar for most operations.
:param \**kwargs: modifiers.  These may be passed by special
 operators such as :meth:`ColumnOperators.contains`.


NotImplementedErrorr7   r<   rp   r?   r@   s       rA   rY   Operators.operateU  s    4 "#b'**rE   c                *    [        [        U5      5      e)zHReverse operate on an argument.

Usage is the same as :meth:`operate`.

rw   ry   s       rA   reverse_operateOperators.reverse_operates  s     "#b'**rE   rj   )rK   rM   )r   FNN)rl   r7   rm   intrn   boolro   z7Optional[Union[Type[TypeEngine[Any]], TypeEngine[Any]]]re   Optional[Callable[..., Any]]rK   Callable[[Any], Operators])r   N)rl   r7   rm   r~   re   r   rK   r   )rp   r4   r?   r   r@   r   rK   rM   )r8   rO   rP   rQ   rR   rS   r[   r^   rb   rp   rt   rY   __sa_operate__r|   rU   r6   rE   rA   rM   rM   z   s     I)2(2!* # 48ii i 	i

i 2i 
$i\ 48	

 
 2	

 
$
6++(++7:+	+8 N++'*+69+	+rE   rM   c                      \ rS rSrSrS r Sr      S             SS jjrSS jrSS jrSS jr	\
 S         SS	 jj5       r\
 S         SS
 jj5       r S         SS jjrSrg)rk   i~  a}  Represent a 'custom' operator.

:class:`.custom_op` is normally instantiated when the
:meth:`.Operators.op` or :meth:`.Operators.bool_op` methods
are used to create a custom operator callable.  The class can also be
used directly when programmatically constructing expressions.   E.g.
to represent the "factorial" operation::

    from sqlalchemy.sql import UnaryExpression
    from sqlalchemy.sql import operators
    from sqlalchemy import Numeric

    unary = UnaryExpression(
        table.c.somecolumn, modifier=operators.custom_op("!"), type_=Numeric
    )

.. seealso::

    :meth:`.Operators.op`

    :meth:`.Operators.bool_op`

)rl   rm   rn   natural_self_precedenteager_groupingro   re   Nc                    Xl         X l        X0l        XPl        X`l        U(       a  UR                  U5      OS U l        Xpl        g r:   )rl   rm   rn   r   r   _to_instancero   re   )r<   rl   rm   rn   ro   r   r   re   s           rA   __init__custom_op.__init__  sB     !$*&<#,5@K$$[1d 	 'rE   c                r    [        U[        5      =(       a!    UR                  5       U R                  5       :H  $ r:   )
isinstancerk   	_hash_keyrZ   s     rA   __eq__custom_op.__eq__  s,    ui( 6!T^^%55	
rE   c                4    [        U R                  5       5      $ r:   )hashr   ra   s    rA   __hash__custom_op.__hash__  s    DNN$%%rE   c                    U R                   U R                  U R                  U R                  U R                  U R
                  U R                  (       a  U R                  R                  4$ S 4$ r:   )	__class__rl   rm   rn   r   r   ro   _static_cache_keyra   s    rA   r   custom_op._hash_key  sd    NNMMOO''262B2BD..
 	
 IM
 	
rE   c                    g r:   r6   r;   s        rA   rB   custom_op.__call__  rD   rE   c                    g r:   r6   r;   s        rA   rB   r     rG   rE   c                    [        US5      (       a  UR                  " X/UQ70 UD6$ U R                  (       a  U R                  " X/UQ70 UD6$ [        R                  " SU R
                  < S35      e)Nr   zCustom operator zX can't be used with plain Python objects unless it includes the 'python_impl' parameter.)hasattrrY   re   r'   InvalidRequestErrorrl   r;   s        rA   rB   r     sx     4)**<<>e>v>>##DB%B6BB))"4=="3 4+ + rE   )r   rn   r   rl   rm   re   ro   )r   FNFFN)rl   r7   rm   r~   rn   r   ro   z5Optional[Union[Type[TypeEngine[_T]], TypeEngine[_T]]]r   r   r   r   re   r   )r?   r   rK   r   rK   r~   )rK   z"Union[CacheConst, Tuple[Any, ...]]r:   rI   rL   rN   )r8   rO   rP   rQ   rR   rS   r   r   r   r   r   rB   rU   r6   rE   rA   rk   rk   ~  sT   0 HI # ',$48'' ' 	'

' !%' ' 2',
&	
   $!+! ! 	!
 ! 
! !   $  	
  
   $  	
  
 rE   rk   c                     \ rS rSr% SrSrSrS\S'    \R                  (       a          SLS jr
        SLS jrSMS	 jrSMS
 jr\	(       a  SNS jrO\R                  rSMS jrSMS jrSMS jrSMS jr\	(       a  SMS jrO\rSMS jrSMS jrSOS jrSMS jrSPS jrSMS jrSMS jrSMS jrSMS jr SQ     SRS jjr SQ     SRS jjrSMS jr SMS jr!SMS jr"SOS jr#SMS  jr$SMS! jr%SMS" jr&SMS# jr'\	(       a  SMS$ jr(O\'r( SQ     SRS% jjr)\	(       a   SQ     SRS& jjr*O\)r* SQ     SRS' jjr+\	(       a   SQ     SRS( jjr,O\+r,SMS) jr-SMS* jr.\	(       a  SMS+ jr/O\.r/  SS       STS, jjr0  SS       STS- jjr1  SS       STS. jjr2  SS       STS/ jjr3SUS0 jr4SUS1 jr5SVS2 jr6 SQ     SWS3 jjr7 SQ       SXS4 jjr8SOS5 jr9SOS6 jr:SOS7 jr;\	(       a  SOS8 jr<O\;r<SOS9 jr=\	(       a  SOS: jr>O\=r>SYS; jr?SMS< jr@SMS= jrASMS> jrBSMS? jrC SZ       S[S@ jjrDSOSA jrESOSB jrFSOSC jrGSMSD jrHSMSE jrISMSF jrJSMSG jrKSMSH jrLSMSI jrMSMSJ jrNSMSK jrOSrPg)\ColumnOperatorsi  a  Defines boolean, comparison, and other operators for
:class:`_expression.ColumnElement` expressions.

By default, all methods call down to
:meth:`.operate` or :meth:`.reverse_operate`,
passing in the appropriate operator function from the
Python builtin ``operator`` module or
a SQLAlchemy-specific operator function from
:mod:`sqlalchemy.expression.operators`.   For example
the ``__eq__`` function::

    def __eq__(self, other):
        return self.operate(operators.eq, other)

Where ``operators.eq`` is essentially::

    def eq(a, b):
        return a == b

The core column expression unit :class:`_expression.ColumnElement`
overrides :meth:`.Operators.operate` and others
to return further :class:`_expression.ColumnElement` constructs,
so that the ``==`` operation above is replaced by a clause
construct.

.. seealso::

    :ref:`types_operators`

    :attr:`.TypeEngine.comparator_factory`

    :class:`.ColumnOperators`

    :class:`.PropComparator`

r6   NzLiteral[None]	timetuplec                    g r:   r6   ry   s       rA   rY   ColumnOperators.operate      !rE   c                    g r:   r6   ry   s       rA   r|   ColumnOperators.reverse_operate#  r   rE   c                .    U R                  [        U5      $ )zTImplement the ``<`` operator.

In a column context, produces the clause ``a < b``.

)rY   r   rZ   s     rA   __lt__ColumnOperators.__lt__'       ||B&&rE   c                .    U R                  [        U5      $ )zVImplement the ``<=`` operator.

In a column context, produces the clause ``a <= b``.

)rY   r   rZ   s     rA   __le__ColumnOperators.__le__/  r   rE   c                    g r:   r6   ra   s    rA   r   ColumnOperators.__hash__<  s    3rE   c                .    U R                  [        U5      $ )zImplement the ``==`` operator.

In a column context, produces the clause ``a = b``.
If the target is ``None``, produces ``a IS NULL``.

)rY   r   rZ   s     rA   r   ColumnOperators.__eq__A       ||B&&rE   c                .    U R                  [        U5      $ )zImplement the ``!=`` operator.

In a column context, produces the clause ``a != b``.
If the target is ``None``, produces ``a IS NOT NULL``.

)rY   r   rZ   s     rA   __ne__ColumnOperators.__ne__J  r   rE   c                .    U R                  [        U5      $ )zImplement the ``IS DISTINCT FROM`` operator.

Renders "a IS DISTINCT FROM b" on most platforms;
on some such as SQLite may render "a IS NOT b".

)rY   is_distinct_fromrZ   s     rA   r    ColumnOperators.is_distinct_fromS  s     ||,e44rE   c                .    U R                  [        U5      $ )a]  Implement the ``IS NOT DISTINCT FROM`` operator.

Renders "a IS NOT DISTINCT FROM b" on most platforms;
on some such as SQLite may render "a IS b".

.. versionchanged:: 1.4 The ``is_not_distinct_from()`` operator is
   renamed from ``isnot_distinct_from()`` in previous releases.
   The previous name remains available for backwards compatibility.

)rY   is_not_distinct_fromrZ   s     rA   r   $ColumnOperators.is_not_distinct_from\  s     ||0%88rE   c                    g r:   r6   rZ   s     rA   isnot_distinct_from#ColumnOperators.isnot_distinct_froml  s    crE   c                .    U R                  [        U5      $ )zTImplement the ``>`` operator.

In a column context, produces the clause ``a > b``.

)rY   r   rZ   s     rA   __gt__ColumnOperators.__gt__q  r   rE   c                .    U R                  [        U5      $ )zVImplement the ``>=`` operator.

In a column context, produces the clause ``a >= b``.

)rY   r
   rZ   s     rA   __ge__ColumnOperators.__ge__y  r   rE   c                ,    U R                  [        5      $ )zQImplement the ``-`` operator.

In a column context, produces the clause ``-a``.

)rY   r   ra   s    rA   __neg__ColumnOperators.__neg__  s     ||C  rE   c                .    U R                  [        U5      $ r:   )rY   r   rZ   s     rA   __contains__ColumnOperators.__contains__  s    ||He,,rE   c                .    U R                  [        U5      $ )zsImplement the [] operator.

This can be used by some database-specific types
such as PostgreSQL ARRAY and HSTORE.

)rY   r   )r<   indexs     rA   __getitem__ColumnOperators.__getitem__  s     ||GU++rE   c                .    U R                  [        U5      $ )zimplement the << operator.

Not used by SQLAlchemy core, this is provided
for custom operator systems which want to use
<< as an extension point.
)rY   r   rZ   s     rA   
__lshift__ColumnOperators.__lshift__       ||FE**rE   c                .    U R                  [        U5      $ )zimplement the >> operator.

Not used by SQLAlchemy core, this is provided
for custom operator systems which want to use
>> as an extension point.
)rY   r   rZ   s     rA   
__rshift__ColumnOperators.__rshift__  r   rE   c                .    U R                  [        U5      $ )zImplement the 'concat' operator.

In a column context, produces the clause ``a || b``,
or uses the ``concat()`` operator on MySQL.

)rY   	concat_oprZ   s     rA   concatColumnOperators.concat  s     ||Iu--rE   c                .    U R                  [        U5      $ )zdImplement an 'rconcat' operator.

this is for internal use at the moment

.. versionadded:: 1.4.40

)r|   r   rZ   s     rA   _rconcatColumnOperators._rconcat  s     ##Iu55rE   c                *    U R                  [        XS9$ )a  Implement the ``like`` operator.

In a column context, produces the expression:

.. sourcecode:: sql

    a LIKE other

E.g.::

    stmt = select(sometable).where(sometable.c.column.like("%foobar%"))

:param other: expression to be compared
:param escape: optional escape character, renders the ``ESCAPE``
  keyword, e.g.::

    somecolumn.like("foo/%bar", escape="/")

.. seealso::

    :meth:`.ColumnOperators.ilike`

escape)rY   like_opr<   r?   r   s      rA   likeColumnOperators.like  s    4 ||GU|::rE   c                *    U R                  [        XS9$ )a;  Implement the ``ilike`` operator, e.g. case insensitive LIKE.

In a column context, produces an expression either of the form:

.. sourcecode:: sql

    lower(a) LIKE lower(other)

Or on backends that support the ILIKE operator:

.. sourcecode:: sql

    a ILIKE other

E.g.::

    stmt = select(sometable).where(sometable.c.column.ilike("%foobar%"))

:param other: expression to be compared
:param escape: optional escape character, renders the ``ESCAPE``
  keyword, e.g.::

    somecolumn.ilike("foo/%bar", escape="/")

.. seealso::

    :meth:`.ColumnOperators.like`

r   )rY   ilike_opr   s      rA   ilikeColumnOperators.ilike  s    @ ||He|;;rE   c                .    U R                  [        U5      $ )zProduce a bitwise XOR operation, typically via the ``^``
operator, or ``#`` for PostgreSQL.

.. versionadded:: 2.0.2

.. seealso::

    :ref:`operators_bitwise`

)rY   bitwise_xor_oprZ   s     rA   bitwise_xorColumnOperators.bitwise_xor       ||NE22rE   c                .    U R                  [        U5      $ )zProduce a bitwise OR operation, typically via the ``|``
operator.

.. versionadded:: 2.0.2

.. seealso::

    :ref:`operators_bitwise`

)rY   bitwise_or_oprZ   s     rA   
bitwise_orColumnOperators.bitwise_or  s     ||M511rE   c                .    U R                  [        U5      $ )zProduce a bitwise AND operation, typically via the ``&``
operator.

.. versionadded:: 2.0.2

.. seealso::

    :ref:`operators_bitwise`

)rY   bitwise_and_oprZ   s     rA   bitwise_andColumnOperators.bitwise_and  r   rE   c                ,    U R                  [        5      $ )zProduce a bitwise NOT operation, typically via the ``~``
operator.

.. versionadded:: 2.0.2

.. seealso::

    :ref:`operators_bitwise`

)rY   bitwise_not_opra   s    rA   bitwise_notColumnOperators.bitwise_not"  s     ||N++rE   c                .    U R                  [        U5      $ )zProduce a bitwise LSHIFT operation, typically via the ``<<``
operator.

.. versionadded:: 2.0.2

.. seealso::

    :ref:`operators_bitwise`

)rY   bitwise_lshift_oprZ   s     rA   bitwise_lshiftColumnOperators.bitwise_lshift0       ||-u55rE   c                .    U R                  [        U5      $ )zProduce a bitwise RSHIFT operation, typically via the ``>>``
operator.

.. versionadded:: 2.0.2

.. seealso::

    :ref:`operators_bitwise`

)rY   bitwise_rshift_oprZ   s     rA   bitwise_rshiftColumnOperators.bitwise_rshift>  r   rE   c                .    U R                  [        U5      $ )a
  Implement the ``in`` operator.

In a column context, produces the clause ``column IN <other>``.

The given parameter ``other`` may be:

* A list of literal values,
  e.g.::

    stmt.where(column.in_([1, 2, 3]))

  In this calling form, the list of items is converted to a set of
  bound parameters the same length as the list given:

  .. sourcecode:: sql

    WHERE COL IN (?, ?, ?)

* A list of tuples may be provided if the comparison is against a
  :func:`.tuple_` containing multiple expressions::

    from sqlalchemy import tuple_

    stmt.where(tuple_(col1, col2).in_([(1, 10), (2, 20), (3, 30)]))

* An empty list,
  e.g.::

    stmt.where(column.in_([]))

  In this calling form, the expression renders an "empty set"
  expression.  These expressions are tailored to individual backends
  and are generally trying to get an empty SELECT statement as a
  subquery.  Such as on SQLite, the expression is:

  .. sourcecode:: sql

    WHERE col IN (SELECT 1 FROM (SELECT 1) WHERE 1!=1)

  .. versionchanged:: 1.4  empty IN expressions now use an
     execution-time generated SELECT subquery in all cases.

* A bound parameter, e.g. :func:`.bindparam`, may be used if it
  includes the :paramref:`.bindparam.expanding` flag::

    stmt.where(column.in_(bindparam("value", expanding=True)))

  In this calling form, the expression renders a special non-SQL
  placeholder expression that looks like:

  .. sourcecode:: sql

    WHERE COL IN ([EXPANDING_value])

  This placeholder expression is intercepted at statement execution
  time to be converted into the variable number of bound parameter
  form illustrated earlier.   If the statement were executed as::

    connection.execute(stmt, {"value": [1, 2, 3]})

  The database would be passed a bound parameter for each value:

  .. sourcecode:: sql

    WHERE COL IN (?, ?, ?)

  .. versionadded:: 1.2 added "expanding" bound parameters

  If an empty list is passed, a special "empty list" expression,
  which is specific to the database in use, is rendered.  On
  SQLite this would be:

  .. sourcecode:: sql

    WHERE COL IN (SELECT 1 FROM (SELECT 1) WHERE 1!=1)

  .. versionadded:: 1.3 "expanding" bound parameters now support
     empty lists

* a :func:`_expression.select` construct, which is usually a
  correlated scalar select::

    stmt.where(
        column.in_(select(othertable.c.y).where(table.c.x == othertable.c.x))
    )

  In this calling form, :meth:`.ColumnOperators.in_` renders as given:

  .. sourcecode:: sql

    WHERE COL IN (SELECT othertable.y
    FROM othertable WHERE othertable.x = table.x)

:param other: a list of literals, a :func:`_expression.select`
 construct, or a :func:`.bindparam` construct that includes the
 :paramref:`.bindparam.expanding` flag set to True.

)rY   in_oprZ   s     rA   in_ColumnOperators.in_L  s    F ||E5))rE   c                .    U R                  [        U5      $ )a  implement the ``NOT IN`` operator.

This is equivalent to using negation with
:meth:`.ColumnOperators.in_`, i.e. ``~x.in_(y)``.

In the case that ``other`` is an empty sequence, the compiler
produces an "empty not in" expression.   This defaults to the
expression "1 = 1" to produce true in all cases.  The
:paramref:`_sa.create_engine.empty_in_strategy` may be used to
alter this behavior.

.. versionchanged:: 1.4 The ``not_in()`` operator is renamed from
   ``notin_()`` in previous releases.  The previous name remains
   available for backwards compatibility.

.. versionchanged:: 1.2  The :meth:`.ColumnOperators.in_` and
   :meth:`.ColumnOperators.not_in` operators
   now produce a "static" expression for an empty IN sequence
   by default.

.. seealso::

    :meth:`.ColumnOperators.in_`

)rY   	not_in_oprZ   s     rA   not_inColumnOperators.not_in  s    4 ||Iu--rE   c                    g r:   r6   rZ   s     rA   notin_ColumnOperators.notin_  s    rE   c                *    U R                  [        XS9$ )ag  implement the ``NOT LIKE`` operator.

This is equivalent to using negation with
:meth:`.ColumnOperators.like`, i.e. ``~x.like(y)``.

.. versionchanged:: 1.4 The ``not_like()`` operator is renamed from
   ``notlike()`` in previous releases.  The previous name remains
   available for backwards compatibility.

.. seealso::

    :meth:`.ColumnOperators.like`

r   )rY   not_like_opr   s      rA   not_likeColumnOperators.not_like  s    " ||K|>>rE   c                    g r:   r6   r   s      rA   notlikeColumnOperators.notlike  r   rE   c                *    U R                  [        XS9$ )am  implement the ``NOT ILIKE`` operator.

This is equivalent to using negation with
:meth:`.ColumnOperators.ilike`, i.e. ``~x.ilike(y)``.

.. versionchanged:: 1.4 The ``not_ilike()`` operator is renamed from
   ``notilike()`` in previous releases.  The previous name remains
   available for backwards compatibility.

.. seealso::

    :meth:`.ColumnOperators.ilike`

r   )rY   not_ilike_opr   s      rA   	not_ilikeColumnOperators.not_ilike  s    " ||L%|??rE   c                    g r:   r6   r   s      rA   notilikeColumnOperators.notilike  r   rE   c                .    U R                  [        U5      $ )a'  Implement the ``IS`` operator.

Normally, ``IS`` is generated automatically when comparing to a
value of ``None``, which resolves to ``NULL``.  However, explicit
usage of ``IS`` may be desirable if comparing to boolean values
on certain platforms.

.. seealso:: :meth:`.ColumnOperators.is_not`

)rY   is_rZ   s     rA   r  ColumnOperators.is_  s     ||C''rE   c                .    U R                  [        U5      $ )a  Implement the ``IS NOT`` operator.

Normally, ``IS NOT`` is generated automatically when comparing to a
value of ``None``, which resolves to ``NULL``.  However, explicit
usage of ``IS NOT`` may be desirable if comparing to boolean values
on certain platforms.

.. versionchanged:: 1.4 The ``is_not()`` operator is renamed from
   ``isnot()`` in previous releases.  The previous name remains
   available for backwards compatibility.

.. seealso:: :meth:`.ColumnOperators.is_`

)rY   is_notrZ   s     rA   r  ColumnOperators.is_not  s     ||FE**rE   c                    g r:   r6   rZ   s     rA   isnotColumnOperators.isnot0  s    rE   c                ,    U R                  [        XUS9$ )a	  Implement the ``startswith`` operator.

Produces a LIKE expression that tests against a match for the start
of a string value:

.. sourcecode:: sql

    column LIKE <other> || '%'

E.g.::

    stmt = select(sometable).where(sometable.c.column.startswith("foobar"))

Since the operator uses ``LIKE``, wildcard characters
``"%"`` and ``"_"`` that are present inside the <other> expression
will behave like wildcards as well.   For literal string
values, the :paramref:`.ColumnOperators.startswith.autoescape` flag
may be set to ``True`` to apply escaping to occurrences of these
characters within the string value so that they match as themselves
and not as wildcard characters.  Alternatively, the
:paramref:`.ColumnOperators.startswith.escape` parameter will establish
a given character as an escape character which can be of use when
the target expression is not a literal string.

:param other: expression to be compared.   This is usually a plain
  string value, but can also be an arbitrary SQL expression.  LIKE
  wildcard characters ``%`` and ``_`` are not escaped by default unless
  the :paramref:`.ColumnOperators.startswith.autoescape` flag is
  set to True.

:param autoescape: boolean; when True, establishes an escape character
  within the LIKE expression, then applies it to all occurrences of
  ``"%"``, ``"_"`` and the escape character itself within the
  comparison value, which is assumed to be a literal string and not a
  SQL expression.

  An expression such as::

    somecolumn.startswith("foo%bar", autoescape=True)

  Will render as:

  .. sourcecode:: sql

    somecolumn LIKE :param || '%' ESCAPE '/'

  With the value of ``:param`` as ``"foo/%bar"``.

:param escape: a character which when given will render with the
  ``ESCAPE`` keyword to establish that character as the escape
  character.  This character can then be placed preceding occurrences
  of ``%`` and ``_`` to allow them to act as themselves and not
  wildcard characters.

  An expression such as::

    somecolumn.startswith("foo/%bar", escape="^")

  Will render as:

  .. sourcecode:: sql

    somecolumn LIKE :param || '%' ESCAPE '^'

  The parameter may also be combined with
  :paramref:`.ColumnOperators.startswith.autoescape`::

    somecolumn.startswith("foo%bar^bat", escape="^", autoescape=True)

  Where above, the given literal parameter will be converted to
  ``"foo^%bar^^bat"`` before being passed to the database.

.. seealso::

    :meth:`.ColumnOperators.endswith`

    :meth:`.ColumnOperators.contains`

    :meth:`.ColumnOperators.like`

r   
autoescape)rY   startswith_opr<   r?   r   r%  s       rA   
startswithColumnOperators.startswith5  s"    n ||5J  
 	
rE   c                ,    U R                  [        XUS9$ )a6
  Implement the ``istartswith`` operator, e.g. case insensitive
version of :meth:`.ColumnOperators.startswith`.

Produces a LIKE expression that tests against an insensitive
match for the start of a string value:

.. sourcecode:: sql

    lower(column) LIKE lower(<other>) || '%'

E.g.::

    stmt = select(sometable).where(sometable.c.column.istartswith("foobar"))

Since the operator uses ``LIKE``, wildcard characters
``"%"`` and ``"_"`` that are present inside the <other> expression
will behave like wildcards as well.   For literal string
values, the :paramref:`.ColumnOperators.istartswith.autoescape` flag
may be set to ``True`` to apply escaping to occurrences of these
characters within the string value so that they match as themselves
and not as wildcard characters.  Alternatively, the
:paramref:`.ColumnOperators.istartswith.escape` parameter will
establish a given character as an escape character which can be of
use when the target expression is not a literal string.

:param other: expression to be compared.   This is usually a plain
  string value, but can also be an arbitrary SQL expression.  LIKE
  wildcard characters ``%`` and ``_`` are not escaped by default unless
  the :paramref:`.ColumnOperators.istartswith.autoescape` flag is
  set to True.

:param autoescape: boolean; when True, establishes an escape character
  within the LIKE expression, then applies it to all occurrences of
  ``"%"``, ``"_"`` and the escape character itself within the
  comparison value, which is assumed to be a literal string and not a
  SQL expression.

  An expression such as::

    somecolumn.istartswith("foo%bar", autoescape=True)

  Will render as:

  .. sourcecode:: sql

    lower(somecolumn) LIKE lower(:param) || '%' ESCAPE '/'

  With the value of ``:param`` as ``"foo/%bar"``.

:param escape: a character which when given will render with the
  ``ESCAPE`` keyword to establish that character as the escape
  character.  This character can then be placed preceding occurrences
  of ``%`` and ``_`` to allow them to act as themselves and not
  wildcard characters.

  An expression such as::

    somecolumn.istartswith("foo/%bar", escape="^")

  Will render as:

  .. sourcecode:: sql

    lower(somecolumn) LIKE lower(:param) || '%' ESCAPE '^'

  The parameter may also be combined with
  :paramref:`.ColumnOperators.istartswith.autoescape`::

    somecolumn.istartswith("foo%bar^bat", escape="^", autoescape=True)

  Where above, the given literal parameter will be converted to
  ``"foo^%bar^^bat"`` before being passed to the database.

.. seealso::

    :meth:`.ColumnOperators.startswith`
r$  )rY   istartswith_opr'  s       rA   istartswithColumnOperators.istartswith  s"    f ||EZ  
 	
rE   c                ,    U R                  [        XUS9$ )a	  Implement the 'endswith' operator.

Produces a LIKE expression that tests against a match for the end
of a string value:

.. sourcecode:: sql

    column LIKE '%' || <other>

E.g.::

    stmt = select(sometable).where(sometable.c.column.endswith("foobar"))

Since the operator uses ``LIKE``, wildcard characters
``"%"`` and ``"_"`` that are present inside the <other> expression
will behave like wildcards as well.   For literal string
values, the :paramref:`.ColumnOperators.endswith.autoescape` flag
may be set to ``True`` to apply escaping to occurrences of these
characters within the string value so that they match as themselves
and not as wildcard characters.  Alternatively, the
:paramref:`.ColumnOperators.endswith.escape` parameter will establish
a given character as an escape character which can be of use when
the target expression is not a literal string.

:param other: expression to be compared.   This is usually a plain
  string value, but can also be an arbitrary SQL expression.  LIKE
  wildcard characters ``%`` and ``_`` are not escaped by default unless
  the :paramref:`.ColumnOperators.endswith.autoescape` flag is
  set to True.

:param autoescape: boolean; when True, establishes an escape character
  within the LIKE expression, then applies it to all occurrences of
  ``"%"``, ``"_"`` and the escape character itself within the
  comparison value, which is assumed to be a literal string and not a
  SQL expression.

  An expression such as::

    somecolumn.endswith("foo%bar", autoescape=True)

  Will render as:

  .. sourcecode:: sql

    somecolumn LIKE '%' || :param ESCAPE '/'

  With the value of ``:param`` as ``"foo/%bar"``.

:param escape: a character which when given will render with the
  ``ESCAPE`` keyword to establish that character as the escape
  character.  This character can then be placed preceding occurrences
  of ``%`` and ``_`` to allow them to act as themselves and not
  wildcard characters.

  An expression such as::

    somecolumn.endswith("foo/%bar", escape="^")

  Will render as:

  .. sourcecode:: sql

    somecolumn LIKE '%' || :param ESCAPE '^'

  The parameter may also be combined with
  :paramref:`.ColumnOperators.endswith.autoescape`::

    somecolumn.endswith("foo%bar^bat", escape="^", autoescape=True)

  Where above, the given literal parameter will be converted to
  ``"foo^%bar^^bat"`` before being passed to the database.

.. seealso::

    :meth:`.ColumnOperators.startswith`

    :meth:`.ColumnOperators.contains`

    :meth:`.ColumnOperators.like`

r$  )rY   endswith_opr'  s       rA   endswithColumnOperators.endswith  s"    n ||*  
 	
rE   c                ,    U R                  [        XUS9$ )a
  Implement the ``iendswith`` operator, e.g. case insensitive
version of :meth:`.ColumnOperators.endswith`.

Produces a LIKE expression that tests against an insensitive match
for the end of a string value:

.. sourcecode:: sql

    lower(column) LIKE '%' || lower(<other>)

E.g.::

    stmt = select(sometable).where(sometable.c.column.iendswith("foobar"))

Since the operator uses ``LIKE``, wildcard characters
``"%"`` and ``"_"`` that are present inside the <other> expression
will behave like wildcards as well.   For literal string
values, the :paramref:`.ColumnOperators.iendswith.autoescape` flag
may be set to ``True`` to apply escaping to occurrences of these
characters within the string value so that they match as themselves
and not as wildcard characters.  Alternatively, the
:paramref:`.ColumnOperators.iendswith.escape` parameter will establish
a given character as an escape character which can be of use when
the target expression is not a literal string.

:param other: expression to be compared.   This is usually a plain
  string value, but can also be an arbitrary SQL expression.  LIKE
  wildcard characters ``%`` and ``_`` are not escaped by default unless
  the :paramref:`.ColumnOperators.iendswith.autoescape` flag is
  set to True.

:param autoescape: boolean; when True, establishes an escape character
  within the LIKE expression, then applies it to all occurrences of
  ``"%"``, ``"_"`` and the escape character itself within the
  comparison value, which is assumed to be a literal string and not a
  SQL expression.

  An expression such as::

    somecolumn.iendswith("foo%bar", autoescape=True)

  Will render as:

  .. sourcecode:: sql

    lower(somecolumn) LIKE '%' || lower(:param) ESCAPE '/'

  With the value of ``:param`` as ``"foo/%bar"``.

:param escape: a character which when given will render with the
  ``ESCAPE`` keyword to establish that character as the escape
  character.  This character can then be placed preceding occurrences
  of ``%`` and ``_`` to allow them to act as themselves and not
  wildcard characters.

  An expression such as::

    somecolumn.iendswith("foo/%bar", escape="^")

  Will render as:

  .. sourcecode:: sql

    lower(somecolumn) LIKE '%' || lower(:param) ESCAPE '^'

  The parameter may also be combined with
  :paramref:`.ColumnOperators.iendswith.autoescape`::

    somecolumn.endswith("foo%bar^bat", escape="^", autoescape=True)

  Where above, the given literal parameter will be converted to
  ``"foo^%bar^^bat"`` before being passed to the database.

.. seealso::

    :meth:`.ColumnOperators.endswith`
r$  )rY   iendswith_opr'  s       rA   	iendswithColumnOperators.iendswithB  s"    f ||%:  
 	
rE   c                2    U R                   " [        U40 UD6$ )a	  Implement the 'contains' operator.

Produces a LIKE expression that tests against a match for the middle
of a string value:

.. sourcecode:: sql

    column LIKE '%' || <other> || '%'

E.g.::

    stmt = select(sometable).where(sometable.c.column.contains("foobar"))

Since the operator uses ``LIKE``, wildcard characters
``"%"`` and ``"_"`` that are present inside the <other> expression
will behave like wildcards as well.   For literal string
values, the :paramref:`.ColumnOperators.contains.autoescape` flag
may be set to ``True`` to apply escaping to occurrences of these
characters within the string value so that they match as themselves
and not as wildcard characters.  Alternatively, the
:paramref:`.ColumnOperators.contains.escape` parameter will establish
a given character as an escape character which can be of use when
the target expression is not a literal string.

:param other: expression to be compared.   This is usually a plain
  string value, but can also be an arbitrary SQL expression.  LIKE
  wildcard characters ``%`` and ``_`` are not escaped by default unless
  the :paramref:`.ColumnOperators.contains.autoescape` flag is
  set to True.

:param autoescape: boolean; when True, establishes an escape character
  within the LIKE expression, then applies it to all occurrences of
  ``"%"``, ``"_"`` and the escape character itself within the
  comparison value, which is assumed to be a literal string and not a
  SQL expression.

  An expression such as::

    somecolumn.contains("foo%bar", autoescape=True)

  Will render as:

  .. sourcecode:: sql

    somecolumn LIKE '%' || :param || '%' ESCAPE '/'

  With the value of ``:param`` as ``"foo/%bar"``.

:param escape: a character which when given will render with the
  ``ESCAPE`` keyword to establish that character as the escape
  character.  This character can then be placed preceding occurrences
  of ``%`` and ``_`` to allow them to act as themselves and not
  wildcard characters.

  An expression such as::

    somecolumn.contains("foo/%bar", escape="^")

  Will render as:

  .. sourcecode:: sql

    somecolumn LIKE '%' || :param || '%' ESCAPE '^'

  The parameter may also be combined with
  :paramref:`.ColumnOperators.contains.autoescape`::

    somecolumn.contains("foo%bar^bat", escape="^", autoescape=True)

  Where above, the given literal parameter will be converted to
  ``"foo^%bar^^bat"`` before being passed to the database.

.. seealso::

    :meth:`.ColumnOperators.startswith`

    :meth:`.ColumnOperators.endswith`

    :meth:`.ColumnOperators.like`


)rY   contains_opr<   r?   kws      rA   r   ColumnOperators.contains  s    f ||K5"55rE   c                2    U R                   " [        U40 UD6$ )a6
  Implement the ``icontains`` operator, e.g. case insensitive
version of :meth:`.ColumnOperators.contains`.

Produces a LIKE expression that tests against an insensitive match
for the middle of a string value:

.. sourcecode:: sql

    lower(column) LIKE '%' || lower(<other>) || '%'

E.g.::

    stmt = select(sometable).where(sometable.c.column.icontains("foobar"))

Since the operator uses ``LIKE``, wildcard characters
``"%"`` and ``"_"`` that are present inside the <other> expression
will behave like wildcards as well.   For literal string
values, the :paramref:`.ColumnOperators.icontains.autoescape` flag
may be set to ``True`` to apply escaping to occurrences of these
characters within the string value so that they match as themselves
and not as wildcard characters.  Alternatively, the
:paramref:`.ColumnOperators.icontains.escape` parameter will establish
a given character as an escape character which can be of use when
the target expression is not a literal string.

:param other: expression to be compared.   This is usually a plain
  string value, but can also be an arbitrary SQL expression.  LIKE
  wildcard characters ``%`` and ``_`` are not escaped by default unless
  the :paramref:`.ColumnOperators.icontains.autoescape` flag is
  set to True.

:param autoescape: boolean; when True, establishes an escape character
  within the LIKE expression, then applies it to all occurrences of
  ``"%"``, ``"_"`` and the escape character itself within the
  comparison value, which is assumed to be a literal string and not a
  SQL expression.

  An expression such as::

    somecolumn.icontains("foo%bar", autoescape=True)

  Will render as:

  .. sourcecode:: sql

    lower(somecolumn) LIKE '%' || lower(:param) || '%' ESCAPE '/'

  With the value of ``:param`` as ``"foo/%bar"``.

:param escape: a character which when given will render with the
  ``ESCAPE`` keyword to establish that character as the escape
  character.  This character can then be placed preceding occurrences
  of ``%`` and ``_`` to allow them to act as themselves and not
  wildcard characters.

  An expression such as::

    somecolumn.icontains("foo/%bar", escape="^")

  Will render as:

  .. sourcecode:: sql

    lower(somecolumn) LIKE '%' || lower(:param) || '%' ESCAPE '^'

  The parameter may also be combined with
  :paramref:`.ColumnOperators.contains.autoescape`::

    somecolumn.icontains("foo%bar^bat", escape="^", autoescape=True)

  Where above, the given literal parameter will be converted to
  ``"foo^%bar^^bat"`` before being passed to the database.

.. seealso::

    :meth:`.ColumnOperators.contains`

)rY   icontains_opr8  s      rA   	icontainsColumnOperators.icontains  s    ^ ||L%6266rE   c                2    U R                   " [        U40 UD6$ )a<  Implements a database-specific 'match' operator.

:meth:`_sql.ColumnOperators.match` attempts to resolve to
a MATCH-like function or operator provided by the backend.
Examples include:

* PostgreSQL - renders ``x @@ plainto_tsquery(y)``

    .. versionchanged:: 2.0  ``plainto_tsquery()`` is used instead
       of ``to_tsquery()`` for PostgreSQL now; for compatibility with
       other forms, see :ref:`postgresql_match`.


* MySQL - renders ``MATCH (x) AGAINST (y IN BOOLEAN MODE)``

  .. seealso::

        :class:`_mysql.match` - MySQL specific construct with
        additional features.

* Oracle Database - renders ``CONTAINS(x, y)``
* other backends may provide special implementations.
* Backends without any special implementation will emit
  the operator as "MATCH".  This is compatible with SQLite, for
  example.

)rY   match_op)r<   r?   r@   s      rA   matchColumnOperators.match?  s    8 ||He6v66rE   c                *    U R                  [        XS9$ )a  Implements a database-specific 'regexp match' operator.

E.g.::

    stmt = select(table.c.some_column).where(
        table.c.some_column.regexp_match("^(b|c)")
    )

:meth:`_sql.ColumnOperators.regexp_match` attempts to resolve to
a REGEXP-like function or operator provided by the backend, however
the specific regular expression syntax and flags available are
**not backend agnostic**.

Examples include:

* PostgreSQL - renders ``x ~ y`` or ``x !~ y`` when negated.
* Oracle Database - renders ``REGEXP_LIKE(x, y)``
* SQLite - uses SQLite's ``REGEXP`` placeholder operator and calls into
  the Python ``re.match()`` builtin.
* other backends may provide special implementations.
* Backends without any special implementation will emit
  the operator as "REGEXP" or "NOT REGEXP".  This is compatible with
  SQLite and MySQL, for example.

Regular expression support is currently implemented for Oracle
Database, PostgreSQL, MySQL and MariaDB.  Partial support is available
for SQLite.  Support among third-party dialects may vary.

:param pattern: The regular expression pattern string or column
  clause.
:param flags: Any regular expression string flags to apply, passed as
  plain Python string only.  These flags are backend specific.
  Some backends, like PostgreSQL and MariaDB, may alternatively
  specify the flags as part of the pattern.
  When using the ignore case flag 'i' in PostgreSQL, the ignore case
  regexp match operator ``~*`` or ``!~*`` will be used.

.. versionadded:: 1.4

.. versionchanged:: 1.4.48, 2.0.18  Note that due to an implementation
   error, the "flags" parameter previously accepted SQL expression
   objects such as column expressions in addition to plain Python
   strings.   This implementation did not work correctly with caching
   and was removed; strings only should be passed for the "flags"
   parameter, as these flags are rendered as literal inline values
   within SQL expressions.

.. seealso::

    :meth:`_sql.ColumnOperators.regexp_replace`


flags)rY   regexp_match_op)r<   patternrE  s      rA   regexp_matchColumnOperators.regexp_match]  s    p ||OW|BBrE   c                .    U R                  [        UUUS9$ )a  Implements a database-specific 'regexp replace' operator.

E.g.::

    stmt = select(
        table.c.some_column.regexp_replace("b(..)", "XY", flags="g")
    )

:meth:`_sql.ColumnOperators.regexp_replace` attempts to resolve to
a REGEXP_REPLACE-like function provided by the backend, that
usually emit the function ``REGEXP_REPLACE()``.  However,
the specific regular expression syntax and flags available are
**not backend agnostic**.

Regular expression replacement support is currently implemented for
Oracle Database, PostgreSQL, MySQL 8 or greater and MariaDB.  Support
among third-party dialects may vary.

:param pattern: The regular expression pattern string or column
  clause.
:param pattern: The replacement string or column clause.
:param flags: Any regular expression string flags to apply, passed as
  plain Python string only.  These flags are backend specific.
  Some backends, like PostgreSQL and MariaDB, may alternatively
  specify the flags as part of the pattern.

.. versionadded:: 1.4

.. versionchanged:: 1.4.48, 2.0.18  Note that due to an implementation
   error, the "flags" parameter previously accepted SQL expression
   objects such as column expressions in addition to plain Python
   strings.   This implementation did not work correctly with caching
   and was removed; strings only should be passed for the "flags"
   parameter, as these flags are rendered as literal inline values
   within SQL expressions.


.. seealso::

    :meth:`_sql.ColumnOperators.regexp_match`

replacementrE  )rY   regexp_replace_op)r<   rG  rL  rE  s       rA   regexp_replaceColumnOperators.regexp_replace  s'    Z ||#	  
 	
rE   c                ,    U R                  [        5      $ )zDProduce a :func:`_expression.desc` clause against the
parent object.)rY   desc_opra   s    rA   descColumnOperators.desc  s     ||G$$rE   c                ,    U R                  [        5      $ )zCProduce a :func:`_expression.asc` clause against the
parent object.)rY   asc_opra   s    rA   ascColumnOperators.asc  s     ||F##rE   c                ,    U R                  [        5      $ )a  Produce a :func:`_expression.nulls_first` clause against the
parent object.

.. versionchanged:: 1.4 The ``nulls_first()`` operator is
   renamed from ``nullsfirst()`` in previous releases.
   The previous name remains available for backwards compatibility.
)rY   nulls_first_opra   s    rA   nulls_firstColumnOperators.nulls_first  s     ||N++rE   c                    g r:   r6   ra   s    rA   
nullsfirstColumnOperators.nullsfirst  s    rE   c                ,    U R                  [        5      $ )zProduce a :func:`_expression.nulls_last` clause against the
parent object.

.. versionchanged:: 1.4 The ``nulls_last()`` operator is
   renamed from ``nullslast()`` in previous releases.
   The previous name remains available for backwards compatibility.
)rY   nulls_last_opra   s    rA   
nulls_lastColumnOperators.nulls_last  s     ||M**rE   c                    g r:   r6   ra   s    rA   	nullslastColumnOperators.nullslast  s    rE   c                .    U R                  [        U5      $ )zProduce a :func:`_expression.collate` clause against
the parent object, given the collation string.

.. seealso::

    :func:`_expression.collate`

)rY   collate)r<   	collations     rA   rg  ColumnOperators.collate  s     ||GY//rE   c                .    U R                  [        U5      $ )zQImplement the ``+`` operator in reverse.

See :meth:`.ColumnOperators.__add__`.

)r|   r   rZ   s     rA   __radd__ColumnOperators.__radd__       ##C//rE   c                .    U R                  [        U5      $ )zQImplement the ``-`` operator in reverse.

See :meth:`.ColumnOperators.__sub__`.

)r|   r   rZ   s     rA   __rsub__ColumnOperators.__rsub__  rm  rE   c                .    U R                  [        U5      $ )zQImplement the ``*`` operator in reverse.

See :meth:`.ColumnOperators.__mul__`.

)r|   r   rZ   s     rA   __rmul__ColumnOperators.__rmul__  rm  rE   c                .    U R                  [        U5      $ )zQImplement the ``%`` operator in reverse.

See :meth:`.ColumnOperators.__mod__`.

)r|   r   rZ   s     rA   __rmod__ColumnOperators.__rmod__  rm  rE   c                ,    U R                  [        XUS9$ )zjProduce a :func:`_expression.between` clause against
the parent object, given the lower and upper range.

	symmetric)rY   
between_op)r<   cleftcrightry  s       rA   betweenColumnOperators.between$  s     ||J|KKrE   c                ,    U R                  [        5      $ )zJProduce a :func:`_expression.distinct` clause against the
parent object.

)rY   distinct_opra   s    rA   distinctColumnOperators.distinct-  s    
 ||K((rE   c                ,    U R                  [        5      $ )a  Produce an :func:`_expression.any_` clause against the
parent object.

See the documentation for :func:`_sql.any_` for examples.

.. note:: be sure to not confuse the newer
    :meth:`_sql.ColumnOperators.any_` method with the **legacy**
    version of this method, the :meth:`_types.ARRAY.Comparator.any`
    method that's specific to :class:`_types.ARRAY`, which uses a
    different calling style.

)rY   any_opra   s    rA   any_ColumnOperators.any_4       ||F##rE   c                ,    U R                  [        5      $ )a  Produce an :func:`_expression.all_` clause against the
parent object.

See the documentation for :func:`_sql.all_` for examples.

.. note:: be sure to not confuse the newer
    :meth:`_sql.ColumnOperators.all_` method with the **legacy**
    version of this method, the :meth:`_types.ARRAY.Comparator.all`
    method that's specific to :class:`_types.ARRAY`, which uses a
    different calling style.

)rY   all_opra   s    rA   all_ColumnOperators.all_C  r  rE   c                .    U R                  [        U5      $ )a  Implement the ``+`` operator.

In a column context, produces the clause ``a + b``
if the parent object has non-string affinity.
If the parent object has a string affinity,
produces the concatenation operator, ``a || b`` -
see :meth:`.ColumnOperators.concat`.

)rY   r   rZ   s     rA   __add__ColumnOperators.__add__R  s     ||C''rE   c                .    U R                  [        U5      $ )zTImplement the ``-`` operator.

In a column context, produces the clause ``a - b``.

)rY   r   rZ   s     rA   __sub__ColumnOperators.__sub__^       ||C''rE   c                .    U R                  [        U5      $ )zTImplement the ``*`` operator.

In a column context, produces the clause ``a * b``.

)rY   r   rZ   s     rA   __mul__ColumnOperators.__mul__f  r  rE   c                .    U R                  [        U5      $ )zTImplement the ``%`` operator.

In a column context, produces the clause ``a % b``.

)rY   r   rZ   s     rA   __mod__ColumnOperators.__mod__n  r  rE   c                .    U R                  [        U5      $ )a#  Implement the ``/`` operator.

In a column context, produces the clause ``a / b``, and
considers the result type to be numeric.

.. versionchanged:: 2.0  The truediv operator against two integers
   is now considered to return a numeric value.    Behavior on specific
   backends may vary.

)rY   r   rZ   s     rA   __truediv__ColumnOperators.__truediv__v  s     ||GU++rE   c                .    U R                  [        U5      $ )zUImplement the ``/`` operator in reverse.

See :meth:`.ColumnOperators.__truediv__`.

)r|   r   rZ   s     rA   __rtruediv__ColumnOperators.__rtruediv__  s     ##GU33rE   c                .    U R                  [        U5      $ )zImplement the ``//`` operator.

In a column context, produces the clause ``a / b``,
which is the same as "truediv", but considers the result
type to be integer.

.. versionadded:: 2.0

)rY   r	   rZ   s     rA   __floordiv__ColumnOperators.__floordiv__  s     ||He,,rE   c                .    U R                  [        U5      $ )zWImplement the ``//`` operator in reverse.

See :meth:`.ColumnOperators.__floordiv__`.

)r|   r	   rZ   s     rA   __rfloordiv__ColumnOperators.__rfloordiv__  s     ##He44rE   )rp   r4   r?   r   r@   r   rK   r   )r?   r   rK   r   r   )rK   r   )r   r   rK   r   r:   )r?   r   r   Optional[str]rK   r   NF)r?   r   r   r  r%  r   rK   r   )r?   r   r9  r   rK   r   )r?   r   r@   r   rK   r   )rG  r   rE  r  rK   r   )rG  r   rL  r   rE  r  rK   r   )rh  r7   rK   r   F)r{  r   r|  r   ry  r   rK   r   )Qr8   rO   rP   rQ   rR   rS   r   rT   typingr#   rY   r|   r   r   r   rM   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r
  r  r  r  r  r  r  r!  r(  r,  r0  r4  r   r=  rA  rH  rN  rR  rV  rZ  r]  ra  rd  rg  rk  ro  rr  ru  r}  r  r  r  r  r  r  r  r  r  r  r  rU   r6   rE   rA   r   r     s   #J I#I}#B	""	",/	";>	"	"	""	"+.	":=	"	"'' & %%''59 I 3''!-,++.6 37;;"/;	;: 37 < <"/ <	 <D323,66c*J.: <  37??"/?	?(  7;	"	"&3	"	"
  37@@"/@	@(  7;	"	"&3	"	"
 (+$ ; 
 !% 	Y
Y
 Y
 	Y

 
Y
| !% 	U
U
 U
 	U

 
U
t !% 	Y
Y
 Y
 	Y

 
Y
| !% 	U
U
 U
 	U

 
U
nS6jO7b7> 488C8C#08C	8Cv FJ2
2
),2
5B2
	2
h%
$
, 4 !
+ 3 		00000 :?LL"%L26L	L)$$
((((,4
-5rE   r   zSet[Any]_commutative_comparisonc                "    [        [        U 5      $ r:   )r   r4   fns    rA   _operator_fnr    s    b!!rE   c                0    [         R                  U 5        U $ r:   )r  r   r  s    rA   commutative_opr    s    RIrE   c                0    [         R                  U 5        U $ r:   )r  r   r  s    rA   comparison_opr    s    OOBIrE   c                     [        5       er:   rx   r6   rE   rA   from_r        

rE   c                     [        5       er:   r  r6   rE   rA   function_as_comparison_opr    s     
rE   c                     [        5       er:   r  r6   rE   rA   as_r    r  rE   c                     [        5       er:   r  r6   rE   rA   existsr    r  rE   c                    [        5       er:   r  as    rA   is_truer    r  rE   c                    g r:   r6   r  s    rA   istruer    s    "rE   c                    [        5       er:   r  r  s    rA   is_falser    r  rE   c                    g r:   r6   r  s    rA   isfalser    s     #rE   c                $    U R                  U5      $ r:   )r   r  bs     rA   r   r     s     a  rE   c                $    U R                  U5      $ r:   )r   r  s     rA   r   r     s     !!!$$rE   c                    g r:   r6   r  s     rA   r   r     s    47rE   c                $    U R                  U5      $ r:   )r  r  s     rA   r  r         558OrE   c                $    U R                  U5      $ r:   )r  r  s     rA   r  r         88A;rE   c                    g r:   r6   r  s     rA   r!  r!  
      &)rE   c                $    U R                  U5      $ r:   )rg  r  s     rA   rg  rg    s    99Q<rE   c                0    U R                  U5      " U5      $ r:   rs   )r  rl   r  s      rA   rp   rp     s    44>!rE   c                     U R                  XS9$ Nr   )r   r  r  r   s      rA   r   r     s     66!6##rE   c                     U R                  XS9$ r  )r  r  s      rA   r  r  !  s     99Q9&&rE   c                    g r:   r6   r  s      rA   
notlike_opr  *  s    ILrE   c                     U R                  XS9$ r  )r   r  s      rA   r   r   1  s     7717$$rE   c                     U R                  XS9$ r  )r  r  s      rA   r  r  7  s     ;;q;((rE   c                    g r:   r6   r  s      rA   notilike_opr  @  s    JMrE   c                "    U R                  XUS9$ Nrx  r}  r  r  cry  s       rA   rz  rz  G  s     99QY9//rE   c                $    U R                  XUS9) $ r  r  r  s       rA   not_between_opr  M  s     IIaiI000rE   c                    g r:   r6   r  s       rA   notbetween_opr  V       rE   c                $    U R                  U5      $ r:   )r  r  s     rA   r  r  _  r  rE   c                $    U R                  U5      $ r:   )r  r  s     rA   r  r  e  r  rE   c                    g r:   r6   r  s     rA   notin_opr  n  s    ),rE   c                "    U R                  5       $ r:   )r  r  s    rA   r  r  u  s    ::<rE   c                "    U R                  5       $ r:   )r  r  s    rA   r  r  z      668OrE   c                "    U R                  5       $ r:   )r  r  s    rA   r  r    r  rE   c                    U(       a  USLa  [         R                  " S5        Uc  Sn[        U[        5      (       d  [	        S5      eUS;  a  UR                  X"U-   5      nUR                  SUS-   5      R                  SUS-   5      nU " XS9$ )	NTz;The autoescape parameter is now a simple boolean True/False/z*String value expected when autoescape=True)%_r  r  r   )r(   warnr   r7   	TypeErrorreplace)r  r?   r   r%  s       rA   _escaped_like_implr    s     T!IIM >F%%%HII#MM&6/:Ec6C<088fslKe##rE   c                0    [        U R                  XU5      $ r:   r  r(  r  r  r   r%  s       rA   r&  r&    s    
 allAzBBrE   c                2    [        U R                  XU5      ) $ r:   r  r  s       rA   not_startswith_opr    s    
 q||Q
CCCrE   c                    g r:   r6   r  s       rA   notstartswith_opr    r  rE   c                0    [        U R                  XU5      $ r:   r  r,  r  s       rA   r+  r+    s    
 ammQ
CCrE   c                2    [        U R                  XU5      ) $ r:   r   r  s       rA   not_istartswith_opr    s    
 q}}aDDDrE   c                0    [        U R                  XU5      $ r:   r  r0  r  s       rA   r/  r/        
 ajj!Z@@rE   c                2    [        U R                  XU5      ) $ r:   r  r  s       rA   not_endswith_opr        
 qzz1jAAArE   c                    g r:   r6   r  s       rA   notendswith_opr
    r  rE   c                0    [        U R                  XU5      $ r:   r  r4  r  s       rA   r3  r3        
 akk1jAArE   c                2    [        U R                  XU5      ) $ r:   r  r  s       rA   not_iendswith_opr        
 q{{AzBBBrE   c                0    [        U R                  XU5      $ r:   r  r   r  s       rA   r7  r7    r  rE   c                2    [        U R                  XU5      ) $ r:   r  r  s       rA   not_contains_opr    r  rE   c                    g r:   r6   r  s       rA   notcontains_opr  	  r  rE   c                0    [        U R                  XU5      $ r:   r  r=  r  s       rA   r<  r<  	  r  rE   c                2    [        U R                  XU5      ) $ r:   r  r  s       rA   not_icontains_opr  	  r  rE   c                (    U R                   " U40 UD6$ r:   rA  r  r  r9  s      rA   r@  r@  	  s     771rE   c                     U R                  XS9$ NrD  rH  r  r  rE  s      rA   rF  rF  $	  s     >>!>))rE   c                "    U R                  XS9) $ r  r   r!  s      rA   not_regexp_match_opr#  *	  s     NN1N***rE   c                "    U R                  XUS9$ )NrK  )rN  )r  r  rL  rE  s       rA   rM  rM  0	  s     AeDDrE   c                *    U R                   " U40 UD6) $ r:   r  r  s      rA   not_match_opr&  7	  s     GGArE   c                    g r:   r6   r  s      rA   notmatch_opr(  @	  s    7:rE   c                    [        5       er:   r  r  s     rA   comma_opr*  G	  r  rE   c                    [        5       er:   r  r  s     rA   	filter_opr,  L	  r  rE   c                n     U R                   nU" U5      $ ! [         a    UR                  U 5      s $ f = fr:   )r   AttributeErrorr   )r  r  r   s      rA   r   r   Q	  s;     ay  zz!}s    44c                "    U R                  5       $ r:   )rR  r  s    rA   rQ  rQ  [	  r  rE   c                "    U R                  5       $ r:   )rV  r  s    rA   rU  rU  `	  s    557NrE   c                "    U R                  5       $ r:   )rZ  r  s    rA   rY  rY  e	      ==?rE   c                    g r:   r6   r  s    rA   nullsfirst_opr4  m	  r  rE   c                "    U R                  5       $ r:   )ra  r  s    rA   r`  r`  t	  s    <<>rE   c                    g r:   r6   r  s    rA   nullslast_opr7  |	  s    %(rE   c                    [        5       er:   r  r  s     rA   json_getitem_opr9  	  r  rE   c                    [        5       er:   r  r  s     rA   json_path_getitem_opr;  	  r  rE   c                $    U R                  U5      $ r:   )r   r  s     rA   r   r   	      ==rE   c                $    U R                  U5      $ r:   )r   r  s     rA   r   r   	  s    <<?rE   c                $    U R                  U5      $ r:   )r   r  s     rA   r   r   	  r=  rE   c                "    U R                  5       $ r:   )r   r  s    rA   r   r   	  r2  rE   c                $    U R                  U5      $ r:   )r   r  s     rA   r   r   	      ArE   c                $    U R                  U5      $ r:   )r   r  s     rA   r   r   	  rB  rE   c                h    U [         ;   =(       d#    [        U [        5      =(       a    U R                  $ r:   )r  r   rk   rn   rs   s    rA   rn   rn   	  s$    N
2y 9 Nb>N>NNrE   c                    U [         ;   $ r:   )r  rs   s    rA   is_commutativerF  	      rE   c                4    U [         [        [        [        4;   $ r:   )rU  rQ  rY  r`  rs   s    rA   is_ordering_modifierrI  	  s    &'>=AAArE   c                h    U [         ;   =(       d#    [        U [        5      =(       a    U R                  $ r:   )_natural_self_precedentr   rk   r   rs   s    rA   is_natural_self_precedentrL  	  s-    
%% 	&b)$ &%%rE   c                8    [        U 5      =(       d	    U [        ;   $ r:   )rn   	_booleansrs   s    rA   
is_booleanrO  	  s    /i/rE   c                ,    [         R                  X 5      $ )zSrotate a comparison operator 180 degrees.

Note this is not the same as negation.

)_mirrorgetrs   s    rA   mirrorrS  	  s     ;;rrE   c                    U [         ;   $ r:   )_associativers   s    rA   is_associativerV  	  rG  rE   c                    U [         ;   $ r:   )_order_by_modifierrs   s    rA   is_order_by_modifierrY  	  s    ###rE   c                    [        5       er:   r  r  s    rA   _asboolr[  	  r  rE   c                      \ rS rSrSrSrSrg)_OpLimiti	  id   r6   N)r8   rO   rP   rQ   	_smallest_largestrU   r6   rE   rA   r]  r]  	  s    IHrE   r]                       izDict[OperatorType, int]_PRECEDENCEc                   XL a  [        U 5      (       a  gUc  g[        [        R                  U [	        U S[
        R                  5      5      [        R                  U[	        US[
        R                  5      5      :*  5      $ )NFTrm   )rL  r   ri  rR  getattrr]  r_  r`  )rg   rh   s     rA   is_precedentrl  0
  st     8BB	OO'(L(:L:LM ,8I8IJ
 	
rE   )r  Callable[..., Any]rK   r4   )r  r2   rK   r2   )rK   r   )r  r   rK   r   )r  r   r  r   rK   r   )r  r   rl   r7   r  r   rK   r   r:   )r  r   r  r   r   r  rK   r   r  )
r  r   r  r   r  r   ry  r   rK   r   )
r  rm  r?   r   r   r  r%  r   rK   r   r  )
r  r   r  r   r   r  r%  r   rK   r   )r  r   r  r   r9  r   rK   r   )r  r   r  r   rE  r  rK   r   )
r  r   r  r   rL  r   rE  r  rK   r   )rp   r4   rK   r   )rp   r4   rK   r4   )rp   Optional[OperatorType]rK   r   )rg   r4   rh   rn  rK   r   )rR   
__future__r   enumr   rg   r   _uncast_addr   _uncast_and_r   _uncast_containsr   
_uncast_eqr	   _uncast_floordivr
   
_uncast_ger   _uncast_getitemr   
_uncast_gtr   _uncast_invr   
_uncast_ler   _uncast_lshiftr   
_uncast_ltr   _uncast_modr   _uncast_mulr   
_uncast_ner   _uncast_negr   _uncast_or_r   _uncast_rshiftr   _uncast_subr   _uncast_truedivr  r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%    r'   r(   util.typingr)   r*   _typingr,   	cache_keyr-   elementsr.   type_apir/   r0   r2   r4   rM   rk   r   r  rT   r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r  r  r!  rg  rp   r   r  r  r   r  r  rz  r  r  r  r  r  r  r  r  r  r&  r  r  r+  r  r/  r  r
  r3  r  r7  r  r  r<  r  r@  rF  r#  rM  r&  r(  r*  r,  r   rQ  rU  rY  r4  r`  r7  r9  r;  r   r   r   r   r   r   rn   rF  rI  rL  rN  rO  rQ  rS  union
differencerU  rV  rY  rX  rK  r[  r]  ri  rl  r6   rE   rA   <module>r     s   1 "  ' ) 1 % 1 % / % ' % - % ' ' % ' ' - ' /                  ! "	1%'$Te8CH-.8 D <%L,'./	,
#./	,
#
|_
-	,
#
<%	,
#	lN	+	,
#
<%
<%	,
#
<%
<%	lN	+
<%
|_
-A+ A+Hqgbk qhk5i k5\- b#s+h +RRR0X 0"

                     
 " " F    
 # # G !  ! %  %
 7 7 /      
 ) ) E     $  $ '  '
 L L J %  % )  )
 M M K 0  0 1  1
 27+/	 
 #M      
 , , H      $$#&$0=$KO$$, EJC
CC)C>BCC  C EJD
DD)D>BDD  D IN -BF	 
 ) EJD
DD)D>BDD  D EJE
EE)E>BEE  E EJA
AA)A>BAA  A EJB
BB)B>BBB  B IN -BF	 
 %N EJB
BB)B>BBB  B EJC
CC)C>BCC  C EJA
AA)A>BAA  A EJB
BB)B>BBB  B IN -BF	 
 %N EJB
BB)B>BBB  B EJC
CC)C>BCC  C    *  * +  + =AE
EE!$E-:EE E   
 : : K                
 ) ) #M  
 ( ( !L                    OB '8T3/	0 r2r2r2r
* !!9dC"89DDb"XN$ v~}E &,,o34     w 
;(	2;(r;( B;( B	;(
 R;( R;( ";( ;( Q;( a;( ;( ;( A;( ;( ;(  A!;(" 1#;($ A%;(& q';(( q);(* q+;(, q-;(. a/;(0 !1;(2 Q3;(4 5;(6 q7;(8 a9;(: !;;(< Q=;(> ?;(@ 
1A;(B qC;(D E;(F AG;(H I;(J K;(L aM;(N !O;(P Q;(R S;(T U;(V W;(X Y;(Z A[;(\ ];(^ _;(` Qa;(b ac;(d 	!e;(f g;(h bQ
AQ
ASu;($ ;|

%;
	
rE   