Warning: session_start(): Session cannot be started after headers have already been sent in /home/tvrreohg/public_html/manga.php on line 13
3 iat¬ã@s2ddlZddlZddlZddlZddlZddlZddlmZmZm Z m Z m Z ddl m Zddl mZddl mZddl mZddl mZejeƒZejd ƒjZd ZdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpiZejd!ƒZe jZ d"e Z!dZ"dZ#d Z$dZ%dZ&d#d$„Z'dqd%d&„Z(Gd'd(„d(ƒZ)Gd)d*„d*e*ƒZ+Gd+d,„d,ƒZ,Gd-d.„d.e)ƒZ-d/d0„Z.Gd1d2„d2e j ƒZ/drdsdtdudvdwdxdydzd{d|d}d~dd@œZ0dAdB„Z1GdCdD„dDƒZ2GdEdF„dFƒZ3dGdH„Z4dIdJ„Z5e1dKfdLdM„Z6dNdO„Z7ej8e/j9e/e.ƒej:e/j9e6ƒej;e/j9e5ƒejt|t|ƒƒ}t|jjdƒƒ}||krbtdt|ƒ›d�ƒ‚Wn:t j k rž}ztdt|ƒ›d�ƒ|‚WYdd}~XnXdS) zRead and verify checksumrérNrz(broken PNG file (bad header checksum in r7z(broken PNG file (incomplete checksum in ) rr>Úcrc_skipr1r<r3r:r?r@ÚstructÚerror)r5rAr/Zcrc1Zcrc2Úer+r+r,rH½s zChunkStream.crccCs|jjdƒdS)z3Read checksum. Used if the C module is not presentrN)r3r:)r5rAr/r+r+r,rRÓszChunkStream.crc_skipóIENDcCszg}xpy|jƒ\}}}Wn.tjk rF}ztdƒ|‚WYdd}~XnX||krRP|j|tj|j|ƒƒ|j|ƒqW|S)Nztruncated PNG file) r:rSrTÚOSErrorrHrÚ _safe_readr3rI)r5ZendchunkZcidsrArBrCrUr+r+r,ÚverifyØszChunkStream.verifyN)rV) Ú__name__Ú __module__Ú __qualname__r6r:rDrGrErJrPrHrRrYr+r+r+r,r2‘sr2c@seZdZdZeddd„ƒZdS)ÚiTXtzq Subclass of string to allow iTXt chunks to look like strings while keeping their extra information NcCstj||ƒ}||_||_|S)zÇ :param cls: the class to use when creating the instance :param text: value for this key :param lang: language code :param tkey: UTF-8 version of the key name )ÚstrÚ__new__ÚlangÚtkey)ÚclsÚtextr`rar5r+r+r,r_ôs z iTXt.__new__)NN)rZr[r\Ú__doc__Ú staticmethodr_r+r+r+r,r]ísr]c@s6eZdZdZdd„Zd dd„Zddd „Zdd d „Zd S)ÚPngInfoz< PNG chunk container (for use with save(pnginfo=)) cCs g|_dS)N)Úchunks)r5r+r+r,r6 szPngInfo.__init__FcCs*||g}|r|jdƒ|jjt|ƒƒdS)a"Appends an arbitrary chunk. Use with caution. :param cid: a byte string, 4 bytes long. :param data: a byte string of the encoded data :param after_idat: for use with private chunks. Whether the chunk should be written after IDAT TN)rIrgÚtuple)r5rAr/Ú after_idatÚchunkr+r+r,Úadd s  z PngInfo.addÚcCs°t|tƒs|jddƒ}t|tƒs,|jddƒ}t|tƒsB|jddƒ}t|tƒsX|jddƒ}|rˆ|jd|d|d|dtj|ƒƒn$|jd|d|d|d|ƒdS) zùAppends an iTXt chunk. :param key: latin-1 encodable text key name :param value: value for this key :param lang: language code :param tkey: UTF-8 version of the key name :param zip: compression flag zlatin-1Ústrictzutf-8siTXtsósN)Ú isinstanceÚbytesÚencoderkr$Úcompress)r5ÚkeyÚvaluer`raÚzipr+r+r,Úadd_itxts        &zPngInfo.add_itxtc Cs¬t|tƒr"|j|||j|j|d�St|tƒs^y|jddƒ}Wn tk r\|j|||d�SXt|tƒst|jddƒ}|r”|jd|dt j |ƒƒn|jd|d|ƒdS) zæAppends a text chunk. :param key: latin-1 encodable text key name :param value: value for this key, text or an :py:class:`PIL.PngImagePlugin.iTXt` instance :param zip: compression flag )ruzlatin-1rmszTXtsstEXtrnN) ror]rvr`rarprqÚ UnicodeErrorrkr$rr)r5rsrtrur+r+r,Úadd_text7s    zPngInfo.add_textN)F)rlrlF)F)rZr[r\rdr6rkrvrxr+r+r+r,rfs   rfcs¼eZdZ‡fdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Z‡ZS)+Ú PngStreamcsRtƒj|ƒi|_i|_d|_d|_d|_d|_d|_d|_ d|_ d|_ d|_ dS)Nr)rr) Úsuperr6Úim_infoÚim_textÚim_sizeÚim_modeÚim_tileÚ im_paletteÚim_custom_mimetypeÚ im_n_framesÚ_seq_numÚ rewind_stateÚ text_memory)r5r3)Ú __class__r+r,r6Xs zPngStream.__init__cCs.|j|7_|jtkr*td|j›d�ƒ‚dS)Nz%Too much memory used in text chunks: z>MAX_TEXT_MEMORY)r…ÚMAX_TEXT_MEMORYr))r5Zchunklenr+r+r,Úcheck_text_memoryis zPngStream.check_text_memorycCs|jjƒ|j|jdœ|_dS)N)ÚinfoÚtileÚseq_num)r{Úcopyrrƒr„)r5r+r+r,Ú save_rewindqszPngStream.save_rewindcCs(|jd|_|jd|_|jd|_dS)Nr‰rŠr‹)r„r{rrƒ)r5r+r+r,Úrewindxs  zPngStream.rewindc Cs¾tj|j|ƒ}|jdƒ}tjd|d|…ƒtjd||ƒ||}|dkr\td|›d�ƒ‚yt||dd…ƒ}Wn:tk r–tj r�d}n‚Ynt j k r®d}YnX||j d<|S) NrnziCCP profile name %rzCompression method %srzUnknown compression method z in iCCP chunkrÚ icc_profile) rrXr3ÚfindrLrMr?r-r)r>r$rTr{)r5rBrCr*ÚiÚ comp_methodr�r+r+r,Ú chunk_iCCP}s"   zPngStream.chunk_iCCPc Cs€tj|j|ƒ}t|dƒt|dƒf|_y t|d|df\|_|_Wntk rXYnX|drld|j d<|dr|t d ƒ‚|S) Nrrré é rÚ interlaceé zunknown filter category) rrXr3r<r}Ú_MODESr~Ú im_rawmodeÚ Exceptionr{r?)r5rBrCr*r+r+r,Ú chunk_IHDR˜s  zPngStream.chunk_IHDRcCs`d|jkr"d|jd||jfg}n*|jdk r6d|jd<dd|j||jfg}||_||_t‚dS)NÚbboxruTÚ default_imager)rr)r{r™r‚r}rZim_idatÚEOFError)r5rBrCrŠr+r+r,Ú chunk_IDAT§s   zPngStream.chunk_IDATcCst‚dS)N)rž)r5rBrCr+r+r,Ú chunk_IEND´szPngStream.chunk_IENDcCs&tj|j|ƒ}|jdkr"d|f|_|S)Nrr)rrXr3r~r€)r5rBrCr*r+r+r,Ú chunk_PLTE¹s  zPngStream.chunk_PLTEcCs”tj|j|ƒ}|jdkrLtj|ƒr@|jdƒ}|dkrJ||jd<q�||jd<nD|jd krft|ƒ|jd<n*|jdkr�t|ƒt|d ƒt|d ƒf|jd<|S) NrrnrÚ transparencyr rrrrr)r rr) rrXr3r~Ú_simple_paletteÚmatchr�r{Úi16)r5rBrCr*r‘r+r+r,Ú chunk_tRNSÁs        zPngStream.chunk_tRNScCs$tj|j|ƒ}t|ƒd|jd<|S)Ngjø@Úgamma)rrXr3r<r{)r5rBrCr*r+r+r,Ú chunk_gAMAÖszPngStream.chunk_gAMAcCsBtj|j|ƒ}tjdt|ƒd|ƒ}tdd„|Dƒƒ|jd<|S)Nz>%dIrcss|]}|dVqdS)gjø@Nr+)Ú.0Úeltr+r+r,ú âsz'PngStream.chunk_cHRM..Z chromaticity)rrXr3rSÚunpackÚlenrhr{)r5rBrCr*Zraw_valsr+r+r,Ú chunk_cHRMÜszPngStream.chunk_cHRMcCs tj|j|ƒ}|d|jd<|S)NrZsrgb)rrXr3r{)r5rBrCr*r+r+r,Ú chunk_sRGBåszPngStream.chunk_sRGBcCsjtj|j|ƒ}t|dƒt|dƒ}}|d}|dkrP|d|df}||jd<n|dkrf||f|jd<|S)Nrrrrg¦ F%uš?ÚdpiZaspect)rrXr3r<r{)r5rBrCr*ÚpxÚpyZunitr°r+r+r,Ú chunk_pHYsðs zPngStream.chunk_pHYsc CsŽtj|j|ƒ}y|jddƒ\}}Wntk r>|}d}YnX|rŠ|jddƒ}|jddƒ}|dkrh|n||j|<||j|<|jt |ƒƒ|S)Nrnrózlatin-1rmÚreplaceÚexif) rrXr3Úsplitr)rOr{r|rˆr­)r5rBrCr*ÚkÚvZv_strr+r+r,Ú chunk_tEXtýs    zPngStream.chunk_tEXtcCsütj|j|ƒ}y|jddƒ\}}Wntk r>|}d}YnX|rN|d}nd}|dkrjtd|›d�ƒ‚yt|dd…ƒ}Wn:tk r tjršd}n‚Yntj k r¸d}YnX|rø|j ddƒ}|j dd ƒ}||j |<|j |<|j t|ƒƒ|S) Nrnrr´rzUnknown compression method z in zTXt chunkzlatin-1rmrµ)rrXr3r·r)r?r-r>r$rTrOr{r|rˆr­)r5rBrCr*r¸r¹r’r+r+r,Ú chunk_zTXts2     zPngStream.chunk_zTXtc $Csjtj|j|ƒ}}y|jddƒ\}}Wntk r:|SXt|ƒdkrL|S|d|d|dd…}}}y|jddƒ\}} } Wntk r–|SX|dkrð|dkrìy t| ƒ} Wqðtk rÔtjrÎ|S‚Yqðtj k rè|SXn|Sy4|j ddƒ}|j ddƒ}| j ddƒ} | j ddƒ} Wnt k �r:|SXt | || ƒ|j |<|j|<|jt| ƒƒ|S)Nrnrrrzlatin-1rmzutf-8)rrXr3r·r)r­r-r>r$rTrOrwr]r{r|rˆ) r5rBrCÚrr*r¸ZcfÚcmr`Ztkr¹r+r+r,Ú chunk_iTXt3sB      zPngStream.chunk_iTXtcCs tj|j|ƒ}d||jd<|S)NsExifr¶)rrXr3r{)r5rBrCr*r+r+r,Ú chunk_eXIf\szPngStream.chunk_eXIfcCsrtj|j|ƒ}|jdk r,d|_tjdƒ|St|ƒ}|dksD|dkrRtjdƒ|S||_t|dƒ|jd<d|_|S)Nz4Invalid APNG, will use default PNG image if possiblerlrÚloopz image/apng) rrXr3r‚ÚwarningsÚwarnr<r{r�)r5rBrCr*Ún_framesr+r+r,Ú chunk_acTLbs   zPngStream.chunk_acTLc Cstj|j|ƒ}t|ƒ}|jdkr(|dks@|jdk rH|j|dkrHtdƒ‚||_t|dƒt|dƒ}}t|dƒt|dƒ}}|j\} } ||| ksœ||| kr¤tdƒ‚||||||f|jd <t|d ƒt|d ƒ} } | dkràd } t | ƒt | ƒd |jd<|d|jd<|d|jd<|S)Nrrz#APNG contains frame sequence errorsrrr•rzAPNG contains invalid framesrœééédièÚdurationéÚdisposaléÚblend) rrXr3r<rƒr?r}r{r¥Úfloat) r5rBrCr*ÚseqÚwidthÚheightr±r²Zim_wZim_hZ delay_numZ delay_denr+r+r,Ú chunk_fcTLqs& zPngStream.chunk_fcTLcCsFtj|jdƒ}t|ƒ}|j|dkr,tdƒ‚||_|j|d|dƒS)Nrrz#APNG contains frame sequence errors)rrXr3r<rƒr?rŸ)r5rBrCr*rÎr+r+r,Ú chunk_fdAT‡s zPngStream.chunk_fdAT)rZr[r\r6rˆr�rŽr“r›rŸr r¡r¦r¨r®r¯r³rºr»r¾r¿rÄrÑrÒÚ __classcell__r+r+)r†r,ryWs*     ")rycCs|dd…tkS)Nr)Ú_MAGIC)Úprefixr+r+r,Ú_accept”srÖcsŠeZdZdZdZdd„Zedd„ƒZdd„Zd d „Z dd d „Z dd„Z dd„Z dd„Z dd„Zdd„Z‡fdd„Zdd„Zdd„Z‡ZS)Ú PngImageFileZPNGzPortable network graphicsc CsÒt|jjdƒƒstdƒ‚|j|_d|_g|_t|jƒ|_xž|jjƒ\}}}y|jj |||ƒ}Wnft k rtPYnRt k rÄt j d|||ƒtj|j|ƒ}|dd…jƒrÀ|jj||fƒYnX|jj||ƒq:W|jj|_|jj|_|jj|_d|_|jj|_|jj|_|jj�pd|_|jj ddƒ|_!|jj"�rT|jj"\}}t#j$||ƒ|_%|d k�rj|d |_&n||_&|jjdk �rÂd|_'|jj(ƒ|j&|_)|jj*ƒ|_+|j!�r¸|jd7_|j,dƒ|jdk|_-dS) Nrznot a PNG filerz%r %s %s (unknown)rrr�FsfdATr).rÖr3r:r?Ú_PngImageFile__fpÚ_PngImageFile__frameÚprivate_chunksryÚpngrPržÚAttributeErrorrLrMrrXÚislowerrIrHr~Úmoder}Ú_sizer{r‰Ú_textrrŠr�Zcustom_mimetyper‚rÃÚgetr�r€rÚrawÚpaletteÚ_PngImageFile__prepare_idatZ!_close_exclusive_fp_after_loadingr�Ú_PngImageFile__rewind_idatr;Ú_PngImageFile__rewindÚ_seekÚ is_animated)r5rArBrCr*Úrawmoder/r+r+r,Ú_open¡sR             zPngImageFile._opencCsD|jdkr>|jr&|j}|j|jdƒ|jƒ|jr>|j|ƒ|jS)Nr)ràrèrÙr9rÃÚload)r5Úframer+r+r,rcås  zPngImageFile.textcCsZ|jdkrtdƒ‚|jj|jdddƒ|jjƒ|jjƒ|jrP|jjƒd|_dS)zVerify PNG fileNz)verify must be called directly after openrrr)r3Ú RuntimeErrorr9rŠrÛrYrEZ _exclusive_fp)r5r+r+r,rYôs    zPngImageFile.verifycCs’|j|ƒsdS||jkr$|jddƒ|j}xbt|jd|dƒD]J}y|j|ƒWq@tk rˆ}z|j|ƒtdƒ|‚WYdd}~Xq@Xq@WdS)NrTrzno more images in APNG file)Z _seek_checkrÙrçÚrangeržr9)r5rìZ last_frameÚfrUr+r+r,r9s    zPngImageFile.seekFcCs|dkrª|rZ|jj|jƒ|jjƒ|j|_d|_|jr>d|_|jj |_ |jj |_ |j|_ d|_d|_|j jddƒ|_|j jdƒ|_|j jdƒ|_|j jdƒ|_d|_�nÒ||jdkrÆtd|›�ƒ‚|jƒ|jræ|jj|j|jƒ|jjƒ|_|j|_ |j�rtj|j |jƒd|_d}�x|j jd ƒy|jjƒ\}}}Wntjtfk �r^PYnX|d k�rrt d ƒ‚|d k�rŽ|�rŠtd ƒ‚d}y|jj!|||ƒWnŒt"k �rºPYnvt k �rü|dk�rê|d 8}|�rê||_Ptj|j |ƒYn4t#k �r.t$j%d|||ƒtj|j |ƒYnX�q W||_|jj |_ |j jdƒ|_|j jdƒ|_|j jdƒ|_|j �s|t ‚|jdk�rš|jt&k�ršt'|_|jt&k�rÆ|jjƒ|_|j(|j|jƒ|_n:|jt'k�rút)j*j+|j,|j-ƒ|_|j(|j|jƒ|_nd|_dS)Nrr�FrÊrÌrœrzcannot seek to frame rsIENDzNo more images in APNG filesfcTLzAPNG missing frame dataTsfdATz%r %s %s (unknown)).rØr9rærÛrŽråräÚimÚpyaccessr{r‰rrŠr3Ú_prev_imÚdisposerár�Z dispose_opÚblend_opÚdispose_extentrÙr)rëÚpasterŒrrXr:rSrTr?ržrPÚUnicodeDecodeErrorrÜrLrMÚAPNG_DISPOSE_OP_PREVIOUSÚAPNG_DISPOSE_OP_BACKGROUNDÚ_croprÚcoreÚfillrÞÚsize)r5rìrŽZ frame_startrArBrCr+r+r,rçsŽ             zPngImageFile._seekcCs|jS)N)rÙ)r5r+r+r,r;lszPngImageFile.tellcCs0|jjdƒr|jd|_|j|_tjj|ƒdS)z"internal: prepare to read PNG filer–rN)r)r‰ráZ decoderconfigräÚ_PngImageFile__idatrÚ load_prepare)r5r+r+r,rÿos  zPngImageFile.load_preparec CsÀxŠ|jdkrŠ|jjdƒ|jjƒ\}}}|dkrD|jj|||ƒdS|dkr‚y|jj|||ƒWntk rtYnX|d|_q||_qW|dkrœ|j}n t||jƒ}|j||_|jj|ƒS)zinternal: read more image datarróIDATóDDATófdATr´)rrr)rþr3r:rÛrJrPržÚmin)r5Z read_bytesrArBrCr+r+r,Ú load_readxs$      zPngImageFile.load_readcCs¼|jdkr|jj|jƒ�x&|jjdƒy|jjƒ\}}}Wntjtfk rXPYnX|dkrfPn&|dkrŒ|jrŒd|_|jj |||ƒPy|jj |||ƒWqt k r¶PYqt k ræ|dkrÔ|d8}t j|j|ƒYqtk �r<tjd|||ƒt j|j|ƒ}|dd…jƒ�r8|jj||d fƒYqXqW|jj|_|j�sf|jjƒd |_nR|j�r¸|jtk�r¸|j|j|jƒ}|jj||j|jd ƒƒ|j|_|j �r¸d |_ d S) z%internal: finished reading image datarrsIENDsfcTLsfdATz%r %s %s (unknown)rrTNr)!rþr3r:rÛrSrTr?rèrärJrPr÷ržrrXrÜrLrMrÝrÚrIr|ràrEròrôÚAPNG_BLEND_OP_OVERrúrðrõröÚconvertrñ)r5rArBrCr*Úupdatedr+r+r,Úload_end™sL    zPngImageFile.load_endcCs6d|jkr|jƒd|jkr*d|jkr*dS|jƒjƒS)Nr¶zRaw profile type exif)r‰rëÚgetexifZ_get_merged_dict)r5r+r+r,Ú_getexifÈs  zPngImageFile._getexifcsd|jkr|jƒtƒjƒS)Nr¶)r‰rërzr )r5)r†r+r,r Ïs zPngImageFile.getexifcCsd|jkr|j|jdƒSiS)z˜ Returns a dictionary containing the XMP tags. Requires defusedxml to be installed. :returns: XMP tags in a dictionary. zXML:com.adobe.xmp)r‰Z_getxmp)r5r+r+r,ÚgetxmpÕszPngImageFile.getxmpcCsBz4y|j|jkr|jjƒWntk r0YnXWdd|_XdS)N)rØr3rErÜ)r5r+r+r,Ú _close__fpás   zPngImageFile._close__fp)F)rZr[r\ÚformatZformat_descriptionrêÚpropertyrcrYr9rçr;rÿrrr r r r rÓr+r+)r†r,rלsD  Z !/  r×óúL;1óóóóóóóóóóó)r zL;1zL;2zL;4rrrzI;16zP;1zP;2zP;4rrrcGsJdj|ƒ}|jtt|ƒƒ|ƒ|j|ƒt|t|ƒƒ}|jt|ƒƒdS)z'Write a PNG chunk (including CRC field)r´N)ÚjoinÚwriteÚo32r­r1)r3rAr/rHr+r+r,Úputchunks   rc@seZdZdd„Zdd„ZdS)Ú_idatcCs||_||_dS)N)r3rj)r5r3rjr+r+r,r6sz_idat.__init__cCs|j|jd|ƒdS)NsIDAT)rjr3)r5r/r+r+r,rsz _idat.writeN)rZr[r\r6rr+r+r+r,r  sr c@seZdZdd„Zdd„ZdS)Ú_fdatcCs||_||_||_dS)N)r3rjr‹)r5r3rjr‹r+r+r,r6sz_fdat.__init__cCs*|j|jdt|jƒ|ƒ|jd7_dS)NsfdATr)rjr3rr‹)r5r/r+r+r,rsz _fdat.writeN)rZr[r\r6rr+r+r+r,r!sr!cCsX|jjd|jjdƒƒ}|jjd|jjddƒƒ}|jjd|jjddƒƒ}|jjd|jjdtƒƒ}|jjd|jjdtƒƒ}|r�tj|jjdgƒƒ} ntj|g|jjdgƒƒ} g} d} �x| D�]} �xtj| ƒD�]ð} | j ƒ} | j |j k�r|j dk�r| j |j |j d �} n | j |j ƒ} |jj ƒ}t |ttfƒ�r:|| |d<t |ttfƒ�rV|| |d<t |ttfƒ�rr|| |d<| d 7} | �r¨| d}|d jdƒ}|d jdƒ}|tk�rÀt| ƒd k�rÀt}|tk�r|d }tjjd|jdƒ}|d}|�rþ|j|ƒ}n d|j}|j||ƒn |tk�r.| dd }n|d }tj| j dƒ|j dƒƒ}|jƒ}| �r¬||jdƒk�r¬||jdƒk�r¬t |ttfƒrÌ|d d|d7<qÌnd}| j| ||dœƒqÌWq¸W||dtt| ƒƒt|ƒƒ|�r tj|t ||ƒdd|jd|fgƒd}�xBt!| ƒD�]4\}}|d } |d�sBd| j}n|d}| j|ƒ} | j}|d }t"t#|jd|ƒƒƒ}|jd|ƒ}|jd|ƒ}||dt|ƒt|dƒt|d ƒt|dƒt|d ƒt$|ƒt$dƒt%|ƒt%|ƒƒ |d 7}|dk�r| �rtj| t ||ƒdd| jd|fgƒn0t&|||ƒ}tj| |dd| jd|fgƒ|j'}�qWdS)Nr�rÈrrÀrÊrÌZ append_imagesr)rãrÚ encoderinforrðrrœr)rðrœr"sacTLrusfcTLièéÿÿÿÿ)rrrr)rréþÿÿÿ)rr)rr)rr)rr)(r"rár‰ÚAPNG_DISPOSE_OP_NONEÚAPNG_BLEND_OP_SOURCEÚ itertoolsÚchainrÚIteratorrŒrÞrrãroÚlistrhrør­rùrrûrürýZcroprörZsubtract_moduloZgetbboxrIrrÚ_saver Ú enumerateÚintÚroundÚo16r r!r‹)rðr3rjrér�rÈrÀrÊrÌr(Z im_framesZ frame_countZim_seqZim_framer"ZpreviousZ prev_disposalZ prev_blendZbase_imrórœÚdeltar‹rìZ frame_datarýZframe_durationZframe_disposalZ frame_blendZ fdat_chunksr+r+r,Ú_write_multiple_frames$s            $           r1cCst|||dd�dS)NT)Úsave_all)r+)rðr3Úfilenamer+r+r,Ú _save_all£sr4FcCsˆ|j}|dkr’d|jkr.td|jd>dƒ}n.|jrXttt|jjƒdƒddƒdƒ}nd}|dkr’|dkrrd}n|dkr€d}nd}|›d |›�}|jjd d ƒ|jjd d?ƒ|jjd d@ƒ|jjddƒf|_yt |\}}Wn6t k �r} zt d|›d�ƒ| ‚WYdd} ~ XnX|j t ƒ||dt|jdƒt|jdƒ|dddƒdddddg} |jjd|jjdƒƒ} | �ršd} | dtj| ƒ} ||d| ƒ| jdƒ|jjdƒ}|�rDdd d!d"g}xŠ|jD]€}|dd…\}} || k�rö| j|ƒ|||| ƒnH||k�r|||| ƒn0|dd…jƒ�rÀ|dd…}|�sÀ|||| ƒ�qÀW|jdk�r–|d}|jjd#ƒd|…}xt|ƒ|k�rˆ|d7}�qnW||d$|ƒ|jjd%|jjd%dƒƒ}|�s¾|dk�rž|jdk�r"|}t|tƒ�rð||d&|d|…ƒn0tdtd'|ƒƒ}d(|d}||d&|d|…ƒnz|jdAk�rPtdtd,|ƒƒ}||d&t|ƒƒnL|jd#k�rˆ|\}}}||d&t|ƒt|ƒt|ƒƒnd%|jk�ràt d-ƒ‚nB|jdk�rà|jjƒd.k�rà|jjd.d/ƒ}|}||d&|d|…ƒ|jjd0ƒ}|�r*||d1tt|dd2d3ƒƒtt|dd2d3ƒƒd4ƒ|�rzd5d6g} x@|jD]6}|dd…\}} || k�r@| j|ƒ|||| ƒ�q@W|jjd7|jjd7ƒƒ}|�rÒt|tjƒ�r®|jd8ƒ}|j d9ƒ�rÆ|d:d…}||d;|ƒ|�rèt!||||ƒn$t"j#|t$||ƒdƒ�r„|j&ƒdS)CNrÚbitsrérrrrú;ÚoptimizeFZcompress_levelÚ compress_typeÚ dictionaryr´zcannot write mode z as PNGsIHDRrrnscHRMsgAMAssBITssRGBstIMEr�s ICC ProfilessiCCPZpnginfossPLTsiTXtstEXtszTXtrsPLTEr¢stRNSéÿóÿr rriÿÿz%cannot use transparency for this moderÚAr°spHYsg¦ F%uš?gà?ósbKGDshISTr¶rsExifr!seXIfrusIENDÚflushr#r#)r rr)rr)'rÞr"rrãÚmaxr­ZgetdataráZ encoderconfigÚ _OUTMODESÚKeyErrorrWrrÔrrýr‰r$rrÚremovergrÝrðZ getpaletterorpr/Zgetpalettemoder-rZExifÚtobytesÚ startswithr1rr+r Úhasattrr?)rðr3r3rjr2rÞZcolorsr5rérUrgZiccÚnamer/r‰Zchunks_multiple_allowedZ info_chunkrAriZpalette_byte_numberZ palette_bytesr¢Z alpha_bytesÚalphaZredZgreenZbluer°r¶r+r+r,r+§sæ $   $                    "          $    r+c KsBGdd„dƒ}dd„}|ƒ}z||_t||d|ƒWd|`X|jS)z4Return a list of PNG chunks representing this image.c@s eZdZgZdd„Zdd„ZdS)zgetchunks..collectorcSsdS)Nr+)r5r/r+r+r,r_sz"getchunks..collector.writecSs|jj|ƒdS)N)r/rI)r5rjr+r+r,rIbsz#getchunks..collector.appendN)rZr[r\r/rrIr+r+r+r,Ú collector\srIcWs0dj|ƒ}tt|t|ƒƒƒ}|j|||fƒdS)Nr´)rrr1rI)r3rAr/rHr+r+r,rIes zgetchunks..appendN)r"r+r/)rðÚparamsrIrIr3r+r+r,Ú getchunksYs rKz.pngz.apngz image/png)rr)r r )rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr )rr!)rr)rr!)rr")r)r r)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)rr)>r'ÚloggingÚrerSrÁr$rlrrrrrZ_binaryrr¥r r<r r r/r rÚ getLoggerrZrLÚcompiler¤r=rÔr˜r£Z SAFEBLOCKr'r‡r%rùrør&rr-r1r2r^r]rfryrÖr×rArr r!r1r4r+rKZ register_openr Z register_saveZregister_save_allZregister_extensionsZ register_mimer+r+r+r,Ú"s˜         \T?V   3