
    Rjs                        U d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZmZmZmZmZmZmZmZmZ d dlmZ dd	lmZ dd
lmZmZmZmZ ddlm Z  ddl!m"Z" 	 d dl#m$Z$m%Z%m&Z&m'Z( n# e)$ r dZ$dZ%dZ&dZ(Y nw xY w	 d dl*m+Z+ e+j,        Z-n# e)e.f$ r dZ-Y nw xY werd dl*m$Z/ d dl0m1Z1 neZ/ee2d<   	 d dl3Z3n# e)$ r dZ3Y nw xY we G d d                      Z4 ej5        e6          Z7dZ8 e4            Z9g dZ:dZ;dZ<dZ=dZ>	 d<dede"dee?e@e@f                  de?eAee deBeedf         eez  f         fdZCdeBdeDfd ZEd!edee/         fd"ZFd#eAez  ez  defd$ZGd%eAdefd&ZHed'eBd#eAez  deDfd(            ZId#eAd)edede?eAe ef         fd*ZJ	 	 	 d=d#eeAeef         d)edeBeeeAdf         d,edee?e@e@f                  def
d-ZK G d. d/          ZLd)dde?eMeMf         fd0ZNd)ddeBfd1ZO	 	 d>d)dd2ePdz  d3ePdz  deBfd4ZQd5eeM         deBfd6ZRde?eSeBeMf         eMeMeMf         fd7ZTd)dd,ed8edeBfd9ZU	 	 d>d)dd2ePdz  d3ePdz  deBfd:ZVd)ddeDfd;ZWdS )?    N)	dataclass)BytesIO)ceil)Path)	TYPE_CHECKINGAnyBinaryIOIterableOptional	TypeAlias	TypeGuardUnionno_type_check)urlopen   )FPDFException)
ImageCacheImageFilterRasterImageInfoVectorImageInfo)	SVGObject)	ImageType)ImageImageCmsTiffImagePluginfeatures)
Resampling)r   )ImageCmsProfilePILImagec                       e Zd ZU dZeed<   dS )ImageSettingscompression_levelN)__name__
__module____qualname__r#   int__annotations__     S/usr/local/lib/hermes-agent/venv/lib/python3.11/site-packages/fpdf/image_parsing.pyr!   r!   >   s%           sr*   r!   )AUTOFlateDecode	DCTDecode	JPXDecode	LZWDecode(   r      @             `            P      0      p            H      (      h            X      8      x            D      $      d            T      4      t            L      ,      l            \      <      |            B      "      b            R      2      r      
      J      *      j            Z      :      z            F      &      f            V      6      v            N      .      n            ^      >      ~      r      A      !      a            Q      1      q      	      I      )      i            Y      9      y            E      %      e            U      5      u            M      -      m            ]      =      }            C      #      c            S      3      s            K      +      k            [      ;      {            G      '      g            W      7      w            O      /      o            _      ?               i  r   r`   image_cachenamedimsreturnc                    t          |t          t          f          rt          |                              d          r_	 t	          t          |          t          t          |                    |           S # t          $ r}t          d|           |d}~ww xY wt          |t                    rEt          |
                                          r$t	          dt          j        |          |           S t          |t          j                  rEt          |                                
                                          rt	          d||           S t          |t                    r|d}}nt          |          rV|                                }t!          j        dd          }|                    |           |                                |}}nt          |t          t          j        f          rt          |t          j                  r|                                n|}|
                                }t!          j        dd          }|                    |           |                                |}}nt          |          d}}| j                            |          }||d	         d
z   |d	<   nt-          ||| j        |          }t1          | j                  d
z   |d<   d
|d	<   d|d<   |                    d          }	|	]t2                              d|           |	| j        v r| j        |	         |d<   n#t1          | j                  }
|
| j        |	<   |
|d<   d|d<   || j        |<   |||fS )ao  
    Read an image and load it into memory.

    For raster images: following this call, the image is inserted in `image_cache.images`,
    and following calls to `fpdf.fpdf.FPDF.image()` will re-use the same cached values, without re-reading the image.

    For vector images: the data is loaded and the metadata extracted.

    Args:
        image_cache: an `ImageCache` instance, usually the `.image_cache` attribute of a `FPDF` instance.
        name: either a string representing a file path to an image, an URL to an image,
            an io.BytesIO, or a instance of `PIL.Image.Image`.
        dims (tuple[int, int]): optional dimensions as a tuple (width, height) to resize the image
            (raster only) before storing it in the PDF.

    Returns: A tuple, consisting of 3 values: the name, the image data,
        and an instance of a subclass of `ImageInfo`.
    z.svgr0  zCould not parse file: Nvector_imagemd5F)usedforsecurityusagesr   iiccp_iiccpzHICC profile found for image %s - It will be inserted in the PDF document)
isinstancestrr   endswithget_svg_info
load_image	Exception
ValueErrorbytes_is_svgstripior   getvalue_is_pil_imagetobyteshashlibnewupdate	hexdigestimagesgetget_img_infoimage_filterlenLOGGERdebugicc_profiles)r0  r1  r2  errorraster_nameimgbytes_img_hashinfor<  r;  s              r+   preload_imager]  n   sl   8 $d$$ IT););F)C)C I	ID		:c$ii00k     	I 	I 	I<d<<==5H	I$ W74::<<#8#8 WNBJt,<,<+VVVV$
## K0E0E0G0G(H(H KNDkJJJJ
 $ +S	t		 +;ue<<<#--//S	D5"*-	.	. +$.tRZ$@$@Jd;ue<<<#--//St99dS5@5G5K5KK5X5XDh!+X$	
 
 *++a/S	XXxxLLZ   {///!,!9$!?X[56617(.!'XDL*.;'T!!s    8A9 9
BBBrZ  c                 V    |                      d          p|                      d          S )Ns   <?xml s   <svg )
startswith)rZ  s    r+   rE  rE     s)    Y''F6+<+<X+F+FFr*   objc                 H    t           d uot          | t           j                   S N)r   r=  )r`  s    r+   rI  rI     s    =C!=!==r*   filenamec                    t          | t          t          j        t          f          r| S t          | d          r=t          | t          t          f          s!t          |                                           S t          | t                    rt          |           } | 	                    d          rIt          |           5 }t          |                                          cddd           S # 1 swxY w Y   n$| 	                    d          rt          |           S t          | d          5 }t          |                                          cddd           S # 1 swxY w Y   dS )z
    This method is used to load external resources, such as images.
    It is automatically called when resource added to document by `fpdf.fpdf.FPDF.image()`.
    It always return a BytesIO buffer.
    read)zhttp://zhttps://Nzdata:rb)r=  r   rG  BufferedIOBaser	   hasattrr>  r   re  r_  r   _decode_base64_imageopen)rc  url_file
local_files      r+   rA  rA     s    (Wb&7BCC x   (HsDk)J)J (x}}'''(D!! !x==233 . X 	,(8==??++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,			W	%	% .#H---	h		 *z(())* * * * * * * * * * * * * * * * * *s$   ?!C--C14C1-!EE"Ebase64Imagec                     |                      d          }t          |          dk    rt          d          |d         }t          j        |          }t          |          S )z7Decode the base 64 image string into an io byte stream.zbase64,rp   z!Unsupported non-base64 image datar   )splitrS  NotImplementedErrorbase64	b64decoder   )rm  frags	imageDatadecodedDatas       r+   ri  ri     sZ    i((E
5zzQ!"EFFFaI"9--K;r*   r<  c                 H   	 t          j        t          |                     }n1# t           j        $ r t                              d|           Y dS w xY wt          |j        j                  	                                }|dvrt                              d||           dS dS )z%Checks the validity of an ICC profilezInvalid ICC Profile in file %sF)GRAYRGBzEUnsupported color space %s in ICC Profile of file %s - cf. issue #711T)
r   getOpenProfiler   
PyCMSErrorrT  r\  r>  profilexcolor_spacerF  )r<  rc  r{  color_spaces       r+   is_iccp_validr~     s    %-%<WT]]%K%K   4h???uu go23399;;K/))S	
 	
 	

 u4s   !$ *AArY  c                    |                     d           |                                }t          ||          }|j        r|j        \  }}}}ndx}}|j        r|j        }|j        r|j        }t          |||          }| ||fS )Nr   r5  g        )datawh)seekre  r   viewboxwidthheightr   )	rc  rY  r0  svg_datasvg_r  r  r\  s	            r+   r@  r@    s     HHQKKKxxzzH
H+
6
6
6C
{ [
1aA
y I
z JqA...DS$r*   r,   rR  c                    t           t          d          d}d}d}d}|rt          |t          t          f          r&t          |           }t          j        |          }d}net          |          sVt          |t                    }t          |t                    rt          |          }n|}|J t          j        |          }d}t          |          sJ d}|r|
                    |t                    }d}|dk    r2|j        dk    rd}n$|j        d	k    rt          j        d
          rd}nd}|j        dv r|dk    r|                    d          }|j        dvr|                    d          }d}|j        dv r|dk    r|                    d          }n$|j        dv r|dk    r|                    d          }|j        \  }	}
t%                      }d}d|j        v r(t)          |j        d         |           r|j        d         }|w|st|j        dk    r|dk    r|j        dv rd\  }}}n=|j        dk    r	d\  }}}d}n)|j        dk    rd\  }}}nt+          d|j                   |                    d           |                    |                                |	|
||||||d| d|	 d
           |S |j        d k    r|dk    r|j        d!         d"k    rt3          |j        t6          j                           d#k    ryt3          |j        t6          j                           d#k    rP|j        t6          j                 }d}|dk    rd}n|d#k    rt+          d$|           t?          |          \  }}|                    |           |                    |          }|j                             t6          j!                  }||d#k    rn\|d%k    rDtE          |          }tG          |          D ]\  }}tH          |         ||<   t          |          }nt+          d&|           d'\  }}}|                    ||	|
d|||||d(t	          |           %                                 d|	 d)|
 d*
           |S d}|j        d	k    rd'\  }}}tM          ||          |d+<   n1|j        dk    rd\  }}}tM          ||          |d+<   n|j        dk    rVd\  }}}tO          d#dd%          }tM          |||,          |d+<   tQ          |          r|d-vrtM          |||.          |d/<   n|j        d0k    rd1\  }}}tM          ||          |d+<   |j)        |j)        j)        nd|d2<   |j                             d3d          ;|d-vr7tM          |                    d          |tO          d4dd5          .          |d/<   n|j        d6k    rmd1\  }}}|j)        |j)        j)        nd|d2<   tO          d#dd%          }tM          |||,          |d+<   tQ          |          r|d-vrtM          |||.          |d/<   n|j        dk    rd\  }}}tM          ||          |d+<   ny|j        dk    rd\  }}}tM          ||          |d+<   nTd\  }}}tO          d4dd5          }tM          |||,          |d+<   tQ          |          r|d-vrtM          |||.          |d/<   d| d|	 }|j        d	k    rd7|	 d)|
 }|s(|rtU          |d8d           n|+                                 |                    |	|
|||||||d9	           |S ):z
    Args:
        filename: in a format that can be passed to load_image
        img: optional `bytes`, `BytesIO` or `PIL.Image.Image` instance
        image_filter (str): one of the SUPPORTED_IMAGE_FILTERS
    Nz1Pillow not available - fpdf2 cannot insert imagesTF)resampler,   JPEGr.   1libtiffCCITTFaxDecoder-   )PPARGBA)r  LLArx  r  r  r  CMYK)r  r  r0   rx  r  r  icc_profile)rx  r  )r   r@   	DeviceRGBr  )rP   r@   
DeviceCMYK)r   r@   
DeviceGrayzUnsupported image mode: r   z/Predictor 15 /Colors z
 /Columns )
r  r  r  csr<  dpnbpcfinverteddpTIFFcompressiongroup4r   z4unsupported photometric interpretation for g4 tiff: rp   zunsupported FillOrder: )r   r   r  z
/BlackIs1 z /K -1 /Rows )
r  r  r  r<  r  r  r  r  r  r  r  )remove_slice)r.   r/   )select_slicesmaskr  )r   r@   Indexedpaltransparencyr   rP   r  z/BlackIs1 true /Columns fp)	r  r  r  r<  r  r  r  r  r  ),r   EnvironmentErrorr=  r   r>  rA  rj  rI  r   rD  resizeRESAMPLEformatmodePIL_featurescheckconvertsizer   r\  r~  rC  r  rM  re  rS  tag_v2r   STRIPOFFSETSSTRIPBYTECOUNTSPHOTOMETRIC_INTERPRETATIONccitt_payload_location_from_pilrP  	FILLORDER	bytearray	enumerateTIFFBitRevTablelower_to_dataslice
_has_alphapalettesetattrclose)rc  rY  rR  r2  
is_pil_imgkeep_bytes_io_openjpeg_invertedimg_raw_dataimg_alteredr  r  r\  r<  r  r  colspacephotor  offsetlengthccittrawdata	fillorderr:  nalpha_channelr  s                             r+   rQ  rQ    s    }RSSSJ M'+L *S4+.. !(++j&&

3 'W55c5!! 	"3<<LLL'''j&&
K jjj11v:&LLX__!3I!>!>_ ,LL(L
x;<=#@#@kk&!!
xIIIkk&!!
x=  \[%@%@kk%  	d		 ; ;kk#8DAqDD  -0(;; 	+8M*D:LK$?$?x?**%6"S((V##%7"S( $S%7"S(( !FCH!F!FGGGa   KK(--//" % -E3EE!EE    K J&   000'833CJ;<==BBCJ>?@@AEEJIJEHzz! R5RR   =SAANFFf%%%.:.?.?.G.GL
'@AAI INNa(66%l33 9 9DAq&5a&8LOO$\22 !F9!F!FGGG!3ChKK( "% -_sx<'8'8'>'>'@'@__A__\]__    K L
x3/S(\22V	S/S(\22V	T		/S(aq))\NNNVc?? 	T| 4
  
  
 %S,]SSSDM	S,S(\22V-0[-Dck))$U 8<<--9l S
 ?
 ?

 %F##\aq@Q@Q  DM 
T		,S(-0[-Dck))$Uaq))\NNNVc?? 	T| 4
  
  
 %S,]SSSDM	V		/S(\22V	U		.S(\22V.S(aq))\NNNVc?? 	T| 4
  
  
 %S,]SSSDM	4#	4	4	4	4B
x3;;;;;  	Ct$$$$IIKKKKK%
	
 
	
   Kr*   c                   F    e Zd ZdZdededefdZddZd	ed
ededdfdZdS )	temp_attrzM
    temporary change the attribute of an object using a context manager
    r`  fieldvaluec                 L    || _         || _        || _        d| _        d | _        d S )NF)r`  r  r  exists	old_value)selfr`  r  r  s       r+   __init__ztemp_attr.__init__  s)    

"r*   r3  Nc                     t          | j        | j                  r&d| _        t	          | j        | j                  | _        t          | j        | j        | j                   d S )NT)rh  r`  r  r  getattrr  r  r  )r  s    r+   	__enter__ztemp_attr.__enter__  sR    48TZ(( 	;DK$TXtz::DN$*dj11111r*   exctypeexcinstexctbc                     | j         r"t          | j        | j        | j                   d S t          | j        | j                   d S rb  )r  r  r`  r  r  delattr)r  r  r  r  s       r+   __exit__ztemp_attr.__exit__  sD    ; 	*DHdj$.99999DHdj)))))r*   )r3  N)	r$   r%   r&   __doc__r   r>  r  r  r  r)   r*   r+   r  r    s         #C # #C # # # #2 2 2 2* *c *# *$ * * * * * *r*   r  c                     | j         t          j                 }| j         t          j                 }t	          |          dk    st	          |          dk    rt          d          ||c\  }\  }||fS )z[
    returns the byte offset and length of the CCITT payload in the original TIFF data
    r   z;Transcoding multiple strips not supported by the PDF format)r  r   r  r  rS  rp  )rY  strip_offsetsstrip_bytesr  r  s        r+   r  r    s     J;<M*_<=K 	Ma{q  !I
 
 	

 	 IVy
 6>r*   c                 >    t                      }t          j         j         j                                                   } j        d         dz   dz   j        d         z  t          t          d          rGt          t          d          5  |	                    |dd           d	d	d	           n# 1 swxY w Y   nyt          j
        j        d
t          dt          dt          f fd}t          t          j
        d|          5  |	                    |dd           d	d	d	           n# 1 swxY w Y   |                    d           t          j        |          }t#          |          \  }}|                    |           |                    |          S )zN
    Convert the open PIL.Image imgdata to compressed CCITT Group4 data.

    r   r  r@   r   
STRIP_SIZEr  r  )r  r  Nr  tagr3  c                     t           j        j        d         t           j        gt           j        dgi}|                    | | |                    S )Nr   r   )r   ROWSPERSTRIPr  r  r  rP  )r  r  	overridesrY  pillow__getitem__tmp_strip_sizes      r+   __getitem__z)transcode_monochrome.<locals>.__getitem__V  sQ    ,chqk/.1A,qcI
 ==&7&7c&B&BCCCr*   r  )r   r   	frombytesr  r  rJ  rh  r   r  saveImageFileDirectory_v2r  r   r'   objectr  rj  r  re  )	rY  newimgioimg2r  newimgr  r  r  r  s	   `      @@r+   transcode_monochromer  8  s@    yyH
 ?38SXs{{}}==D hqkAo!+chqk9N-- EnEE 	E 	EIIhv8IDDD	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E
 ,AM	Dc 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 1=+
 
 	E 	E IIhv8IDDD	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E MM!Z!!F4V<<NFFMM&==   s$   B55B9<B9
D//D36D3r  r  c                    t          |                                           }|r||= |r||         }| j        dk    rt          | j        d         dz            }n;t          |          | j        d         | j        d         z  z  }| j        d         |z  }t                      }t          dt          |          |          D ]7}|                    d           |                    ||||z                       8|}t          g}t                      \  }	}
}}d}|D ]}|t          |g          z   }||	v r|}|                    |	|                    |
dt          z  dz
  k    r)|
|	|<   |
dz  }
|
|k    r|t          k     r|dz  }d|z  dz
  }n-|                    t                     t                      \  }	}
}}t          |g          }|r|                    |	|                    |                    t                     t          |          S )Nr  r   r@   r       r*   )r  rJ  r  r   r  rS  rangeextendLZW_CLEAR_TABLE_MARKERclear_tablerD  appendLZW_MAX_BITS_PER_CODELZW_EOD_MARKERpack_codes_into_bytes)rY  r  r  r  row_sizechannels_countdata_with_paddingr:  result_codestable	next_codebits_per_codemax_code_valuecurrent_sequencebytenext_sequences                   r+   _to_lzwdatar  m  sI   
 S[[]]##D  "L!
x3a((Tsx{SXa['@A8A;/!1c$ii** 9 9  '''  a!h,&6!78888D ++L6Amm3E9m^ - -(5$==8E!!, &6 7888 Q"771<<<'0m$Q	~---BW2W2W!Q&M&'=&8A%=N ##$:;;;BM--?y-  %dV}}  5E"23444''' ...r*   codesc                    t                      \  }}}}d}d}t                      }t           t          j        | t          j                  } | D ]}||z  |z  }||z  }|dk    r&|dz  }|                    ||z	  dz             |dk    &|t          k    rt                      \  }}}}Z|t          k    r#|dz  }||k    r|t          k     r|dz  }d|z  dz
  }|dk    r|                    |d|z
  z  dz             t          |          S )z
    Convert the list of result codes into a continuous byte stream, with codes packed as per the code bit-width.
    The bit-width starts at 9 bits and expands as needed.

    r   N)dtyper@   r.  r   )
r  r  numpyarrayuint32r  r  r  r  rD  )	r  r  r  r  r  bufferbits_in_bufferoutputcodes	            r+   r   r     sQ    		FN[[F E666 : :M)T1-'!!aNMM6^3t;<<< !! ))):E--7Ay-^##NI>))m>S.S.S""#}"4!9v!n"45=>>>==r*   c                  r    d t          d          D             } t          dz   }t          }d|z  dz
  }| |||fS )zK
    Reset the encoding table and coding state to initial conditions.

    c                 0    i | ]}t          |g          |S r)   )rD  ).0r:  s     r+   
<dictcomp>zclear_table.<locals>.<dictcomp>  s"    ///qUA3ZZ///r*   r/  r   )r  r  LZW_INITIAL_BITS_PER_CODE)r  r  r  r  s       r+   r  r    sJ     0/E#JJ///E"I-M=(A-N)]N::r*   kwargsc                    |dk    rt          | fi |S |dk    rt          |           S |dk    rt          | fi |S | j        dk    r|                     d          } | j        dk    r|                     d          } |dk    r9t                      }|                     |d	
           |                                S |dk    r9t                      }|                     |d
           |                                S t          d| d          )Nr-   r  r0   r  r  r  rx  r.   r  )r  r/   JPEG2000zUnsupported image filter: "")		_to_zdatar  r  r  r  r   r  rH  r   )rY  rR  r  compressed_bytess       r+   r  r    s0   }$$''''''''#C((({""3))&)))
x4kk#
x6kk%  {"""99!&111((***{"""99!*555((***
ElEEE
F
FFr*   c                 2   t          |                                           }|r||= |r||         }| j        dk    rt          | j        d         dz            }n;t          |          | j        d         | j        d         z  z  }| j        d         |z  }t                      }t          dt          |          |          D ]7}|                    d           |                    ||||z                       8t          j	        |t          j                  S )Nr  r   r@   r   r  )level)r  rJ  r  r   r  rS  r  r  zlibcompressSETTINGSr#   )rY  r  r  r  r  r  r  r:  s           r+   r   r     s   
 S[[]]##D  "L!
x3a((Tsx{SXa['@A8A;/!1c$ii** 9 9  '''  a!h,&6!78888=*(2LMMMMr*   c                 >   |                      d          }|                                \  }}|dk    r|dk    rdS ||k    rdS t          *t          j        |          dk                                    S t	          d |                                D                       S )a  
    Return True if the image has any non-opaque alpha channel values.

    For the alpha band, `getextrema()` yields the min & max values across all pixels:
    - (255, 255): every pixel is fully opaque, so we can fast-return False.
    - (x, x) where x != 255: the channel is a flat non-opaque mask, so True.
    Otherwise we need to scan for any value different from 255 (using NumPy if available).
    Ar.  FTNc              3   "   K   | ]
}|d k    V  dS )r.  Nr)   )r  cs     r+   	<genexpr>z_has_alpha.<locals>.<genexpr>,  s&      99AqCx999999r*   )
getchannel
getextremar  asarrayanyrJ  )rY  r  lohis       r+   r  r    s     NN3''M%%''FB	SyyR3YYu	Rxxtm,,388:::99!6!6!8!8999999r*   rb  )Nr,   N)NN)Xrq  rK  rG  loggingr$  dataclassesr   r   mathr   pathlibr   typingr   r   r	   r
   r   r   r   r   r   urllib.requestr   errorsr   image_datastructuresr   r   r   r   r  r   utilr   PILr   r   r   r   r  ImportError	PIL.Imager   LANCZOSr  AttributeErrorr   PIL.ImageCmsr   r(   r  r!   	getLoggerr$   rT  SUPPORTED_IMAGE_FILTERSr&  r  r  r  r  r  tuplefloatr>  rD  r]  boolrE  rI  rA  ri  r~  r@  rQ  r  r'   r  r  r  r  r   dictr  r  r   r  r)   r*   r+   <module>rG     s     				   ! ! ! ! ! !                  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 # " " " " " ! ! ! ! ! !                       NNNNNNNNNNNNN   EHOLLL	$$$$$$!HH^$   HHH  ++++++,,,,,,,HiLLLL   EEE                
 
	8	$	$X =??  <     +/U" U"U"
U" 5&
'U" 	)Z$
<=o%'	U" U" U" U"pGE Gd G G G G>s >y2 > > > >*th. *8 * * * *4 c  g          t     $ /9
3	?*+   ( @D &*.	g gC4'(g	z5(D#t;	<g g 5&
'	g
 g g g gT* * * * * * * *2 c3h    <2!j 2!U 2! 2! 2! 2!n "&!%=/ =/	=/$,=/ $,=/ 	=/ =/ =/ =/@(# (5 ( ( ( (V
;U4s
+S#s:; 
; 
; 
; 
;G* GK G3 G5 G G G G> "&!%N N	N$,N $,N 	N N N N2:J :4 : : : : : :s6   )A6 6BB
B 	B$#B$>C CC