
    9c                      Z    d dl Z d dlZd dlmc mZ d dl d dlmZmZm	Z	  G d de      Z
y)    N)*)ModuleOptionKwargc                   |   e Zd ZddddZddgZdZdZd	Zd
ZdZ	 e
ddddid       e
ddddid       e
ddddid       e
ddddid       e
ddd did!       e
d"d#d#did$      gZ edd%&       edd%&       edd%&       ed#d%&       ed d%&       edd%&      gZd'Zd(gZd1d)Zd1d*Zd+ Zd, Zd- Zd. Zd/ Zy0)2HexDiff313234)redgreenblue\/   r   ~z0x%.8X    %szBinary DiffingWhexdumpenabledTz+Perform a hexdump / diff of a file or files)shortlongkwargsdescriptionGr   
show_greenzBOnly show lines containing bytes that are the same among all filesir   show_redzCOnly show lines containing bytes that are different among all filesUr   	show_bluezDOnly show lines containing bytes that are different among some filesusimilar	show_samez6Only display lines that are the same between all fileswtersez=Diff all files, but only display a hex dump of the first fileF)namedefaultz%s
displayc                     |S N )selfccolorbolds       9/usr/lib/python3/dist-packages/binwalk/modules/hexdiff.py_no_colorizezHexDiff._no_colorize@   s        c                     g }|j                  | j                  |          |r|j                  d       ddj                  |      d|dS )N1[;mz[0m)appendCOLORSjoin)r+   r,   r-   r.   attrs        r/   	_colorizezHexDiff._colorizeC   s?    DKK&'KK&)hhtna88r1   c                     d| j                   d   z   dz   }d| j                   d   z   dz   }d| j                   d   z   dz   }| j                  r||v ry| j                  r||v ry| j                  r||v ryy)Nr4   r   r5   r   r   TF)r8   r   r   r   )r+   datar   r   r   s        r/   _color_filterzHexDiff._color_filterL   s}    E**S0$++g..4V,,s2>>ddl__$]]sd{r1   c                    d}t        |      D ]N  \  }}d}t        |      D ]  \  }}	||k(  r	 ||   |	|   k7  r|dz  } |t        |      dz
  k(  rd}F|dkD  sLd} n | j                  dt	        |      z  |      }|t
        j                  vs|t
        j                  v rd}| j                  ||      }||fS # t        $ r}
|dz  }Y d }
~
d }
~
ww xY w)Nr   r      r   r   z%.2X.)iterator
IndexErrorlencolorizeordstring	printable
whitespace)r+   target_databyteoffsetr-   fp_idata_i
diff_countfp_jdata_jehexbyte	asciibytes                r/   hexasciizHexDiff.hexasciiZ   s    &{3 	NT6J"*;"7 $v4<$f~7"a
$ S-11a#	& --T 2E:v'''463D3D+DDMM$.	##! " $!OJ$s   B99	CCCc                    d }d }d}d}d| j                   _        t        dt        |            D ][  }||   j                  | j                   j                  kD  s*||   j                  | j                   _        ||   | j                   _        ] 	 d}d}d}	i }
| j                  |dz     }|D ]+  }|j                  | j                        |
|<   |
|   r'|	dz  }	- |	t        |      k(  ry |D ]  }d}d}t        d| j                        D ]D  }|t        |
|         k\  rd}d}n| j                  |
|
|   |   |      \  }}|d|z  z  }|d	|z  z  }F ||d
|dz  }| j                  r n||d   k7  s||z  }|d|z  z  } j                  | j                  |z  z   }||k(  r| j                  dk(  r| j                  x}}n6| j                  |      s| j                  x}}n| j                   ||fz  }|dz  }|| j                  | j                  fvs9||k7  rH|| j                  | j                  fvs|| j                  | j                  fvr| j#                  |||       |}|}|dz  }| j                   xj$                  | j                  z  c_         )Nr   T    r@   XXrA   z%s z%sz ||z %s )rL   r   r'   )statustotalrangerD   sizefp
SEPERATORSreadblockrU   r$   rL   r"   SAME_DIFFERENCEr>   SKIPPED_LINECUSTOM_DISPLAY_FORMATresult	completed)r+   target_fileslast_raw_line	last_line
loop_count	sep_countr   linecurrent_raw_line
done_files
block_data	seperatorr`   hexline	asciilinerS   rT   rL   r'   s                      r/   
diff_fileszHexDiff.diff_filesy   s   	
	 q#l+, 	1AA##dkk&7&77$0O$8$8!!-a	1
 D!JJ	A6I" $!#!4
2!"~!OJ$ S.." /	q$**- 2AC
2//"&$'	/3}}ZTVXYIZ\]/^,)uw.G	!11I2 Wi88::b)) %,$FY..D1/4 YY$**z"9:F=0T^^t5K!%!5!55$''-!%!2!22$44~EQ	T..0D0DEE$&"4+<+<d>R>R*SSd&7&79M9M%NN6tWMI,M!OJKK!!TZZ/!{ r1   c                    t        | j                  | j                  | j                  g      sdx| _        x| _        | _        d| j                  j
                  _        | j                  j                  | _        | j                  s| j                  | _        g | _	        	 | j                  d      }|sn| j                  j                  |       1| j                  dz  dz   }| j                  rd}nt        | j                        }dd|z  |z  z   d	z   | _        | j                  D cg c]  }|j                   c}| _        | j                  r,t        | j                         dkD  r| j                   d
   | _        t#        t$        j&                  d      rXt$        j&                  j)                         r:t+        j,                         s&d
d l}|j1                          | j2                  | _        y | j6                  | _        y c c}w )NTF)close_previous   rX   r@   zOFFSET      z	%%-%ds   
r   isatty)anyr   r   r   configr'   fit_to_screenrc   DEFAULT_BLOCK_SIZEhex_target_files	next_filer7   r$   rD   HEADER_FORMATr%   HEADERhasattrsysstderrrz   common	MSWindowscurses	setuptermr;   rE   r0   )r+   fheader_width
file_countr`   r   s         r/   initzHexDiff.init   s    DMM4??DNNCD?CCDMCDOdn -2) [[&&
zz00DJ !#e4A%%,,Q/  

Q!+::JT223J+L(J68:>? *.)>)>?2rww?::#dkk*Q.++a.DK 3::x(SZZ->->-@IYIYI[ NNDM --DM @s   %G<c                     | j                   r<| j                          | j                  | j                          | j                          y y r)   )r   headerru   footer)r+   s    r/   runzHexDiff.run   s4      KKMOOD112KKM !r1   N)r   T)__name__
__module____qualname__r8   ra   r~   re   rd   rf   TITLEr   CLIr   KWARGSRESULT_FORMATRESULTr0   r;   r>   rU   ru   r   r   r*   r1   r/   r   r      s[    F JLO*E 	S $'H	J 	S#T*_	a 	S!4(`	b 	S"D)a	c 	S"D)S	U 	SoZ	\+C8 	:u-;.</7E*;.9e,F M[F9$>J0X,.\r1   r   )r   rG   binwalk.core.commoncorer   binwalk.core.compatbinwalk.core.moduler   r   r   r   r*   r1   r/   <module>r      s(    
  $ $ ! 5 5of or1   