
    kfY                        d 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mZ ddlT ddlmZmZ ddlmZmZmZmZmZmZ ddlmZm Z  dd	lm!Z! dd
l"m#Z#m$Z$ ddl%m&Z&m'Z' ddl(m)Z)m*Z*m+Z+  e,e)e*e+          Z-ddl.m/Z0 dddddddddd	dddddddddd	dZ1	 ddl2m3Z3 n# e4$ r dZ3Y nw xY wdddddddddd	Z5 G d  d!e          Z6 G d" d#          Z7 ed$d%d&d'          Z8 G d( d)e           Z9 e ee9                    Z: G d* d+e6          Z; G d, d-e;          Z< G d. d/e<          Z= e ee=                    Z>dd0l?m@Z@  G d1 d2e@          ZA G d3 d4e6          ZBdS )5z3.3.0    )colors)simpleSplit)isNumberisNumberOrNoneOneOfisColorOrNoneisStringisTextAnchorisBoxAnchor	isBooleanNoneOrisInstanceOfisNoneOrStringisNoneOrCallableisSubclassOf)*)stringWidthgetAscentDescent)DrawingGroupCircleRectStringSTATE_DEFAULTS)Widget
PropHolder)
DirectDraw)XPreformattedFlowable)ParagraphStylePropertySet)TA_LEFTTA_RIGHT	TA_CENTER)startendmiddle   )	text2Pathnneesesswwnw)	r   -   Z            i  i;  xy)DirectDrawFlowableNr%   r&   r'   )	r0   r1   r/   r,   r+   r-   r*   r.   cc                   j   e Zd ZdZ edRi d eed          d eed          d eed          d eed	          d
 eed          d eed          d eed          d eed          d eed          d e e	dddd          d          d eed          d eed          d eed          d  ee
d!          d" ee
d#          d$ eed%          d& eed          d' eed(          d) eed*          d+ eed,          d- eed.          d/ eed0          d1 eed2          d3 eed4          d5 eed6          d7 eed8          d9 eed:          d; eed<d=>          d? e e ee          d@          dAd=>          dB e e ee          d@          dCd=>          dD e e ee           ee          f          dEd=>          ZdF ZdG ZdH ZdI ZdJ ZdK ZdL ZdM ZdN ZdO ZdP Z dQS )SLabelzA text label to attach to something else, such as a chart axis.

    This allows you to specify an offset, angle and many anchor
    properties relative to the label's origin.  It allows, for example,
    angled multiline axis labels.
    r9    descr:   dxzdelta x - offsetdyzdelta y - offsetanglezDangle of label: default (0), 90 is vertical, 180 is upside down, etc	boxAnchorzanchoring point of the labelboxStrokeColorzborder color of the boxboxStrokeWidthzborder widthboxFillColorzthe filling color of the box	boxTargetnormalantilohiz"one of ('normal','anti','lo','hi')	fillColorzlabel text colorstrokeColorzlabel text border colorstrokeWidthzlabel text border widthtextzthe actual text to displayfontNamezthe name of the font usedfontSizezthe size of the fontleadingwidthzthe width of the labelmaxWidthz#maximum width the label can grow toheightzthe height of the text
textAnchorz0the anchoring point of the text inside the labelvisible True if the label is to be drawn
topPaddingzpadding at top of boxleftPaddingzpadding at left of boxrightPaddingzpadding at right of boxbottomPaddingzpadding at bottom of boxuseAscentDescentz^If True then the font's Ascent & Descent will be used to compute default heights and baseline.customDrawChangerzDAn instance of CustomDrawChanger to modify the behavior at draw time   )rA   _advancedUsageddfNoneOrDirectDrawzA DirectDrawFlowable instanceddfKlassz=A Flowable class for direct drawing (default is XPreformattedddfStylez-A style or style class for a ddfKlass or Nonec           
          | j         d(i |  | j         d(i ddddddddddd	dd
ddddddddddddd dddd dd dd dd dd dd dt          d         dt          d         dt          d         dddd d!d"d#d$d%t          d&t          | j        d&d           d't          | j        d'd            d S ))N_textzMulti-Line
StringrE   r<   rD   r   r9   r:   rB   rC   r[   r\   r]   r^   rG         ?rF   rI   rJ   rO   rH   rT   rU   rV   rW   rN   rR   rS   rP   g?rX   r%   rY   ra   r_   Frc   re   rf    )_setKeywordsr   r;   getattr	__class__)selfkws     d/var/www/html/nettyfy-visnx/env/lib/python3.11/site-packages/reportlab/graphics/charts/textlabels.py__init__zLabel.__init__M   s   B 	 	 	,,	C	 	 A		
 A	 Q	 Q	 Q	  a	  !q	 !"	 "%	 "&	 %H	 #d	   $t!	" $#	$ %	&  4'	( )	* +;77+	, **55-	. **55/	0 "c1	2 %W3	4 !5	6 $)57	8 )(9	: #4>*TBBB;	< #4>*TBBB=	 	 	 	    c                     || _         dS )zpSet the text property.  May contain embedded newline characters.
        Called by the containing chart or axis.N)rh   )rn   rQ   s     rp   setTextzLabel.setTextp   s     


rr   c                 "    || _         || _        dS )zSet the origin.  This would be the tick mark or bar top relative to
        which it is defined.  Called by the containing chart or axis.Nr8   )rn   r9   r:   s      rp   	setOriginzLabel.setOriginv   s     rr   c                 |   t          dd          }|                    t          dddt          j                             t                      }|                    dd           d|_        d|_        d|_	        d	|_
        t          j        |_        |                    d
           |                    |           |S )zyThis shows a label positioned with its top right corner
        at the top centre of the drawing, and rotated 45 degrees.   d   r3      )rN   r+   r2   r   izAnother
Multi-Line
String)r   addr   r   greenr>   rv   rE   rD   rB   rC   rF   rt   )rn   dlabs      rp   demoz
Label.demo}   s     C 	
fSQ&,777888ggc"	#\1222	c


rr   c                     | j         }|dv rh| j        }t          |dz  dz            dz  dz  }|dz  s(||z
  dz  }t          |          dk    r||dk    rdpdz   }t          |d	                  |         }|S )
z,hook for allowing special box anchor effects)autoxautoyih  g     F@r2   r3   rz   r   r7   )rE   rD   intabs_A2BA)rn   barD   nadas        rp   _getBoxAnchorzLabel._getBoxAnchor   s    ^###JEuSy#o&&r)3.BG 3bjC'r77199r!t{1c2Br"vr"B	rr   c                     | j         rEt          | j        | j                  \  | _        | _        | j        | j        | j        z
  z  | _        d S d| _        d S )Ng?)r_   r   rR   rS   _ascent_descent_baselineRatiorn   s    rp   _getBaseLineRatiozLabel._getBaseLineRatio   sU      	(*:4=*W*W'DL$-"&,T]0J"KD"'Drr   c                    | j         p|| j        z   | j        z   | _        | j        | j        z
  | j        z
  | _        | j        | j        z
  | j        z
  | _        | 	                                }|dv r| j         | _
        n(|dv r| j        | j        z
  | _
        nd| j        z  | _
        | j
        | j        z
  | _        |dv r| j        | j        z
  | _        n!|dv r| j        | _        n| j         dz  | _        | j        | j        z   | _        d S )N)r*   r+   r1   )r.   r/   r-   ri   )r+   r,   r-   )r1   r0   r/   )rW   r[   r^   _height_widthr\   r]   _ewidth_eheightr   _top_bottom_left_right)rn   objHrE   s      rp   _computeSizeEndzLabel._computeSizeEnd   s   {Stdo'=@R'RD$44T5FFdo5d6HH&&((	''(DII/))T_4DIIDM)DIy4=0'')DK7DJJ/)))DJJ,s*DJj-rr   c                     t           dd           }|sg  _        t           j         j         j         j                   _         j        sV j	         j
        z    _         j        r: fd j        D              _         xj        t           j                  z  c_        n j         _                                           j        r j         _        n+ j        r j         j        z
   _        n j        dz   _         j        t'           j                  z  }n5 j        t+          d          t-          d j         j         j         j                  } j        st5          di |}nt7           j        t8                    r  j        j        di |}nft7           j        t<                    r(t?           j        t8                    r  j        di |}n$tA          dt=           j                             | _!                                           j        rd|_"         j         j        z
  |_        n j        r j        n	 j        dz  |_        |j         _         #                                } j        pd	}|d
k    rEtH          |_%         | j        |          }|&                    |d	          \  }} j        p|j'        }tP          |         |_%         | j        |          x _)        }|&                    |d	          \  }} j        s* j	         j
        z    _         xj        |j'        z  c_        n j         _         *                    |           d S )Nre   c                 F    g | ]}t          |j        j                  S rj   )r   rR   rS   ).0linern   s     rp   
<listcomp>z%Label.computeSize.<locals>.<listcomp>   s*    'n'n'nZ^Dt}(U(U'n'n'nrr   333333?[DirectDrawFlowable class is not available you need the rlextra package as well as reportlabxlabel-generated)namerR   rS   rN   rO   zddfStyle has invalid type Tr%   stylerj   )+rl   _lineWidthsr   rh   rR   rS   rV   _linesrU   r\   r]   r   maxr   rT   _leadingr_   r   r   lenrc   RuntimeErrordictrN   rO   rf   r    
isinstancer!   clonetype
issubclass
ValueError_styleautoLeading_getTextAnchorr"   	alignmentwrap
_width_max_ta2al_ddfObjr   )rn   re   r   stytaaWobj_s   `       rp   computeSizezLabel.computeSize   sw   4
400 >	)!D%djt}T][[DK: )".t/@@; 9'n'n'n'nbfbm'n'n'nD$KK3t'7#8#88KK"j""$$$| 2 $& 2 $t} < $c 1=T[!1!11DDx"  $A  B  B  B+!]!]"n $ 0  C = U$++s++DM+66 U)dm)00C00DM$// UJt}[4Y4Y U#dm**c** !Sd4=>Q>Q!S!STTTDK""$$$$ R"&"lT]:.2lQdllc@QKDM$$&&B,*B7{{ 'htz444((2j114]4cn"2JCM!)$*3!?!?!??DL3hhr*--GAt: )".t/@@s~-"jT"""""rr   c                 ^    | j         }|dk    rt          |                                          }|S )z/This can be overridden to allow special effectsboxauto)rX   _BA2TAr   )rn   r   s     rp   r   zLabel._getTextAnchor   s,    _y==vd&8&8&:&:;"	rr   c                 ~   | j         }|pd| _         |                                  || _         t                      }|                    | j        | j        z   | j        | j        z              |                    | j	                   t          | dd           }|r| j        }nY| j        | j        | j        z  z
  }|                                 }|dk    r| j        }n |dk    r| j        | j        dz  z   }n| j        }| j        s| j        rc| j        r\|                    t-          | j        | j        z
  | j        | j        z
  | j        | j        | j        | j        | j                             |rtt                      }|                    || j        | j        z
             |                    |                     | j                             |                    |           n| j        | j         | j!        }
}	}| j"        | j#        | j        }}}t          | di           }|rN| j$        D ]E}tK          ||||	|
|          }||_        ||_"        ||_#        |                    |           ||z  }FnS| j$        D ]K}tM          ||||          }||_'        |	|_         |
|_!        ||_        |                    |           ||z  }L|S )	Nr?   re   r%   r'   ri   rO   rP   rN   	_svgAttrs)r   )(rh   r   r   	translater9   rB   r:   rC   rotaterD   rl   r   r   r   r   r   r   r   rH   rF   rG   r{   r   r\   r   r^   r   r   r   rc   r   rN   rR   rS   rO   rP   r   
_text2Pathr   rX   )rn   rh   gre   r9   r:   rX   g1rN   rR   rS   rO   rP   rT   svgAttrsr   r.   s                    rp   _rawDrawzLabel._rawDraw  s   
[b

GG	DFTW$dftw&6777	4
400 
	 
AA	DM$*===A,,..JW$$Jx''Jc!11K  	!4 	9L 	EE$
4#33T%77$($7$($7"&"35 5 5     	!BLL49T]2333FF488DL))***EE"IIII,0NDM4=xI040@$BRTXTagKT+b11H ! K ! !D"4Ax:NNA"+AK$/AM$/AMEE!HHHLAA! !K ! !Dq!TX>>>A#-AL!)AJ!)AJ"+AKEE!HHHLAArr   c                     t          | dd           }|r> |d|            	 |                                  |d|            S #  |d|            w xY w|                                 S )Nr`   TF)rl   r   )rn   r`   s     rp   drawz
Label.drawD  s~    #D)<TBB 	#d4(((.}}!!%----!!%----==??"s   A ANrj   )!__name__
__module____qualname____doc__AttrMapAttrMapValuer   r   r   r   r	   r   r
   r   r   r   r   r   r   r!   r   _attrMaprq   rt   rv   r   r   r   r   r   r   r   r   rj   rr   rp   r>   r>   !   s&         w  
  
  
Lr**** 
Lr**** 
 \((:;;;; 
 \((:;;;;	 

 X+qrrrr 
 !L2PQQQQ 
 &m9RSSSS 
 &hNCCCC 
 $|M7UVVVV 
 !LxtD!A!AGkllll 
 !L4FGGGG 
 #l=6OPPPP 
 #l81JKKKK 
 |H*FGGGG 
  <.IJJJJ 
   <.DEEEE! 
" ,~26666# 
$ ^1IJJJJ% 
&  <4YZZZZ' 
( n2JKKKK) 
* "\,4fgggg+ 
, ,y.PQQQQ- 
. "\(0GHHHH/ 
0 #l81IJJJJ1 
2 $|H2KLLLL3 
4 %X3MNNNN5 
6 (<	  8X  Y  Y  Y  Y7 
8 )L)9  @F  WX  Y  Y  Y  Y9 
: l66,,z":":;MNNTs  EF  G  G  G  G; 
<  <||H'='=>P Q Q  XW  hi  j  j  j  j= 
>  <[(A(A,,{B[B['\ ] ]  dS  de  f  f  f  f? 
HD! ! !F      *  ( ( (. . .*B# B# B#H  = = =~	# 	# 	# 	# 	#rr   r>   c            	       ^   e Zd Z edi d eed          d eed          d eed          d eed          d eed          d eed          d	 eed          d
 eed          d eed          d eed          d eed          d ee          ddd eed          d eed          d eed          d eed          d eed          d eed          d ee	d          d ee
d          Zd Zd Zd ZdS )LabelDecoratorr9   r?   r@   r:   rB   rC   rD   rE   rF   rG   rH   rN   rO   rP   rA   rR   rS   rT   rU   rV   rW   rX   rY   rZ   c                     d| _         d| _        | j                                        D ]#}t	          | |          st          | |d            $d S )Nr%   r0   )rX   rE   r   keyshasattrsetattrrn   as     rp   rq   zLabelDecorator.__init__g  sW    !##%% 	9 	9A4??8GD4$8$8$8	9 	9rr   c                     |j         \  }}}}}}}	}
}}}}|                    |j        j        |                    |                    |           d S N)_callOutInfort   categoryAxiscategoryNamesr{   )rn   lLchartr   rowNocolNor9   r:   rU   rW   x00y00x0y0s                  rp   decoratezLabelDecorator.decoratem  sR    =>^:aeAafSR			%$259:::	arr   c                     t                      }| j                                        D ])\  }}|t          ||d           }t	          |||           *|                     ||           d S r   )r>   __dict__itemsrl   r   r   )rn   r   r   r   vs        rp   __call__zLabelDecorator.__call__r  sl    GG=&&(( 	 	CAayga$//!AaNNNNarr   Nrj   )r   r   r   r   r   r   r   r   r   r
   r   r   rq   r   r   rj   rr   rp   r   r   O  s       w 
 
 
LR0000
LR0000
 \.b1111
 \.b1111	

 ^4444
 !L"5555
 &m<<<<
 &n"====
 $|Mr::::
 !LB7777
 #l=b9999
 #l>222
 9;
  <B7777
  <B7777
 ,~26666
  ^4444!
"  <B7777#
$ n"5555%
& "\,B7777'
( ,y.PQQQQ)
H.9 9 9  
    rr   r   highlowbaraxisc            	           e Zd Z e eed           eed           eed           eed                    Zd Zd Z	d	S )
LabelOffsetzWhere to base +ve offsetr@   zValue for positive elementszWhere to base -ve offsetzValue for negative elements)posModeposnegModenegc                 >    dx| _         | _        dx| _        | _        d S )Nr   r   )r   r   r   r   r   s    rp   rq   zLabelOffset.__init__  s"    "((T\4888rr   c                    |j         }|j        }|j        }|dk    r| j        }| j        }n| j        }| j        }|r|j        }n|j        }|r6|r|j        }	n|j        }	|dk    r|	|j	        z   }n|dk    r|	}n|dk    r|	|z   }||z   S )Nr   r   r   r   )
_flipXYr   joinAxisr   r   r   r   _x_y_length)
rn   r   valflipXYAjAmodedeltar   _vs
             rp   	_getValuezLabelOffset._getValue  s    Z66<DHEE<DHE 	AAA 
	 UUV||OuusFwrr   N)
r   r   r   r   r   isOffsetModer   r   rq   r  rj   rr   rp   r   r   z  s        w&,|9STTT"l81NOOO&,|9STTT"l81NOOO	  H         rr   r   c                   8    e Zd Z ee          Zd Zd Zd ZdS )PMVLabelBASEc                 8    t          j        | fi | d| _        d S Nr   )r>   rq   _pmvrn   kwdss     rp   rq   zPMVLabel.__init__  s%    t$$t$$$			rr   c           
      t    t                               |           }| j        dk     rdddddddd	d
d	|         }|S )Nr   r-   r.   r/   r,   r<   r0   r+   r*   r1   )	r1   r*   r+   r0   r<   r,   r/   r.   r-   )r>   r   r  r   s     rp   r   zPMVLabel._getBoxAnchor  sH    %%9Q;;$3DSSSVZ_bhlmmnoprr   c                 h    t                               |           }| j        dk     rdddd|         }|S )Nr   r&   r'   r%   )r%   r'   r&   )r>   r   r  r   s     rp   r   zPMVLabel._getTextAnchor  s8      &&9Q;;UXWMMaPrr   N)	r   r   r   r   r>   r   rq   r   r   rj   rr   rp   r  r    sZ        w
 
 
H    
    rr   r  c                       e Zd ZdZ ee eed           eed           ee	d           ee	d           ee
d           e edd	d
dd          d                    Zd ZdS )BarChartLabelF
    An extended Label allowing for nudging, lines visibility etc
    zNon-zero for a drawn liner@   zColor for a drawn linezNone or fixed draw ends +/-zNone or fixed draw starts +/-zNon-zero sign dependent nudgerJ   rK   rL   rM   midz(one of ('normal','anti','lo','hi','mid'))r  lineStrokeWidthlineStrokeColorfixedEnd
fixedStartnudgerI   c                 p    t          j        | fi | d| _        d | _        d x| _        | _        d| _        d S r  )r  rq   r  r  r   r  r!  r  s     rp   rq   zBarChartLabel.__init__  sD    $''$''' #*..$-


rr   N)r   r   r   r   r   r  r   r   r   NoneOrInstanceOfLabelOffsetr   r   r   rq   rj   rr   rp   r  r    s          w&,~<WXXX&,};STTT< ;B_```!\"=DcdddX,KLLL LxtD!G!GMwxxx
 
 
H    rr   r  c                   H    e Zd ZdZ ee eed                    Zd Z	dS )NA_Labelr  zText to be used for N/A valuesr@   )r  rQ   c                 H    t                               |            d| _        d S )Nzn/a)r  rq   rQ   r   s    rp   rq   zNA_Label.__init__  s!    t$$$			rr   N)
r   r   r   r   r   r  r   r   r   rq   rj   rr   rp   r%  r%    s[          w|N1QRRR
 
 
H    rr   r%  )CustomDrawChangerc                   (    e Zd Zej        fdZd ZdS )RedNegativeChangerc                 <    t          j        |            || _        d S r   )r'  rq   rN   )rn   rN   s     rp   rq   zRedNegativeChanger.__init__  s    "4((("rr   c                 j    i }|j                             d          r|j        |d<   | j        |_        |S )N-rN   )rh   
startswithrN   )rn   r   Rs      rp   _changerzRedNegativeChanger._changer  s8    9$$ 	+ ]AkN NCMrr   N)r   r   r   r   redrq   r/  rj   rr   rp   r)  r)    s<         &
 # # # #    rr   r)  c                   0    e Zd ZdZ ee          Zd ZdS )	XLabelz=like label but uses XPreFormatted/Paragraph to draw the _textr  c                     t          j        | g|R i | |                    dt                    | _        |                    d| j                  | _        d S )Nre   directDrawClass)r>   rq   popr   re   rc   )rn   argsr  s      rp   rq   zXLabel.__init__  sS    t)T)))D)))M::88-dh77rr   Fc                     |                     dt                    | _        |                     dt                    }|t	          d          || _        t          j        | g|R i | d S )NflowableClassr4  r   )r5  r   _flowableClassr;   r   _ddfr>   rq   )rn   r6  r  rc   s       rp   rq   zXLabel.__init__  sz    "&((?="I"ID((,-?@@C{"  $A  B  B  BDIN4---------rr   c                 `   g | _         t          d| j        | j        | j        | j                  x}| _        |                                  | j        rd|_	        | j
        | j        z
  |_        n| j        r| j        n	| j        dz  |_        |j        | _        |                                 }| j        pd}|dk    rOt           |_        |                     | j        |          }|                    |d          \  }}| j        p|j        }t,          |         |_        |                     | j        |          x| _        }|                    |d          \  }}| j        s/| j        | j        z   | _        | xj        | j        j        z  c_        n| j        | _        |                     |           d S )Nr   )rR   rS   rN   rO   Tr   r   r%   r   )r   r    rR   rS   rN   rO   r   r   r_   r   r   r   rT   r   r   rV   r"   r   r9  rh   r   r   r   _objrU   r\   r]   r   r   )rn   r   r   r   r   r   r   s          rp   r   zXLabel.computeSize  s   !D ./A!]!]"n $ 0	! ! ! C$+ ""$$$$ R"&"lT]:.2lQdllc@QKDM$$&&B,*B7{{ '))$*3)??((2j114]4cn"2JCM"11$*31GGGDIhhr*--GAt: )".t/@@ty33"j  &&&&&rr   c                    | j         }|pd| _         |                                  || _         t                      }|                    | j        | j        z   | j        | j        z              |                    | j	                   | j
        }| j        s| j        rc| j        r\|                    t          | j
        | j        z
  | j        | j        z
  | j        | j        | j        | j        | j                             t                      }|                    || j        | j        z
             |                    |                     | j                             |                    |           |S )Nr?   r   )rh   r   r   r   r9   rB   r:   rC   r   rD   r   rH   rF   rG   r{   r   r\   r   r^   r   r   r   r   r:  r<  )rn   rh   r   r9   r   s        rp   r   zXLabel._rawDraw  sP   JE"DJDJAKK($&47*:;;;HHTZ   
A   T%8 T=P dDJt'77 L);; K L(,(;(,(;&*&79 9 9    BLL49T]2333FF499TY''(((EE"IIIHrr   N)
r   r   r   r   r   r>   r   rq   r   r   rj   rr   rp   r2  r2    sC        GGwE   H8 8 8
D Drr   r2  )C__version__reportlab.libr   reportlab.lib.utilsr   reportlab.lib.validatorsr   r   r   r   r	   r
   r   r   r   r   r   r   r   reportlab.lib.attrmapreportlab.pdfbase.pdfmetricsr   r   reportlab.graphics.shapesr   r   r   r   r   r   reportlab.graphics.widgetbaser   r   r   reportlab.platypusr   r   reportlab.lib.stylesr    r!   reportlab.lib.enumsr"   r#   r$   r   r   utilsr)   r   r   rlextra.graphics.canvasadapterr;   ImportErrorr   r>   r   r  r   r#  r  r  r%  NoneOrInstanceOfNA_Labelreportlab.graphics.charts.utilsr'  r)  r2  rj   rr   rp   <module>rN     s0                + + + + + +                              $ # # # F F F F F F F F Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z < < < < < < < < 0 0 0 0 0 0 6 6 6 6 6 6 6 6 < < < < < < < < < < < < < < < < < <	G		:	:	: + + + + + + $CTsQU\`aa$CTsQU\`aa	
 	

AAAAAAA    g%u5V^ckpxyyl# l# l# l# l#F l# l# l#\	( ( ( ( ( ( ( (T U6%f--$ $ $ $ $* $ $ $L #F<<#<#<==     u   &    H   *
 
 
 
 
} 
 
 
  X 6 677  = = = = = =	 	 	 	 	* 	 	 	M M M M MU M M M M Ms   B& &B0/B0