
    Wh\                       d Z ddlmZ ddlmZmZ ddlZddlZddl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 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$ ddl%Z& ej'        e(          Z) ej*        d            ej+        d          Z,de,_-        ej.        /                    e,           ej0        ecZZ1ej2        e3cZ3Z4 ej5        d           G d d                      Z6dEd#Z7e,8                     ej9        ej:        e,                     e,j;        dEd$            Z<d% Z=e=ej>        e,<   d& Z?e?ej@        e,<   dFd,ZA ej9        eAe,          ejB        e,<   dGd-ZCdHd.ZD ejE        e,eD           d/ ZFd e$            dd0dId4ZG ej+        d5          ZHdeH_-        ej.        /                    eH            G d6 d7ejI                  ZJ G d8 d9ejI                  ZK eJ            ZL eK            ZMejN        O                    eJ           ejN        O                    eK           ejP        O                    eJ           ejP        O                    eK           ejQ        O                    eK           ejR        O                    eK           dJd<ZSeH8                     ej9        ej:        eH                     eHjT        dJd=            ZUd> ZVeVej>        eH<   d? ZWeWej@        eH<   d@ ZXeXejB        eH<   dA ZY ejE        eHeY           ddBdCdKdDZZdS )LzModule for JAX callbacks.    )annotations)CallableSequenceN)Any)core)deprecations)dispatch)dtypes)effects)sharding_impls)	tree_util)util)ad)batching)mlir)lax)map)
xla_client)SingleDeviceSharding)DeprecatedArgjax-callback-vectorizedpure_callbackT)frozenc                  0    e Zd ZU dZded<   ded<   dd
ZdS )_FlatCallbacka/  A Python function callable with flat arguments and results.

  An instance of this class is used as a parameter for the callback primitives.
  We prefer it to an anonymous flattened function because it produces
  equal objects when we call the same Python function with the same argument
  structure.
  Callable[..., Any]callback_funcztree_util.PyTreeDefin_tree	flat_args	jax.ArrayreturnSequence[jax.Array]c                z    t          j        | j        |          \  }}t          j         | j        |i |          S N)r   tree_unflattenr   tree_leavesr   )selfr   argskwargss       W/var/www/html/movieo_spanner_bot/venv/lib/python3.11/site-packages/jax/_src/callback.py__call__z_FlatCallback.__call__E   s>    +DL)DDLD& !3!3T!DV!D!DEEE    N)r   r    r!   r"   )__name__
__module____qualname____doc____annotations__r+    r,   r*   r   r   9   sT           $###F F F F F Fr,   r   callbackshardingSingleDeviceSharding | None
vectorizedbool | DeprecatedArgvmap_method
str | Nonec                   ~~~~ 	 t          j        d          ^}}n"# t          $ r}t          d          |d }~ww xY wt          j        ||          }t          j        |          5  	 t          j        t          j         ||           cd d d            S # t          $ r t                              d            w xY w# 1 swxY w Y   d S )Ncpubackendzjax.pure_callback failed to find a local CPU device to place the inputs on. Make sure "cpu" is listed in --jax_platforms or the JAX_PLATFORMS environment variable.zjax.pure_callback failedjaxlocal_devicesRuntimeError
device_putdefault_devicer   tree_mapnpasarrayBaseExceptionlogger	exception)	result_avalsr3   r4   r6   r8   r(   
cpu_device_es	            r*   pure_callback_implrN   J   s@    
K&u555NJ	   
	/  	 
j	)	)$
*%%  
HHdO<<           1222         s4    
=8=)C+!B&B??CC	Cc                    ~~ ~~~|S r$   r2   )r3   rJ   r4   r6   r8   avalss         r*   pure_callback_abstract_evalrQ   h   s     Xx[	r,   c                 $    ~ ~t          d          )NzgPure callbacks do not support JVP. Please use `jax.custom_jvp` to use callbacks while taking gradients.
ValueErrorr(   r)   s     r*   pure_callback_jvp_rulerV   u   "    
FM	N 	N Nr,   c                 $    ~ ~t          d          )NzmPure callbacks do not support transpose. Please use `jax.custom_vjp` to use callbacks while taking gradients.rS   rU   s     r*   pure_callback_transpose_rulerY      rW   r,   bool | None | DeprecatedArgrJ   Sequence[core.ShapedArray]r)   r   c               P    t          t                    r$"t          j        dd j         dd           dd t          ||          D             \  d t          ||          D             }t          fd	D                       }dk    r7                    d
          "t          d d
         D                       d
<   dk    rW                    d          0t          d t          d         |          D                       d<     j        ||d}	nىdk    sdk    rodk    rndfdt          ||          D             }
                    d          "t          d d         D                       d<     j        |
|d}	n^dk    r@d |D             t          j
        |          \  } fd}t          ||          }	nt          d j         d          t          |	          dt          |	          z  fS )Nr   zThe default behavior of z under vmap will soon change. Currently, the default behavior is to generate a sequential vmap (i.e. a loop), but in the future the default will be to raise an error. To keep the current default, set vmap_method='sequential'.   
stacklevel
sequentialc                J    h | ] \  }}|t           j        u|j        |         !S r2   )r   
not_mappedshape).0ads      r*   	<setcomp>z)callback_batching_rule.<locals>.<setcomp>   s9     1 1 1tq!H/// 
///r,   c                `    g | ]+\  }}|t           j        u r|nt          j        ||d           ,S r   r   rb   moveaxisrd   argdims      r*   
<listcomp>z*callback_batching_rule.<locals>.<listcomp>   S     N N N19c H///ccS!,,N N Nr,   c              3  Z   K   | ]%}t          j        t           j        d |          V  &dS )r   N)r   unmapped_avalno_axis_name)rd   aval	axis_sizes     r*   	<genexpr>z)callback_batching_rule.<locals>.<genexpr>   sK          
 D$5q$??           r,   output_layoutsc              3  V   K   | ]$}|d nt          d |D                       dz   V  %d S )Nc              3      K   | ]	}|d z   V  
dS    Nr2   rd   ns     r*   rv   z3callback_batching_rule.<locals>.<genexpr>.<genexpr>   s&      )@)@A!a%)@)@)@)@)@)@r,   ri   tuplerd   layouts     r*   rv   z)callback_batching_rule.<locals>.<genexpr>   sZ       %0 %0 E)@)@)@)@)@$@$@4$G%0 %0 %0 %0 %0 %0r,   legacy_vectorizedinput_layoutsc              3  |   K   | ]7\  }}|t           j        u r|n|d nt          d |D                       dz   V  8d S )Nc              3      K   | ]	}|d z   V  
dS rz   r2   r|   s     r*   rv   z3callback_batching_rule.<locals>.<genexpr>.<genexpr>   s&      ,C,CqQU,C,C,C,C,C,Cr,   ri   )r   rb   r   )rd   r   rf   s      r*   rv   z)callback_batching_rule.<locals>.<genexpr>   sr       &? &? fa ,,,&&>44u,C,CF,C,C,C'C'Cd'J&? &? &? &? &? &?r,   )r6   r8   rJ   expand_dimsbroadcast_allr{   c                b    g | ]+\  }}|t           j        u rt          j        |f          n|,S r2   )r   rb   r   	broadcast)rd   xrf   sizes      r*   ro   z*callback_batching_rule.<locals>.<listcomp>   sM     ) ) )Aq &'(*=%=%=a$!!!1) ) )r,   c              3  V   K   | ]$}|d nt          d |D                       dz   V  %d S )Nc              3      K   | ]	}|d z   V  
dS rz   r2   r|   s     r*   rv   z3callback_batching_rule.<locals>.<genexpr>.<genexpr>   s&      +B+BaAE+B+B+B+B+B+Br,   ri   r~   r   s     r*   rv   z)callback_batching_rule.<locals>.<genexpr>   sZ       &1 &1 .$$e+B+B6+B+B+B&B&BT&I&1 &1 &1 &1 &1 &1r,   c                *    g | ]}|t           j        uS r2   r   rb   rd   rf   s     r*   ro   z*callback_batching_rule.<locals>.<listcomp>   s     ===1!8..===r,   c                R    t          j        |           } j        |dS )N)rJ   r6   r8   )r   merge_listsbind)	batched_argsmerged_args
is_batchedr)   primrJ   unbatched_argsr6   r8   s	     r*   
_batch_funz*callback_batching_rule.<locals>._batch_fun   sH    $ZNNkTY#!	 
   r,   zvmap is only supported for the zk primitive when vmap_method is one of 'sequential', 'expand_dims', 'broadcast_all', or 'legacy_vectorized'.ri   )
isinstancer   r   warnnamezipr   getr   r   partition_listlax_mapNotImplementedErrorlen)r   r(   dimsr6   r8   rJ   r)   new_argsbatched_result_avalsoutvals
bcast_argsr   r   ru   r   r   r   s   `  ````      @@@@r*   callback_batching_ruler      s|    
M** {/B!	O49 	O 	O 	O     K1 1s4 1 1 1*)N N=@t__N N N(                  L  VZZ0@%A%A%M$ %0 %0-.%0 %0 %0  0  0F ''' zz/"". % &? &? vo6==&? &? &? !? !?f_ di	)	 
  GG m##{o'E'E#6699AD) ) ) )$'') ) )J zz/"". % &1 &1/&1 &1 &1 !1 !1f_ di'	 
 	 GG l""=====J#'#6z8#L#L NL           j,//GG
	$) 	 	 	      
wG,	,,r,   c                4   t          | t          j                  rr| j        t	          | j        j                  k    rt          d          |t          d          t          j	                    }t          j	        j
        j        |_        |S t          | t          j                  r|t          |t                    st          dt          |                     t          t!          |j                            }| j        }|t'          d          	 |                    |          }n+# t*          $ r}t-          d| d| d          |d }~ww xY wd}t          j	                    }t          j	        j
        j        |_        d	g|_        |g|_        |S d S )
Nz~callbacks are only supported in spmd computations when all mesh axes are partitioned manually (no partial automatic sharding).zEcallbacks do not support specifying sharding inside spmd computationsz:pure_callback only supports SingleDeviceSharding, but got z9Please file a bug at https://github.com/jax-ml/jax/issuesz6Sharding provided to pure_callback specifies a device z' that is not in the device assignment ()r   r{   )r   r   SPMDAxisContextmanual_axes	frozensetmesh
axis_namesr   xc
OpShardingTypeMANUALtypeShardingContextr   nextiter
device_setdevice_assignmentAssertionErrorindex
IndexErrorrT   MAXIMALtile_assignment_dimensionstile_assignment_devices)axis_contextr4   op_shardingdevicer   device_indexrM   s          r*   _callback_op_shardingr      s   n<==  9\->-I#J#JJJL      -//K})0Kn<== "677 
!!X! !
 
 	
 D,--..f&8		"GI I 	I.(..v66 . . .&& &"& & &' ' -.	.. l
 -//K})1K./SK*+7.K' 
s   D- -
E7EEc          
         fd}t          | j        j        |          }t          j        | |d t          |          | j        | j        d|          \  }}}|S )Nc                 <    t          t          | d d          S )N)r3   r4   )r   rN   )r   r3   paramss    r*   	_callbackz)pure_callback_lowering.<locals>._callback  s:    	
 	
 		
 	
  r,   Fhas_side_effectr4   )r   module_contextr   r   emit_python_callbacklistavals_in	avals_out)	ctxr3   r4   r(   r   r   r   resultrL   s	    `  `    r*   pure_callback_loweringr     s          &c&8&ExPP+*	

4jj	l	m	 	 	,&!Q 
-r,   c                    t          j        | j                  }t          j        |          |k    rt	          d          d S )NzQresult_shape_dtypes cannot specify 64-bit types when `jax_enable_x64` is disabled)rE   dtyper
   canonicalize_dtyperT   )shape_dtypedts     r*   _check_shape_dtyper   6  sJ    	x!"""r""b((
[] ] ] )(r,   )r4   r6   r8   r   result_shape_dtypesr(   c          	        t          |t                    s0|.t          j        ddd           |t	          d          |rdnd}g d	}||vrt	          d
| d|           t          j        ||f          \  }}	t          j        t          |           t          j        d |          }
t          j        |
          \  }}t          j
        |t          | |	          t          |          |||d}t          j        ||          S )a  Calls a pure Python callback. Works under :func:`jit`/:func:`~vmap`/etc.

  For more explanation, see `External Callbacks`_.

  ``pure_callback`` enables calling a Python function in JIT-ed JAX functions.
  The input ``callback`` will be passed JAX arrays placed on a local CPU, and
  it should also return JAX arrays on CPU.

  The callback is treated as functionally pure, meaning it has no side-effects
  and its output value depends only on its argument values. As a consequence, it
  is safe to be called multiple times (e.g. when transformed by :func:`~vmap` or
  :func:`~pmap`), or not to be called at all when e.g. the output of a
  `jit`-decorated function has no data dependence on its value. Pure callbacks
  may also be reordered if data-dependence allows.

  When `vmap`-ed the behavior will depend on the value of the ``vmap_method``.

  * Calling :func:`~jax.vmap` on a callback without an explicit ``vmap_method``
    is deprecated and it will eventually raise ``NotImplementedError``.
  * ``vmap_method="sequential"`` uses :func:`~jax.lax.map` to loop over
    the batched arguments, calling ``callback`` once for each batch element.
  * ``vmap_method="expand_dims"`` calls ``callback`` with new axes of size ``1``
    added as the leading dimension unbatched inputs.
  * ``vmap_method="broadcast_all"`` behaves like ``expand_dims``, but the
    inputs are tiled to the expected batched shape.

  If necessary, the legacy behavior provided by the deprecated
  ``vectorized=True`` argument can be recovered using
  ``vmap_method="legacy_vectorized"``.

  The current default behavior is to use ``vmap_method="sequential"`` when
  not specified, but this behavior is deprecated, and in the future, the
  default will be to raise a ``NotImplementedError`` unless ``vmap_method`` is
  explicitly specified.

  Args:
    callback: function to execute on the host. The callback is assumed to be a pure
      function (i.e. one without side-effects): if an impure function is passed, it
      may behave in unexpected ways, particularly under transformation. The callable
      will be passed PyTrees of arrays as arguments, and should return a PyTree of
      arrays that matches ``result_shape_dtypes``.
    result_shape_dtypes: pytree whose leaves have ``shape`` and ``dtype`` attributes,
      whose structure matches the expected output of the callback function at runtime.
      :class:`jax.ShapeDtypeStruct` is often used to define leaf values.
    *args: arguments to be passed to the callback function
    sharding: optional sharding that specifies the device from which the callback should
      be invoked.
    vmap_method: string specifying how the callback transforms under
      :func:`~jax.vmap` as described above.
    **kwargs: keyword arguments to be passed to the callback function

  Returns:
    result: a pytree of :class:`jax.Array` objects whose structure matches that of
      ``result_shape_dtypes``.

  See Also:
    - :func:`jax.experimental.io_callback`: callback designed for impure functions.
    - :func:`jax.debug.callback`: callback designed for general-purpose debugging.
    - :func:`jax.debug.print`: callback designed for printing.

  Examples:
    The behavior of ``pure_callback`` under :func:`~jax.vmap` is controlled by
    the ``vmap_method`` argument as described above. It is useful to consider
    some explicit examples that demonstrate the semantics. For example,
    consider the following function:

    >>> def callback(x, y):
    ...   print(jnp.shape(x), jnp.shape(y))
    ...   return x + y

    >>> def fun(x, y, *, vmap_method):
    ...   shape = jnp.broadcast_shapes(jnp.shape(x), jnp.shape(y))
    ...   dtype = jnp.result_type(x, y)
    ...   out_type = jax.ShapeDtypeStruct(shape, dtype)
    ...   return jax.pure_callback(callback, out_type, x, y,
    ...                            vmap_method=vmap_method)

    Calling this with ``vmap_method="expand_dims"`` adds a new axis of size ``1``
    to ``y``:

    >>> from functools import partial
    >>> x = jnp.arange(4)
    >>> y = 1.0
    >>> jax.vmap(partial(fun, vmap_method="expand_dims"), in_axes=(0, None))(x, y)
    (4,) (1,)
    Array([1., 2., 3., 4.], dtype=float32)

    Whereas, ``vmap_method="broadcast_all"`` adds an axis of size ``4`` to
    ``y``:

    >>> jax.vmap(partial(fun, vmap_method="broadcast_all"),
    ...          in_axes=(0, None))(x, y)
    (4,) (4,)
    Array([1., 2., 3., 4.], dtype=float32)

  .. _External Callbacks: https://jax.readthedocs.io/en/latest/notebooks/external_callbacks.html
  Nr   zThe vectorized argument of jax.pure_callback is deprecated and setting it will soon raise an error. To avoid an error in the future, and to suppress this warning, please use the vmap_method argument instead.   r^   z{the vectorized and vmap_method arguments of jax.pure_callback cannot be used together. Please use the vmap_method argument.r   r`   )r`   r   r   r   Nz.vmap_method must be on of the allowed methods z, but got: c                @    t          j        | j        | j                  S r$   r   ShapedArrayrc   r   r   s    r*   <lambda>zpure_callback.<locals>.<lambda>  s     !'22 r,   )r3   rJ   r4   r6   r8   )r   r   r   r   rT   r   tree_flattenrD   r   pure_callback_pr   r   r   r%   )r3   r   r4   r6   r8   r(   r)   allowed_vmap_methodsr   r   rJ   flat_result_avalsout_treeout_flats                 r*   r   r   =  s}   T 
J	.	. Fz7I!	N     CD D D *4E%%K5 5 5,,,
	"9M 	" 	"	" 	"# # # !-tVn==)W')<===#224GI I, ) 6| D DX!Xw//*++  ( 
	!(H	5	55r,   io_callbackc                      e Zd Zd ZdS )IOEffectc                    dS )NIOr2   rL   s    r*   r   zIOEffect.<lambda>  s    d r,   Nr-   r.   r/   __str__r2   r,   r*   r   r     s        N'''r,   r   c                      e Zd Zd ZdS )OrderedIOEffectc                    dS )N	OrderedIOr2   r   s    r*   r   zOrderedIOEffect.<lambda>  s    k r,   Nr   r2   r,   r*   r   r     s        !!'''r,   r   orderedboolc                   ~ ~~	 t          j        d          ^}}n"# t          $ r}t          d          |d }~ww xY wt          j        ||          }t          j        |          5  	 t          j        t          j         ||           cd d d            S # t          $ r t                              d            w xY w# 1 swxY w Y   d S )Nr;   r<   zjax.io_callback failed to find a local CPU device to place the inputs on. Make sure "cpu" is listed in --jax_platforms or the JAX_PLATFORMS environment variable.zjax.io_callback failedr>   )rJ   r3   r4   r   r(   rK   rL   rM   s           r*   io_callback_implr     s>    Hg&u555NJ	   
	/  	 
j	)	)$
*%%  
HHdO<<           /000         s4    
<7<(C*!B&B>>CCCc                2    ~~~ |rt           nt          }||hfS r$   )_OrderedIOEffect	_IOEffect)r3   rJ   r4   r   rP   effects         r*   io_callback_abstract_evalr     s(     Xx&5I&	x	r,   c                 $    ~ ~t          d          )Nz IO callbacks do not support JVP.rS   rU   s     r*   io_callback_jvp_ruler   
  s    
F5666r,   c                 $    ~ ~t          d          )Nz&IO callbacks do not support transpose.rS   rU   s     r*   io_callback_transpose_ruler     s    
F;<<<r,   c                  
 |rt          d          d |D             
d t          | |          D             }t          j        
|          \  }
fd}t	          ||          }	|	dt          |	          z  fS )Nz"Cannot `vmap` ordered IO callback.c                *    g | ]}|t           j        uS r2   r   r   s     r*   ro   z-io_callback_batching_rule.<locals>.<listcomp>  s     ;;;,,;;;r,   c                `    g | ]+\  }}|t           j        u r|nt          j        ||d           ,S ri   rj   rl   s      r*   ro   z-io_callback_batching_rule.<locals>.<listcomp>  rp   r,   c                X    t          j        |           }t          j        |ddS )NF)r3   r4   rJ   r   )r   r   io_callback_pr   )r   mergedr3   r   rJ   r4   r   s     r*   r   z-io_callback_batching_rule.<locals>._batch_fun  s@    j.,GGFv8+7H H H Hr,   ri   )rT   r   r   r   r   r   )r(   r   r3   rJ   r4   r   r   r   r   out_valsr   r   s     ```     @@r*   io_callback_batching_ruler    s      ;
9
:
::;;d;;;*N N=@t__N N N(!%!4Z!J!J.,H H H H H H H H H Z..(	4#h--'	''r,   c          
        fd}t          | j        j        |          }r| j                            t
                    }t          j        | ||t          |          | j	        | j
        d|          \  }	}}
|                     t          j        t
          |i                     n7t          j        | |d t          |          | j	        | j
        d|          \  }	}}
|	S )Nc            	     >    t          t          | d d          S )N)r3   r4   r   )r   r   )r   r3   r   r   s    r*   r   z'io_callback_lowering.<locals>._callback)  s=    		
 	

 	
 	
  r,   Tr   )r   r   r   	tokens_inr   r   r   r   r   r   r   set_tokens_outTokenSet)r   r3   r4   r   r(   r   r   r   tokenr   rL   s    ` ` `     r*   io_callback_loweringr  (  s   	 	 	 	 	 	 	 &c&8&ExPP+ M.//E0T

	 	 	FE1 t}&6%>??@@@@0T

	 	 	FE1 
-r,   F)r4   r   c               @   t          j        ||f          \  }}t          j        t          |           t          j        |          \  }}	t	          d |          }
t          j        |t          | |          t          |
          ||d}t          j	        |	|          S )a(  Calls an impure Python callback.

  For more explanation, see `External Callbacks`_.

  Args:
    callback: function to execute on the host. It is assumed to be an impure function.
      If ``callback`` is pure, using :func:`jax.pure_callback` instead may lead to
      more efficient execution.
    result_shape_dtypes: pytree whose leaves have ``shape`` and ``dtype`` attributes,
      whose structure matches the expected output of the callback function at runtime.
      :class:`jax.ShapeDtypeStruct` is often used to define leaf values.
    *args: arguments to be passed to the callback function
    sharding: optional sharding that specifies the device from which the callback should
      be invoked.
    ordered: boolean specifying whether sequential calls to callback must be ordered.
    **kwargs: keyword arguments to be passed to the callback function

  Returns:
    result: a pytree of :class:`jax.Array` objects whose structure matches that of
      ``result_shape_dtypes``.

  See Also:
    - :func:`jax.pure_callback`: callback designed for pure functions.
    - :func:`jax.debug.callback`: callback designed for general-purpose debugging.
    - :func:`jax.debug.print`: callback designed for printing.

  .. _External Callbacks: https://jax.readthedocs.io/en/latest/notebooks/external_callbacks.html
  c                @    t          j        | j        | j                  S r$   r   r   s    r*   r   zio_callback.<locals>.<lambda>z  s    D$4QWag$F$F r,   )r3   rJ   r4   r   )
r   r   rD   r   r   r  r   r   r   r%   )r3   r   r4   r   r(   r)   r   r   flat_shape_dtypesr   r   r   s               r*   r   r   S  s    H !-tVn==)W')<=== ) 67J K KXFF+- -Xw//*++  ( 
	!(H	5	55r,   )r3   r   r4   r5   r6   r7   r8   r9   )r6   rZ   r8   r9   rJ   r[   r)   r   )r4   r5   )r3   r   r4   r5   )r3   r   r   r   r(   r   r4   r5   r6   rZ   r8   r9   r)   r   )r3   r   r4   r5   r   r   )r3   r   r   r   r(   r   r4   r5   r   r   r)   r   )[r0   
__future__r   collections.abcr   r   dataclasses	functoolsloggingtypingr   r?   jax._srcr   r   r	   r
   r   r   r   r   jax._src.interpretersr   r   r   jax._src.laxr   jax._src.lax.control_flow.loopsr   r   jax._src.libr   r   jax._src.sharding_implsr   jax._src.typingr   numpyrE   	getLoggerr-   rH   register	Primitiver   multiple_results%prim_requires_devices_during_loweringaddsafe_map
unsafe_mapsafe_zipr   
unsafe_zip	dataclassr   rN   def_implpartialapply_primitivedef_abstract_evalrQ   rV   primitive_jvpsrY   primitive_transposesr   primitive_batchersr   r   register_loweringr   r   r  Effectr   r   r   r   lowerable_effectsadd_typecontrol_flow_allowed_effectsordered_effectsshardable_ordered_effectsr   def_effectful_abstract_evalr   r   r   r  r  r   r2   r,   r*   <module>r:     s$      " " " " " " . . . . . . . .                



       ! ! ! ! ! !                   # # # # # #             $ $ $ $ $ $ * * * * * * & & & & & &       : : : : : : ) ) ) ) ) ) 8 8 8 8 8 8 ) ) ) ) ) )    		8	$	$  / 0 0 0 !$.11#'    . 2 2? C C C-Z-Z d###F F F F F F F $#F    4   **8+C+:< < = = = "	 	 	 #"	N N N &< / "N N N ,H  (T- T- T- T-n 0Ay/@O0 0 O ,
2 2 2 2j   6  (> ? ? ?] ] ] -1.;moo"J6 J6 J6 J6 J6 J6^ }--!%   . 2 2= A A A    w~   " " " " "gn " " " HJJ	"?$$    " "8 , , ,   " "? 3 3 3  $ - -h 7 7 7  $ - -o > > >       1 1 1  ! * *? ; ; ;   2   (y()A)68 8 9 9 9 *	  	  	  +*	 7 7 7 $8 -  = = = *D  &( ( ( .G M *% % %P  }&: ; ; ; -106 06 06 06 06 06 06 06r,   