
    -Phч                       d dl mZ d dlZd dlZd dlmZmZmZmZm	Z	m
Z
 d dlmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZmZm Z m!Z!m"Z"m#Z# d dl$m%Z% d dl&m'Z'm(Z(m)Z) erVd dlm*Z* d dl+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl$m6Z6 d dl&m7Z7m8Z8 d dl9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ e1e3e*f         ZAee*         ZB ejC        eD          5  d dlmEZE ddd           n# 1 swxY w Y    G d ded                   ZFdS )    )annotationsN)TYPE_CHECKINGAnyCallableLiteralSequencecast)CoalesceOperatorFunctionExpressionStarExpression)DuckDBPyType)LazyExpr)WindowInputsDuckDBExprDateTimeNamespaceDuckDBExprListNamespaceDuckDBExprStringNamespaceDuckDBExprStructNamespace)colgenerate_order_by_sqlgenerate_partition_by_sqllitnarwhals_to_native_dtypewhen)ExprKind)Implementationnot_implementedrequires)
Expression)Self)
AliasNames	EvalNames
EvalSeriesWindowFunction)DuckDBLazyFrameDuckDBNamespace)ExprMetadata)Version_FullContext)FillNullStrategy	IntoDTypeNonNestedLiteralNumericLiteral
RankMethodRollingInterpolationMethodTemporalLiteral)SQLExpressionc                  6   e Zd Zej        Z	 dddZedd            ZddZ	ddZ
ddZddZdddd'Zdd+Zedd/            Zedd1            Zdd5Zdd6Zdd7Zdd8Zdd;Zdd=Zdd>ZeddC            ZddDZddEZddFZddGZddHZddIZddJZ ddKZ!ddLZ"ddMZ#ddNZ$ddOZ%ddPZ&ddQZ'ddRZ(ddSZ)ddTZ*ddUZ+ddVZ,ddWZ-ddXZ.ddYZ/ddZZ0dd[Z1dd\Z2dd]Z3dd^Z4ddcZ5ddgZ6ddhZ7ddiZ8ddjZ9ddkZ:ddlZ;ddmZ<ddnZ=ddoZ>ddpZ? e@jA        dq          ddv            ZBddwZCddxZDddyZEdd{ZFdd}ZG e@jA        dq          dd            ZH e@jA        dq          dd            ZI e@jA        dq          dd            ZJ e@jA        dq          dd            ZK e@jA        dq          dd            ZL e@jA        dq          dd            ZM e@jA        dq          dd            ZN e@jA        dq          dd            ZO e@jA        dq          dd            ZP e@jA        dq          dd            ZQ e@jA        dq          dd            ZR e@jA        dq          dd            ZS e@jA        dq          dd            ZTddZUddZV e@jA        dq          dd            ZW e@jA        dq          dd            ZXddZYddZZedd            Z[edd            Z\edd            Z]edd            Z^ e_            Z` e_            ZadS )
DuckDBExprNcall'EvalSeries[DuckDBLazyFrame, Expression]window_functionDuckDBWindowFunction | Noneevaluate_output_namesEvalNames[DuckDBLazyFrame]alias_output_namesAliasNames | Nonebackend_versiontuple[int, ...]versionr,   returnNonec               h    || _         || _        || _        || _        || _        d | _        || _        d S N)_call_evaluate_output_names_alias_output_names_backend_version_version	_metadata_window_function)selfr8   r:   r<   r>   r@   rB   s          U/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/narwhals/_duckdb/expr.py__init__zDuckDBExpr.__init__>   s?     
&;##5  /.2=L    DuckDBWindowFunctionc                "     d fd} j         p|S )	Ndfr(   window_inputsDuckDBWindowInputsrC   list[Expression]c                n    |j         rJ t          |j         }d| dfd |           D             S )Nz{expr} over ()c                V    g | ]%}t                              |                     &S exprr5   format).0r]   templates     rO   
<listcomp>zKDuckDBExpr.window_function.<locals>.default_window_func.<locals>.<listcomp>X   s/    SSS$M(//t/"<"<==SSSrQ   )order_byr   partition_by)rT   rU   partition_by_sqlra   rN   s      @rO   default_window_funcz7DuckDBExpr.window_function.<locals>.default_window_funcR   sV     %----8-:TU<)9<<<HSSSS$$r((SSSSrQ   rT   r(   rU   rV   rC   rW   )rM   )rN   rf   s   ` rO   r:   zDuckDBExpr.window_functionP   s8    	T 	T 	T 	T 	T 	T $;(;;rQ   rT   r(   Sequence[Expression]c                ,    |                      |          S rF   )rG   )rN   rT   s     rO   __call__zDuckDBExpr.__call__\   s    zz"~~rQ   c                    d S rF    rN   s    rO   __narwhals_expr__zDuckDBExpr.__narwhals_expr___   s      rQ   r*   c                <    ddl m}  || j        | j                  S )Nr   r)   )r@   rB   )narwhals._duckdb.namespacer*   rJ   rK   )rN   r*   s     rO   __narwhals_namespace__z!DuckDBExpr.__narwhals_namespace__a   s7    >>>>>> 14=
 
 
 	
rQ   reversebool	func_name0Literal['sum', 'max', 'min', 'count', 'product']c                    d fd}|S )	NrT   r(   inputsrV   rC   rW   c                    t          |j        d i}t          |j         } d| d| dfd |           D             S )N	ascendingz ({expr}) over ( z2 rows between unbounded preceding and current row)c                V    g | ]%}t                              |                     &S r[   r^   r`   r]   sqls     rO   rb   z=DuckDBExpr._cum_window_func.<locals>.func.<locals>.<listcomp>v   /    NNNTM#**$*"7"788NNNrQ   r   rc   r   rd   )rT   rw   order_by_sqlre   r}   rt   rr   rN   s       @rO   funcz)DuckDBExpr._cum_window_func.<locals>.funco   s    0&/YQX[YYL8&:MN D D0@ D D< D D D  ONNNTT"XXNNNNrQ   rT   r(   rw   rV   rC   rW   rl   )rN   rr   rt   r   s   ``` rO   _cum_window_funczDuckDBExpr._cum_window_funci   s<    	O 	O 	O 	O 	O 	O 	O 	O rQ   )ddof$Literal['sum', 'mean', 'std', 'var']centerwindow_sizeintmin_samplesr   
int | Nonec                   	
 g d|r|dz
  dz  }|dz
  dz  }||z    d
| d	n
|dz
   d
d	d	 
fd}|S )N)summeanstdvar      z
 preceding
 followingzcurrent rowrT   r(   rw   rV   rC   rW   c           	        t          |j        ddi}t          |j         }d| d| d d
 d	}dv r}nkd	k    r		d
k    rd}n\d	v r		dk    rd}nOdk    r		d
k    rd}n@dk    r		dk    rd}n1dv rd d}t	          |          d d d}t	          |          d| d | d| fd |           D             S )Nry   T(rz    rows between z and rY   >   r   r   r   r   var_popr   var_sampr   
stddev_popstddev_samp>   r   r   z;Only ddof=0 and ddof=1 are currently supported for rolling_.z,Only the following functions are supported: z.
Got: zcount({expr}) over z >= z({expr}) over c           
         g | ]T}t          t                              |                     t                              |                               US r[   )r   r5   r_   )r`   r]   condition_sql	value_sqls     rO   rb   zADuckDBExpr._rolling_window_func.<locals>.func.<locals>.<listcomp>   sm       
 	 !-"6"6D"6"A"ABB!)"2"2"2"="=>>   rQ   )r   rc   r   rd   
ValueError)rT   rw   r   re   windowfunc_msgr   r   r   endrt   r   rN   startsupported_funcss          @@rO   r   z-DuckDBExpr._rolling_window_func.<locals>.func   sz   0&/RTRRL8&:MNZ)ZZLZZZZTWZZZFO++&e##		!e##		"e##		$e##		%n,,`T]``` oo%j_jj^gjjj oo%MFMMMMM ::&::I    
 !DHH   rQ   r   rl   )rN   rt   r   r   r   r   half	remainderr   r   r   r   s   ``  ``   @@@rO   _rolling_window_funczDuckDBExpr._rolling_window_funcz   s     877 	 !O)D$qA-Ii'333E%%%CC"Q222EC	 	 	 	 	 	 	 	 	 	 	 	< rQ   kind/Literal[ExprKind.AGGREGATION, ExprKind.LITERAL]r#   c                    |t           j        u r| S | j        dk     rd}t          |          |                     t          d          gg           S )Nr      z`At least version 1.3 of DuckDB is required for binary operations between aggregates and columns.r   )r   LITERALrJ   NotImplementedErroroverr   )rN   r   r   s      rO   	broadcastzDuckDBExpr.broadcast   sR    8###K 6))tC%c***yy#a&&2&&&rQ   evaluate_column_namescontextr-   c              D    dfd} | |d |j         |j                  S )NrT   r(   rC   rW   c                .    d  |           D             S )Nc                ,    g | ]}t          |          S rl   r   )r`   names     rO   rb   z>DuckDBExpr.from_column_names.<locals>.func.<locals>.<listcomp>   s    DDD$CIIDDDrQ   rl   )rT   r   s    rO   r   z*DuckDBExpr.from_column_names.<locals>.func   s#    DD*?*?*C*CDDDDrQ   r<   r>   r@   rB   rT   r(   rC   rW   )rJ   rK   )clsr   r   r   s    `  rO   from_column_nameszDuckDBExpr.from_column_names   sW    	E 	E 	E 	E 	E 	E s"7##4$
 
 
 	
rQ   column_indicesc               j    dfd} | ||                                d |j        |j                  S )NrT   r(   rC   rW   c                0    | j         fdD             S )Nc                :    g | ]}t          |                   S rl   r   )r`   icolumnss     rO   rb   z@DuckDBExpr.from_column_indices.<locals>.func.<locals>.<listcomp>   s#    <<<C
OO<<<rQ   )r   )rT   r   r   s    @rO   r   z,DuckDBExpr.from_column_indices.<locals>.func   s%    jG<<<<^<<<<rQ   r   r   )_eval_names_indicesrJ   rK   )r   r   r   r   s     ` rO   from_column_indiceszDuckDBExpr.from_column_indices   s_    	= 	= 	= 	= 	= 	= s"%"9"9."I"I##4$
 
 
 	
rQ   Callable[..., Expression]expressifiable_args
Self | Anyc                    d fd}|S )NrT   r(   rC   rW   c                ~                 } fd                                 D             fd|D             S )Nc                    i | ]?\  }}|                     |          r                    |          nt          |          @S rl   )_is_expr_evaluate_exprr   )r`   keyvaluerT   rN   s      rO   
<dictcomp>zEDuckDBExpr._callable_to_eval_series.<locals>.func.<locals>.<dictcomp>   sY     # # #C u1E1EUR&&u---3u::# # #rQ   c                "    g | ]} |fi S rl   rl   r`   native_seriesr8   other_native_seriess     rO   rb   zEDuckDBExpr._callable_to_eval_series.<locals>.func.<locals>.<listcomp>   <       ! ]::&9::  rQ   )items)rT   native_series_listr   r8   r   rN   s   ` @rO   r   z1DuckDBExpr._callable_to_eval_series.<locals>.func   s}    !%b# # # # #"5";";"="=# # #    %7   rQ   r   rl   )rN   r8   r   r   s   ``` rO   _callable_to_eval_seriesz#DuckDBExpr._callable_to_eval_series   s4    		 		 		 		 		 		 		 		 rQ   c                    d fd}|S )	NrT   r(   rU   rV   rC   rW   c                                                     } fd                                D             fd|D             S )Nc                    i | ]@\  }}|                     |          r                    |          nt          |          AS rl   )r   _evaluate_window_exprr   )r`   r   r   rT   rN   rU   s      rO   r   zKDuckDBExpr._push_down_window_function.<locals>.window_f.<locals>.<dictcomp>   sa     # # # C =='' R--e]CCCZZ# # #rQ   c                "    g | ]} |fi S rl   rl   r   s     rO   rb   zKDuckDBExpr._push_down_window_function.<locals>.window_f.<locals>.<listcomp>   r   rQ   )r:   r   )rT   rU   r   r   r8   r   rN   s   `` @rO   window_fz7DuckDBExpr._push_down_window_function.<locals>.window_f   s     "&!5!5b-!H!H# # # # # # #6";";"="=	# # #    %7   rQ   rg   rl   )rN   r8   r   r   s   ``` rO   _push_down_window_functionz%DuckDBExpr._push_down_window_function   s4    	 	 	 	 	 	 	 	( rQ   c               v    |                       | j        |fi || j        | j        | j        | j                  S )aN  Create expression from callable.

        Arguments:
            call: Callable from compliant DataFrame to native Expression
            expr_name: Expression name
            expressifiable_args: arguments pass to expression which should be parsed
                as expressions (e.g. in `nw.col('a').is_between('b', 'c')`)
        r   )	__class__r   rH   rI   rJ   rK   rN   r8   r   s      rO   _with_callablezDuckDBExpr._with_callable   sO     ~~)D)$FF2EFF"&"=#7 1M  
 
 	
rQ   c                   |                       | j        |fi | | j        |fi || j        | j        | j        | j                  S Nr   r   r   r   rH   rI   rJ   rK   r   s      rO   _with_elementwisezDuckDBExpr._with_elementwise  sh     ~~)D)$FF2EFF+D+DHH4GHH"&"=#7 1M  
 
 	
rQ   opotherc                    |                      |                     ||          |                     ||          | j        | j        | j        | j                  S )N)r   r   r   )rN   r   r   s      rO   _with_binaryzDuckDBExpr._with_binary  s`    ~~))"E)::++Be+<<"&"=#7 1M  
 
 	
rQ   r   c               p     t          |           | j        | j        | j        || j        | j                  S r   )typerG   rM   rH   rJ   rK   rN   r   s     rO   _with_alias_output_namesz#DuckDBExpr._with_alias_output_names(  s@    tDzzJ!"&"=# 1M
 
 
 	
rQ   c                j    |                      | j        || j        | j        | j        | j                  S r   )r   rG   rH   rI   rJ   rK   )rN   r:   s     rO   _with_window_functionz DuckDBExpr._with_window_function2  s<    ~~J"&"=#7 1M  
 
 	
rQ   r]   r"   r   strc                ,    |                     |          S rF   )alias)r   r]   r   s      rO   _alias_nativezDuckDBExpr._alias_native<  s    zz$rQ   c                0    |                      d |          S )Nc                    | |z  S rF   rl   r]   r   s     rO   <lambda>z$DuckDBExpr.__and__.<locals>.<lambda>A  
    TE\ rQ   r   rN   r   s     rO   __and__zDuckDBExpr.__and__@        !A!A5IIIrQ   c                0    |                      d |          S )Nc                    | |z  S rF   rl   r   s     rO   r   z#DuckDBExpr.__or__.<locals>.<lambda>D  r   rQ   r   r   s     rO   __or__zDuckDBExpr.__or__C  r   rQ   c                0    |                      d |          S )Nc                    | |z   S rF   rl   r   s     rO   r   z$DuckDBExpr.__add__.<locals>.<lambda>G  r   rQ   r   r   s     rO   __add__zDuckDBExpr.__add__F  r   rQ   c                0    |                      d |          S )Nc                    | |z  S rF   rl   r   s     rO   r   z(DuckDBExpr.__truediv__.<locals>.<lambda>J  r   rQ   r   r   s     rO   __truediv__zDuckDBExpr.__truediv__I  r   rQ   c                V    |                      d |                              d          S )Nc                ,    |                     |           S rF   )r  r   s     rO   r   z)DuckDBExpr.__rtruediv__.<locals>.<lambda>N  s     1 1$ 7 7 rQ   literalr   r   r   s     rO   __rtruediv__zDuckDBExpr.__rtruediv__L  s/      77
 

%	

	rQ   c                0    |                      d |          S )Nc                    | |z  S rF   rl   r   s     rO   r   z)DuckDBExpr.__floordiv__.<locals>.<lambda>R  s
    TU] rQ   r   r   s     rO   __floordiv__zDuckDBExpr.__floordiv__Q        !B!BEJJJrQ   c                V    |                      d |                              d          S )Nc                ,    |                     |           S rF   )r  r   s     rO   r   z*DuckDBExpr.__rfloordiv__.<locals>.<lambda>V  s     2 24 8 8 rQ   r  r	  r   s     rO   __rfloordiv__zDuckDBExpr.__rfloordiv__T  s/      88%
 

%	

	rQ   c                0    |                      d |          S )Nc                    | |z  S rF   rl   r   s     rO   r   z$DuckDBExpr.__mod__.<locals>.<lambda>Z  r   rQ   r   r   s     rO   __mod__zDuckDBExpr.__mod__Y  r   rQ   c                V    |                      d |                              d          S )Nc                ,    |                     |           S rF   )r  r   s     rO   r   z%DuckDBExpr.__rmod__.<locals>.<lambda>]      U]]45H5H rQ   r  r	  r   s     rO   __rmod__zDuckDBExpr.__rmod__\  1      !H!H%PPVV
 
 	
rQ   c                0    |                      d |          S )Nc                    | |z
  S rF   rl   r   s     rO   r   z$DuckDBExpr.__sub__.<locals>.<lambda>b  r   rQ   r   r   s     rO   __sub__zDuckDBExpr.__sub__a  r   rQ   c                V    |                      d |                              d          S )Nc                ,    |                     |           S rF   )r  r   s     rO   r   z%DuckDBExpr.__rsub__.<locals>.<lambda>e  r  rQ   r  r	  r   s     rO   __rsub__zDuckDBExpr.__rsub__d  r  rQ   c                0    |                      d |          S )Nc                    | |z  S rF   rl   r   s     rO   r   z$DuckDBExpr.__mul__.<locals>.<lambda>j  r   rQ   r   r   s     rO   __mul__zDuckDBExpr.__mul__i  r   rQ   c                0    |                      d |          S )Nc                    | |z  S rF   rl   r   s     rO   r   z$DuckDBExpr.__pow__.<locals>.<lambda>m  s
    T5[ rQ   r   r   s     rO   __pow__zDuckDBExpr.__pow__l  s      !@!@%HHHrQ   c                V    |                      d |                              d          S )Nc                ,    |                     |           S rF   )r%  r   s     rO   r   z%DuckDBExpr.__rpow__.<locals>.<lambda>p  r  rQ   r  r	  r   s     rO   __rpow__zDuckDBExpr.__rpow__o  r  rQ   c                0    |                      d |          S )Nc                    | |k     S rF   rl   r   s     rO   r   z#DuckDBExpr.__lt__.<locals>.<lambda>u  
    TE\ rQ   r   r   s     rO   __lt__zDuckDBExpr.__lt__t  r   rQ   c                0    |                      d |          S )Nc                    | |k    S rF   rl   r   s     rO   r   z#DuckDBExpr.__gt__.<locals>.<lambda>x  r+  rQ   r   r   s     rO   __gt__zDuckDBExpr.__gt__w  r   rQ   c                0    |                      d |          S )Nc                    | |k    S rF   rl   r   s     rO   r   z#DuckDBExpr.__le__.<locals>.<lambda>{  
    TU] rQ   r   r   s     rO   __le__zDuckDBExpr.__le__z  r  rQ   c                0    |                      d |          S )Nc                    | |k    S rF   rl   r   s     rO   r   z#DuckDBExpr.__ge__.<locals>.<lambda>~  r2  rQ   r   r   s     rO   __ge__zDuckDBExpr.__ge__}  r  rQ   c                0    |                      d |          S )Nc                    | |k    S rF   rl   r   s     rO   r   z#DuckDBExpr.__eq__.<locals>.<lambda>  r2  rQ   r   r   s     rO   __eq__zDuckDBExpr.__eq__  r  rQ   c                0    |                      d |          S )Nc                    | |k    S rF   rl   r   s     rO   r   z#DuckDBExpr.__ne__.<locals>.<lambda>  r2  rQ   r   r   s     rO   __ne__zDuckDBExpr.__ne__  r  rQ   c                `    t          dt          j                  }|                     |          S )Nr   )r	   operatorinvertr   )rN   r?  s     rO   
__invert__zDuckDBExpr.__invert__  s(    18?CC%%f---rQ   c                .    |                      d           S )Nc                "    t          d|           S )Nabsr   r\   s    rO   r   z DuckDBExpr.abs.<locals>.<lambda>  s    3EeT3R3R rQ   r   rm   s    rO   rC  zDuckDBExpr.abs  s    %%&R&RSSSrQ   c                .    |                      d           S )Nc                "    t          d|           S )Nr   rD  r\   s    rO   r   z!DuckDBExpr.mean.<locals>.<lambda>  s    0B640P0P rQ   r   rm   s    rO   r   zDuckDBExpr.mean  s    ""#P#PQQQrQ   c                4    dd}|                      |          S )Nr]   r"   rC   c           
     H   t          d|           }t          d|           |t          d          z
  z  t          d||t          d          z
  z            z  }t          |t          d          k    t          d                                         t          |t          d          k    t          t	          d                                                  t          |t          d          k    t          d                                        |                              S )	Ncountskewnessr   sqrtr   r   nang        )r   r   r   	otherwisefloat)r]   rK  sample_skewnesss      rO   r   zDuckDBExpr.skew.<locals>.func  s    &w55E #:t443q66>#$VUec!ffn-EFFG 
 QT33==Uc!ff_c%,,&7&788BB#a&&#c((33==oNN   rQ   r]   r"   rC   r"   rH  r   s     rO   skewzDuckDBExpr.skew  s,    	 	 	 	 ""4(((rQ   c                .    |                      d           S )Nc                "    t          d|           S )NmedianrD  r\   s    rO   r   z#DuckDBExpr.median.<locals>.<lambda>  s    0B8T0R0R rQ   rH  rm   s    rO   rV  zDuckDBExpr.median  s    ""#R#RSSSrQ   c                h     dd}d fd
}                      |                              |          S )Nr]   r"   rC   c                X    t          t          d|           t          d                    S )Nbool_andTr
   r   r   r\   s    rO   fzDuckDBExpr.all.<locals>.f  s#    #$6z4$H$H#d))TTTrQ   rT   r(   rU   rV   rW   c                P    t          |j         fd |           D             S )Nc           
         g | ]@}t          t          t          d |           d d          t          d                    AS )rY   over (rY   Tr
   r5   r   r   r`   r]   pbs     rO   rb   z4DuckDBExpr.all.<locals>.window_f.<locals>.<listcomp>  sf       
 	 !!%7
D%I%I"W"WRT"W"W"WXXII   rQ   r   rd   rT   rU   ra  rN   s     @rO   r   z DuckDBExpr.all.<locals>.window_f  H     +M,FGB   
 !DHH   rQ   rR  rg   r   r   rN   r[  r   s   `  rO   allzDuckDBExpr.all  ]    	U 	U 	U 	U
	 
	 
	 
	 
	 
	 ""1%%;;HEEErQ   c                h     dd}d fd
}                      |                              |          S )Nr]   r"   rC   c                X    t          t          d|           t          d                    S )Nbool_orFrZ  r\   s    rO   r[  zDuckDBExpr.any.<locals>.f  s#    #$6y$$G$GUTTTrQ   rT   r(   rU   rV   rW   c                P    t          |j         fd |           D             S )Nc           
         g | ]@}t          t          t          d |           d d          t          d                    AS )rk  r^  rY   Fr_  r`  s     rO   rb   z4DuckDBExpr.any.<locals>.window_f.<locals>.<listcomp>  sf       
 	 !!%7	4%H%H"V"VQS"V"V"VWWJJ   rQ   rb  rc  s     @rO   r   z DuckDBExpr.any.<locals>.window_f  rd  rQ   rR  rg   re  rf  s   `  rO   anyzDuckDBExpr.any  rh  rQ   quantilerP  interpolationr3   c                >    dfd}|                      |          S )Nr]   r"   rC   c                n    dk    rt          d| t                              S d}t          |          )Nlinearquantile_contzDOnly linear interpolation methods are supported for DuckDB quantile.)r   r   r   )r]   r   rp  ro  s     rO   r   z!DuckDBExpr.quantile.<locals>.func  s9    (()/4XOOOXC%c***rQ   rR  rH  )rN   ro  rp  r   s    `` rO   ro  zDuckDBExpr.quantile  s=    	+ 	+ 	+ 	+ 	+ 	+ 	+ ""4(((rQ   lower_bound.Self | NumericLiteral | TemporalLiteral | Noneupper_boundc                    dd}dd}dd	}||                      ||
          S ||                      ||          S |                      |||          S )Nr]   r"   ru  r   rC   c                $    t          d| |          S )NgreatestrD  )r]   ru  s     rO   _clip_lowerz$DuckDBExpr.clip.<locals>._clip_lower  s    %j$DDDrQ   rw  c                $    t          d| |          S )NleastrD  )r]   rw  s     rO   _clip_upperz$DuckDBExpr.clip.<locals>._clip_upper  s    %gt[AAArQ   c                B    t          dt          d| |          |          S )Nrz  r}  rD  )r]   ru  rw  s      rO   
_clip_bothz#DuckDBExpr.clip.<locals>._clip_both  s*     &.wkJJK  rQ   )rw  )ru  )ru  rw  )r]   r"   ru  r   rC   r"   )r]   r"   rw  r   rC   r"   )r]   r"   ru  r   rw  r   rC   r"   rE  )rN   ru  rw  r{  r~  r  s         rO   clipzDuckDBExpr.clip  s    
	E 	E 	E 	E	B 	B 	B 	B	 	 	 	 ))+;)OOO))+;)OOO%%K[ & 
 
 	
rQ   c                h     dd}d fd
}                      |                              |          S )Nr]   r"   rC   c                X    t          t          d|           t          d                    S )Nr   r   rZ  r\   s    rO   r[  zDuckDBExpr.sum.<locals>.f  s#    #$6ud$C$CSVVLLLrQ   rT   r(   rU   rV   rW   c                P    t          |j         fd |           D             S )Nc           
         g | ]@}t          t          t          d |           d d          t          d                    AS )r   r^  rY   r   r_  r`  s     rO   rb   z4DuckDBExpr.sum.<locals>.window_f.<locals>.<listcomp>  se       
 	 !!%7t%D%D"R"RR"R"R"RSSFF   rQ   rb  rc  s     @rO   r   z DuckDBExpr.sum.<locals>.window_f  rd  rQ   rR  rg   re  rf  s   `  rO   r   zDuckDBExpr.sum  s]    	M 	M 	M 	M
	 
	 
	 
	 
	 
	 ""1%%;;HEEErQ   c                4    dd}|                      |          S )Nr]   r"   rC   c           
         t          dt          d|                     t          dt          |                                 t          d                                        t          d                              z   S )Narray_unique	array_aggmaxr   r   )r   r   	isnotnullr   rO  r\   s    rO   r   z!DuckDBExpr.n_unique.<locals>.func   si    % 2; E E "tDNN,,c!ff55??AGG  rQ   rR  rH  r   s     rO   n_uniquezDuckDBExpr.n_unique  s,    	 	 	 	 ""4(((rQ   c                .    |                      d           S )Nc                "    t          d|           S NrK  rD  r\   s    rO   r   z"DuckDBExpr.count.<locals>.<lambda>  s    0B7D0Q0Q rQ   rH  rm   s    rO   rK  zDuckDBExpr.count
  s    ""#Q#QRRRrQ   c                .    |                      d           S )Nc                     t          d          S r  rD  )_exprs    rO   r   z DuckDBExpr.len.<locals>.<lambda>  s    1CG1L1L rQ   rH  rm   s    rO   lenzDuckDBExpr.len  s    ""#L#LMMMrQ   c                    dk    r|                      d           S dk    r|                      d           S d	fd}|                      |          S )
Nr   c                "    t          d|           S )Nr   rD  r\   s    rO   r   z DuckDBExpr.std.<locals>.<lambda>  s    /dCC rQ   r   c                "    t          d|           S )Nr   rD  r\   s    rO   r   z DuckDBExpr.std.<locals>.<lambda>  s    /tDD rQ   r]   r"   rC   c                    t          d|           }t          d|           t          d|          z  t          d|t                    z
            z  S )NrK  r   rM  r   r   r]   	n_samplesr   s     rO   _stdzDuckDBExpr.std.<locals>._std  sT    *7D99I"<66$VY778%fy3t99/DFFHrQ   rR  rH  )rN   r   r  s    ` rO   r   zDuckDBExpr.std  s    199&&CC   199&&DD  	 	 	 	 	 	 ""4(((rQ   c                    dk    r|                      d           S dk    r|                      d           S d	fd}|                      |          S )
Nr   c                "    t          d|           S )Nr   rD  r\   s    rO   r   z DuckDBExpr.var.<locals>.<lambda>&  s    4FyRV4W4W rQ   r   c                "    t          d|           S )Nr   rD  r\   s    rO   r   z DuckDBExpr.var.<locals>.<lambda>(  s    4FzSW4X4X rQ   r]   r"   rC   c                p    t          d|           }t          d|           |z  |t                    z
  z  S )NrK  r   r  r  s     rO   _varzDuckDBExpr.var.<locals>._var*  s:    *7D99I"9d33i?9sSWyyCXYrQ   rR  rH  )rN   r   r  s    ` rO   r   zDuckDBExpr.var$  sy    199&&'W'WXXX199&&'X'XYYY	 	 	 	 	 	 ""4(((rQ   c                .    |                      d           S )Nc                "    t          d|           S )Nr  rD  r\   s    rO   r   z DuckDBExpr.max.<locals>.<lambda>3      0B5$0O0O rQ   rH  rm   s    rO   r  zDuckDBExpr.max2      ""#O#OPPPrQ   c                .    |                      d           S )Nc                "    t          d|           S )NminrD  r\   s    rO   r   z DuckDBExpr.min.<locals>.<lambda>6  r  rQ   rH  rm   s    rO   r  zDuckDBExpr.min5  r  rQ   c                .    |                      d           S )Nc                l    t          d|                                                     d                    S )Nr   r   )r   isnullr	   r\   s    rO   r   z'DuckDBExpr.null_count.<locals>.<lambda>:  s'    +E4;;==3E3Ee3L3LMM rQ   rH  rm   s    rO   
null_countzDuckDBExpr.null_count8  s     ""MM
 
 	
rQ   r   rd   Sequence[str | Expression]rc   Sequence[str]c                t     d fd}                      | j         j         j         j                  S )NrT   r(   rC   rh   c                L                         | t                              S rF   )r:   r   )rT   rc   rd   rN   s    rO   r   zDuckDBExpr.over.<locals>.funcA  s#    ''Lx,P,PQQQrQ   r   rT   r(   rC   rh   )r   rH   rI   rJ   rK   )rN   rd   rc   r   s   ``` rO   r   zDuckDBExpr.over=  sl    	R 	R 	R 	R 	R 	R 	R 	R ~~"&"=#7 1M  
 
 	
rQ   c                .    |                      d           S )Nc                *    |                                  S rF   )r  r\   s    rO   r   z$DuckDBExpr.is_null.<locals>.<lambda>M  s    4;;== rQ   rE  rm   s    rO   is_nullzDuckDBExpr.is_nullL  s    %%&@&@AAArQ   c                .    |                      d           S )Nc                "    t          d|           S )NisnanrD  r\   s    rO   r   z#DuckDBExpr.is_nan.<locals>.<lambda>P  s    3Egt3T3T rQ   rE  rm   s    rO   is_nanzDuckDBExpr.is_nanO  s    %%&T&TUUUrQ   c                .    |                      d           S )Nc                "    t          d|           S )NisfiniterD  r\   s    rO   r   z&DuckDBExpr.is_finite.<locals>.<lambda>S  s    3EjRV3W3W rQ   rE  rm   s    rO   	is_finitezDuckDBExpr.is_finiteR  s    %%&W&WXXXrQ   Sequence[Any]c                4    |                      fd          S )Nc                @    t          dt                    |           S )Ncontainsr  r   s    rO   r   z"DuckDBExpr.is_in.<locals>.<lambda>W  s    +JE

DII rQ   rE  r   s    `rO   is_inzDuckDBExpr.is_inU  '    %%IIII
 
 	
rQ   decimalsc                4    |                      fd          S )Nc                @    t          d| t                              S )Nroundr  )r]   r  s    rO   r   z"DuckDBExpr.round.<locals>.<lambda>\  s    +GT3x==II rQ   rE  )rN   r  s    `rO   r  zDuckDBExpr.roundZ  r  rQ   nc                >     d fd}                      |          S )	NrT   r(   rw   rV   rC   rh   c                    t          |j        ddi}t          |j         }d d| d| dfd |           D             S )Nry   Tzlag({expr}, z) over (rz   rY   c                V    g | ]%}t                              |                     &S r[   r^   r|   s     rO   rb   z2DuckDBExpr.shift.<locals>.func.<locals>.<listcomp>e  r~   rQ   r   )rT   rw   r   re   r}   r  rN   s       @rO   r   zDuckDBExpr.shift.<locals>.funca  si    0&/RTRRL8&:MNP1PP.>PPPPPCNNNNTT"XXNNNNrQ   rT   r(   rw   rV   rC   rh   r   )rN   r  r   s   `` rO   shiftzDuckDBExpr.shift_  sD    	O 	O 	O 	O 	O 	O 	O ))$///rQ   c                :     d fd}                      |          S )	NrT   r(   rw   rV   rC   rh   c                    t          |j        ddi}|j        rt          |j         dz   }nd}t	          d           d| d| dfd	 |           D             S )
Nry   T, {expr}partition by {expr}
row_number over(rz   rY   c                x    g | ]6}t                              |                     t          d          k    7S r\   r   r5   r_   r   r|   s     rO   rb   z>DuckDBExpr.is_first_distinct.<locals>.func.<locals>.<listcomp>w  :    XXXtM#**$*"7"788CFFBXXXrQ   r   rc   rd   r   r   rT   rw   r   re   r}   rN   s       @rO   r   z*DuckDBExpr.is_first_distinct.<locals>.funck  s    0&/RTRRL" 9-v/BCjP !  $9 %l33 ; ;(; ;+7; ; ;  YXXXttTVxxXXXXrQ   r  r  r   s   ` rO   is_first_distinctzDuckDBExpr.is_first_distincti  =    	Y 	Y 	Y 	Y 	Y 	Y ))$///rQ   c                :     d fd}                      |          S )	NrT   r(   rw   rV   rC   rh   c                    t          |j        ddi}|j        rt          |j         dz   }nd}t	          d           d| d| dfd	 |           D             S )
Nry   Fr  r  r  r  rz   rY   c                x    g | ]6}t                              |                     t          d          k    7S r  r  r|   s     rO   rb   z=DuckDBExpr.is_last_distinct.<locals>.func.<locals>.<listcomp>  r  rQ   r  r  s       @rO   r   z)DuckDBExpr.is_last_distinct.<locals>.func}  s    0&/SUSSL" 9-v/BCjP !  $9 %l33 ; ;(; ;+7; ; ;  YXXXttTVxxXXXXrQ   r  r  r   s   ` rO   is_last_distinctzDuckDBExpr.is_last_distinct{  r  rQ   c                :     d fd}                      |          S )	NrT   r(   rw   rV   rC   rW   c                    t          |j        ddi}t          |j         }d| d| dfd |           D             S )Nry   Tzlag({expr}) over (rz   rY   c                \    g | ](}|t                              |                     z
  )S r[   r^   r|   s     rO   rb   z1DuckDBExpr.diff.<locals>.func.<locals>.<listcomp>  s4    UUUDD=)>)>???UUUrQ   r   r  s       @rO   r   zDuckDBExpr.diff.<locals>.func  sb    0&/RTRRL8&:MNK)9KKLKKKCUUUUDDQSHHUUUUrQ   r   r  r   s   ` rO   diffzDuckDBExpr.diff  s=    	V 	V 	V 	V 	V 	V ))$///rQ   c               V    |                      |                     |d                    S )Nr   rr   rt   r   r   rN   rr   s     rO   cum_sumzDuckDBExpr.cum_sum  0    ))!!'U!CC
 
 	
rQ   c               V    |                      |                     |d                    S )Nr  r  r  r  s     rO   cum_maxzDuckDBExpr.cum_max  r  rQ   c               V    |                      |                     |d                    S )Nr  r  r  r  s     rO   cum_minzDuckDBExpr.cum_min  r  rQ   c               V    |                      |                     |d                    S )NrK  r  r  r  s     rO   	cum_countzDuckDBExpr.cum_count  s0    ))!!'W!EE
 
 	
rQ   c               V    |                      |                     |d                    S )Nproductr  r  r  s     rO   cum_prodzDuckDBExpr.cum_prod  s0    ))!!'Y!GG
 
 	
rQ   c               Z    |                      |                     d|||                    S )Nr   rt   r   r   r   r   r   rN   r   r   r   s       rO   rolling_sumzDuckDBExpr.rolling_sum  s>    ))%%''	 &  
 
 	
rQ   c               Z    |                      |                     d|||                    S )Nr   r  r  r  s       rO   rolling_meanzDuckDBExpr.rolling_mean  s>    ))%% ''	 &  
 
 	
rQ   c          	     \    |                      |                     d||||                    S )Nr   rt   r   r   r   r   r  rN   r   r   r   r   s        rO   rolling_varzDuckDBExpr.rolling_var  C     ))%%'' &  
 
 	
rQ   c          	     \    |                      |                     d||||                    S )Nr   r  r  r  s        rO   rolling_stdzDuckDBExpr.rolling_std  r  rQ   r   Self | NonNestedLiteralstrategyFillNullStrategy | Nonelimitc                     = j         dk     rd d}t          |          d fd
}                     |          S dd}                     ||          S )Nr   z`fill_null` with `strategy=z'` is only available in 'duckdb>=1.3.0'.rT   r(   rw   rV   rC   rh   c                    t          |j        ddi}t          |j         }
dk    rdnd}dn}
dk    r| dnd| d	}| d
| d| d| dfd 	|           D             S )Nry   Tforward
last_valuefirst_value	unboundedz preceding and current rowzcurrent row and r   z({expr} ignore nulls) over (rz   r   rY   c                V    g | ]%}t                              |                     &S r[   r^   r|   s     rO   rb   zEDuckDBExpr.fill_null.<locals>._fill_with_strategy.<locals>.<listcomp>  s/    RRRcjjdj&;&;<<RRRrQ   r   )rT   rw   r   re   	fill_func_limitrows_betweenr}   r  rN   r  s          @rO   _fill_with_strategyz1DuckDBExpr.fill_null.<locals>._fill_with_strategy  s      5foVQUVV#<f>Q#R ,4	,A,ALL}	(-5  9,, 9999>F>>>  ! W W(W W+7W WGSW W W  SRRRbRRRRrQ   r]   r"   r   r   c                "    t          | |          S rF   )r
   )r]   r   s     rO   _fill_constantz,DuckDBExpr.fill_null.<locals>._fill_constant  s    #D%000rQ   )r   r  )r]   r"   r   r   rC   r"   )rJ   r   r   r   )rN   r   r  r  r   r  r  s   ` ``   rO   	fill_nullzDuckDBExpr.fill_null  s     $v--eHeee)#...S S S S S S S S& --.ABBB	1 	1 	1 	1 %%nE%BBBrQ   dtyper/   c                >     d fd}                      |          S )Nr]   r"   rC   c                r    t          j                  }|                     t          |                    S rF   )r   rK   r	   r   )r]   native_dtyper  rN   s     rO   r   zDuckDBExpr.cast.<locals>.func  s.    3E4=IIL99\,77888rQ   rR  rE  )rN   r  r   s   `` rO   r	   zDuckDBExpr.cast  s=    	9 	9 	9 	9 	9 	9 	9 %%d+++rQ   c                x     dddfd}d fd}                      |                              |          S )Nr]   r"   rd   str | ExpressionrC   c                    t          | g|R  }t          dt          d                     d| d}t          |          t	          d          k    S )NrK  *r^  rY   r   )r   r   r   r5   r   )r]   rd   ra  r}   s       rO   
_is_uniquez(DuckDBExpr.is_unique.<locals>._is_unique  sV    *4?,???B'S::HH2HHHC %%Q//rQ   c                     |           S rF   rl   )r]   r  s    rO   _unpartitioned_is_uniquez6DuckDBExpr.is_unique.<locals>._unpartitioned_is_unique  s    :d###rQ   rT   r(   rw   rV   rh   c                H    j         rJ fd |           D             S )Nc                ,    g | ]} |gj         R  S rl   rd   )r`   r]   r  rw   s     rO   rb   zHDuckDBExpr.is_unique.<locals>._partitioned_is_unique.<locals>.<listcomp>!  s.    PPPtJJt:f&9:::PPPrQ   rc   )rT   rw   r  rN   s    `rO   _partitioned_is_uniquez4DuckDBExpr.is_unique.<locals>._partitioned_is_unique  s9     &&&PPPPPttBxxPPPPrQ   )r]   r"   rd   r  rC   r"   rR  r  re  )rN   r  r!  r  s   `  @rO   	is_uniquezDuckDBExpr.is_unique  s    	0 	0 	0 	0
	$ 	$ 	$ 	$ 	$ 	$	Q 	Q 	Q 	Q 	Q 	Q 	Q ""#;<<RR"
 
 	
rQ   methodr2   
descendingc                    dv rt          d          n%dk    rt          d          nt          d          d ddfddfd}d fd}                     |                              |          S )N>   r  r  averagerankdense
dense_rankr  r  r]   r"   r$  rs   rd   !Sequence[str | Expression] | NonerC   c               P   |rd|  dnd|  d}t          dt                                }|t          |  d| }t          g || R   }n|}t          |           }	dk    r<t           d| d          t          | d	| d          z   t	          d
          z
  }ng	dk    rLt           d| d          t          | d	| d          t	          d
          z
  t	          d          z  z   }nt           d| d          }t          |                                 |          S )Nz	order by z desc nulls lastz asc nulls lastrK  rz   r  z OVER (rY   r^  r   r&  g       @)r   r   r   r5   r   r   r  )
r]   r$  rd   r   
count_exprr   count_window	rank_exprr   r#  s
           rO   _rankzDuckDBExpr.rank.<locals>._rank0  s    72D22226666 
 ,G^5E5EFFJ'5|DUU|UU";"P\"P4"P"P"PR%8>>!T";";&";";";<<#z$I$I,$I$I$IJJK!ff 	
 9$$)T*C*C&*C*C*CDD!Z"G"G"G"G"GHH3q66QHHH 		 *T*C*C&*C*C*CDD	(()444rQ   c                     |           S )N)r$  rl   )r]   r/  r$  s    rO   _unpartitioned_rankz,DuckDBExpr.rank.<locals>._unpartitioned_rankP  s    5*5555rQ   rT   r(   rw   rV   rh   c                J    j         rJ fd |           D             S )Nc                6    g | ]} |j                    S ))r$  rd   r  )r`   r]   r/  r$  rw   s     rO   rb   z>DuckDBExpr.rank.<locals>._partitioned_rank.<locals>.<listcomp>W  s=        dz@STTT  rQ   r   )rT   rw   r/  r$  rN   s    `rO   _partitioned_rankz*DuckDBExpr.rank.<locals>._partitioned_rankS  sQ     &&&      DHH   rQ   )r]   r"   r$  rs   rd   r*  rC   r"   rR  r  )r   r   r   )rN   r#  r$  r1  r4  r/  r   s   ```  @@rO   r'  zDuckDBExpr.rank'  s    ...%f--DDw%l33DD%l33D ?C		5 	5 	5 	5 	5 	5 	5 	5 	5@	6 	6 	6 	6 	6 	6 	6	 	 	 	 	 	 	 	 ""#677MM
 
 	
rQ   basec                :    dfd}|                      |          S )Nr]   r"   rC   c           	     z   t          d|           }t          | t          d          k     t          t          d                                                  | t          d          k    t          t          d                                                  |t          dt                              z            S )Nlogr   rN  z-inf)r   r   r   rP  rO  )r]   r8  r5  s     rO   _logzDuckDBExpr.log.<locals>._loga  s    $UD11CTCFF]Ce$5$566dc!ffnc%--&8&8993!3E3t99!E!EEFFrQ   rR  rE  )rN   r5  r9  s    ` rO   r8  zDuckDBExpr.log`  s7    	 	 	 	 	 	 %%d+++rQ   c                4    dd}|                      |          S )Nr]   r"   rC   c                "    t          d|           S )NexprD  r\   s    rO   _expzDuckDBExpr.exp.<locals>._expl  s    %eT222rQ   rR  rE  )rN   r=  s     rO   r<  zDuckDBExpr.expk  s,    	3 	3 	3 	3 %%d+++rQ   r   c                     t          |           S rF   r   rm   s    rO   r   zDuckDBExpr.strq      (...rQ   r   c                     t          |           S rF   r   rm   s    rO   dtzDuckDBExpr.dtu  s    *4000rQ   r   c                     t          |           S rF   r   rm   s    rO   listzDuckDBExpr.listy  s    &t,,,rQ   r   c                     t          |           S rF   r   rm   s    rO   structzDuckDBExpr.struct}  r?  rQ   rF   )r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   r,   rC   rD   )rC   rR   r  )rC   rD   )rC   r*   )rr   rs   rt   ru   rC   rR   )rt   r   r   rs   r   r   r   r   r   r   rC   rR   )r   r   rC   r#   )r   r=   r   r-   rC   r#   )r   r   r   r-   rC   r#   )r8   r   r   r   rC   r9   )r8   r   r   r   rC   rR   )r8   r   r   r   rC   r#   )r   r   r   r   rC   r#   )r   r?   rC   r#   )r:   rR   rC   r#   )r]   r"   r   r   rC   r"   )r   r7   rC   r#   )rC   r#   )ro  rP  rp  r3   rC   r#   )ru  rv  rw  rv  rC   r#   )r   r   rC   r#   )rd   r  rc   r  rC   r#   )r   r  rC   r#   )r  r   rC   r#   )r  r   rC   r#   )rr   rs   rC   r#   )r   r   r   r   r   rs   rC   r#   )
r   r   r   r   r   rs   r   r   rC   r#   )r   r   r  r  r  r   rC   r#   )r  r/   rC   r#   )r#  r2   r$  rs   rC   r#   )r5  rP  rC   r#   )rC   r   )rC   r   )rC   r   )rC   r   )b__name__
__module____qualname__r   DUCKDB_implementationrP   propertyr:   rj   rn   rq   r   r   r   classmethodr   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/  r3  r6  r9  r<  r@  rC  r   rS  rV  rg  rn  ro  r  r   r  rK  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'  r8  r<  r   rA  rC  rE  r    
drop_nullsuniquerl   rQ   rO   r7   r7   ;   se	       $+O
 8<M M M M M$ 	< 	< 	< X	<    -,,,
 
 
 
   0  1 1 1 1 1 1f' ' ' ' 
 
 
 [
$ 
 
 
 [
       2
 
 
 
&

 

 

 


 
 
 

 
 
 

 
 
 
       [ J J J JJ J J JJ J J JJ J J J   
K K K K   
J J J J
 
 
 

J J J J
 
 
 

J J J JI I I I
 
 
 

J J J JJ J J JK K K KK K K KK K K KK K K K. . . .T T T TR R R R) ) ) )"T T T TF F F F$F F F F$	) 	) 	) 	)
 
 
 
4F F F F$	) 	) 	) 	)S S S SN N N N) ) ) )() ) ) )Q Q Q QQ Q Q Q
 
 
 

 Xf%%
 
 
 &%
B B B BV V V VY Y Y Y
 
 
 


 
 
 

 Xf%%0 0 0 &%0 Xf%%0 0 0 &%0" Xf%%0 0 0 &%0" Xf%%0 0 0 &%0 Xf%%
 
 
 &%

 Xf%%
 
 
 &%

 Xf%%
 
 
 &%

 Xf%%
 
 
 &%

 Xf%%
 
 
 &%

 Xf%%
 
 
 &%
 Xf%%
 
 
 &%
 Xf%%
 
 
 &%
 Xf%%
 
 
 &%
#C #C #C #CJ, , , , Xf%%
 
 
 &%
& Xf%%6
 6
 6
 &%6
p	, 	, 	, 	,, , , , / / / X/ 1 1 1 X1 - - - X- / / / X/ !""J_FFFrQ   r7   )r(   r"   )G
__future__r   
contextlibr>  typingr   r   r   r   r   r	   duckdbr
   r   r   duckdb.typingr   narwhals._compliantr   narwhals._compliant.windowr   narwhals._duckdb.expr_dtr   narwhals._duckdb.expr_listr   narwhals._duckdb.expr_strr   narwhals._duckdb.expr_structr   narwhals._duckdb.utilsr   r   r   r   r   r   narwhals._expression_parsingr   narwhals._utilsr   r    r!   r"   typing_extensionsr#   narwhals._compliant.typingr$   r%   r&   r'   narwhals._duckdb.dataframer(   rp   r*   r+   r,   r-   narwhals.typingr.   r/   r0   r1   r2   r3   r4   rR   rV   suppressImportErrorr5   r7   rl   rQ   rO   <module>rc     si   " " " " " "      H H H H H H H H H H H H H H H H G G G G G G G G G G & & & & & & ( ( ( ( ( ( 3 3 3 3 3 3 @ @ @ @ @ @ > > > > > > ? ? ? ? ? ? B B B B B B                2 1 1 1 1 1 E E E E E E E E E E 2!!!!!!&&&&&&            ;:::::::::::99999955555555                  */:*EF%j1 Z%% % %$$$$$$% % % % % % % % % % % % % % %G G G G G9: G G G G Gs   C..C25C2