o
    vh                    @   s  d Z dZddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZ ddlmZm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!m"Z"m#Z# ddl$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 G dd de"Z8G dd de3Z9G dd de9Z:G dd de9Z;G dd dZ<G dd de9Z=G dd de=e:Z>G d d! d!e=e;Z?d"d# Z@d$d% ZAd&d' ZBd(d) ZCd*d+ ZDd,d- ZEd.d/ ZFd0d1 ZGd2d3 ZHd4d5 ZId6d7 ZJd8d9 ZKg d:ZLd;d< ZMd=d> ZNd?d@ ZOdAdB ZPdCdD ZQdEdF ZRdGdH ZSdIdJ ZTdKdL ZUdMdN ZVdOdP ZWdQdR ZXdSdT ZYdUdV ZZdWdX Z[dYdZ Z\d[d\ Z]d]d^ Z^g d:ZLd_d` Z_dadb Z`dcdd Zadedf Zbdgdh Zcdidj Zddkdl Zedmdn ZfG dodp dpe(ZgdS )qz3.3.0zThis module defines a variety of Bar Chart components.

The basic flavors are stacked and side-by-side, available in horizontal and
vertical versions. 

    N)literal_eval)colors)isNumberisNumberOrNoneisColorOrNoneisString
SequenceOf	isBooleanisStringOrNoneNoneOrisListOfNumbersOrNoneEitherOrOneOfisInt)isStryieldNoneSplits)uSymbol2SymbolisSymbol)AttrMapAttrMapValue)stringWidth)TypedPropertyCollection
PropHolder
tpcGetItem)LineRectGroupDrawingPolyLine)XCategoryAxis
YValueAxisYCategoryAxis
XValueAxis)BarChartLabelNoneOrInstanceOfNA_Label)PlotArea)_objStrcmpc                   @   s   e Zd Zeeeddeeddeeddeeddedddd	eed
dee	e
ddd	eeddee	eddd	Zdd ZdS )BarChartPropertieszColor of the bar border.desczColor of the bar interior area.zWidth of the bar border.zDash array of a line.Nz,A widget to be used instead of a normal bar.   r+   advancedUsagez0Text to be associated with a bar (eg seriesname)z!None or makeMarker('Diamond') ...z(minimum width/height that will be drawn.z%if this bar should be drawn as a line)	strokeColor	fillColorstrokeWidthstrokeDashArraysymbolnameswatchMarkerminDimenisLinec                 C   s$   d | _ tj| _d| _d | _d | _d S )N      ?)r/   r   bluer0   r1   r3   r2   self r<   a/var/www/html/hyperkenya/venv/lib/python3.10/site-packages/reportlab/graphics/charts/barcharts.py__init__,   s
   
zBarChartProperties.__init__)__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r	   _attrMapr>   r<   r<   r<   r=   r)      s    





r)   c                   @   sF  e Zd ZdZedgi dedeeeee	e
ffddddee
dd	d
ee
dd	dee
dd	deddd	deddd	deddd	deddd	deddd	deddd	dedddddeddd	deed ddd!eed"ddd#edd$d	d%ee
d&d	d'eed(d)d*d+d	d,edd-ddd.eed/d	d0eed1ddd2eeeed3d3dd4d3ddd4d5Zd6d7 Zdhd8d9Zd:d; Zd<d= Zd>d? Zd@dA ZdBdC ZdDdE ZdFdG ZdHdI ZdJdK ZdLdM ZdNdO ZdidQdRZdjdSdTZdUdV Z dWdX Z!dYdZ Z"d[d\ Z#d]d^ Z$d_d` Z%dadb Z&dcdd Z'dedf Z(dS )kBarChartz(Abstract base class, unusable by itself.BASEuseAbsolutezrFlag to use absolute spacing values; use string of gsb for finer control
(g=groupSpacing,s=barSpacing,b=barWidth).r,   r-   barWidthzThe width of an individual bar.r*   groupSpacingzWidth between groups of bars.
barSpacingzWidth between individual bars.barsNzHandle of the individual bars.	valueAxiszHandle of the value axis.categoryAxiszHandle of the category axis.dataz/Data to be plotted, list of (lists of) numbers.	barLabelsz!Handle to the list of bar labels.barLabelFormatzZFormatting string or function used for bar labels. Can be a list or list of lists of such.barLabelCallOutz`Callout function(label)
label._callOutInfo = (self,g,rowNo,colNo,x,y,width,height,x00,y00,x0,y0)barLabelArrayzGexplicit array of bar label values, must match size of data if present.reversePlotOrderz,If true, reverse common category plot order.naLabelzLabel to use for N/A values.annotationsz<list of callables, will be called with self, xscale, yscale.categoryLabelBarSizez=width to leave for a category label to go between categories.categoryLabelBarOrderfirstlastautoz,where any label bar should appear first/last	barRecordzJcallable(bar,label=labelText,value=value,**kwds) to record bar informationzIndexOverridesa!  None (the default ie use old z ordering scheme) or a ',' separated list of key=value (int/float) for new zIndex ordering. If used defaults are
    background=0,
    categoryAxis=1,
    valueAxis=2,
    bars=3,
    barLabels=4,
    categoryAxisGrid=5,
    valueAxisGrid=6,
    annotations=7categoryNALabelz'Label to use for a group of N/A values.seriesOrderr   )emptyOKNoneOKloz#dynamic 'mixed' category style casec              
   C   sn  | j }|t| }|| }t|dt|dd }	t|dt|dd }
t|dt|dd }t|dt|dd }t|dt|dd }|rPt|||d  ||d  |
S t|ddr||d  }t|d	re|j}nt|d	rn|j}nd }t|||| ||jp||j|j	|j
d
}|rt|||d  ||jp|j}|r|rt }|| || |S |p|S t||||||	||
dS )Nr/   r0   r2   r1   r5          @r7   Fr3   r/   r1   r2   )r1   r/   r2   r0   )rI   lengetattrr   hasattrr3   r   r/   r0   r1   r2   r   addr   )r;   rowNoxywidthheight	baseStylestyleIdxstyler/   r0   r2   r1   r5   yh2SLgr<   r<   r=   makeSwatchSampleW   s@   


"

zBarChart.makeSwatchSamplec                 C   s   t t| j| d|S )zreturn series name i or defaultr4   )r&   rc   rI   )r;   idefaultr<   r<   r=   getSeriesNamez   s   zBarChart.getSeriesNamec                 C   s&  | j jdvsJ d| j j | jrt | _t | _nt | _t | _t	dddd| jj
d _t|  d| _d| _d	d
g| _d| _d| _d| _d| _tt| _d| j_d| j_d | _d | _d| j_tt| _d| j_tj | j_!d | j_"tj#| jd _$tj%| jd _$tj&| jd _$d  | _'| _(d | _)d S )N)rC   
BarChart3DzAbstract Class %s Instantiatedstackedparallelparallel_3dmixedrm   r   )d   n   x      )F   P   U   Z   
      cmiddler,      )*	__class__r?   _flipXYr!   rK   r"   rJ   r   r    r   rB   validater%   r>   rH   rQ   rL   rE   rF   rG   r   r#   rM   	boxAnchor
textAnchorrN   rP   nudger)   rI   r1   r   blackr/   r2   redr0   greenr9   rR   r[   rZ   r:   r<   r<   r=   r>   ~   s@   

	



zBarChart.__init__c                 C   s4   | j jdkr
tdtdd}|   }|| |S )zShows basic use of a bar chartrC   z#Abstract Class BarChart has no demo   r{   )r   r?   NotImplementedErrorr   re   )r;   drawingbcr<   r<   r=   demo   s   

zBarChart.democ                    s   t | dd }t| j|sdd tD }n\| j tt}t }g }|D ]/}fdd|D } fdd|D }|rI||8 }||O }||8 }|rV|t| ||8 }q'|re|dd t	|D  |rs|d	d t	|D  || _
d S )
Nr\   c                 S   s   g | ]}|fqS r<   r<   .0ssr<   r<   r=   
<listcomp>   s    z+BarChart.getSeriesOrder.<locals>.<listcomp>c                    s(   h | ]}d |  kr krn n|qS )r   r<   r   )nr<   r=   	<setcomp>   s   ( z*BarChart.getSeriesOrder.<locals>.<setcomp>c                    s   h | ]}  |d dr|qS )r7   F)	checkAttrr   rI   r<   r=   r      s    c                 s       | ]}|fV  qd S Nr<   r   r<   r<   r=   	<genexpr>       z*BarChart.getSeriesOrder.<locals>.<genexpr>c                 s   r   r   r<   r   r<   r<   r=   r      r   )rc   rb   rL   rangerI   setappendtupleextendsorted_seriesOrder)r;   bsRunseenlinessrq   glr<   )rI   r   r=   getSeriesOrder   s0   

zBarChart.getSeriesOrderc                    s   | j j}| jtttt} |dvr<g fdd}|dkr'|   n|   | jD ]}| fdd|D   q.| _	d S )Nrx   ry   c                     s   t dd | D dg }|d d  }| D ]$}t|D ]\}}|p!d}|dkr/||  |7  < q||  |7  < qq |  | d S )Nc                 s   s    | ]}t |V  qd S r   )rb   )r   dr<   r<   r=   r          zBBarChart._getConfigureData.<locals>._accumulate.<locals>.<genexpr>r   ư)max	enumerater   )Dpdatandatar   rs   v)rL   r<   r=   _accumulate   s   
z/BarChart._getConfigureData.<locals>._accumulaterw   c                 3   s    | ]} | V  qd S r   r<   )r   j_datar<   r=   r      r   z-BarChart._getConfigureData.<locals>.<genexpr>)
rK   rm   rL   r   listmaprb   r   r   _configureData)r;   cAStyleccr   br<   )r   rL   r=   _getConfigureData   s   


zBarChart._getConfigureDatac                 C   s&   |    | j| j | jj| jjfS )z Attempt to return the data range)r   rJ   	_setRanger   	_valueMin	_valueMaxr:   r<   r<   r=   
_getMinMax   s   zBarChart._getMinMaxc                 C   sX   | j }|| j| j| |   || j |d}|js(||kr*||| kr*|S |S )z8Position and configure value axis, return crossing valuer   )	rJ   setPositionrg   rh   r   	configurer   scale	forceZero)r;   orglengthvA	crossesAtr<   r<   r=   
_drawBegin   s   
"zBarChart._drawBeginc                    sR  | j }| j}|| j |   t }t| dd}|s||   t|dd}t|dd}|s9|j	|| |j
d |sD|j	|| |j
d ||   || || |r`|j	|| |j
d |rk|j	|| |j
d t| ddD ]}||| |j|j qq| `|S tdd	d
dddddd | dD ]w}| }|sqz	|d\}	}
W n   td||d fddt  D f |	 vrtd|	 d fddt  D f zt|
}
t|
ttfsJ W n   td|
||d fddt  D f |
 |	< qdd   D     |  }|jd} D ]}\}
}	|	dkr9||   q'|	dkrE|| q'|	dkrU|j	|| |j
d q'|	d kra|| q'|	d!krq|j	|| |j
d q'|	d"kr}|| q'|	d#kr|| q'|	dkrt| ddD ]}||| |j|j qq'| `|S )$z"finalize the drawing of a barchartrZ   NdrawGridLastF)parentdimrS   r<   r   r,   r         r         )
backgroundrK   rJ   rI   rM   categoryAxisGridvalueAxisGridrS   ,=z?Badly formatted zIndex clause %r in %r
allowed variables are
%s
c                       g | ]
}d | | f qS z%s=%rr<   r   kZr<   r=   r   1      z(BarChart._drawFinish.<locals>.<listcomp>z9Unknown zIndex variable %r in %r
allowed variables are
%sc                    r   r   r<   r   r   r<   r=   r   3  r   zCBad zIndex value %r in clause %r of zIndex
allowed variables are
%sc                    r   r   r<   r   r   r<   r=   r   8  r   c                 S   s   g | ]\}}||fqS r<   r<   )r   r   r   r<   r<   r=   r   :  s    r   rK   r   rJ   r   rI   rM   )rK   rJ   r   r   calcBarPositionsr   rc   re   makeBackgroundmakeGridgetGridDimsmakeBarsr   dictstripsplit
ValueErrorjoinr   keysr   
isinstancefloatintitemssortcontentspop)r;   cAr   rq   zIndexcAdglvAdglazr   r   r   blr<   r   r=   _drawFinish  s   

(1
..0








*zBarChart._drawFinishc           %         s  | j r	| j
n| j
| j}|j| j}t| }| _tt	t
t| | _}| j}| j}| j}t| dd}t| dd}	|	dkrGrEdpFd}	|	dk}	|j| jtfddt|D }
||
 }d	kr| j}t||
 }|| }|d
 | }|d
kr|}|}nd }}|| dg dd n*dv rd
}|| }|d
 | }|}|}n|}|dg dd |}d } }}|| |  | _| jrttsdndd
dv   ddv   ddv   ndtdd
 }|| }dkr|  | _ } }}ndkrd } }}|j npd
kr)d}|| ||   }}n^dkr;d}|| ||   }}nLdkrRd }}|rO|| | | nd}n5dkrdd}|| ||   }}n#dkrvd }}|| | | }ndkrd
 }}|| | | }|| _|| _|| _| j}|j|j |j!|j"}}|d  kr|krn ndnd|k r|n	|dk rƈ|| _#|| d| | }|| ||  }|r|	r||d  | }||7 }n|||  ||  |d  | }||j$_%g | _&| j&j'}| j(} 	
fdd}d	krxd} t)|D ]H\}!g |r<|d
 |! n|!||  *|!dd		r]| d
7 } ||d
 | d  n| | 8 t|D ]}"||"|" qg| q-dS d} t)| jD ]a\}#}$t|$d
krdnd|$D ]N}!|r|d
 |# n|#||  g ||! *|!dd		r| d
7 } ||d
 | d  n| | 8 t|D ]}"||"|"| |#  q| qqdS )zWorks out where they go. default vertical.

        Sets an attribute _barPositions which is a list of
        lists of (x, y, width, height) matching the data.
        rT   r   rU   rX   rW   rV   c                 3   s"    | ]}t  |d dV  qdS )r7   FN)r   r   r   _r   r<   r=   r   o  s     z,BarChart.calcBarPositions.<locals>.<genexpr>rz   r,   Nr   r   r   r   rq   r   r         ?r   r   r   r8   g      @c                    s>  dkr |   	 }n
| \}}| }
|  }|d u r&d }}nfdvrpsp|dkrP| }r=|k rCn|krC}|  |7  < | }n"| }r]|krcn|k rc}|  |7  < | }n}|| }d|  k rdkrn nd}|dk rd} r|||fp|||f d S )Nr   r   r   :0yE:0yE>)r   )colNoaccxrg   rq   r  datumrj   rh   )_cscaleaccumNegaccumPosbarRowbaseLinecScaleflipXY
groupWidthr7   r   rowrm   rE   vARDvScaleri   xValr<   r=   _addBar  s0   

&z*BarChart.calcBarPositions.<locals>._addBarr7   Frx   rw   )+r   rh   rg   rK   r   rL   rb   _seriesCountr   r   r   
_rowLengthrG   rH   rF   rc   rm   rI   sumr   r   _groupWidthrE   r   strr   _normFactor_scale_normFactorB_normFactorG_normFactorSrJ   reverseDirectionr   r   	_baseLinelabelslabelPosFrac_barPositionsr   rQ   r   r   )%r;   r   rL   seriesCount	rowLengthwGrH   rF   clbsclbo	lineCountseriesMLineCountr   barsPerGroupwBwSbGapBbGapSaW0aWfBfGfSr   vmvMoffsbGaplbpfaBPrQ   r  lineSeenrf   r  sbsgr<   )r	  r
  r  r  rI   r  r  r  r  r7   r   r  rm   rE   r  r  ri   r  r=   r   S  s  

*












 ,
 zBarChart.calcBarPositionsc                 C   s   | j }t|ttfr|| }t|ttfr|| }|du r!d}|S |dkr.| j| | }|S t|r=|| j| |  }|S t|drM|| j| | }|S d| }t|)zreturn formatted label textNvalues__call__z6Unknown formatter type %s, expected string or function)	rN   r   r   r   rP   r   rL   rd   	Exception)r;   rf   r  labelFmt	labelTextmsgr<   r<   r=   _getLabelText  s&   

zBarChart._getLabelTextc                 C   s   |j }t|dd}|dk}|r| }| }	}
|rd}
|d|  }|dkr&dp'd| }|dkr5||d  }n4|d	krL|
dkrD||
 | }n%|| }|	 }	n|d
krc|
dkr[||
 | }n|| }|	 }	n||
 | }|	|_|||	fS )zCompute x, y for a label	boxTargetnormalantir   r8   r,   r   midhir_   )r   rc   _pmv)r;   labelrg   rh   ri   rj   r   btrH  pmvaluer   r   r<   r<   r=   _labelXY&  s.   

zBarChart._labelXYc           	      C   s<   |  ||}|r| || j||f |||||||	 d S d S r   )rE  	_addLabelrM   )	r;   rq   rf   r  rg   rh   ri   rj   textr<   r<   r=   _addBarLabelC  s   (zBarChart._addBarLabelFc
                 C   sv   |	d u r| j }	|	r7|	jr9t|	}	| jjdkrdpd}
|d u r!|
}|d u r'|
}| j|	j|	||||||||d
S d S d S )Nr   r  r  )calcOnly)rR   rR  copyrJ   r   rQ  )r;   rq   rf   r  rg   rh   ri   rj   rT  nar   r<   r<   r=   _addNABarLabelH  s   

 zBarChart._addNABarLabelc                 C   s  |j rt||j|j}| j}|r| ||||	|\}}}n| |||||	\}}}t|dd }|d urF|| |}||}}|rC|}n|}n|rQ|}||	d  }n||d  }|}t|dd }|d urp|| |}|rn|}n|}|dk r|r~d|j }d}nd|j	 }d}nd }}|
r|| || fS |
|| ||  || |j|j}}|r|r|dt||||||d || t| dd }|r| |||||||	||||f|_|| |`d S d S d S )NfixedEndr`   
fixedStartr   )r/   r1   rO   )visibler   fontNamefontSizer   rP  rc   	_getValuedxdy	setOriginsetTextlineStrokeColorlineStrokeWidthinsertr   re   _callOutInfo)r;   rR  rL  rq   rf   r  rg   rh   ri   rj   rT  
labelWidthr  y0x0rN  rX  r   x00y00rY  r_  r`  sCsWalxr<   r<   r=   rQ  Q  sX   



$
.zBarChart._addLabelc           	      C   sB   t ||||}|j|_|j|_|j|_|jr|j|_|| d S r   )r   r1   r0   r/   r2   re   )	r;   rq   rg   rh   ri   rj   rf   rm   rr<   r<   r=   _makeBar  s   zBarChart._makeBarc           "      C   s  | j }t| dd }| j}| j}| j}i }|r?g }	t| jd }
t|D ]\}}t|D ]\}\}}}}d ||fvr=d||< q+q#g j}g j}t|D ]\}}t|}|| }|| }|	|dd}g j}t|D ]m\}\}}}}||f|v r}|||f p~|}d ||fv r|r||v r| 
||||||| nR|r||	vr| 
|||||||d|	}|r||
 | \}}}}| 
||
|||||d|	}|d |d  d }|d |d  d }| j
||
|||dd|d	 |	| |r|d  qhd }t|d
rt|j}nt| j d
r	| j j}t|dd }|r<|r)|dk r"t|j |}nt|j|}n|dk r6t|j |}nt|j|}|ry|sM|| }||d  }n
|| }||d  }|| || |rxtt|||||jpo|j} | rx||  nR|r||_||_||_||_|| n=t|dkrt|dkr|jd us|jd ur| ||||||| |r||jd | ||| j| | ||d | ||||||| qht |j!D ]}|r|t"||jp|j|j#|j$d qqI|j!D ]}!||! q|j!D ]} ||  qd S )NrY   r,   r7   FTr   r`   g-C6?)rV  r3   r6   r8   gHz>r   )rL  rO  rf   r  ra   )%rI   rc   r$  r   r[   rb   rL   r   r   r   rW  rd   rU  deepcopyr3   minr6   r   r   r   r/   r0   rg   rh   ri   rj   re   absrp  r   rE  rS  r   __self__r   r1   r2   )"r;   rq   lgrI   brBPr  catNALcatNNACBLrowNoLrf   r  r  rg   rh   ri   rj   r   lineSyms
styleCountrl   rowStyler7   linePtsrm   r0r1r3   r6   yLxLsymplr<   r<   r=   	_makeBars  s   



40

zBarChart._makeBarsc	                 C   sB  |j rt||j|j}	| j}
|
r| |||||\}}}n| |||||\}}}t|dd }|d urF|| |}||}}|
rC|}n|}n|
rQ|}||d  }n||d  }|}t|dd }|d urp|| |}|
rn|}n|}|dk r|
r~d|j }d}nd|j	 }d}nd }}|
|| ||  || || fS d S )NrX  r`   rY  r   rZ  )r[  r   r\  r]  r   rP  rc   r^  r_  r`  ra  rb  	getBounds)r;   rR  rL  rf   r  rg   rh   ri   rj   rg  r  rh  ri  rN  rX  r   rj  rk  rY  r_  r`  r<   r<   r=   _computeLabelPosition  sF   



zBarChart._computeLabelPositionc                 C   s~   | j | j}}|r||_|r||_| jr$|| | j| j| j| j	 n|| j| | j| j	| j |
| j |   dS )zRInformation function, can be called by charts which want to with space around barsN)rK   rJ   joinAxisr   r   r   rg   ri   rh   rj   r   r   r   r;   r   r   r<   r<   r=   _computeBarPositions  s   

 zBarChart._computeBarPositionsc              
   C   s.  | j }|   t| j}| j}g }|j}|rS| j}|| j }	| j| j	 }
|D ]+}|D ]&\}}}}|| }|| }|t
||t||t
||| |	t|| f q*q&n<| j}|| j	 }	| j| j }
|D ]+}|D ]&\}}}}|| }|| }|t
||t||t
||| |	t|| f qgqc|  |d g}|D ]@}|d }|d |d k r|d |d k rt
|d |d t|d |d t
|d |d t
|d |d f|d< q|| q|}d}d}t|}t|D ]\}}|d }|| }||
kr ||fS |}d }}||k r6|| d |kr6t
|| d |}t
|| d |}|d7 }||k r6|| d |ks||krg||krf|}|rQ|||| || dfp[|||| || df}||krf ||fS q||kr|}|r}|	| ||	|| dfp||	| || |	df}||kr ||fS q||fS )	ak  helper for madmen who want to put stuff inside their barcharts
        basically after _computebarPositions we slide a line of length size
        down the bar profile on either side of the bars to find the
        maximum space. If the space at any point is >= required then we're
        done. Otherwise we return the largest space location and amount.
        r   r   r,   r   r   i  Ni)r   r  rb   rL   r$  r   rg   ri   rh   rj   rr  r   r   r   )r;   sizerequiredr  lenDatarw  CaCr_   rJ  endbprg   rh   whr   r   r   r   ro  maxSmaxPnCrs   civ0v1r   aloahir<   r<   r=   _computeMaxSpace+  s~   

2
2
 J


4
4 zBarChart._computeMaxSpacec                 C   s  | j | j}}|r||_|r||_| jr$|| | j| j| j| j	 n|| j| | j| j	| j |
| j |   | j}g j}| j}t|D ]w\}}g j}t|D ]f\}	\}
}}}d||fv r| j}|r|jrt|}| jjdkrxdpyd}|du r|}|du r|}|| |j|||	|
||| qU|d qU| ||	}|r|| || j||	f ||	|
||| qU|d qU||j qJ|jS )zLInformation function, can be called by charts which want to mess with labelsNr   r  r  )rK   rJ   r  r   r   r   rg   ri   rh   rj   r   r   r   rI   r   r$  r   rR   rR  rU  r   r  rE  rM   rt  )r;   r   r   rI   r   rw  rf   r  r  r  rg   rh   ri   rj   rV  r   rR  r<   r<   r=   _computeSimpleBarLabelPositionsk  s:   

 

 
(
z(BarChart._computeSimpleBarLabelPositionsc                 C   s&   t  }t  }| || || |S r   )r   r  re   )r;   rq   ru  r<   r<   r=   r     s
   
zBarChart.makeBarsc                 C   s^   | j j}| j}t|}tttt|}|dkr%|d | j || j  }n| j}|| j	|  S )z:for dynamically computing the desired category axis lengthrx   r,   )
rK   rm   rL   rb   r   r   r   rH   rF   rG   )r;   rm   rL   r   mr  r<   r<   r=   _desiredCategoryAxisLength  s   z#BarChart._desiredCategoryAxisLengthc                 C   st   | j | j}}|r||_|r||_| jr'|| | j| j| j| j	 | 
 S || j| | j| j	| j | 
 S r   )rK   rJ   r  r   r   r   rg   ri   rh   rj   r   r  r<   r<   r=   draw  s   

zBarChart.drawr<   r   )FN)F))r?   r@   rA   __doc__r   r%   r   r   r	   r   r   r$   r   r
   r   r   rB   rr   ru   r>   r   r   r   r   r   r   r   rE  rP  rS  rW  rQ  rp  r  r  r  r  r  r   r  r  r<   r<   r<   r=   rC   4   s    	
" 
#=	H @

	4	e,@%rC   c                   @      e Zd ZdZdZdS )VerticalBarChartz3Vertical bar chart with multiple side-by-side bars.r   Nr?   r@   rA   r  r   r<   r<   r<   r=   r        r  c                   @   r  )HorizontalBarChartz5Horizontal bar chart with multiple side-by-side bars.r,   Nr  r<   r<   r<   r=   r    r  r  c                   @   s.   e Zd Zd
ddZdd Zdd Zdd	 ZdS )
_FakeGroupNc                 C   s   g | _ t|| _d S r   )r   	functools
cmp_to_key_key)r;   r(   r<   r<   r=   r>     s   z_FakeGroup.__init__c                 C   s   | j | d S r   )r   r   )r;   whatr<   r<   r=   re     s   z_FakeGroup.addc                 C   s   | j S r   r   r:   r<   r<   r=   rO    s   z_FakeGroup.valuec                 C   s   | j j| jd d S )N)key)r   r   r  r:   r<   r<   r=   r     s   z_FakeGroup.sortr   )r?   r@   rA   r>   re   rO  r   r<   r<   r<   r=   r    s
    
r  c                	   @   sv   e Zd ZeeeeddeeddeeddeedddZdZdZ	dZ
dZd	d
 Zdd Zdd Zdd Zdd ZdS )rv   zdx/dzr*   zdy/dzzdepth of an individual serieszz gap around series)rD   theta_xtheta_yzDepthzSpacer8   Nc                 C   s   t |  | j}| j}|d u r| j}| j}|d u r| j}| jjdkr-|| |d |  }n|d|  }|| j	9 }| j
| | _| j| | _d S )Nry   r,   r   )rC   r   r  r  rF   r  rH   rK   rm   r  r  _3d_dxr  _3d_dy)r;   r%  r  r  	_3d_depthr<   r<   r=   r     s   

zBarChart3D.calcBarPositionsc                 C   s\   | j }|d u r
| j}| j}|d u r| j}| jjdkr'| j|||  |  }|S | j| }|S )Nry   )r  rF   r  rH   rK   rm   r  )r;   rf   r  r  z0r<   r<   r=   _calc_z0  s   
zBarChart3D._calc_z0c                 C   s   | j }|d u r
| j}| j}	|	d u r| j}	| |}
|
|| j  }|dk r+||7 }| }||
| j 7 }||
| j 7 }| jrA||	7 }n||	7 }|	d|
|||||||f	 d S )Nr   )
r  rF   r  rH   r  r  r  r  r   re   )r;   rq   rg   rh   ri   rj   rf   rm   r  r  r  z1r<   r<   r=   rp    s   

 zBarChart3D._makeBarc                 C   sv   |  |}| j}	|	d u r| j}	|}
||| j 7 }||| j 7 }| jr'||	7 }n||	7 }|d||
||||||f	 d S )Nr,   )r  r  rH   r  r  r   re   )r;   rq   rf   r  rg   rh   ri   rj   r  r  r  r<   r<   r=   rS    s   

 zBarChart3D._addBarLabelc                 C   s>  ddl m} t| jd}| || |  t }| j}| j}|	 }| j
j}|dkr0|  n|dkrBdd tdd	 |D D }|D ]5}|d dkry|d
d  \}	}
}}}}}}|
|	 }||||| ||| || || |jd |j|jdd qD|D ] }|d
kr|d
d  \}	}
}}}}}}t| ||||||| q||S )Nr   )_draw_3d_barr'   rw   rz   c                 S   s   g | ]}|d  qS )r,   r<   r  r<   r<   r=   r         z'BarChart3D.makeBars.<locals>.<listcomp>c                 s   s0    | ]}|d  |d |d |d f|fV  qdS )r,   r   r   r   Nr<   )r   tr<   r<   r=   r     s   . z&BarChart3D.makeBars.<locals>.<genexpr>r,   g?)r0   fillColorShadedr/   r1   shading)!reportlab.graphics.charts.utils3dr  r  _cmpZr  r   r   r  r  rO  rK   rm   reverser   r0   r/   r1   rC   rS  )r;   r  fgrq   r  r  fg_valuer   r  r  r  rg   rh   ri   rj   rf   rm   dzr  r<   r<   r=   r     s:   
 zBarChart3D.makeBars)r?   r@   rA   r   rC   r   r   rB   r  r  r  r  r   r  rp  rS  r   r<   r<   r<   r=   rv     s     



rv   c                   @      e Zd Zdd ZdS )VerticalBarChart3Dc                 C   B   t |d  |d |d |d  f|d  |d |d |d  fS )Nr,   r   r   r   r'   r;   r   r   r<   r<   r=   <lambda>&     B zVerticalBarChart3D.<lambda>Nr?   r@   rA   r  r<   r<   r<   r=   r  %      r  c                   @   r  )HorizontalBarChart3Dc                 C   r  )Nr,   r   r   r   r'   r  r<   r<   r=   r  )  r  zHorizontalBarChart3D.<lambda>Nr  r<   r<   r<   r=   r  (  r  r  c                  C   s   t dd} dg}t }d|_d|_d|_d|_||_tj|_	d|j
_d|j
_d	|j
_d
|jj_d|jj_d|jj_d|jj_ddg|j_| | | S )z9A slightly pathologic bar chart with only TWO data items.  r         2   }   ,  r   <      ne   rZ     YingYangr   r  rg   rh   rj   ri   rL   r   r   r/   rJ   valueMinvalueMax	valueSteprK   r"  r   r_  r`  anglecategoryNamesre   r   rL   r   r<   r<   r=   	sampleV0a,  s&   





r  c                  C   s   t dd} dg}t }d|_d|_d|_d|_||_tj|_	d|j
_d|j
_d|j
_d	|jj_d
|jj_d|jj_d|jj_dg|j_| | | S )z/A pathologic bar chart with only ONE data item.r  r   *   r  r  r  r   r  r  r  rZ  r  Jan-99r  r  r<   r<   r=   	sampleV0bK  s&   






r  c                  C   s   t dd} dg}t }d|_d|_d|_d|_||_tj|_	d|j
_d|j
_d	|j
_d
|jj_d|jj_d|jj_g |j_| | | S )z8A really pathologic bar chart with NO data items at all!r  r   r<   r  r  r  r   r  r  r  r  rZ  )r   r  rg   rh   rj   ri   rL   r   r   r/   rJ   r  r  r  rK   r"  r   r_  r`  r  re   r  r<   r<   r=   	sampleV0ci  s$   




r  c                  C   s   t dd} ddg}t }d|_d|_d|_d|_||_tj|_	d|j
_d	|j
_d
|j
_d|jj_d|jj_d|jj_d|jj_dd}dd |D }||j_| | | S )!Sample of multi-series bar chart.r  r   r  r   r     %   -      r      r         &   .   r  r   r  r  r  r   r  r  r  r  rZ  r  Jan Feb Mar Apr May Jun Jul Aug c                 S      g | ]}|d  qS z-99r<   r   r   r<   r<   r=   r     r  zsampleV1.<locals>.<listcomp>)r   r  rg   rh   rj   ri   rL   r   r   r/   rJ   r  r  r  rK   r"  r   r_  r`  r  r   r  re   r   rL   r   catNamesr<   r<   r=   sampleV1  s.   






r  c                  C   s   ddg} d}t dd}t }d|_d|_d|_d|_| |_d	|_d
|_d
|_	d|j
_d|j
_d|j
_d|j
j_d|j
j_d|j
j_d|j
j_||j_d|jj_d|jj_d|jj_|| |S )r  333333@r   r   gffffff"@333333?皙r   g333333@zQ3 2000zYear to Datez	12 monthszAnnualised
3 yearszSince 07.10.99r  r   r  r}   r  r   r   r  r   	Helveticar  r   r   r   r  rg   rh   rj   ri   rL   rH   rG   rF   rJ   r  r  r  r"  r\  r]  r   r   rK   r  r`  re   rL   r"  r   r   r<   r<   r=   	sampleV2a  6   








r  c                  C   s   ddg} d}t dd}t }d|_d|_d|_d|_| |_d	|_d
|_d
|_	d|j
_d|j
_d	|j
_d|j
j_d|j
j_d|j
j_d|j
j_||j_d|jj_d|jj_d|jj_|| |S )r  r  r  r  r  r   r  r}   r  r   r   r  r  r  r  r   r   r  r  r  r<   r<   r=   	sampleV2b  r	  r
  c                  C   s   ddg} d}t dd}t }d|_d|_d|_d|_| |_d	|_d
|_d
|_	d|j
_d|j
_d|j
_d|j
j_d|j
j_||j_d|jj_d|jj_d|j
j_d|j
j_d|jj_d
|j_d|_d|j_d|j_d|j_d|j_d|j_|| |S )r  r  r  r   r   {G#@r  r   r  r   r  r  r  r   r  r}   r  r   r   r  r  r   r  r  r   r   r  %0.2fr   r   )r   r  rg   rh   rj   ri   rL   rH   rG   rF   rJ   r  r  r  r"  r\  r]  rK   r  r   r   r`  rM   r   rN   r_  re   r  r<   r<   r=   	sampleV2c  sD   








r  c                  C   sT  d} d}d}t | t |ksJ dt | t |ksJ dtdd}t }d|_d|_d|_d	|_|f|_tj	|j
_d
|_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_| |j_d|jj_d|jj_d|jj_d|jj_d|jj_d|jj_t|}| dd |!d |"| |S )zBFaked horizontal bar chart using a vertical real one (deprecated).
zUK EquitieszUS EquitieszEuropean EquitieszJapanese EquitieszPacific (ex Japan) EquitieszEmerging Markets EquitieszUK BondszOverseas BondszUK Index-LinkedCash
g      333333?r8   r  g?gffffff?g?g?r  r  
g        Q?g?皙?g)\(?gp=
ף?g)\(?g)\(?r  r  bad datar  r   r   r{      r  r  r   r  r   r   rZ  r   r,   i   i)#rb   r   r  rg   rh   rj   ri   rL   r   r   rI   r0   rN   rM   r_  r`  r   r  r\  r]  r   rJ   r[  r  r  r  rK   tickUptickDownr  r"  r   	translaterotatere   namesseries1series2r   r   rq   r<   r<   r=   sampleV3-  sN   









r"  c                  C      t dd} dg}t }d|_d|_d|_d|_||_tj|_	d|j
_d|j
_d	|j
_d
|jj_d|jj_ddg|j_| | | S )AA bar chart showing value axis region starting at *exactly* zero.r  r   r  r  r  r  r   r  r  r   r  r  r   r  rg   rh   rj   ri   rL   r   r   r/   rJ   r  r  r  rK   r"  r   r`  r  re   r  r<   r<   r=   	sampleV4ae  "   



r'  c                  C   r#  )<A bar chart showing value axis region starting *below* zero.r  r   r  r  r  r  r  r  r   r%  r  r  r&  r  r<   r<   r=   	sampleV4b  r(  r+  c                  C   r#  )z;A bar chart showing value axis region staring *above* zero.r  r   r  r  r  r  r   r  r  r   r%  r  r  r&  r  r<   r<   r=   	sampleV4c  r(  r,  c                  C   r#  )<A bar chart showing value axis region entirely *below* zero.r  r   iir  r  r  r*  r  r   r%  r  r  r&  r  r<   r<   r=   	sampleV4d  r(  r0  ))r   r  )r  r  )r  (   )r1  r  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|j_d|j_d|j_d	|jj_d
|jj_ddg|j_| | | S )8A simple bar chart with no expressed spacing attributes.r  r   r  r  r  r   r  r  r   r%  r  r  )r   dataSample5r  rg   rh   rj   ri   rL   r   r   r/   rJ   r  r  r  rK   r"  r   r`  r  re   r  r<   r<   r=   	sampleV5a  s"   



r4  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d	|_d|j_d
|j_d|j_d|jj_d|jj_ddg|j_| | | S )-A simple bar chart with proportional spacing.r  r   r  r  r  r   r1  r  r   r  r  r   r%  r  r  r   r3  r  rg   rh   rj   ri   rL   r   r   r/   rE   rF   rG   rH   rJ   r  r  r  rK   r"  r   r`  r  re   r  r<   r<   r=   	sampleV5b  *   



r7  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d|_d|j_d	|j_d
|j_d|jj_d|jj_ddg|j_| | | S )6Make sampe simple bar chart but with absolute spacing.r  r   r  r  r  r,   r1  r   r  r  r   r%  r  r  r6  r  r<   r<   r=   
sampleV5c1  r8  r:  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d	|_d	|j_d
|j_d|j_d|jj_d|jj_ddg|j_| | | S )r9  r  r   r  r  r  r,   r1  r  r   r  r  r   r%  r  r  r6  r  r<   r<   r=   
sampleV5c2=  r8  r;  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d	|_d|j_d
|j_d|j_d|jj_d|jj_ddg|j_| | | S )r9  r  r   r  r  r  r,   r1  r   r   r  r  r   r%  r  r  r6  r  r<   r<   r=   
sampleV5c3^  r8  r<  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d	|_d
|j_d|j_d|j_d|jj_d|jj_ddg|j_| | | S )r9  r  r   r  r  r  r,   r1  r  r   r   r  r  r   r%  r  r  r6  r  r<   r<   r=   
sampleV5c4  r8  r=  c                  C   r#  )z>Make a slightly pathologic bar chart with only TWO data items.r  r   r  r  r  r  r   r  r  ser  r  r  r   r  rg   rh   rj   ri   rL   r   r   r/   rJ   r  r  r  rK   r"  r   r  r  re   r  r<   r<   r=   	sampleH0a  r(  r@  c                  C   s   t dd} dg}t }d|_d|_d|_d|_||_tj|_	d|j
_d|j
_d|j
_d	|jj_d
|jj_dg|j_| | | S )z4Make a pathologic bar chart with only ONE data item.r  r   r  r  r  r  r   r  r>  r  r  r?  r  r<   r<   r=   	sampleH0b  s"   




rA  c                  C   s~   t dd} dg}t }d|_d|_d|_d|_||_tj|_	d|j
_d|j
_d	|j
_d
|jj_d|jj_g |j_| | | S )z=Make a really pathologic bar chart with NO data items at all!r  r   r<   r  r  r  r   r  r  r>  r  r?  r  r<   r<   r=   	sampleH0c  s"   



rB  c                  C   s   t dd} ddg}t }d|_d|_d|_d|_||_tj|_	d|j
_d	|j
_d
|j
_d|jj_dd}dd |D }||j_| |d | S )r  r  r   r  r  r  r  r  r   r  r  er  r  c                 S   r  r  r<   r  r<   r<   r=   r     r  zsampleH1.<locals>.<listcomp>barchart)r   r  rg   rh   rj   ri   rL   r   r   r/   rJ   r  r  r  rK   r"  r   r   r  re   r  r<   r<   r=   sampleH1  s(   


rE  c                  C   s   ddg} d}t dd}t }d|_d|_d|_d	|_| |_d
|_d|_d|_	d|j
_d|j
_d|j
_d|j
j_d|j
j_d|j
j_d|j
j_|j
|j ||j_d|jj_d|jj_d|jj_|| |S )r  r  r  r  r  r   r   r  r}   r  r   r   r  r  r   r  r  r   r   j)r   r  rg   rh   rj   ri   rL   rH   rG   rF   rJ   r  r  r  r"  r\  r]  r   r   r   rK   r  r_  re   r  r<   r<   r=   	sampleH2a  s8   








rG  c                  C   s   ddg} d}t dd}t }d|_d|_d|_d	|_| |_d
|_d|_d|_	d|j
_d|j
_d
|j
_d|j
j_d|j
j_d|j
j_d|j
j_||j_d|jj_d|jj_d|jj_|| |S )r  r  r  r  r  r   r   r  r}   r  r   r   r  r  r  r  r   r   rF  )r   r  rg   rh   rj   ri   rL   rH   rG   rF   rJ   r  r  r  r"  r\  r]  r   r   rK   r  r_  re   r  r<   r<   r=   	sampleH2b@  r	  rH  c                  C   s   ddg} d}t dd}t }d|_d|_d|_d	|_| |_d
|_d|_d|_	d|j
_d|j
_d|j
_d|j
j_d|j
j_d|j
j_d|j
j_||j_d|jj_d|jj_d|jj_d|j_d|_d|j_d|j_d|j_d|j_d|j_|| |S )r  r  r  r  r  r   r   r  r}   r  r   r   r  r  r   r  r  r   r   rF  r  r   r   )r   r  rg   rh   rj   ri   rL   rH   rG   rF   rJ   r  r  r  r"  r\  r]  r   r   rK   r  r_  rM   r   rN   r`  re   r  r<   r<   r=   	sampleH2ci  sD   








rI  c                  C   s"  d} d}d}t | t |ksJ dt | t |ksJ dtdd}t }d|_d|_d	|_d
|_|f|_tj	|j
_d|_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_d|j_| |j_d|jj_d|jj_d|jj_d|jj_t|}|| |S )zEA really horizontal bar chart (compared to the equivalent faked one).r  r  r  r  r  r   r{   r  r     r  r   r  r  r   r   rZ  r   r,   iV) rb   r   r  rg   rh   rj   ri   rL   r   r   rI   r0   rN   rM   r_  r`  r   r\  r]  r   rJ   r[  r  r  r  rK   tickLeft	tickRightr  r"  r   re   r  r<   r<   r=   sampleH3  sD   






rM  c                  C   x   t dd} dg}t }d|_d|_d|_d|_||_tj|_	d|j
_d|j
_d	|j
_d
|jj_ddg|j_| | | S )r$  r  r   r  r  r  r  r   r  r  rC  r  r  r   r  rg   rh   rj   ri   rL   r   r   r/   rJ   r  r  r  rK   r"  r   r  re   r  r<   r<   r=   	sampleH4a      


rP  c                  C   rN  )r)  r  r   r  r  r  r  r*  r  r  rC  r  r  rO  r  r<   r<   r=   	sampleH4b  rQ  rR  c                  C   rN  )z<A bar chart showing value axis region starting *above* zero.r  r   r  r  r  r  r   r  r  rC  r  r  rO  r  r<   r<   r=   	sampleH4c  rQ  rS  c                  C   rN  )r-  r  r   r.  r  r  r  r/  r*  r  rC  r  r  rO  r  r<   r<   r=   	sampleH4d!  rQ  rT  c                  C   sv   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|j_d|j_d|j_d	|jj_d
dg|j_| | | S )r2  r  r   r  r  r  r   r  r  rC  r  r  )r   r3  r  rg   rh   rj   ri   rL   r   r   r/   rJ   r  r  r  rK   r"  r   r  re   r  r<   r<   r=   	sampleH5a?  s    


rU  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d	|_d|j_d
|j_d|j_d|jj_ddg|j_| | | S )r5  r  r   r  r  r  r   r1  r  r   r  r  rC  r  r  r   r3  r  rg   rh   rj   ri   rL   r   r   r/   rE   rF   rG   rH   rJ   r  r  r  rK   r"  r   r  re   r  r<   r<   r=   	sampleH5bZ  (   


rW  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d|_d|j_d	|j_d
|j_d|jj_ddg|j_| | | S )z)A simple bar chart with absolute spacing.r  r   r  r  r  r,   r   r   r  r  rC  r  r  rV  r  r<   r<   r=   
sampleH5c1z  rX  rY  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d	|_d	|j_d
|j_d|j_d|jj_ddg|j_| | | S 'Simple bar chart with absolute spacing.r  r   r  r  r  r,   r   r  r   r  r  rC  r  r  rV  r  r<   r<   r=   
sampleH5c2  rX  r\  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|_d|_d	|_d
|_d	|j_d|j_d|j_d|jj_ddg|j_| | | S )r[  r  r   r  r     r  r,   r   r   r   r  r  rC  r  r  rV  r  r<   r<   r=   
sampleH5c3  rX  r^  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d|_d	|j_d
|j_d|j_d|jj_ddg|j_| | | S rZ  rV  r  r<   r<   r=   
sampleH5c4  rX  r_  c                  C   s   t dd} t}t }d|_d|_d|_d|_||_tj	|_
d|_d|_d|_d	|j_d
|j_d|j_d|jj_ddg|j_d	dlm} | }tj	|_tj|_d|_d	|_| }tj	|_tj|_d|_d	|_| }tj|_tj|_d|_d|_d	|_||j _!||j d _!||j d _!| "| | S )(Simple bar chart using symbol attribute.r  r   r  r  r  r   r  r   r   r  rC  r  r  
ShadedRect
horizontalverticalr,   r   )#r   r3  r  rg   rh   rj   ri   rL   r   r   r/   rF   rG   rH   rJ   r  r  r  rK   r"  r   r   reportlab.graphics.widgets.gridsrb  fillColorStartr9   fillColorEndorientationr1   pinkwhitecylinderModerI   r3   re   )r   rL   r   rb  sym1sym2sym3r<   r<   r=   sampleSymbol1  sN   


ro  c                  C   s  t dd} t}t }d|j_d|_d|_d|_d|_||_	t
j|_d|_d|_d	|j_d
|jj_ddg|j_d	dlm} | |j_t
j|jj_t
j|jj_d|jj_d|jj_d	|jj_| |jd _t
j|jd j_t
j|jd j_d|jd j_d|jd j_d	|jd j_| |jd _t
j |jd j_t
j|jd j_d|jd j_d|jd j_d	|jd j_| |jd _t
j!|jd j_t
j|jd j_d|jd j_d|jd j_d	|jd j_| "| | S )r`  r  r   rw   r  r  r  r   r  r   rC  r  r  ra  rd  r,   r   r   )#r   r3  r  rK   rm   rg   rh   rj   ri   rL   r   r   r/   rF   rG   rJ   r  r"  r   r  re  rb  rI   r3   r   rf  rj  rg  rh  rk  r1   magentar   r9   re   )r   rL   r   rb  r<   r<   r=   sampleStacked1/	  sT   






rq  c                   @   s   e Zd ZdZdddZdS )
SampleH5c4r[  r  r   c                 O   s   t j| ||g|R i | t }d|_d|_d|_d|_t|_t	j
|_d|_d|_d|_d|_d|j_d|j_d	|j_d
|jj_ddg|j_| j|dd |  d S )Nr  r  r  r,   r   r  r   r  r  rC  r  r  HBC)r4   )r   r>   r  rg   rh   rj   ri   r3  rL   r   r   r/   rE   rF   rG   rH   rJ   r  r  r  rK   r"  r   r  re   r  )r;   ri   rj   argskwr   r<   r<   r=   r>   k	  s&   
zSampleH5c4.__init__N)r  r   )r?   r@   rA   r  r>   r<   r<   r<   r=   rr  h	  s    rr  )h__version__r  rU  r  astr   reportlab.libr   reportlab.lib.validatorsr   r   r   r   r   r	   r
   r   r   r   r   r   reportlab.lib.utilsr   r   "reportlab.graphics.widgets.markersr   r   reportlab.lib.attrmapr   r   reportlab.pdfbase.pdfmetricsr   reportlab.graphics.widgetbaser   r   r   reportlab.graphics.shapesr   r   r   r   r   reportlab.graphics.charts.axesr   r    r!   r"   $reportlab.graphics.charts.textlabelsr#   r$   reportlab.graphics.charts.areasr%   !reportlab.graphics.charts.legendsr&   	reportlabr(   r)   rC   r  r  r  rv   r  r  r  r  r  r  r  r
  r  r"  r'  r+  r,  r0  r3  r4  r7  r:  r;  r<  r=  r@  rA  rB  rE  rG  rH  rI  rM  rP  rR  rS  rT  rU  rW  rY  r\  r^  r_  ro  rq  rr  r<   r<   r<   r=   <module>   s   8      b#))28!!!!!#*)22    69