
    M/PhH_                         d Z ddlZddlmZ ddlmZ ddlm	Z	 ddl
mc mZ ddlmc mc mZ ddlmc mc mZ ej        Z G d d          Z G d de          ZdS )z
Impulse reponse-related code
    N)cache_readonlyc                   t    e Zd ZdZ	 	 ddZddZd Zd Zdddd	dd
ddddddddZdddd	dd
dddddd
dZ	dS )BaseIRAnalysisz
    Base class for plotting and computing IRF-related statistics, want to be
    able to handle known and estimated processes
    N
   Fc                    || _         || _        |j        |j        |j        c| _        | _        | _        || _        ||j        }t          j
        |          }|| _        || _        |                    |          | _        |r|                    ||          | _        n|                    ||          | _        | j                            d          | _        |r!| j                            d          | _        n | j                            d          | _        |st|                                | _        |r-t3          j        |                                |          | _        n,t3          j        |                                |          | _        |r t;          j        |j                  | _         d S t;          j        |j!                  | _         d S )N)Pr   axis)"modelperiodsneqsk_arnobslagsTordersigma_ulacholeskyr   svarma_repirfssvar_ma_rep	svar_irfsorth_ma_rep	orth_irfscumsumcum_effectssvar_cum_effectsorth_cum_effectslong_run_effects
lr_effectsnpdotsvar_lr_effectsorth_lr_effectsutilcomp_matrixvar_rep_Acoefs)selfr   r   r   r   r   vecmsigmas           ]/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/statsmodels/tsa/vector_ar/irf.py__init__zBaseIRAnalysis.__init__   s   
',z5:uz$	49df
9ME E""A	LL))	 	="..w!.<<DNN"..w!.<<DN9+++33 	B$(N$9$9q$9$A$AD!!$(N$9$9q$9$A$AD!  	K#4466DO K')ve.D.D.F.F'J'J$$')ve.D.D.F.F'J'J$  	4&u}55DGGG&u{33DGGG    c                 4    |r| j         S |r| j        S | j        S N)r   r   r   )r,   orthr   s      r/   _choose_irfszBaseIRAnalysis._choose_irfsJ   s*     	>! 	>!9r1   c                     t           r3   NotImplementedErrorr,   argskwargss      r/   covzBaseIRAnalysis.covR       !!r1   c                     t           r3   r7   r9   s      r/   cum_effect_covzBaseIRAnalysis.cum_effect_covU   r=   r1   皙?)r   r   Tasym  )impulseresponsesignifplot_paramsfigsizesubplot_paramsplot_stderrstderr_typereplseed	componentc                ^   | j         }| j        }| j        }|r|rt          d          |                     ||          }|rd}n|rd}nd}|du rd}n|	dvrt          d          |	d	k    r|                     |
          }|	dk    r|                     |||
||          }|	dk    r|                     |||
|||          }|	dk    r|                     |||
|||          }|	dk    r| 	                    |||
|||          }t          j        ||||| j        j        ||||||	          }|S )a  
        Plot impulse responses

        Parameters
        ----------
        orth : bool, default False
            Compute orthogonalized impulse responses
        impulse : {str, int}
            variable providing the impulse
        response : {str, int}
            variable affected by the impulse
        signif : float (0 < signif < 1)
            Significance level for error bars, defaults to 95% CI
        subplot_params : dict
            To pass to subplot plotting funcions. Example: if fonts are too big,
            pass {'fontsize' : 8} or some number to your taste.
        plot_params : dict

        figsize : (float, float), default (10, 10)
            Figure size (width, height in inches)
        plot_stderr : bool, default True
            Plot standard impulse response error bands
        stderr_type : str
            'asym': default, computes asymptotic standard errors
            'mc': monte carlo standard errors (use rpl)
        repl : int, default 1000
            Number of replications for Monte Carlo and Sims-Zha standard errors
        seed : int
            np.random.seed for Monte Carlo replications
        component: array or vector of principal component indices
        zFor SVAR system, set orth=Falsez"Impulse responses (orthogonalized)zImpulse responses (structural)zImpulse responsesFN)rA   mcsz1sz2sz3z<Error type must be either 'asym', 'mc','sz1','sz2', or 'sz3'rA   r4   rO   )r4   r   rK   rE   rL   rP   )r4   r   rK   rE   rL   rM   rQ   rR   )rE   rH   rF   rG   rJ   )r   r   r   
ValueErrorr5   r<   
errband_mcerr_band_sz1err_band_sz2err_band_sz3plottingirf_grid_plotnames)r,   r4   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   r   r   r   r   titlestderrfigs                       r/   plotzBaseIRAnalysis.plotX   s   F ,
y 	@D 	@>???  t,, 	(8EE 	(4EE'E%FF BBB[\\\f$$t,,d""d.26.2 ) 4 4 e##**404V045> + @ @ e##**404V045> + @ @ e##**404V045> + @ @
 $T67H%)Z%5uV4B1<-41<> > > 
r1   )
rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   c       
         D   |rd}| j         }| j        }nd}| j        }| j        }|	dvrt	          d          |	dk    r|                     |          }|	dk    r|                     ||
||          }|sd	}t          j        ||||| j	        j
        |||||||	
          }|S )a  
        Plot cumulative impulse response functions

        Parameters
        ----------
        orth : bool, default False
            Compute orthogonalized impulse responses
        impulse : {str, int}
            variable providing the impulse
        response : {str, int}
            variable affected by the impulse
        signif : float (0 < signif < 1)
            Significance level for error bars, defaults to 95% CI
        subplot_params : dict
            To pass to subplot plotting funcions. Example: if fonts are too big,
            pass {'fontsize' : 8} or some number to your taste.
        plot_params : dict

        figsize: (float, float), default (10, 10)
            Figure size (width, height in inches)
        plot_stderr : bool, default True
            Plot standard impulse response error bands
        stderr_type : str
            'asym': default, computes asymptotic standard errors
            'mc': monte carlo standard errors (use rpl)
        repl : int, default 1000
            Number of replications for monte carlo standard errors
        seed : int
            np.random.seed for Monte Carlo replications
        z/Cumulative responses responses (orthogonalized)zCumulative responses)rA   rO   z)`stderr_type` must be one of 'asym', 'mc'rA   rS   rO   )r4   rK   rE   rL   N)rE   hlinesrH   rF   rG   rJ   )r    r&   r   r"   rT   r?   cum_errband_mcrY   rZ   r   r[   )r,   r4   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   r\   r   r"   r]   r^   s                    r/   plot_cum_effectszBaseIRAnalysis.plot_cum_effects   s    F  	)EE/K-JJ*E*KJn,,HIIIf$$,,$,77d"",,$T4: - G G 	F$[&'8%)Z%5uV,64B1<-41<> > > 
r1   Nr   NFF)FFF)
__name__
__module____qualname____doc__r0   r5   r<   r?   r_   rc    r1   r/   r   r      s         
 DI14 14 14 14f   " " "" " "T$dH dTTT T T T Tl>dT $$(,$%+$T> > > > > > >r1   r   c                       e Zd ZdZ	 	 ddZddZ	 	 dd
Z	 	 ddZ	 	 ddZ	 	 ddZ	d Z
ed             Zd ZddZ	 	 ddZddZddZddZddZd Zed             Zd ZdS )
IRAnalysisu   
    Impulse response analysis class. Computes impulse responses, asymptotic
    standard errors, and produces relevant plots

    Parameters
    ----------
    model : VAR instance

    Notes
    -----
    Using Lütkepohl (2005) notation
    Nr   Fc           	          t                               | ||||||           |r|j        | _        n|j        | _        |j        | _        i | _        d S )N)r   r   r   r   r-   )r   r0   cov_var_reprcov_a
_cov_alpha
_cov_sigmacov_sig_g_memo)r,   r   r   r   r   r   r-   s          r/   r0   zIRAnalysis.__init__   sh    eq'&+$T 	  	C 	C 	C  	*+DJJ)DJ' r1   c                 >   |r|                                  S |                     | j        dz             }t          j        | j        dz  | j        dz  f          |d<   t          d| j        dz             D ]'}| j        |dz
           }|| j        z  |j	        z  ||<   (|S )u   
        Compute asymptotic standard errors for impulse response coefficients

        Notes
        -----
        Lütkepohl eq 3.7.5

        Returns
        -------
              r   )
	_orth_cov_empty_covmr   r#   zerosr   rangeGro   r   )r,   r4   covsiGis        r/   r<   zIRAnalysis.cov
  s      	$>>###q 011(DINDIN;<<Qq$,*++ 	- 	-AAB4:o,DGGr1   rB   r@   d   c           	          | j         }| j        }|r|                    ||||||d          S |                    ||||||d          S )z8
        IRF Monte Carlo integrated error bands
        Fr4   rK   stepsrE   rL   burncum)r   r   sirf_errband_mcirf_errband_mc)	r,   r4   r   rK   rE   rL   r   r   r   s	            r/   rU   zIRAnalysis.errband_mc   sv    
 
, 	>((dW06T.2 ) ? ? ? ''TG/5D-1u ( > > >r1   c                    | j         }| j        }	|                     ||          }
| j        }|                    |||	||          }t          j        |          }|                     |          \  }}}|xt          j	        |          ||fk    r2t          dt          |          z   dz   t          |          z             t          j        |          ||	z  k    rt          d          |}t          j        |
          }t          j        |
          }t          |          D ]}t          |          D ]}|
dd||f         |||dd|||f         f         |z  t          j        ||||||f         f                   z  z   |dd||f<   |
dd||f         |||dd|||f         f         |z  t          j        ||||||f         f                   z  z
  |dd||f<   ||fS )a  
        IRF Sims-Zha error band method 1. Assumes symmetric error bands around
        mean.

        Parameters
        ----------
        orth : bool, default False
            Compute orthogonalized impulse responses
        repl : int, default 1000
            Number of MC replications
        signif : float (0 < signif < 1)
            Significance level for error bars, defaults to 95% CI
        seed : int, default None
            np.random seed
        burn : int, default 100
            Number of initial simulated obs to discard
        component : neqs x neqs array, default to largest for each
            Index of column of eigenvector/value to use for each error band
            Note: period of impulse (t=0) is not included when computing
            principle component

        References
        ----------
        Sims, Christopher A., and Tao Zha. 1999. "Error Bands for Impulse
        Response". Econometrica 67: 1113-1155.
        r4   rK   r   rL   r   NComponent array must be  x ,Atleast one of the components does not existru   )r   r   r5   r   	irf_resimr'   norm_signif_level_eigval_decomp_SZr#   shaperT   strargmaxcopyrz   sqrt)r,   r4   r   rK   rE   rL   r   rM   r   r   r   r   r   qWeigvaklowerupperr}   js                        r/   rV   zIRAnalysis.err_band_sz10  s(   : 
,  t,,yOOD)-D $ : :	"6**++I665! x	""tDk11 !;c$ii!G%!ORUVZR[R[![\\\y##tG|33 !OPPP t 	\ 	\A4[[ \ \ $QRR!Vq1QQQq1vq/@qQRSTUVWXUXSYzIZA[A[/[ [abb1f $QRR!Vq1QQQq1vq/@qQRSTUVWXUXSYzIZA[A[/[ [abb1f\ e|r1   c           	         | j         }| j        }	|                     ||          }
| j        }|                    |||	|d          }|                     |          \  }}}|xt          j        |          ||fk    r2t          dt          |          z   dz   t          |          z             t          j
        |          ||	z  k    rt          d          |}t          j        ||	dz   ||f          }t          |          D ]T}t          |          D ]B}t          |          D ]0}||||||f         ddf         ||dd||f         z  ||dd||f<   1CUt          j        |d	          }t          |d
z  |z            dz
  t          d|d
z  z
  |z            dz
  f}t          j        |
          }t          j        |
          }t          |          D ]h}t          |          D ]V}|
dd||f         ||d         dd||f         z   |dd||f<   |
dd||f         ||d         dd||f         z   |dd||f<   Wi||fS )a  
        IRF Sims-Zha error band method 2.

        This method Does not assume symmetric error bands around mean.

        Parameters
        ----------
        orth : bool, default False
            Compute orthogonalized impulse responses
        repl : int, default 1000
            Number of MC replications
        signif : float (0 < signif < 1)
            Significance level for error bars, defaults to 95% CI
        seed : int, default None
            np.random seed
        burn : int, default 100
            Number of initial simulated obs to discard
        component : neqs x neqs array, default to largest for each
            Index of column of eigenvector/value to use for each error band
            Note: period of impulse (t=0) is not included when computing
            principle component

        References
        ----------
        Sims, Christopher A., and Tao Zha. 1999. "Error Bands for Impulse
        Response". Econometrica 67: 1113-1155.
        r   r   Nr   r   r   ru   r   r	   rv   )r   r   r5   r   r   r   r#   r   rT   r   r   ry   rz   sortroundr   )r,   r4   r   rK   rE   rL   r   rM   r   r   r   r   r   r   r   r   gammapr}   r   
gamma_sortindxr   r   s                           r/   rW   zIRAnalysis.err_band_sz2i  s   : 
,  t,,yOODd), $ . .	 ,,Y775! x	""tDk11 !;c$ii!G%!ORUVZR[R[![\\\y##tG|33 !OPPP$	4677t 	L 	LA4[[ L Lt L LA&'!AacF111o	!ABBq(8K&KE!ABBq(OOLL WU+++
VAXd]##A%eQvaxZ,=&>&>q&@@t 	G 	GA4[[ G G#AAAaE{ZQ!A-FFaaa!e#AAAaE{ZQ!A-FFaaa!eG e|r1   c           	         | j         }| j        }	|                     ||          }
| j        }|                    |||	|d          }t          j        |||	|z  f          }t          |          D ]C}t          |          D ]1}t          j        ||dddd|f         j	                  |||ddf<   2Dt          j        ||	|z  |	|z  f          }t          j        ||	|z  |	|z  f          }t          j        ||	|z  f          }t          j        |t                    }|ct          j        |          |k    rt          dt          |          z             t          j        |          ||	z  k    rt          d          |}t          |          D ]H}t          j        ||         d	          ||<   t!          j        ||                   \  ||<   ||<   ||<   It          j        ||	dz   ||f          }t          |          D ]}d}t          |          D ]}t          |          D ]m}||||         ||	z  |dz   |	z  f         ||dd||f         z  ||dd||f<   ||dz
  k    r.||||         ||	z  df         ||dd||f         z  ||dd||f<   nt          j        |d
          }t'          |dz  |z            dz
  t'          d|dz  z
  |z            dz
  f}t          j        |
          }t          j        |
          }t          |          D ]h}t          |          D ]V}|
dd||f         ||d         dd||f         z   |dd||f<   |
dd||f         ||d         dd||f         z   |dd||f<   Wi||fS )a  
        IRF Sims-Zha error band method 3. Does not assume symmetric error bands around mean.

        Parameters
        ----------
        orth : bool, default False
            Compute orthogonalized impulse responses
        repl : int, default 1000
            Number of MC replications
        signif : float (0 < signif < 1)
            Significance level for error bars, defaults to 95% CI
        seed : int, default None
            np.random seed
        burn : int, default 100
            Number of initial simulated obs to discard
        component : vector length neqs, default to largest for each
            Index of column of eigenvector/value to use for each error band
            Note: period of impulse (t=0) is not included when computing
            principle component

        References
        ----------
        Sims, Christopher A., and Tao Zha. 1999. "Error Bands for Impulse
        Response". Econometrica 67: 1113-1155.
        r   r   ru   Ndtypez"Component array must be of length r   r   rowvarr	   rv   )r   r   r5   r   r   r#   ry   rz   ravelr   intsizerT   r   r   r<   r'   eigval_decompr   r   r   )r,   r4   r   rK   rE   rL   r   rM   r   r   r   r   r   stackr   r}   	stack_covr   r   r   r   cr   r   r   r   r   s                              r/   rX   zIRAnalysis.err_band_sz3  s;   8 
,  t,,yOOD)-C $ 9 9	$gdl344 t 	@ 	@A4[[ @ @ "1QRR!8)<)> ? ?a111f@ (D'$,=>>	HdGDL'$,788$-..HT%%% wy!!d++ !ED		!QRRRy##tG|33 !OPPP t 	D 	DA6%(!444IaL#'#5il#C#C AaD%(AaDD$	4677t 	U 	UAA4[[ U Ut U UA&'!A$qy!A#w/F(F&G)TUVWVXVXYZ[\T\J]&]E!ABBq(ODF{{*+Aad1W9::,=*>1QRRPQRS8AT*Ta1QhUU WU+++
VAXd]##A%eQvaxZ,=&>&>q&@@t 	G 	GA4[[ G G#AAAaE{ZQ!A-FFaaa!e#AAAaE{ZQ!A-FFaaa!eG e|r1   c                 ^   | j         }| j        }t          j        ||||f          }t	          |          D ]C}t	          |          D ]1}t          j        |dddd||f         d          |||ddddf<   2Dt          j        ||||f          }t          j        |||df          }t          j        ||ft                    }	t	          |          D ]S}t	          |          D ]A}t          j        |||ddddf                   \  |||ddddf<   |||dddf<   |	||f<   BT|||	fS )z
        Returns
        -------
        W: array of eigenvectors
        eigva: list of eigenvalues
        k: matrix indicating column # of largest eigenvalue for each c_i,j
        Nru   r   r   r   )	r   r   r#   ry   rz   r<   r   r'   r   )
r,   r   r   r   cov_holdr}   r   r   r   r   s
             r/   r   zIRAnalysis._eigval_decomp_SZ  s    y,8T4':;;t 	I 	IA4[[ I I$&F9QQQqrr!AX+>a$H$H$H1QQQqqq!!I HdD'7344$gq122HdD\---t 	[ 	[A4[[ [ [595GQRSTUVUVUVWXWXWXQXHY5Z5Z2!Aaaa'
E!Aaaa'NAacFF[%{r1   c                 j      j          fdfdt          d j        dz             D             S )Nc                    d}t          |           D ]y}| dz
  |z
  }|j        v rj        |         }n3t          j        j        j        |          }|d          }|j        |<   t          j        |j        |                   }||z   }z|S )N        ru   )	rz   rs   r   matrix_powerr*   r   r#   kronr   )r}   r{   midxapowpieceKr,   s         r/   _make_gzIRAnalysis.G.<locals>._make_g  s    A1XX  !eai$,&&<,DD?479c::D8D(,DL% dil33IHr1   c                 &    g | ]} |          S rj   rj   ).0r}   r   s     r/   
<listcomp>z IRAnalysis.G.<locals>.<listcomp>0  s!    ???q

???r1   ru   )r   rz   r   )r,   r   r   s   `@@r/   r{   zIRAnalysis.G  sZ     I
	 	 	 	 	 	( @???E!T\A-=$>$>????r1   c                    t          j        | j                  }t          j        | j        j        |          }| j        }|                     | j        dz             }t          | j        dz             D ]}|dk    rd}n5t          j
        || j        |dz
                     }|| j        z  |j        z  }t          j
        t          j        || j        |                   |          }|| j        z  |j        z  | j        z  }	||	z   ||<   |S )Nru   r   )r#   eyer   r   r   r   Hrx   r   rz   r$   r{   ro   r   rr   )
r,   IkPIkr   r|   r}   apieceCiCibarbpieces
             r/   rw   zIRAnalysis._orth_cov2  s     VDIgdfh##Fq 011t|a'(( 	& 	&AAvvVC!--dj24/F272ty|44a88Edl*UW4>F voDGGr1   c                    t          j        | j                  }t          j        | j        j        |          }d}|                     | j        dz             }t          | j        dz             D ]}|dk    r|| j	        |dz
           z   }|r|dk    rd}n't          j
        ||          }|| j        z  |j        z  }t          j
        t          j        || j        |                   | j                  }	|	| j        z  |	j        z  | j        z  }
||
z   ||<   |dk    r*t          j        | j        dz  | j        dz  f          ||<   || j        z  |j        z  ||<   |S )a  
        Compute asymptotic standard errors for cumulative impulse response
        coefficients

        Parameters
        ----------
        orth : bool

        Notes
        -----
        eq. 3.7.7 (non-orth), 3.7.10 (orth)

        Returns
        -------
        r   ru   r   rv   )r#   r   r   r   r   r   rx   r   rz   r{   r$   ro   r   r   rr   ry   )r,   r4   r   r   Fr|   r}   r   BnBnbarr   s              r/   r?   zIRAnalysis.cum_effect_covI  sZ     VDIgdfh##q 011t|a'(( 	/ 	/A1uuq1u% /66FFQB$*_rt3Frwr4+;A+>??HH$,.8DFB 6/Q66 h	1dil'CDDDGdj.13.Qr1   c           	      V    | j         }| j        }|                    ||||||d          S )zM
        IRF Monte Carlo integrated error bands of cumulative effect
        Tr   )r   r   r   )r,   r4   rK   rE   rL   r   r   r   s           r/   rb   zIRAnalysis.cum_errband_mcv  sB    
 
,##D*1&)-Dd $ D D 	Dr1   c                    | j         }t          j        t          j        |j        | j                  |          }t          j        | j                  }|rt          j        t          j        | j	        j        t          j        | j                            |          }t          j        t          j        ||          | j
                  }|| j        z  |j        z  || j        z  |j        z  z   S || j        z  |j        z  S )z)
        Returns
        -------
        )r"   r#   r   tiler   r   r   r   r$   r   r   ro   rr   )r,   r4   lreFinftyr   BinfBinfbars          r/   lr_effect_covzIRAnalysis.lr_effect_cov  s    
 o	22C88VDI 	26"'$&(BF49,=,=>>GGDfRWR--tv66G4:%.dl*WY67 8 DJ&11r1   c                 f    t          j        d |                     |          D                       S )Nc           	      ~    g | ]:}t          j        t          j        t          j        |                              ;S rj   tsaunvecr#   r   diagr   r   s     r/   r   z%IRAnalysis.stderr.<locals>.<listcomp>  sD     7 7 7 27271::#6#677 7 7 7r1   rS   )r#   arrayr<   r,   r4   s     r/   r]   zIRAnalysis.stderr  s@    x 7 7"&((("5"57 7 7 8 8 	8r1   c                 f    t          j        d |                     |          D                       S )Nc           	      ~    g | ]:}t          j        t          j        t          j        |                              ;S rj   r   r   s     r/   r   z0IRAnalysis.cum_effect_stderr.<locals>.<listcomp>  sJ     B B B 27271::#6#677 B B Br1   rS   )r#   r   r?   r   s     r/   cum_effect_stderrzIRAnalysis.cum_effect_stderr  sK    x B B"&"5"54"5"@"@B B B C C 	Cr1   c                     |                      |          }t          j        t          j        t          j        |                              S )NrS   )r   r   r   r#   r   r   )r,   r4   r<   s      r/   lr_effect_stderrzIRAnalysis.lr_effect_stderr  s:      d ++y..///r1   c                 ^    t          j        || j        dz  | j        dz  ft                    S )Nrv   r   )r#   ry   r   float)r,   r   s     r/   rx   zIRAnalysis._empty_covm  s3    x$)q.$)q.A#% % % 	%r1   c                 h   | j         }t          j        |          }t          j        ||          }t	          j        |          }|t	          j        || j                  |z  t	          j        | j        |          z   z  |j        z  }t	          j	        |j        t          j        |                    S r3   )r   r   elimination_matrixcommutation_matrixr#   r   r   r   r   r$   Linv)r,   r   LkKkkr   Bs         r/   r   zIRAnalysis.H  s    I#A&&$Q**VAYY "'"df%%+bgdfb.A.AABRTIvbdAE!HH%%%r1   c                     t           r3   r7   )r,   s    r/   
fevd_tablezIRAnalysis.fevd_table  r=   r1   rd   re   )FFrB   r@   Nr   )FFrB   r@   Nr   N)FrB   r@   Nr   )rf   rg   rh   ri   r0   r<   rU   rV   rW   rX   r   r   r{   rw   r?   rb   r   r]   r   r   rx   r   r   rj   r1   r/   rl   rl      s         DI      , 7;03> > > >  9=AE7 7 7 7r FJ48> > > >@ FJ48O O O Ob  2 @ @ ^@<  .+ + + +Z /347	D 	D 	D 	D2 2 2 2$8 8 8 8C C C C0 0 0 0% % % & & ^&" " " " "r1   rl   )ri   numpyr#   numpy.linalglinalgr   scipy.linalgr   statsmodels.tools.decoratorsr   statsmodels.tsa.tsatoolsr   tsatools"statsmodels.tsa.vector_ar.plotting	vector_arrY   statsmodels.tsa.vector_ar.utilr'   r   matr   rl   rj   r1   r/   <module>r      s,                    7 7 7 7 7 7 & & & & & & & & & 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - - - - - - -h[ [ [ [ [ [ [ [|D" D" D" D" D" D" D" D" D" D"r1   