o
    8VaV                     @   sX  d Z ddlmZmZ ddlmZmZ ddlm	Z	 ddl
mZ ddl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 ddlm Z m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z' ej(j)Z*dddZ+e+ddZ,e+ddZ-e+ddZ.e+ddZ/e+ddZ0e+d d!Z1e+d"d#Z2e+d$d%Z3e+d&dZ4e+d'd(Z5e+d)Z6e+d*d(Z7e+d+d,Z8e+d-Z9e+d.Z:e+d/d0Z;e+d1d2Z<e+d3d4Z=e+d5d6Z>e+d7d8Z?e+d9d8Z@e+d:d8ZAe+d;d<ZBe+d=d>ZCe+d?d@ZDe+dAd@ZEe+dBd@ZFe+dCd@ZGe+dDd@ZHe+dEd>ZIe+dFdGZJe+dHdGZKe+dIdGZLe+dJdGZMe+dKdGZNe+dLd8ZOe+dMd8ZPe+dNd8ZQe+dOdGZRe+dPdGZSe+dQdRZTe+dSdTZUe+dUdTZVedVdWZWi ZXdXdY ZYdZd[ ZZd\d] Z[d^d_ Z\ej]ej^ej_ej`ejaejbfZcd`da Zddbdc Zeddde Zfdfdg Zgdhd, Zhdidj Zidkdl Zjdmdn Zkdodp Zldqdr Zmdsdt Zndudv Zodwdx Zpdydz Zqd{d| Zrd}d~ Zsdd Ztdd Zudd Zvejwdd Zxejwdd Zyejwdd Zzejwdd Z{ejwdd Z|dd Z}dd Z~e}dd Ze~dd Ze}dd Ze~dd Ze}dd Ze~dd Ze}dd Ze~dd Ze}dd Ze~dd Ze}dd Ze~dd Ze}dd Ze~dd Ze}dd Ze~dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zeedd dd Zeedd dd Zeedd dd Zeedd dd Zdd Zdd Zdd Zi ZeeZed¡ZddĄ ZeYe,ddƄ ZeYe-ddȄ ZeYe.ddʄ ZeYe4dd̄ ZeYe/dd΄ ZeYe0ddЄ ZeYe1dd҄ ZeYe2ddԄ ZeYe3ddք ZeYe?dd؄ ZeYe@ddڄ ZeYeAdd܄ ZeYe5ddބ ZeYe6dd ZeYe7dd ZeYe8dd ZeYe;dd ZeYe<dd ZeYe>dd ZeYe:dd ZeYe=dd ZeYeBdd ZeYeCdd ZeYeDdd ZeYeEdd ZeYeFdd ZeYeGdd ZeYeHdd ZeYeIdd ZeYeJdd  ZeYeKdd ZeYeLdd ZeYeMdd ZeYeNdd ZeYeOd	d
 ZeYePdd ZeYeQdd ZeYeRdd ZeYeSdd ZeYeTdd ZeYeUdd ZeYeVdd ZeYe9dd Zΐdd Zϐdd ZdS (   a  Integration method that emulates by-hand techniques.

This module also provides functionality to get the steps used to evaluate a
particular integral, in the ``integral_steps`` function. This will return
nested namedtuples representing the integration rules used. The
``manualintegrate`` function computes the integral using those steps given
an integrand; given the steps, ``_manualintegrate`` will evaluate them.

The integrator can be extended with new heuristics and evaluation
techniques. To do so, write a function that accepts an ``IntegralInfo``
object and returns either a namedtuple representing a rule or
``None``. Then, write another function that accepts the namedtuple's fields
and returns the antiderivative, and decorate it with
``@evaluates(namedtuple_type)``.  If the new technique requires a new
match, add the key and call to the antiderivative function to integral_steps.
To enable simple substitutions, add the match to find_substitutions.

    )DictOptional)
namedtupledefaultdict)Mapping)reduceN)iterable)r   )Expr)	fuzzy_not)TrigonometricFunction)OrthogonalPolynomial)	Piecewise)switchdo_one	null_safe	condition)EqNedegree)divisors)debug c                    s2   dd   fdd}t | |d } |_||_|S )Nc                 S   s   | j |j kot| |S N)	__class__tuple__eq__selfother r    A/usr/lib/python3/dist-packages/sympy/integrals/manualintegrate.pyr   ,   s   zRule.<locals>.__eq__c                    s    | | S r   r    r   r   r    r!   <lambda>.       zRule.<locals>.<lambda>z context symbol)r   r   __ne__)nameZpropsZ__neq__clsr    r"   r!   Rule*   s   r(   ConstantRuleconstantConstantTimesRulezconstant other substep	PowerRulezbase expAddRulesubstepsURulezu_var u_func constant substep	PartsRulezu dv v_step second_stepCyclicPartsRulezparts_rules coefficientTrigRulezfunc argExpRuleReciprocalRulefunc
ArcsinRuleInverseHyperbolicRuleAlternativeRulealternativesDontKnowRuleDerivativeRuleRewriteRulezrewritten substepPiecewiseRuleZsubfunctionsHeavisideRulezharg ibnd substepTrigSubstitutionRulez(theta func rewritten substep restriction
ArctanRuleza b cArccothRuleArctanhRule
JacobiRulezn a bGegenbauerRulezn aChebyshevTRulenChebyshevURuleLegendreRuleHermiteRuleLaguerreRuleAssocLaguerreRuleCiRuleza bChiRuleEiRuleSiRuleShiRuleErfRuleFresnelCRuleFresnelSRuleLiRulePolylogRuleUpperGammaRuleza eEllipticFRuleza dEllipticERuleIntegralInfozintegrand symbolc                        fdd}|S )Nc                    s    | _ | t < | S r   )rule
evaluatorsr5   r[   r    r!   
_evaluatese   s   zevaluates.<locals>._evaluatesr    )r[   r_   r    r^   r!   	evaluatesd   s   r`   c                 C   sX   t | trdS | D ] }t |trt|r dS q	t |tr)tdd |D r) dS q	dS )NTc                 s   s    | ]}t |V  qd S r   contains_dont_know.0ir    r    r!   	<genexpr>t   s    z%contains_dont_know.<locals>.<genexpr>F)
isinstancer:   r   rb   listany)r[   valr    r    r!   rb   k   s   


rb   c                    s$  | j r| j d }t| tjr| t|d  S t| tjr-|  t|d  S t| tjrB| t| t| S t| tjrX|  t| t| S t| tjrjt	 fdd| j D S t| tj
rt| j dkrt| j d tjr| j d t| j d   S |  S )a  Derivative of f in form expected by find_substitutions

    SymPy's derivatives for some trig functions (like cot) aren't in a form
    that works well with finding substitutions; this replaces the
    derivatives for those particular forms with something that works better.

    r      c                       g | ]}t | qS r    )manual_diffrd   argsymbolr    r!   
<listcomp>       zmanual_diff.<locals>.<listcomp>   )argsrg   sympytandiffseccotcscAddsumMullenNumberrm   )frq   ro   r    rp   r!   rm   x   s    
  
rm   c                    s   t |dkr|d }t|ttfr| }nt|stdnt |dkr)|g}ntdg }|D ]'\} t|tjrX|j	d | 
fdd fdd} |t f q1| t|| S )	zn
    A wrapper for `expr.subs(*args)` with additional logic for substitution
    of invertible functions.
    rt   r   z(Expected an iterable of (old, new) pairsrk   z$subs accepts either 1 or 2 argumentsc                    s   | j o| j kS r   )is_Powbasex)x0r    r!   r#          zmanual_subs.<locals>.<lambda>c                    s   t | j  S r   )rv   expr   )newr    r!   r#      r   )r   rg   r   r   itemsr   
ValueErrorrv   logru   replaceappendr   subsrh   )exprru   ZsequenceZnew_subsoldr    )r   r   r!   manual_subs   s(   


r   c           
         s   g } fdd}fdd D ]0}|krqt |}|||}|durE|\}}| kr7q|||f}	|	|vrE||	 q|S )Nc                    sj  |dkrdS | }|j vrdS td||  t||  }|j vrXrQ|rQtfdd D }tfdd| D }||krQdS |jddS t	| t
jrd| j jrt
| jdk rt
jd	gd
}t
jdgd
}| j| |   r fdd||fD \}}|dkr|dkr|d| j  | | }|jddS dS )Nr   Fz!substituted: {}, u: {}, u_var: {}c                    rl   r    r   rd   trp   r    r!   rr      rs   z<find_substitutions.<locals>.test_subterm.<locals>.<listcomp>c                    rl   r    r   r   )u_varr    r!   rr      rs   )Zas_Addrt   aexcludebc                       g | ]}  |tqS r    getZEROrc   matchr    r!   rr          )free_symbolsr   formatr   cancelis_rational_functionmaxas_numer_denomas_independentrg   rv   Powr   
is_IntegerAbsWildr   r   r   )uu_diffsubstitutedZ
deg_beforeZ	deg_afterr   r   )	integrandrq   r   r   r!   test_subterm   s8   

z(find_substitutions.<locals>.test_subtermc                    s  t  tgttjtjtjR r jd gS t  tjtj	tj
tjtjfr- jd gS t  tjtjfr< jd gS t  tjrH jd gS t  tjrdg } jD ]}|| || qS|S t  tjrg } jd r}| jd  n jd r| jd   jd jr| fddt jd D   jd jr|dd  jd D  |S t  tjrg } jD ]}|| || q|S g S )Nr   rt   rk      c                    s<   g | ]}d |  k rt  jd  k rn n jd | qS )rt   r   )absru   )rd   dtermr    r!   rr      s
    zAfind_substitutions.<locals>.possible_subterms.<locals>.<listcomp>c                 S   s   g | ]}|j r|qS r    )r   r   r    r    r!   rr      s    
)rg   r   inverse_trig_functionsrv   r   r   	Heavisideru   
chebyshevt
chebyshevulegendrehermitelaguerre
gegenbauerassoc_laguerrejacobir~   r   extendr   Zis_constantr   r   Zis_Addr|   )r   rr   ro   )possible_subtermsrq   r   r!   r      sT   

"

z-find_substitutions.<locals>.possible_subtermsF)rm   r   r   )
r   rq   r   resultsr   r   r   Znew_integrandr*   substitutionr    )r   r   rq   r   r!   find_substitutions   s"   "'



r   c                        fdd}|S )z$Strategy that rewrites an integrand.c                    sh   | \}}t d||  |  r,|  }||kr.t||}t|ts0|r2t||||S d S d S d S d S )Nz/Integral: {} is rewritten with {} on symbol: {})r   r   integral_stepsrg   r:   r<   )integralr   rq   	rewrittensubstepr   rewriter    r!   	_rewriter  s   
zrewriter.<locals>._rewriterr    )r   r   r   r    r   r!   rewriter     r   c                    r   )zAStrategy that rewrites an integrand based on some other criteria.c                    sd   | \} }|\}}t d|||  | t| } | r.| }||kr0t|t||||S d S d S )Nz@Integral: {} is rewritten with {} on symbol: {} and criteria: {})r   r   rh   r<   r   )Zcriteriar   r   rq   ru   r   r   r    r!   _proxy_rewriter"  s   z'proxy_rewriter.<locals>._proxy_rewriterr    )r   r   r   r    r   r!   proxy_rewriter   r   r   c                    rZ   )z4Apply the rule that matches the condition, else Nonec                    s*      D ]\}}|| r||   S qd S r   )r   )r   keyr[   
conditionsr    r!   multiplexer_rl2  s
   z#multiplexer.<locals>.multiplexer_rlr    )r   r   r    r   r!   multiplexer0  s   r   c                     rZ   )zHStrategy that makes an AlternativeRule out of multiple possible results.c                    s   g }d}t d  D ]&}|d }t d|| || }|r0t|ts0|| kr0||vr0|| q
t|dkr;|d S |rVdd |D }|rNt|g| R  S t|g| R  S d S )Nr   zList of Alternative Rulesrt   Rule {}: {}c                 S   s   g | ]}t |s|qS r    ra   )rd   r[   r    r    r!   rr   I  r   z7alternatives.<locals>._alternatives.<locals>.<listcomp>)r   r   rg   r:   r   r   r8   )r   Zaltscountr[   resultZdoablerulesr    r!   _alternatives:  s,   
z#alternatives.<locals>._alternativesr    )r   r   r    r   r!   r9   8  s   c                 C   s   t | jg| R  S r   )r)   r   r   r    r    r!   constant_ruleP  s   r   c                 C   s   | \}}|  \}}||jvr+t|tjr+t|d dkr$t|||S t||||S ||jvrjt|tjrlt||||}t	t
|jrG|S t
|jrStdd|S t|tt
|dftdd|dfg||S d S d S )Nrt   r   T)as_base_expr   rg   rv   Symbolsimplifyr4   r,   r3   r
   r   is_zeror)   r=   r   )r   r   rq   r   r   r[   r    r    r!   
power_ruleS  s&   r   c                 C   s4   | \}}t |jd tjrttj|jd ||S d S Nr   )rg   ru   rv   r   r3   E)r   r   rq   r    r    r!   exp_ruleh  s   r   c                    s   t jtt jtt jtt jtt j	t
t jtt jtt jti}t jdt jdt jdi}| \} |D ]7}t||rb||d}|j|  u rbt fdd|jd | D sb|jd | | f }|| |   S q+d S )Nr   rk   rt   c                 3   s    | ]}|  V  qd S r   has)rd   vrp   r    r!   rf         z'orthogonal_poly_rule.<locals>.<genexpr>)rv   r   rC   r   rD   r   rE   r   rG   r   rH   r   rI   r   rJ   r   rK   rg   r   ru   ri   )r   Zorthogonal_poly_classesZorthogonal_poly_var_indexr   klassZ	var_indexru   r    rp   r!   orthogonal_poly_rulen  s0   
r   c                    s  | \}}t jd|gdd gd}t jd|gd}t jd|gd}t jd|gd	d gd}t jd
|gdd gd}|||||f}t jt || | | d tft jt || | | d tft jt || | | d tft jt 	|| | | d t
ft jt || | | d tft jdt || |  d tft jt ||d  ||  | d tft j	t 	||d  ||  | d tft jt ||d  ||  | d tft j|| t ||  d tft jt ||| | d tft jdt ||t 	|d    dd tft jt ||t 	|d   dd tff}	|	D ]<}
t||
d rX||
d   rXt fdd|D }|
d d u sJ|
d | rX|||f }|
d |   S qd S )Nr   c                 S      | j  S r   r   r   r    r    r!   r#         z'special_function_rule.<locals>.<lambda>r   Z
propertiesr   r   cr   c                 S   r   r   r   r   r    r    r!   r#     r   ec                 S   s   | j o| j S r   )is_nonnegative
is_integerr   r    r    r!   r#         rt   rk   c                 S      | |kS r   r    r   r   r    r    r!   r#     r   c                 S   r   r   r    r   r    r    r!   r#     r   r   c                 3   s(    | ]}  |d ur  |V  qd S r   )r   )rd   wr   r    r!   rf     s    z(special_function_rule.<locals>.<genexpr>r   )rv   r   r~   r   rN   cosrL   coshrM   sinrO   sinhrP   r   r   rT   rQ   rS   rR   rV   polylogrU   sqrtrW   rX   rg   r   r   )r   r   rq   r   r   r   r   r   ZwildspatternspZ	wild_valsru   r    r   r!   special_function_rule  sJ   
&&&"r  c           	         s  | \  \ }tjdgd}tjdgd} ||d   s)d S dd }dd }d	d
 } fddfdd||fD \}}g }td| d dkr|t||d| dt|dk|dk f ||||d|dt|dk|dkf |||| d|dt|dk |dkf dd |D }|jr|jrdd |D }t	|dkr|d d d  S d S |rt
fdd|D S d S )Nr   r   r   rk   c                 S   s   | j p|  S r   )is_negativeZcould_extract_minus_signr   r    r    r!   negative     z#inverse_trig_rule.<locals>.negativec                 S      t tj| |S r   )r7   rv   Zasinhr   rq   r    r    r!   ArcsinhRule  r  z&inverse_trig_rule.<locals>.ArcsinhRulec                 S   r  r   )r7   rv   Zacoshr  r    r    r!   ArccoshRule  r  z&inverse_trig_rule.<locals>.ArccoshRulec                    s  t d} }}d  }	 }
 }}}|dkr+|| }	||||  |d   }|| }|| dkrKt ||  }
t || }|}|||d   }| || |}|
d uru|dkrl|d urlt||| ||||  }t||
|||}|	d ur|d urt|	||}|S )Nr   rt   rk   )rv   Dummyr   r+   r/   )Z	RuleClassZbase_expr   Zsign_ar   Zsign_br   Zcurrent_baseZcurrent_symbolr*   u_funcZ
u_constantr   Zfactored)r   r   rq   r    r!   make_inverse_trig  s2   

z,inverse_trig_rule.<locals>.make_inverse_trigc                    r   r    r   rc   r   r    r!   rr     r   z%inverse_trig_rule.<locals>.<listcomp>rt   r   c                 S   s   g | ]}|d  t jur|qS r  )rv   Zfalserd   r   r    r    r!   rr         c                 S   s   g | ]}|d  t ju r|qS r  )rv   truer  r    r    r!   rr     r  c                    s$   g | ]} |d d  |d fqS Nr  r    r  )r  r    r!   rr     s   $ )r   rv   r   r   r   r   r6   And	is_numberr   r=   )	r   r   r   r   r  r  r  ZpossibilitiesZpossibilityr    )r   r   r  r   rq   r!   inverse_trig_rule  s:   *(*r  c                    s6   | \}  fdd|  D }d |v rd S t|| S )Nc                    rl   r    )r   )rd   grp   r    r!   rr     s    zadd_rule.<locals>.<listcomp>)Zas_ordered_termsr-   )r   r   r   r    rp   r!   add_rule  s
   
r  c                 C   sH   | \}}| |\}}t||}|dkr |d ur"t|||||S d S d S Nrt   )r   r   r+   )r   r   rq   Zcoeffr   	next_stepr    r    r!   mul_rule  s   
r  c                    s   fdd}dd }|t j|t ||t jt j|t jg}t d}t| t jgtR r1||  } t|D ]\}}|| }|r|\}	}
 |	j	vrQ|	
|sQ d S |	|d}	|
|d}
||kri|	 si d S t|	t jrd|
 }| rt| dkr d S ||krt|
trt|
 }t|r d S |	 }t|}|	|
|||f  S d}|dk rd	}n4||kr|
jrtd
d |
jD rd	}n ||d d  D ]}|| }|r|d |d|
rd	} nq|r|	 }tt |
 }t|st|}|	|
|||f  S q5d S )Nc                    sV   |    } t| tjrg n	 fdd| jD }|r)tj| }| |   }||fS d S )Nc                    s   g | ]	}|  r|qS r    )Zis_algebraic_exprrn   rp   r    r!   rr     s    z;_parts_rule.<locals>.pull_out_algebraic.<locals>.<listcomp>)r   Ztogetherrg   rv   r   ru   r~   )r   Z	algebraicr   dvrp   r    r!   pull_out_algebraic  s   
z'_parts_rule.<locals>.pull_out_algebraicc                     rZ   )Nc                    sT   t  fddD r&fdd jD }|r(tdd |} | }||fS d S d S )Nc                    s   g | ]}  |qS r    r   rd   r   r   r    r!   rr     rs   zJ_parts_rule.<locals>.pull_out_u.<locals>.pull_out_u_rl.<locals>.<listcomp>c                    s&   g | ] t  fd dD r qS )c                 3   s    | ]}t  |V  qd S r   )rg   )rd   r'   ro   r    r!   rf     r   zT_parts_rule.<locals>.pull_out_u.<locals>.pull_out_u_rl.<locals>.<listcomp>.<genexpr>)ri   )rd   	functionsr  r!   rr     s    
c                 S   s   | | S r   r    )r   r   r    r    r!   r#     r   zH_parts_rule.<locals>.pull_out_u.<locals>.pull_out_u_rl.<locals>.<lambda>)ri   ru   r   )r   ru   r   r  r  r  r!   pull_out_u_rl  s   z6_parts_rule.<locals>.pull_out_u.<locals>.pull_out_u_rlr    )r   r!  r    r  r!   
pull_out_u  s   	z_parts_rule.<locals>.pull_out_uZ	temporaryrt   Frk   Tc                 s   s&    | ]}t |tjtjtjfV  qd S r   )rg   rv   r   r   r   rd   r   r    r    r!   rf   M  s    z_parts_rule.<locals>.<genexpr>r   )rv   r   r   r   r   r   r	  rg   	enumerater   r   r   is_polynomialr   r   r   rb   rx   _manualintegrateru   allZequalsr   )r   rq   r  r"  Zliate_rulesZdummyindexr[   r   r   r  Zrec_dvv_stepdur   Zacceptr   r    rp   r!   _parts_rule  sn   






r+  c                    s  | \}|  \}}t|}g }|r|\}}}}}	td|||||	 || t|tjr2d S t|tjtj	tj
tjtjfrX|ti}
t|
 dkrPd S t|
  d7  < tdD ]n}td|||| || |  }|dkrv nU|jvrtdd |D dt| | |}|dkr|rt||||| }|  S ||   \}}t|}|r|\}}}}}	||9 }||9 }||||||	f q\  fd	d
 |r|d \}}}}}	t|||	 |dd  || |}|dkr|rt||||| }|S d S )Nz,u : {}, dv : {}, v : {}, du : {}, v_step: {}rk   rt      z7Cyclic integration {} with v: {}, du: {}, integrand: {}c              	   S   s(   g | ]\}}}}}t |||d d d qS r   )r0   )rd   r   r  r   r*  r)  r    r    r!   rr   }  s    zparts_rule.<locals>.<listcomp>r  c                    sV   | r| d \}}}}}t ||| | dd  || |S t|} | r&| S t|S )Nr   rt   )r0   r   r:   )stepsr   r   r  r   r*  r)  make_second_steprq   r    r!   r/    s   

z$parts_rule.<locals>.make_second_stepr   )Zas_coeff_Mulr+  r   r   r   rg   rv   Integralr   r   r   r   r   xreplace_cache_dummy_parts_u_cacheranger   r   r1   r   r+   r0   )r   r   r*   r   r-  r   r  r   r*  r)  cachekey_coefficientr[   Znext_constantZnext_integrandr    r.  r!   
parts_rule_  sl   



r8  c                 C   s  | \}}t |tjst |tjr/|jd }t |tjsd S t |tjr&d}nd}t||||S |t|d kr?td|||S |t|d krOtd|||S t |tj	rbtj|j tj|j  }nct |tj
rutj|j tj|j  }nPt |tjr|jd }t|d t	|t|  t|t	|  }n)t |tjr|jd }t|d t
|t|  t|t
|  }nd S t|t||||S )Nr   r   r   rk   sec**2csc**2)rg   rv   r   r   ru   r   r2   ry   r{   rw   rz   r<   r   )r   r   rq   ro   r5   r   r    r    r!   	trig_rule  sB   

 
 r;  c                 C   s   | \}}t |t | }|| }||jvr.td|||}|dkr,|r,t|||||}|S t | t | }|| }||jvrYtd|||}|dkrW|rWt|||||}|S d S )Nsec*tanrt   csc*cot)rv   ry   rw   r   r2   r+   r{   rz   )r   r   rq   Zsectanqr[   Zcsccotr    r    r!   trig_product_rule  s    

r?  c                 C   s&  | \}}t jd|gd}t jd|gd}t jd|gd}||||d  |  }|r|| || || }}}|jr|jrtt|||||t || dft|||||t t |d | | t 	|| dft
|||||t t 	|d | | t 	|| dfg||S t|||||S t jd|gd}||||d  ||  |  }|r|| || }}|jrd S t d}	||d|   }
|||	|d|   }t||	}|rt|	|
d |||S d S t jd	|gd}||| | ||d  ||  |  }|r|| || || || || f\}}}}}|jr$d S ||d  ||  | }|d|  }d| | | }| | | }t d}	t|	||t|	d
 |	||}|dkrkt||| ||| | |}|jrq|S t|| |}t||g||}|| | ||  }t||||S d S )Nr   r   r   r   rk   r   r   r   r   r  rt   )rv   r   r   is_extended_realr=   r@   ZGtrA   r  ZLtrB   r   r	  r   r   r/   r+   r-   r<   )r   r   rq   r   r   r   r   r   Zmatch2r   r
  Z
integrand2r  r   Zmatch3denominatorconstZnumer1Znumer2Zstep1Zstep2r.   Zrewritenr    r    r!   quadratic_denom_rule  sx    88"

*,


rC  c                 C   s4  | \}}t jd|gd}t jd|gd}t d}|t || | | }|s+d S || || || }}}t jd|gd}t jd|gd}t d}	|t || | |	 }
|
r`d S t d}t || | }|||}|||d	 | | }|d	 | | }t||}|rt||d |||S d S )
Nr   r   r   r   r   r   r   r   rk   )rv   r   r   r   r	  r   r   r/   )r   r   rq   r   r   r   r   r   r   r   Zrecursion_testr   r
  r  r    r    r!   root_mul_rule+  s.   



rD  c                 C   s\   t jd| gd}t jd| gd}t jd| gdd gd}t jd| gd	d gd}||||fS )
Nr   r   r   mc                 S      t | tjS r   rg   rv   ZIntegerrF   r    r    r!   r#   J  r$   zmake_wilds.<locals>.<lambda>r   rF   c                 S   rF  r   rG  rH  r    r    r!   r#   K  r$   )rv   r   )rq   r   r   rE  rF   r    r    r!   
make_wildsF  s
   rI  c                 C   B   t | \}}}}t||  | t||  |  }|||||fS r   )rI  rv   r   r   rq   r   r   rE  rF   patternr    r    r!   sincos_patternO     $rM  c                 C   rJ  r   )rI  rv   rw   ry   rK  r    r    r!   tansec_patternV  rN  rO  c                 C   rJ  r   )rI  rv   rz   r{   rK  r    r    r!   cotcsc_pattern]  rN  rP  c                 C   sL   t jd| gd}t jd| gd}t d}t ||  | | }||||fS )NrE  r   r   r  )rv   r   r   )rq   rE  r   r  rL  r    r    r!   heaviside_patternd  s
   
rQ  c                    rZ   )Nc                    s    |  S r   r    ru   r]   r    r!   
uncurry_rln     zuncurry.<locals>.uncurry_rlr    )r5   rS  r    r]   r!   uncurrym  s   rU  c                    rZ   )Nc                    sB   | \}}}}}} ||||||}||krt |t||||S d S r   )r<   r   )ru   r   r   rE  rF   r   rq   r   r   r    r!   trig_rewriter_rls  s   z'trig_rewriter.<locals>.trig_rewriter_rlr    )r   rW  r    rV  r!   trig_rewriterr  s   rX  c                 C   s   |j o|j o|jo|jS r   )is_evenr   r   r   rE  rF   re   sr    r    r!   r#   ~  s    r#   c                 C   sD   dt d|  |  d |d  dt d| |  d |d   S Nrt   rk   )rv   r   r   r   rE  rF   re   rq   r    r    r!   r#     s      c                 C   s   |j o|dkS Nr   Zis_oddrZ  r    r    r!   r#     r   c                 C   sB   dt | | d  |d d  t | |  t || |  S r\  )rv   r   r   r]  r    r    r!   r#     
     c                 C      |j o|dkS r^  r_  rZ  r    r    r!   r#     r   c                 C   sB   dt || d  |d d  t ||  t | | |  S r\  )rv   r   r   r]  r    r    r!   r#     r`  c                 C   ra  Nr,  rY  rZ  r    r    r!   r#     r   c                 C   F   dt || d  |d d  t || d  t | | |  S r\  )rv   rw   ry   r]  r    r    r!   r#     
     c                 C      |j S r   r_  rZ  r    r    r!   r#         c                 C   B   t | | d d |d d  t | |  t || |  S Nrk   rt   )rv   ry   rw   r]  r    r    r!   r#     r`  c                 C   s   |dko|dkS )Nrk   r   r    rZ  r    r    r!   r#     r   c                 C   s   t | | d d S ri  )rv   ry   r]  r    r    r!   r#     rs   c                 C   ra  rb  rc  rZ  r    r    r!   r#     r   c                 C   rd  r\  )rv   rz   r{   r]  r    r    r!   r#     re  c                 C   rf  r   r_  rZ  r    r    r!   r#     rg  c                 C   rh  ri  )rv   r{   rz   r]  r    r    r!   r#     r`  c                    s   | \ }t  fddtjtjfD rBt|\}}}}} |s%d S tttt	t
ttitfdd||||fD  |g S d S )Nc                 3       | ]}  |V  qd S r   r   r  r  r    r!   rf     r   z#trig_sincos_rule.<locals>.<genexpr>c                    r   r    r   rc   r   r    r!   rr     r   z$trig_sincos_rule.<locals>.<listcomp>)ri   rv   r   r   rM  r   r   sincos_botheven_conditionsincos_bothevensincos_sinodd_conditionsincos_sinoddsincos_cosodd_conditionsincos_cosoddr   r   rq   rL  r   r   rE  rF   r    r   r   r!   trig_sincos_rule  s$   
rs  c                    s   | \ }  dt| t|i t fddtjtjfD rQt|\}}}}} |s4d S tt	t
ttttitfdd||||fD  |g S d S )Nrt   c                 3   rj  r   r   r  r  r    r!   rf     r   z#trig_tansec_rule.<locals>.<genexpr>c                    r   r    r   rc   r   r    r!   rr     r   z$trig_tansec_rule.<locals>.<listcomp>)r   rv   r   ry   ri   rw   rO  r   r   tansec_tanodd_conditiontansec_tanoddtansec_seceven_conditiontansec_seceventan_tansquared_conditiontan_tansquaredr   rq  r    rr  r!   trig_tansec_rule  s*   
rz  c              
      s   | \ }  dt| t|dt| t|t|t| t|i t fddtjtjfD rft|\}}}}} 	|sKd S t
ttttitfdd||||fD  |g S d S )Nrt   c                 3   rj  r   r   r  r  r    r!   rf     r   z#trig_cotcsc_rule.<locals>.<genexpr>c                    r   r    r   rc   r   r    r!   rr     r   z$trig_cotcsc_rule.<locals>.<listcomp>)r   rv   r   r{   rw   rz   r   ri   rP  r   r   cotcsc_cotodd_conditioncotcsc_cotoddcotcsc_csceven_conditioncotcsc_cscevenr   rq  r    rr  r!   trig_cotcsc_rule  s,   
r  c                 C   sv   | \}}t jdt d| gd}|t d| | }|r9dt | t | t d|  }t|| |S d S )Nr   rk   r   )rv   r   r   r   r   r   )r   r   rq   r   r   Z
sin_doubler    r    r!   trig_sindouble_rule  s   &r  c                 C   s"   t tttttttt| S r   )r   r   rs  rz  r  r  r   r    r    r!   trig_powers_products_rule  s   r  c              	   C   s  | \}}t jdd|gd}t jdd|gd}t d}|||d   }||}|D ]}||}	|	|t}
|	|t}|
jrE|
dkpG|
j}|jrO|dkpQ|j}|
jrY|
dk p[|
j	}|jrc|dk pe|j	}d }|r~|r~t 
|
t 
| t | }d}nC|r|rt 
|
t 
|  }|t | }t || k||k }n!|r|rt 
|
 t 
| }|t | }t || k||k }|rCi }t jt jt jt jt jt jfD ]}|||t 
||d < d|| |t 
||d	 < q||| }t||}||sC|t||9 }| }|dt | }|r-|dt | t |i}t||}t|sCt|||||||  S q*d S )
Nr   r   r   r   thetark   Trt   )rv   r   r	  findr   r   r   r  Zis_positiver  r   rw   r   r  ry   r   r{   rz   r   trigsimpr   r   rm   r1  r   rb   r?   )r   r   rq   ABr  Ztarget_patternmatchesr   r   r   r   Z
a_positiveZ
b_positiveZ
a_negativeZ
b_negativeZx_funcrestrictionr*   substitutionsr   ZreplacedZsecantsr   r    r    r!   trig_substitution_rule  sf   



 



r  c           
      C   s   | \}}t |\}}}}||}|r<d|| kr>t|| |}t|}	|| || }}t|| | | | |	||S d S d S r   )rQ  r   r   r&  r>   )
r   r   rq   rL  rE  r   r  r   r)  r   r    r    r!   heaviside_rule5  s   
r  c              
   C   s  | \}}t d}t|||}d}|rtd g }|D ]\}}}	t|	|}
|d }td||
 t|
r6qt |d dkr| \}}|
rOt	||	|
|	|}
|j
rg }g }t|t jr`|j}n|| |D ]}t|jstt||d|}|r||t |df qg||
df t||	|}
|t||||
|| qt|dkrt|||S |r|d S d S |t jrt |}d}||| }	|	||}	||	j
vrt|||t|	|||S d S d S )Nr   r   zList of Substitution Rulesrt   r   T)rv   r	  r   r   r   r   rb   r   r   r+   r   rg   r~   ru   r   r
   r   r   r   r=   r/   r   r8   r   r   rx   r   )r   r   rq   r   r  r   Zwaysr
  r   r   Zsubruler6  denomZ	piecewiseZcould_be_zeror   r   r    r    r!   substitution_rule@  sn   






r  c                 C      |   S r   )r   r  r    r    r!   r#     r   c                 C   s
   |  |S r   )Zapartr  r    r    r!   r#     s   
 c                 C   s   dS )NTr    r  r    r    r!   r#     s    c                 C   r  r   )r   r  r    r    r!   r#     r   c                    s0   t  fdd| jD pt| tjpt| tjS )Nc                 3   s     | ]}|j p| V  qd S r   )r   r%  rn   rp   r    r!   rf     s    z<lambda>.<locals>.<genexpr>)r'  ru   rg   rv   r   r~   r  r    rp   r!   r#     s   
c                 C   r  r   expandr  r    r    r!   r#     r   c                 C   s   t dd | tD dkS )Nc                 S   s   h | ]}|j d  qS )r   rR  r#  r    r    r!   	<setcomp>  rs   z<lambda>.<locals>.<setcomp>rt   )r   Zatomsr   r  r    r    r!   r#     s   c                 C   s   | j ddS )NT)Ztrigr  r  r    r    r!   r#     r$   c                 C   sT   | d }|j }|j}|j}| j|v r!| j|v rt|  S t|| jS t| jg| R  S r   )Z	variablesr   r   rq   r;   r:   r)   r   )r   r   Zdiff_variablesZundifferentiated_functionZintegrand_variablesr    r    r!   derivative_rule  s   

r  c                 C   sP   | \}}| dt| r&|dt| t|}t|t||||S d S r  )r   rv   r   r   ry   r<   r   )r   r   rq   r   r    r    r!   rewrites_rule  s
   r  c                 C   s   t |  S r   )r:   r   r    r    r!   fallback_rule  rT  r  zc                    sn  |  ti}|tv r t| du rt| S t|  tfS dt|< t| }fdd  fdd}ttttt t	j
tttttttt	jtt	jtt	jtt	jtttttttttttt	jtttt	jtttt	jt i
ttttt!t"t#t$|t	jt	j
t%t$|t	jt	j
t&t$|t	jt	j'gt(R  t)t$|t	jt	j
t*t+t,tt-t.|}t|= |S )a  Returns the steps needed to compute an integral.

    Explanation
    ===========

    This function attempts to mirror what a student would do by hand as
    closely as possible.

    SymPy Gamma uses this to provide a step-by-step explanation of an
    integral. The code it uses to format the results of this function can be
    found at
    https://github.com/sympy/sympy_gamma/blob/master/app/logic/intsteps.py.

    Examples
    ========

    >>> from sympy import exp, sin
    >>> from sympy.integrals.manualintegrate import integral_steps
    >>> from sympy.abc import x
    >>> print(repr(integral_steps(exp(x) / (1 + exp(2 * x)), x)))     # doctest: +NORMALIZE_WHITESPACE
    URule(u_var=_u, u_func=exp(x), constant=1,
    substep=PiecewiseRule(subfunctions=[(ArctanRule(a=1, b=1, c=1, context=1/(_u**2 + 1), symbol=_u), True),
        (ArccothRule(a=1, b=1, c=1, context=1/(_u**2 + 1), symbol=_u), False),
        (ArctanhRule(a=1, b=1, c=1, context=1/(_u**2 + 1), symbol=_u), False)],
    context=1/(_u**2 + 1), symbol=_u), context=exp(x)/(exp(2*x) + 1), symbol=x)
    >>> print(repr(integral_steps(sin(x), x)))     # doctest: +NORMALIZE_WHITESPACE
    TrigRule(func='sin', arg=x, context=sin(x), symbol=x)
    >>> print(repr(integral_steps((x**2 + 3)**2 , x)))     # doctest: +NORMALIZE_WHITESPACE
    RewriteRule(rewritten=x**4 + 6*x**2 + 9,
    substep=AddRule(substeps=[PowerRule(base=x, exp=4, context=x**4, symbol=x),
        ConstantTimesRule(constant=6, other=x**2,
            substep=PowerRule(base=x, exp=2, context=x**2, symbol=x),
                context=6*x**2, symbol=x),
        ConstantRule(constant=9, context=9, symbol=x)],
    context=x**4 + 6*x**2 + 9, symbol=x), context=(x**2 + 3)**2, symbol=x)


    Returns
    =======

    rule : namedtuple
        The first step; most rules have substeps that must also be
        considered. These substeps can be evaluated using ``manualintegrate``
        to obtain a result.

    Nc                    s~   | j }t|tr
tS t|tjrtjS  |jvrtjS tjtjtj	tj
tjtjgttjtR D ]}t||r<|  S q1d S r   )r   rg   r   rv   
Derivativer   r   r   r   r   r   r|   r~   r   r   r   )r   r   r'   rp   r    r!   r     s(   



zintegral_steps.<locals>.keyc                     s    fdd}|S )Nc                    s    | }|o
t |S r   )
issubclass)r   k)r   klassesr    r!   _integral_is_subclass  s   zKintegral_steps.<locals>.integral_is_subclass.<locals>._integral_is_subclassr    )r  r  )r   )r  r!   integral_is_subclass  s   z,integral_steps.<locals>.integral_is_subclass)/r1  r2  _integral_cacher:   rY   r   r   r  r   rv   r   r   r  rC  r   r   r   r|   r  r~   r  r?  r  rD  r  r  r   r;  r   r   r   r   r   r9   r  r  r   partial_fractions_rulecancel_ruler   r   r8  distribute_expand_ruler  trig_expand_ruler  r  )r   rq   optionsr5  r   r  r   r    )r   rq   r!   r     s   2

()r   c                 C   s   | | S r   r    )r*   r   rq   r    r    r!   eval_constant9     r  c                 C   s   | t | S r   r&  )r*   r   r   r   rq   r    r    r!   eval_constanttimes=     r  c                 C   s2   t | |d  |d  t |dft | dfS Nrt   r  T)rv   r   r   r   r   r   r   rq   r    r    r!   
eval_powerA  s   r  c                 C   s   |t |  S r   rv   Zlnr  r    r    r!   eval_expH     r  c                 C   s   t tt| S r   )r}   mapr&  r.   r   rq   r    r    r!   eval_addL  r  r  c                 C   s@   t |}|jr|jdkr|t| t|j }|| |S r  )r&  r   r   r   rv   r   r   )r   r
  r*   r   r   rq   r   r    r    r!   eval_uP  s   r  c                 C   s   t |}| | t | S r   r  )r   r  r)  Zsecond_stepr   rq   r   r    r    r!   
eval_partsX  s   r  c                 C   sJ   d| }g }d}| D ]}| ||j t|j  |d9 }q
tj| | S )Nrt   r  )r   r   r&  r)  rv   r|   )Zparts_rulesr7  r   rq   r   signr[   r    r    r!   eval_cyclicparts^  s   
r  c                 C   st   | dkr
t | S | dkrt |S | dkrt |S | dkr%t |S | dkr.t |S | dkr8t | S d S )Nr   r   r<  r=  r9  r:  )rv   r   r   ry   r{   rw   rz   )r5   ro   r   rq   r    r    r!   	eval_trigj  s   



r  c                 C   s2   | | d t ||  t |t ||   S r  )rv   r   atanr   r   r   r   rq   r    r    r!   eval_arctany     2r  c                 C   8   |  | d t | |  t |t | |   S r  )rv   r   Zacothr  r    r    r!   eval_arccoth}     8r  c                 C   r  r  )rv   r   Zatanhr  r    r    r!   eval_arctanh  r  r  c                 C   s
   t | S r   r  r5   r   rq   r    r    r!   eval_reciprocal     
r  c                 C   s
   t |S r   )rv   asinr  r    r    r!   eval_arcsin  r  r  c                 C   s   | |S r   r    r  r    r    r!   eval_inversehyperbolic  r  r  c                 C   s   t | d S r   r  )r9   r   rq   r    r    r!   eval_alternative  r  r  c                 C   s   t |S r   r  )r   r   r   rq   r    r    r!   eval_rewrite  r  r  c                 C   s   t jdd | D  S )Nc                 S   s   g | ]
\}}t ||fqS r    r  )rd   r   condr    r    r!   rr     s    z"eval_piecewise.<locals>.<listcomp>)rv   r   r  r    r    r!   eval_piecewise  s   
r  c                 C   s  | t| dt|  }| t| dt|  }| t| dt|  }t|	t
}t|dks9J |d }t|| |}t|dksMJ t|d \}	}
t|tjrs|	}|
}t|
d |	d  }t|d }n9t|tjr|	}|
}t|
d |	d  }t|d }nt|tjr|	}|
}t|
d |	d  }t|d }t| || ft| || ft| || f| |fg}tt| | |fS )Nrt   r   rk   )r   rv   ry   r   r{   r   rz   rw   rh   r  r   r   ZsolveZfractionrg   r   r  acosr  r   r&  r  )r  r5   r   r   r  r   rq   Ztrig_functionZrelationZnumerr  ZoppositeZ
hypotenuseZadjacentZinverser   r    r    r!   eval_trigsubstitution  s@   r  c                 C   sP   t | j}t|D ]\}\}}||kr||d f||<  nq	tj| jg|R  S r  )rh   variable_countr$  rv   r  r   )r   rq   r  re   varr   r    r    r!   eval_derivativerule  s   
r  c                 C   s   t | ||||  S r   )rv   r   r   )ZhargZibndr   r   rq   r    r    r!   eval_heaviside  s   r  c                 C   s~   t dt| d |d |d | | | |  t| | | df|t| df|| d |d  d || | d  t| dfS )Nrk   rt   r   r,  )r   rv   r   r   r   )rF   r   r   r   rq   r    r    r!   eval_jacobi  s
   <0r  c                 C   sZ   t t| d |d |d|d   t|dft| d || d  t| dftjjdfS )Nrt   rk   r  T)r   rv   r   r   r   SZerorF   r   r   rq   r    r    r!   eval_gegenbauer  s
   * 
r  c                 C   sV   t t| d || d  t| d || d   d tt| df|d d dfS )Nrt   rk   T)r   rv   r   r   r   rF   r   rq   r    r    r!   eval_chebyshevt  s   r  c                 C   s0   t t| d || d  t| dftjjdfS r  )r   rv   r   r   r  r  r  r    r    r!   eval_chebyshevu  s    
r  c                 C   s,   t | d |t | d | d|  d  S r\  )rv   r   r  r    r    r!   eval_legendre  s   ,r  c                 C   s   t | d |d| d   S r\  )rv   r   r  r    r    r!   eval_hermite     r  c                 C   s   t | |t | d | S r  )rv   r   r  r    r    r!   eval_laguerre  r  r  c                 C   s   t | d |d | S r  )rv   r   r  r    r    r!   eval_assoclaguerre     r  c                 C   s0   t |t | |  t |t | |   S r   )rv   r   Cir   Sir   r   r   rq   r    r    r!   eval_ci     0r  c                 C   0   t |t | |  t |t | |   S r   )rv   r   Chir   Shir  r    r    r!   eval_chi  r  r  c                 C   s   t |t | |  S r   )rv   r   ZEir  r    r    r!   eval_ei	  r  r  c                 C   r  r   )rv   r   r  r   r  r  r    r    r!   eval_si  r  r  c                 C   r  r   )rv   r   r  r   r  r  r    r    r!   eval_shi  r  r  c              
   C   s  | j r^tttj|   d t||d d|     td|  | | dt|     | dk fttj|  d t||d d|     td|  | | dt|    dfS ttj|  d t||d d|     td|  | | dt|    S )Nrk   r,  r  r   T)r@  r   rv   r   pir   ZerfZerfir  r    r    r!   eval_erf  s    .$,","r  c              
   C   s   t t jd|   t |d d|   | t d|  | | t d|  t j   t |d d|   | t d|  | | t d|  t j     S Nrk   r,  )rv   r   r  r   fresnelcr   fresnelsr  r    r    r!   eval_fresnelc!  
   BBr  c              
   C   s   t t jd|   t |d d|   | t d|  | | t d|  t j   t |d d|   | t d|  | | t d|  t j     S r  )rv   r   r  r   r  r   r  r  r    r    r!   eval_fresnels'  r  r  c                 C   s   t | | | |  S r   )rv   Zlir  r    r    r!   eval_li-  s   r  c                 C   s   t |d | | S r  )rv   r   r  r    r    r!   eval_polylog1  s   r  c                 C   s2   || |  | |   t |d |  |  |  S r  )rv   Z
uppergamma)r   r   r   rq   r    r    r!   eval_uppergamma5  r  r  c                 C   s   t |||  t |  S r   )rv   Z
elliptic_fr   r   r   r   rq   r    r    r!   eval_elliptic_f9     r  c                 C   s   t |||  t |  S r   )rv   Z
elliptic_er   r  r    r    r!   eval_elliptic_e=  r  r  c                 C   s   t | |S r   )rv   r0  r  r    r    r!   eval_dontknowruleA  r  r  c                 C   s(   t | j}|stdt|  ||  S )NzCannot evaluate rule %s)r\   r   r   r   repr)r[   Z	evaluatorr    r    r!   r&  E  s   r&  c                 C   s   t t| |}t  t|trDt|jdkrD|jd d }t|trD|jd d dkrD|	|jd d t
j|j f|jd d df}|S )a$  manualintegrate(f, var)

    Explanation
    ===========

    Compute indefinite integral of a single variable using an algorithm that
    resembles what a student would do by hand.

    Unlike :func:`~.integrate`, var can only be a single symbol.

    Examples
    ========

    >>> from sympy import sin, cos, tan, exp, log, integrate
    >>> from sympy.integrals.manualintegrate import manualintegrate
    >>> from sympy.abc import x
    >>> manualintegrate(1 / x, x)
    log(x)
    >>> integrate(1/x)
    log(x)
    >>> manualintegrate(log(x), x)
    x*log(x) - x
    >>> integrate(log(x))
    x*log(x) - x
    >>> manualintegrate(exp(x) / (1 + exp(2 * x)), x)
    atan(exp(x))
    >>> integrate(exp(x) / (1 + exp(2 * x)))
    RootSum(4*_z**2 + 1, Lambda(_i, _i*log(2*_i + exp(x))))
    >>> manualintegrate(cos(x)**4 * sin(x), x)
    -cos(x)**5/5
    >>> integrate(cos(x)**4 * sin(x), x)
    -cos(x)**5/5
    >>> manualintegrate(cos(x)**4 * sin(x)**3, x)
    cos(x)**7/7 - cos(x)**5/5
    >>> integrate(cos(x)**4 * sin(x)**3, x)
    cos(x)**7/7 - cos(x)**5/5
    >>> manualintegrate(tan(x), x)
    -log(cos(x))
    >>> integrate(tan(x), x)
    -log(cos(x))

    See Also
    ========

    sympy.integrals.integrals.integrate
    sympy.integrals.integrals.Integral.doit
    sympy.integrals.integrals.Integral
    rk   r   rt   T)r&  r   r3  clearrg   r   r   ru   r   r5   rv   r   )r   r  r   r  r    r    r!   manualintegrateL  s   1r  )r   )__doc__typingr   ZtDictr   collectionsr   r   Zcollections.abcr   	functoolsr   rv   Zsympy.core.compatibilityr   Zsympy.core.containersZsympy.core.exprr	   Zsympy.core.logicr
   Z(sympy.functions.elementary.trigonometricr   Z#sympy.functions.special.polynomialsr   Z$sympy.functions.elementary.piecewiser   Zsympy.strategies.corer   r   r   r   Zsympy.core.relationalr   r   Zsympy.polys.polytoolsr   Zsympy.ntheory.factor_r   Zsympy.utilities.miscr   r  r  r   r(   r)   r+   r,   r-   r/   r0   r1   r2   r3   r4   r6   r7   r8   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   r\   r`   rb   rm   r   r  r  r  ZacotZacscZasecr   r   r   r   r   r9   r   r   r   r   r  r  r  r  r+  r8  r;  r?  rC  rD  ZcacheitrI  rM  rO  rP  rQ  rU  rX  rk  rl  rm  rn  ro  rp  rv  rw  rt  ru  rx  ry  r}  r~  r{  r|  rs  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  intr3  r	  r2  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  r  r  r  r  r  r  r  r  r  r  r&  r  r    r    r    r!   <module>   s   








































![(A[L)@




=?
 


















&
	








