
    
3j`             	          S SK rS SKrS SKrS SKJs  Jr  S SKJ	r
  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKJr   S SKrSrS SKJrJrJrJrJ r J!r!J"r"  S SK#J$r$  S SK%J&r&J'r'  S S	K(J)r)  S S
K*J+r+  S SK,J-r-J.r.J/r/  S SK0J1r1  S SK2JrJ3r3J4r4J5r5  S SK6J7r7  S SK8r8S SK9r9SSK:J;r;   S SK<J=r=J>r>  S SK?J@r@  \R                  R                  \R                  R                  \R                  R                  \D5      5      5      rE " S S5      rF " S S5      rG " S S\R                  5      rI " S S5      rJ " S S\R                  5      rK " S S5      rL " S S 5      rM " S! S"5      rN " S# S$\R                  5      rO " S% S&5      rP " S' S(5      rQ " S) S*5      rR " S+ S,5      rS " S- S.5      rT " S/ S05      rU " S1 S25      rV " S3 S45      rW " S5 S65      rX " S7 S85      rY " S9 S:5      rZ " S; S<5      r[ " S= S>5      r\ " S? S@5      r] " SA SB5      r^ " SC SD5      r_ " SE SF\'5      r`SG raSH rbSI rcSJ rdSK reSL rfSM rgSN rhSO \b\c\d\e\f\g\hSP.ri " SQ SR5      rj " SS ST5      rkSU rlSV rm " SW SX5      rn " SY SZ5      ro " S[ S\5      rp " S] S^5      rq " S_ S`5      rr " Sa Sb\R                  5      rs " Sc Sd5      rt " Se Sf5      ru " Sg Sh5      rv " Si Sj5      rw " Sk Sl5      rx " Sm Sn5      ry " So Sp5      rz " Sq Sr5      r{ " Ss St5      r| " Su Sv5      r} " Sw Sx5      r~ " Sy Sz5      r " S{ S|\R                  5      r " S} S~5      r " S S5      r " S S5      r " S S5      r " S S5      r " S S5      r " S S5      r " S S5      r " S S5      r " S S\R                  5      r " S S5      r " S S5      r " S S5      r " S S5      r " S S5      r " S S5      r " S S\R                  5      r " S S\R                  5      r " S S\R                  5      rg! \ a    \R4                  " S5        Sr GNf = f! \ a    Sr=Sr> GNf = f)    N)BytesIOTzOpenCV not installedF)	ImageGrab	ImageDraw	ImageFontImageImageOpsImageSequence	ImageStat)PngInfo)MAX_RESOLUTION	SaveImage	composite)args)ProgressBarcommon_upscaletiled_scale_multidim)model_management)io	InputImplTypesui)Fraction   )string_to_color)PromptServerBinaryEventTypes)ThreadPoolExecutorc                   >    \ rS rSr\S 5       rSrSrSrSr	S
S jr
S	rg)	ImagePass1   c                     0 SS0S.$ )NimageIMAGErequiredoptional ss    N/home/wildlama/comfy/ComfyUI/custom_nodes/ComfyUI-KJNodes/nodes/image_nodes.pyINPUT_TYPESImagePass.INPUT_TYPES2   s     
 	
    r$   passthroughKJNodes/imagez0
Passes the image through without modifying it.
Nc                     U4$ Nr)   )selfr#   s     r,   r0   ImagePass.passthroughB   s	    vr/   r)   r3   )__name__
__module____qualname____firstlineno__classmethodr-   RETURN_TYPESFUNCTIONCATEGORYDESCRIPTIONr0   __static_attributes__r)   r/   r,   r    r    1   s1    
 
 LHHKr/   r    c                   F    \ rS rSr\S 5       rSrSrSrSr	Sr
SrSS	 jrS
rg)
ColorMatchE   c                 <    SS/ SQSS04S.SSSS	S
S.4SSS04S.S.$ )Nr$   )mklhmreinhardmvgd
hm-mvgd-hm	hm-mkl-hmdefaultrD   )	image_refimage_targetmethodFLOAT      ?              $@{Gz?rJ   minmaxstepBOOLEANT)strengthmultithreadr&   r)   clss    r,   r-   ColorMatch.INPUT_TYPESF   sR     ( *V%Y  %#c$X\&]^ )It+<=
 	
r/   r1   r$   r#   
colormatchTab  
color-matcher enables color transfer across images which comes in handy for automatic  
color-grading of photographs, paintings and film sequences as well as light-field  
and stopmotion corrections.  

The methods behind the mappings are based on the approach from Reinhard et al.,  
the Monge-Kantorovich Linearization (MKL) as proposed by Pitie et al. and our analytical solution  
to a Multi-Variate Gaussian Distribution (MVGD) transfer in conjunction with classical histogram   
matching. As shown below our HM-MVGD-HM compound outperforms existing methods.   
https://github.com/hahnec/color-matcher/

c           	      @  ^^^^^^^^^ TS:X  a  U4$  SSK Jm  TR                  5       mUR                  5       nUR	                  S5      mUR                  5       mTR                  5       mTR                  5       mTR                  5       mUUUUUUUUU4	S jnU(       ae  TS:  a_  [        [        R                  " 5       =(       d    ST5      n[        US9 n	[        U	R                  U[        T5      5      5      n
S S S 5        O [        T5       Vs/ s H
  o" U5      PM     n
n[        R                  " W
SS9R!                  [        R"                  5      n
U
R%                  SS5        U
4$ ! [         a  n[        S5      UeS nAff = f! , (       d  f       Ns= fs  snf )Nr   ColorMatchergCan't import color-matcher, did you install requirements.txt? Manual install: pip install color-matcherc                   >	 T" 5       nTS:X  a  TOTU    R                  5       nTR                  S5      S:X  a  T	OT
U    R                  5       n UR                  X#TS9nTS:w  a
  UTXB-
  -  -   n[        R                  " U5      $ ! [
         a<  n[        R                  " SU  SU 35        [        R                  " U5      s S nA$ S nAff = f)N   r   srcrefrM   Thread  error: )numpysizetransfertorch
from_numpy	Exceptionloggingwarning)icmimage_target_np_iimage_ref_np_iimage_resultera   
batch_sizerK   image_ref_np
images_refimages_targetimages_target_nprM   rX   s         r,   process&ColorMatch.colormatch.<locals>.process}   s    B4>!O 0WXIYI_I_Ia-6^^A->!-C\TUI\I\I^N	;!{{/@]c{dq=#4x<Cc7d#dL''55 ;'!HQC 89''(9::;s   5B 
C1C CCrd   max_workersdim)color_matcherra   ImportErrorcpurk   squeezerj   rT   os	cpu_countr   listmaprangerm   stacktofloat32clamp_)r4   rK   rL   rM   rX   rY   rw   r}   max_threadsexecutoroutrr   ra   rx   ry   rz   r{   r|   s    ` ``       @@@@@@r,   r^   ColorMatch.colormatchi   sk   q= ?"	P2 MMO	#'')!&&q)
$,,.&&(
!'')(..0	; 	; :>blln1:>K#<8<<z1BCD =< (-Z'89'8!71:'8C9kk#1%((7

1avK  	P  H  I  OP  P	P< =< :s)   E, %F
F,
F6FF

Fr)   NrO   T)r6   r7   r8   r9   r:   r-   r=   r;   RETURN_NAMESr<   
DEPRECATEDr>   r^   r?   r)   r/   r,   rA   rA   E   s;    
 
 HLLHJK,r/   rA   c                   T    \ rS rSr\S 5       r\SS\R                  4S jj5       rSr	g)ColorMatchV2   c                    [         R                  " SSS[         R                  R                  S5      [         R                  R                  S5      [         R                  R                  S/ SQSS	9[         R
                  R                  S
SSSSS9[         R                  R                  SSS9/[         R                  R                  SS9/S9$ )Nr   r1   a  
color-matcher enables color transfer across images which comes in handy for automatic  
color-grading of photographs, paintings and film sequences as well as light-field  
and stopmotion corrections.  

The methods behind the mappings are based on the approach from Reinhard et al.,  
the Monge-Kantorovich Linearization (MKL) as proposed by Pitie et al. and our analytical solution  
to a Multi-Variate Gaussian Distribution (MVGD) transfer in conjunction with classical histogram   
matching. As shown below our HM-MVGD-HM compound outperforms existing methods.   
https://github.com/hahnec/color-matcher/   

'reinhard_lab_gpu' method uses Kornia for GPU-accelerated color transfer in Lab color space.
rL   rK   rM   )rD   rE   rF   rG   rH   rI   reinhard_lab_gpurD   optionsrJ   rX   rO   rP   rQ   rR   rS   rY   TrJ   r#   display_namenode_idcategorydescriptioninputsoutputs)r   Schemar   InputComboFloatBooleanOutputrZ   s    r,   define_schemaColorMatchV2.define_schema   s    yy"$ ~.{+xl!  # z3CTPTU

   = W53
 	
r/   returnc           	      4  ^^^^^ ^! TS:X  a  [         R                  " T5      $ TS:X  Ga#  SS Kn[        R                  " 5       nTR
                  u  ppTR                  U5      R                  SSSS5      R                  5       nTR                  U5      R                  SSSS5      R                  5       nUR                  R                  U5      nUR                  R                  U5      nUR                  XS5      nUR                  UR
                  S   US5      n[        R                  " USSSS	9u  nn[        R                  " USSSS	9u  nnUR                  S
5      nUR
                  S   S:X  a,  US:  a&  UR                  USS5      nUR                  USS5      nUU-
  UU-  -  U-   nUR                  XX5      nUR                  R!                  U5      nST-
  U-  TU-  -   nUR                  SSSS5      R                  5       n[         R                  " UR#                  5       R%                  5       R'                  SS5      5      $  SSKJm   TR/                  S5      nTR/                  S5      m!U UUUU!U4S jnU(       ae  US:  a_  [1        [2        R4                  " 5       =(       d    SU5      n[7        US9 n[9        UR;                  U[=        U5      5      5      nS S S 5        O![=        U5       Vs/ s H  nU" U5      PM     nn[        R>                  " WSS9R                  [        R@                  5      R'                  SS5      n[         R                  " U5      $ ! [,         a  n[-        S5      UeS nAff = f! , (       d  f       N= fs  snf )Nr   r      rd   r   TF)r   keepdimunbiasedgư>rO   r`   rb   c                   > T" 5       nTU    R                  5       R                  5       nT[        U T
S-
  5         R                  5       R                  5       n UR                  X#T	S9nTS:w  a
  UTXB-
  -  -   n[        R
                  " U5      $ ! [         a<  n[        R                  " SU  SU 35        [        R
                  " U5      s S nA$ S nAff = f)Nrd   re   rh   ri   )	r   rj   rT   rl   rm   rn   ro   rp   error)rr   rs   image_target_npry   rv   rw   ra   rK   rL   rM   ref_batch_sizerX   s         r,   r}   %ColorMatchV2.execute.<locals>.process   s    B*1o11399;O$SNQ,>%?@DDFLLNL	9!{{Y_{`q=#2XA_5`#`L''55 9s(1#67''889s   5B 
C1C
CCr   r   )!r   
NodeOutputkorniar   get_torch_deviceshaper   permute
contiguouscolor
rgb_to_labviewrm   std_mean
clamp_min_expand
lab_to_rgbr   floatr   r   ra   r   rk   rT   r   r   r   r   r   r   r   r   )"r[   rL   rK   rM   rX   rY   r   deviceBHWCsrc_bchwref_bchwsrc_labref_labsrc_lab_flatref_lab_flatsrc_stdsrc_meanref_stdref_meancorrected_lab_flatcorrected_labcorrected_rgb_01r   rw   rx   r}   r   r   rr   ra   r   s"    ````                           @@r,   executeColorMatchV2.execute   s#    q===..''%668F%++JA!#v.66q!QBMMOH ||F+33Aq!Q?JJLHll--h7Gll--h7G"<<b1L"<<a(8!R@L %|T\a bGX %|T\a bGX((.G}}Q1$Q#??1b"5!..B3"."9g>O!PS[![.33A!?M  &||66}E>X-;K0KKC++aAq)446C==!2!9!9!Q!?@@	P2 "&&q)
"*	9 	9 :>blln1:>K#<8<<z1BCD =< (-Z'89'8!71:'8C9kk#1%((7>>q!D}}S!!;  	P  H  I  OP  P	P, =< :s*   M& ?%N:N&
N0M<<N
Nr)   Nr   
r6   r7   r8   r9   r:   r   r   r   r   r?   r)   r/   r,   r   r      s9    
 
> E"Y[YfYf E" E"r/   r   c                   H    \ rS rSrS r\S 5       rSrSrSr	Sr
SrSS
 jrSrg	)SaveImageWithAlpha   c                 T    [         R                  " 5       U l        SU l        SU l        g Noutput folder_pathsget_output_directory
output_dirtypeprefix_appendr4   s    r,   __init__SaveImageWithAlpha.__init__  !    &;;=	r/   c                 "    SSSSS04S.SSS	.S
.$ )Nr$   MASKSTRINGrJ   ComfyUI)imagesmaskfilename_prefixPROMPTEXTRA_PNGINFOpromptextra_pnginfor'   hiddenr)   r*   s    r,   r-   SaveImageWithAlpha.INPUT_TYPES  s1      +&(09i2H'IK &.P	 	r/   r)   save_images_alphaTr1   zF
Saves an image and mask as .PNG with the mask as the alpha channel. 
Nc           	      0  ^^ X0R                   -  n[        R                  " X0R                  US   R                  S   US   R                  S   5      u  mmpgn[        5       nUU4S jn	[        X5       GH  u  pSU
R                  5       R                  5       -  nSSUR                  5       R                  5       -
  R                  5       -  n[        R                  " [        R                  " USS5      R                  [        R                  5      5      n[        R                  " U5      R!                  UR"                  [        R$                  5      n[        R                  " USS5      R                  [        R                  5      nUR'                  [        R                  " USS95        S n[(        R*                  (       dh  [-        5       nUb&  UR/                  S	[0        R2                  " U5      5        Ub2  U H,  nUR/                  U[0        R2                  " UU   5      5        M.     U	" 5       S-   nT S
US S3nUR5                  [6        R8                  R;                  TU5      USS9  UR=                  UUU R>                  S.5        GM     SSU00$ )Nr   rd   c                     > Sn [        [        R                  " T5      5       HI  n[        R                  " T S3U5      nU(       d  M&  [        UR                  S5      5      nX0:  d  MG  Un MK     U $ )Nr   z_(\d+)_?\.[a-zA-Z0-9]+rd   )sortedr   listdirre	fullmatchintgroup)max_counterexisting_filematchfile_counterfilenamefull_output_folders       r,   r
  :SaveImageWithAlpha.save_images_alpha.<locals>.file_counter  sd    K!'

3E(F!G
2H%I=Y5#&u{{1~#6L#1&2 "H r/        o@rO      Lmoder   _05.png   pnginfocompress_levelr  	subfolderr   r   r   ) r   r   get_save_image_pathr   r   r   zipr   rj   r   r   	fromarraynpclipastypeuint8resizerk   LANCZOSputalphar   disable_metadatar   add_textjsondumpssaver   pathjoinappendr   )r4   r   r   r   r   r   counterr  resultsr
  r#   alpharr   aimg	a_resizedmetadataxfiler  r  s                      @@r,   r   $SaveImageWithAlpha.save_images_alpha  s]   ---LXLlLlm|  N  N  PV  WX  PY  P_  P_  `a  Pb  dj  kl  dm  ds  ds  tu  dv  MwIHg/&	  -LEuyy{((**Aeiik//1188::A//"''!Q"4";";BHH"EFC *11#((EMMJI	1c299"((CILL=>H(("9%%%h

60BC ,* ))!TZZa8H-IJ + #nq(GZqD1DHHRWW\\"4d;X^_H`NN &		 - .8 7,..r/   r   r   r   )ComfyUI_image_with_alphaNN)r6   r7   r8   r9   r   r:   r-   r;   r<   OUTPUT_NODEr=   r>   r   r?   r)   r/   r,   r   r      s=     
   L"HKHK./r/   r   c                   d    \ rS rSr\S 5       r\S\R                  4S j5       r\	SS j5       r
Srg)	ImageConcanateiH  c                    [         R                  R                  S[         R                  [         R                  /S9n[         R
                  " SSS[         R                  R                  SUS9[         R                  R                  S[         R                  [         R                  /S	9[         R                  R                  S
/ SQSS9[         R                  R                  SSS9/[         R                  R                  USS9/S9$ )Nimage_or_maskallowed_typesr<  r1   u  Concatenates image2 to image1 in the specified direction.
Both inputs accept IMAGE or MASK; the output type follows image1.
If image2 is a different type than image1 it's converted (RGB mean for image→mask,
channel-replicate for mask→image).
When match_image_size is False and dimensions don't match along the shared axis,
the smaller image is centered and zero-padded instead of erroring.image1templateimage2)types	directionrightdownleftuprH  r   match_image_sizeTr   r   rC  r   r   )r   	MatchTypeTemplater   Maskr   r   	MultiTyper   r   r   r[   type_templates     r,   r   ImageConcanate.define_schemaI  s     --obhhXZX_X_M`-ayy$$U ""8m"D""8BHHbgg3F"G{4S]de

  !3T B	 ##]#R#
 	
r/   r   c                 N    [         R                  " U R                  XX45      5      $ r3   )r   r   concatenate)r[   rA  rD  rF  rL  s        r,   r   ImageConcanate.executed  s    }}S__VYYZZr/   Nc           	      P   U R                  5       S:H  nU(       aD  UR                  5       S:X  a0  [        SUR                  S   5      nUSS U24   R                  SS9nOKU(       dD  UR                  5       S:X  a0  UR	                  S5      R                  SSSU R                  S   5      nU(       a"  U R	                  S5      n UR	                  S5      nU R                  S   nUR                  S   n[        Xx5      n	U R                  S   U R                  S   pU R                  S   UR                  S   p[        X5      nU(       a^  Ub  UOU R                  nUR                  S   UR                  S   -  nUS	;   a  US   n[        UU-  5      nO2US   n[        UU-  5      nOUR                  S   UR                  S   nnUS
;   a  [        U
U5      UU-   nnOU
U-   [        UU5      nnUS:X  a  UU
-
  S-  SUU-
  S-  U4u  nnnnOSUS:X  a  UU
-
  S-  UUU-
  S-  S4u  nnnnO5US:X  a  SUU-
  S-  U
UU-
  S-  4u  nnnnOUUU-
  S-  SUU-
  S-  4u  nnnn[        R                  " U	UUU4[        R                  " 5       [        R                  " 5       S9nS nUS S 2UUU
-   2UUU-   2S S 24   nXy:X  a
  U" UX5        O0U" US U X5        U" UUS  U SS  R                  X-
  SSS5      U5        AUS S 2UUU-   2UUU-   2S S 24   nU(       a  [        U	5      n[        R                  " 5       n[        U	5       H  n[        UUS-
  5      n UU U S-    R!                  USS9R#                  SSSS5      n![$        R&                  " U!UU4SSS9R#                  SSSS5      n"U" UUUS-    U"U5        A!A"UR)                  S5        M     O?X:X  a
  U" UX5        O0U" US U X5        U" UUS  USS  R                  X-
  SSS5      U5        AU(       a  UR+                  S5      $ U$ )Nr   r  r   .r   r   rd   r   )rJ  rH  )rH  rJ  rH  rJ  rI  dtyper   c                     U R                   S   U:X  a  U R                  U5        g U SS U24   R                  U5        U SUS 24   R                  S5        g )Nr   .rO   )r   copy_fill_)dstrf   src_Cs      r,   write)ImageConcanate.concatenate.<locals>.write  sQ    yy}%		#C%K &&s+CK &&s+r/   Tnon_blockingbicubic)rk   r  	antialias)r   rT   r   mean	unsqueezer   rU   r  rm   zerosr   intermediate_dtypeintermediate_devicer   r   r   r   r   Finterpolateupdater   )#rA  rD  rF  rL  first_image_shapeoutput_is_maskchbs1bs2r   H1W1C1C2out_Ctarget_shapeorig_aspectH2W2out_Hout_Wi1_yi1_xi2_yi2_xr   r`  slot1slot2pbarr   rr   src_iframeresizeds#                                      r,   rV  ImageConcanate.concatenateh  st     *fjjla/QR()BC"H%**r*2FFJJLA$5%%b)00RV\\"=MNF%%b)F%%b)Fll1oll1oMa&,,q/Bb!6<<#3BB0A0M,SYS_S_L ,,q/FLLO;K--!!_k)*!!_k)*\\!_fll1oB))r2;R5E57CBK5E&+bjQ%6EBJ1;Lb%P"D$d& &+bjQ%6URZA<Mq%P"D$d& %&(92
q?P%P"D$d%'%"*):A
q?P%P"D$due$"557#779
	, q$tby.$tby.!;<8%$%+v*%+vbc{11!'2r2FKq$tby.$tby.!;<q>D%668F1XAsQwuUQY/2262MUUVWYZ\]_`a--RH9X\]eefgijlmopqeAa!engr27A  xeV(eDSk6.eCDk6"#;#5#5agr2r#JBO>>"%%r/   r)   r3   )r6   r7   r8   r9   r:   r   r   r   r   staticmethodrV  r?   r)   r/   r,   r<  r<  H  sL    
 
4 [R]] [ [ Y Yr/   r<  c                   :    \ rS rSr\S 5       rSrSrSrSr	S r
Srg	)
ImageConcatFromBatchi  c                 2    SSSSSSSS.4SS	S
04SS	S04S.0$ )Nr'   r$   INTr   rd   r  rS   rW   rJ   F   )r   num_columnsrL  max_resolutionr)   r*   s    r,   r-    ImageConcatFromBatch.INPUT_TYPES  sC     !q3PQ#RS!*Y,> ?$y$&78	 
 	
r/   r$   concatr1   zZ
    Concatenates images from a batch into a grid with a specified number of columns.
    c                    UR                   u  pVpxXR-   S-
  U-  n	[        R                  " SU SU SU SU 35        [        R                  " SU	 SU 35        U(       a  US   R                   n
/ nU H  nUR                   S   nUR                   S   nX-  nUS:  a  U
S   n[        UU-  5      nOU
S   n[        UU-  5      n[        R                  " S	U S
U SU S
U S3	5        [	        UR                  SS5      UUSS5      nUR                  SS5      nUR                  U5        M     [        R                  " U5      nU
S S u  pgX-  nX'-  n[        R                  " SU SU 35        [        UU-  UU-  S5      nUU-  nUU-  n[        S[        [        US-  5      S-  5      5      n[        S[        [        US-  5      S-  5      5      n[        UU-
  5      S:  a'  [        S[        [        US-   S-  5      S-  5      5      n[        UU-
  5      S:  a'  [        S[        [        US-   S-  5      S-  5      5      nX-  nX'-  n[        R                  " SU SU 35        [        R                  " SU SU 35        [        R                  " UUU4UR                  S9n[        U5       H  u  nn[        R                   R"                  R%                  UR'                  S5      R)                  SSSS5      Xg4SS9R+                  5       R)                  SSS5      nUU-  nUU-  nUUUU-  US-   U-  2UU-  US-   U-  2S S 24'   M     UR'                  S5      4$ )Nrd   zInitial dimensions: batch_size=z	, height=z, width=z, channels=z	num_rows=z, num_columns=r   zResizing image from (, z) to ()r   lanczosdisabledr   z,Grid dimensions before scaling: grid_height=z, grid_width=rO      r  z+Grid dimensions after scaling: grid_height=zFinal image dimensions: height=rZ  r   bilinearrk   r  )r   rp   infor  r   movedimr-  rm   r   rT   rU   roundabsrh  rZ  	enumeratenn
functionalrl  rg  r   r   )r4   r   r  rL  r  rx   heightwidthchannelsnum_rowsrx  resized_imagesr#   original_heightoriginal_widthoriginal_aspect_ratiotarget_heighttarget_widthresized_imagegrid_height
grid_widthscale_factorscaled_heightscaled_widthgrididxrowcols                               r,   r  ImageConcatFromBatch.concat  s   .4ll+
E,q0[@6zl)F8S[\a[bbmnvmwxyy
.FG!!9??LN"'++a.!&Q(6(H%(1,$0OM#&}7L'L#ML#/?L$'7L(L$MM4_4ERGWW]^k]llno{n||}~ !/u}}R/C\S`bkmw x - 5 5a <%%m4#  ( [[0F(!,MF ' (
CK=P]^h]ijk >K7*9TVYZ -|+ QE-!"34q89:As5!12Q678}v%&*C}q'8A&= > BCDF|e#$q(3ulQ&6!%;<q@ABE ' (
B;-}]g\hij6vhhugNO{{KX>fllS#F+JC!HH//;;EOOA<N<V<VWXZ[]^`a<bjpix  @J;  K  S  S  U  ]  ]  ^_  ab  de  fM$C#CJWDVSUFN*CIs1uem,CQFG	 , ~~a !!r/   r)   N)r6   r7   r8   r9   r:   r-   r;   r<   r=   r>   r  r?   r)   r/   r,   r  r    s2    
 
 LHHKH"r/   r  c                   :    \ rS rSr\S 5       rSrSrSrSr	S r
Srg	)
ImageGridComposite2x2i"  c                     SSSSSS.0$ )Nr'   r$   )rA  rD  image3image4r)   r*   s    r,   r-   !ImageGridComposite2x2.INPUT_TYPES#  s         	
  	r/   r$   compositegridr1   z3
Concatenates the 4 input images into a 2x2 grid. 
c                     [         R                  " X4SS9n[         R                  " X44SS9n[         R                  " XV4SS9nU4$ Nr   r   rd   rm   cat)r4   rA  rD  r  r  top_row
bottom_rowr  s           r,   r  #ImageGridComposite2x2.compositegrid3  sB    ))V,!4YY/Q7
yy'.A6wr/   r)   Nr6   r7   r8   r9   r:   r-   r;   r<   r=   r>   r  r?   r)   r/   r,   r  r  "  s1      LHHKr/   r  c                   :    \ rS rSr\S 5       rSrSrSrSr	S r
Srg	)
ImageGridComposite3x3i9  c                     SSSSSSSSSSS.	0$ )Nr'   r$   )	rA  rD  r  r  image5image6image7image8image9r)   r*   s    r,   r-   !ImageGridComposite3x3.INPUT_TYPES:  s/             

 
 
	r/   r$   r  r1   z3
Concatenates the 9 input images into a 3x3 grid. 
c
                     [         R                  " XU4SS9n
[         R                  " XEU4SS9n[         R                  " XxU	4SS9n[         R                  " XU4SS9nU4$ r  r  )r4   rA  rD  r  r  r  r  r  r  r  r  mid_rowr  r  s                 r,   r  #ImageGridComposite3x3.compositegridO  s]    ))VV4!<))VV4!<YY7Q?
yy'J7Q?wr/   r)   Nr  r)   r/   r,   r  r  9  s1      LHHKr/   r  c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)ImageBatchTestPatterniW  c                    [         R                  " SSS[         R                  R                  SSSSSS9[         R                  R                  SS	S	SSS9[         R                  R                  S
SS	SSS9[         R                  R                  SSS	SSS9[         R                  R                  SSSSSS9[         R                  R                  SSSSSS9[         R                  R                  S[
        R                  " S5      S9[         R                  R                  SSSSSS9/[         R                  R                  SS9/S9$ )Nr  KJNodes/textzMGenerate a batch of images with sequential numbers rendered in a chosen font.rx   rd   r  rS   
start_fromr   text_xr   text_yr        r  fontkjnodes_fontsr   	font_sizer  r  r#   r   r   )	r   r   Intr   r   r   get_filename_listr   r   rZ   s    r,   r   #ImageBatchTestPattern.define_schemaX  s   yy+#g\1!AN\1!ANXst!LXst!LWcrt!LXs1Mv|/M/Mo/^_[#1$QO	 W5
 	
r/   r   c	           	      >   [         R                  " SU5      n	[        R                  " X5      n
Sn [        R
                  " [        R                  " SS5      5      R                  SSU
SS/S	9  [        R                  " SXV4SS9n[        R
                  " U5      n[        R                  " XUS4[        R                  S9n[        U5      n[        U5       H  nUR                  SSXV4SS9  [         R"                  " SS5      [         R"                  " SS5      [         R"                  " SS5      4n[%        UU-   5      nU(       a  UR                  Xx4UU
US/S	9  OUR                  Xx4UU
US9  [        R&                  " U5      UU'   UR)                  S5        M     [*        R,                  " U5      R/                  [0        R2                  " 5       [0        R4                  " 5       S9R7                  S5      n[8        R:                  " U5      $ ! [         a    S
n GNf = f)Nr  TRGB)rd   rd   r   r   0r   r   r   -ligar  fillfeaturesFblack)r   r   r  r   )r  r  r  r  rd   r   rZ  r  )r   get_full_pathr   truetyper   Drawr   newtextro   r  emptyr"  r   r   	rectanglerandomrandintstrasarrayrm  rm   rn   r   r   rj  ri  div_r   r   )r[   rx   r  r  r  r  r  r  r  	font_pathpil_fontuse_ligar#   drawout_bufr  rr   
font_colorr  
out_tensors                       r,   r   ImageBatchTestPattern.executem  s    ..E	%%i; 	NN599UF3499(gY :  		%%@~~e$((Jq9J:&z"ANNAq%0wN? ..C0&..C2H&..YZ\_J`aJzA~&D		6*Dxj\c[d	e		6*Dxj	QE*GAJKKN # %%g.11#779"557 2 
 $u+ 	 }}Z((9  	H	s   =H HHr)   Nr   r)   r/   r,   r  r  W  s6    
 
( &)`b`m`m &) &)r/   r  c                   N    \ rS rSr\S 5       rSrSrSrSr	Sr
\S 5       rS	 rS
rg)ImageGrabPILi  c                     g r3   r)   rZ   s    r,   
IS_CHANGEDImageGrabPIL.IS_CHANGED  s     	r/   r$   r]   	screencapr1   h
Captures an area specified by screen coordinates.  
Can be used for realtime diffusion with autoqueue.
c                 l    SSSSSSS.4SSSSSS.4SSSSSS.4SSSSSS.4SSSSSS.4S	S
SSSS.4S.0$ )Nr'   r  r   r  rd   rS   r  r  rN   皙?rP   rQ   rR   r5  yr  r  
num_framesdelayr)   r*   s    r,   r-   ImageGrabPIL.INPUT_TYPES  s     !1T1MN!1T1MN c4QR"ST!s!DRS#TU %1AcST'UV"3tUY$Z[
	 		r/   c                    [         R                   " 5       n/ nXX-   X$-   4n	[        U5       H  n
[        R                  " U	S9n[        R
                  " [        R                  " U[        R                  S9S-  5      R                  S5      nUR                  U5        US:  d  My  [         R                  " U5        M     [         R                   " 5       U-
  n[        R                  " SU S35        [        R                  " USS94$ )	N)bboxr  r  r   rd   zscreengrab took z	 seconds.r   )timer   r   grabrm   rn   r  arrayr   rg  r-  sleeprp   r  r  )r4   r5  r  r  r  r  r  
start_timecapturesr  r  screen_capturescreen_capture_torchelapsed_times                 r,   r  ImageGrabPIL.screencap  s    YY[
ai,z"A&^^6N#(#3#3BHH^SUS]S]4^af4f#g#q#qrs#t OO01 A~

5! # yy{Z/'~Y?@		(*,,r/   r)   Nr6   r7   r8   r9   r:   r  r;   r   r<   r=   r>   r-   r  r?   r)   r/   r,   r  r    sJ      LLHHK
 
 
-r/   r  c                   N    \ rS rSr\S 5       rSrSrSrSr	Sr
\S 5       rS	 rS
rg)Screencap_mssi  c                     [        S5      $ NNaNr   r+   kwargss     r,   r  Screencap_mss.IS_CHANGED      U|r/   r$   r]   r  r1   r	  c                 l    SSSSSSS.4SSSSSS.4SSSSSS.4SSSSSS.4SSSSSS.4S	S
SSSS.4S.0$ )Nr'   r  r   '  rd   rS   r  r  rN   r  rP   rQ   rR   r  r)   r*   s    r,   r-   Screencap_mss.INPUT_TYPES  s     !1UANO!1UANO c5RS"TU!s!EST#UV %1AcST'UV"3tUY$Z[
	 		r/   c                    SSK J n  / nU" 5        n	X!X4S.n
[        U5       H  nU	R                  U
5      n[        R                  " U5      n[
        R                  " US/ SQ4   5      R                  5       S-  nUR                  U5        US:  d  Mq  [        R                  " U5        M     S S S 5        [
        R                  " US5      4$ ! , (       d  f       N&= f)Nr   )mss)toprJ  r  r  .r   rd   r   r  rd   )r,  r   r  r  r  rm   rn   r   r-  r  r  r   )r4   r5  r  r  r  r  r  r,  r  sctr  r  sct_imgimg_np	img_torchs                  r,   r  Screencap_mss.screencap  s    Uc%JD:&((4.'*!,,VCN-CDJJLuT		*>JJu% '  Ha(** Us   A>CC
Cr)   Nr  r)   r/   r,   r  r    sJ      LLHHK
 
 
+r/   r  c                   R    \ rS rSr\S 5       rSrSrSrSr	Sr
\S 5       rS	rS
 rSrg)ScreencapStreami  c                     [        S5      $ r!  r#  r$  s     r,   r  ScreencapStream.IS_CHANGED  r'  r/   r$   r]   capturer1   az  
Captures a frame from a browser screen/window share stream.
Click 'Start capture' to select a screen or window to share.
Live preview is shown in the node. Works with auto-queue.

Crop controls:
- Drag on preview to draw a crop box
- Drag inside the box to move it
- Drag edges or corners to resize
- Shift+drag to lock aspect ratio
- Right-click or double-click to clear crop
c           	      H    SSSSS.4SSS[         SS.4SSS[         SS.4S	.0$ )
Nr'   r   r   FrJ   	multiliner  rd   rS   )
frame_data
crop_widthcrop_heightr   r*   s    r,   r-   ScreencapStream.INPUT_TYPES  sG     'Re)LM$!An^_&`a %1Q~_`'ab
 	
r/   i   c                 r   U(       d-  US:  a  UOSnUS:  a  UOSn[         R                  " SXTS5      4$ [        U5      U R                  :  a  [	        SU R                  S-   S35      e [
        R                  " UR                  SS5      S	   5      n[        R                  " [        U5      5      R                  S5      n[        R                  " U5      R                  [        R                   5      S-  n[         R"                  " U5      R%                  S5      n	U	4$ ! [         a    [	        S
5      ef = f)Nr   r  rd   r   zFrame data exceeds    zMB limit,r   zInvalid frame data encodingr  r  )rm   rh  lenMAX_FRAME_BYTES
ValueErrorbase64	b64decodesplitro   r   openr   convertr  r  r!  r   rn   rg  )
r4   r=  r>  r<  wh	img_bytesr2  r1  
img_tensors
             r,   r8  ScreencapStream.capture  s   (1n
#A*QCAKK1+--z?T111243G3GI3V2WW_`aa	<(()9)9#q)A")EFI jj+,44U;#%%bjj1E9%%f-77:
}  	<:;;	<s   +)D   D6r)   N)r6   r7   r8   r9   r:   r  r;   r   r<   r=   r>   r-   rE  r8  r?   r)   r/   r,   r5  r5    sQ      LLHHK 
 
 'Or/   r5  c                   N    \ rS rSr\S 5       rSrSrSrSr	Sr
\S 5       rS	 rS
rg)WebcamCaptureCV2i'  c                     g r3   r)   rZ   s    r,   r  WebcamCaptureCV2.IS_CHANGED)  s    r/   r$   r]   r8  KJNodes/experimentalz`
Captures a frame from a webcam using CV2.  
Can be used for realtime diffusion with autoqueue.
c                 f    SSSSSSS.4SSSSSS.4SSSSSS.4SSSSSS.4SSSSSS.4S	S
S04S.0$ )Nr'   r  r   r  rd   rS   r  r  rW   rJ   F)r5  r  r  r  	cam_indexreleaser)   r*   s    r,   r-   WebcamCaptureCV2.INPUT_TYPES6  s{     !1T1MN!1T1MN c4QR"ST!s!DRS#TU$!1SRS&TU&E(:;	
 		
r/   c                    [        U S5      (       a  U R                  b  U R                  U:w  a  [        U S5      (       a'  U R                  b  U R                  R                  5         X0l        [        R
                  " U5      U l         U R                  R                  [        R                  U5        U R                  R                  [        R                  U5        U R                  R                  5       (       d  [        S5      eU R                  R                  5       u  pxU(       d  [        S5      eXX%-   2XU-   24   n[        R                  " US/ SQ4   5      R                  5       S-  n	U(       a!  U R                  R                  5         S U l        U	R!                  S5      4$ ! [        R                   a     Nf = f)NcapzCould not open webcamz#Failed to capture image from webcam.r.  r  r   )hasattrr[  current_cam_indexrX  cv2VideoCapturesetCAP_PROP_FRAME_WIDTHCAP_PROP_FRAME_HEIGHTr   isOpenedRuntimeErrorreadrm   rn   r   rg  )
r4   r5  r  rW  r  r  rX  retr  r2  s
             r,   r8  WebcamCaptureCV2.captureC  sb   tU##txx'74;Q;QU^;^tU##(<  "%."''	2DHS55u=S66? 88$$&&"#:;;XX]]_
DEE j!eG)+,$$U3	>%:;AACeK	HHDH##A&((# 99 s   	AF+ +GG)r[  r]  N)r6   r7   r8   r9   r:   r  r;   r   r<   r=   r>   r-   r8  r?   r)   r/   r,   rR  rR  '  sJ      LLH%HK
 

 

)r/   rR  c                   >    \ rS rSr\S 5       rSrSrSrSr	S
S jr
Srg	)AddLabeli`  c                     SSSSSSS.4SSSSSS.4SS	S
SSS.4SSSSSS.4SSS04SSS04[         R                  " S5      4SSS04/ SQSS04S.
SSSSS.40S.$ )Nr$   r  
   r   r  rd   rS   r   0   r       r   rJ   whiter  r  Text)rK  rI  rJ  rH  overlayrK  )
r#   r  r  r  r  r   label_colorr  r  rF  captionr   T)rJ   
forceInputr&   )r   r  r*   s    r,   r-   AddLabel.INPUT_TYPESa  s     "QtQOP!AdANO"RaPQR$PQ!RS#i%9:$y'&:;!33ODG	623 t	, H"D&IJ+ 	r/   r$   addlabelr  z
Creates a new with the given text, and concatenates it to  
either above or below the input image.  
Note that this changes the input image's height!  
Fonts are loaded from this folder:  
ComfyUI/custom_nodes/ComfyUI-KJNodes/fonts
c           	        ^^^^^
^^^^ UR                   S   nUR                   S   mU	S:X  a%  [        R                  R                  [        SS5      O[
        R                  " SU	5      m[        U5      n[        U5      n[        US S 5      m[        US S 5      mU
UUUUUUUU4	S jnUS:X  a  U Vs/ s H  nU" UU5      PM     nnOJ[        U5      U:X  d   S	[        U5       S
35       e[        X5       VVs/ s H  u  nnU" UU5      PM     nnn[        R                  " USS9nT
S:X  a  [        R                  " UU4SS9nU4$ T
S:X  a  [        R                  " UU4SS9nU4$ T
S:X  aD  [        R                  " USS5      R                  SSSS5      n[        R                  " UU4SS9nU4$ T
S:X  aD  [        R                  " USS5      R                  SSSS5      n[        R                  " UU4SS9nU4$ UnU4$ s  snf s  snnf )Nr   r   zTTNorms-Black.otffontsr  r   c           	      @  >	 [         R                  " TT5      n/ nUR                  S5       H  nUR                  5       S:X  a  UR	                  S5        M*  UR                  5       n/ nU Hx  nU(       a  SR                  Xg/-   5      nOUn UR                  U5      S   n	U	TST-  -
  ::  a  UR	                  U5        MU  UR	                  SR                  U5      5        U/nMz     U(       d  M  UR	                  SR                  U5      5        M     TS:X  aS  [        R                  " U R                  5       R                  5       S-  R                  [        R                  5      5      n
OSTS:X  a1  S	nT[!        U5      T-  -   U-   n[        R"                  " S
TU4T5      n
O[        R"                  " S
TT4T5      nUn
[$        R&                  " U
5      nTnU H  n UR)                  TU4UUTS/S9  UT-  nM!     [*        R,                  " [        R.                  " U
5      R                  [        R0                  5      S-  5      R3                  S5      nU$ ! [         a    UR                  U5      S   n	 GNf = f! [         a    UR)                  TU4UUTS9   Nf = f)N
r    r   r   rp  r  r   r  r  r  r  r  r  )r   r  rI  stripr-  r,  getbboxro   getsizer   r  r   rj   r!  r  r"  rD  r  r   r  r  rm   rn   r  r   rg  )input_imagecaption_textr  lines	text_linewordscurrent_lineword	test_linetest_line_width	pil_imagemarginrequired_heightlabel_imager  y_offsetlineprocessed_imagerF  font_color_tupler  r  r  label_color_tupler  r  r  s                     r,   process_image(AddLabel.addlabel.<locals>.process_image  st   %%i;DE)//5	??$*LL$!)!!D#$'HH\F-B$C	$(	E*.,,y*A!*D '%!f**<<$++D1SXXl%;<(,v "  <LL,!78- 60 I%!OO[__->-D-D-F-L,T,TUWU]U],^_	R<F'-E
Y0F'F&&PO %		%%1IK\ ]I #())EE6?DU"VK +I>>),D HZIIvx0$THXdkclIm I%  $..rxx	/B/I/I"**/UX]/]^hhijkO""G % E*.,,y*A!*DE< ! ZIIvx0$THXIYZs$   II<I98I9<JJr   zNumber of captions z  does not match number of imagesr   rI  rd   rK  rJ  )r   r   rH  )r   r   r+  r,  script_directoryr   r  r   tuplerD  r  rm   r  rot90r   )r4   r#   r  r  r  r  r  r   rq  r  rF  rr  rx   font_color_rgblabel_color_rgbr  r2  processed_imagesr[  processed_batchcombined_imagesr  r  r  r  s     `` ``   `          @@@@r,   ru  AddLabel.addlabel  sF   [[^
ATX\oToBGGLL!17<OP  vB  vP  vP  Q`  bf  vg	 )4)+6 !!34!/"1"564	# 4	#l b=DIJESc4 8EJw<:-u1Dc'lDTTt/uu-HKEH[\H[HCc3 7H[\))$4!< #ii(@aHO  !! $#ii%(@aHO  !! & #kk/1fEMMaQRTUWXYO#ii%(@aHO  !! '!#kk/1fEMMaQRTUWXYO#ii(@aHO  !! .O!!)  K  ]s   4H;Hr)   N)r   )r6   r7   r8   r9   r:   r-   r;   r<   r=   r>   ru  r?   r)   r/   r,   ri  ri  `  s2     4 LHHKY"r/   ri  c                   >    \ rS rSr\S 5       rSrSrSrSr	Sr
S rS	rg
)GetImageSizeAndCounti  c                     SSS00$ Nr'   r#   r$   r)   r*   s    r,   r-    GetImageSizeAndCount.INPUT_TYPES  s    Z
  	r/   )r%   r  r  r  )r#   r  r  countr}  r1   zZ
Returns width, height and batch size of the image,  
and passes it through unchanged.  

c                     UR                   S   nUR                   S   nUR                   S   nSU SU SU 3/0XX44S.$ )Nr   rd   r   r  r5  r   result)r   )r4   r#   r  r  r  s        r,   r}  GetImageSizeAndCount.getsize  sY    AQAwawax013V3
 	
r/   r)   Nr6   r7   r8   r9   r:   r-   r;   r   r<   r=   r>   r}  r?   r)   r/   r,   r  r    s6     
 2L9LHHK
r/   r  c                   >    \ rS rSr\S 5       rSrSrSrSr	Sr
S rS	rg
)GetLatentSizeAndCounti  c                     SSS00$ )Nr'   latentLATENTr)   r*   s    r,   r-   !GetLatentSizeAndCount.INPUT_TYPES  s    k
  	r/   )r  r  r  r  r  r  )r  rx   r  framesr  r  r}  r1   zQ
Returns latent tensor dimensions,  
and passes the latent through unchanged.  

c           
         [        US   R                  5      S:X  a  US   R                  u  p#pEnO<[        US   R                  5      S:X  a  US   R                  u  p#pVSnO[        S5      eSU SU SU SU SU 3	/0XX4XV4S.$ )	Nsamples   r  r   zInvalid latent shaper  r5  r  )rD  r   rF  )r4   r  r   r   Tr   r   s          r,   r}  GetLatentSizeAndCount.getsize  s    vi &&'1,"9-33MA!	"(()Q.	*00JA!A344 s!A3as!A3as+,.!-
 	
r/   r)   Nr  r)   r/   r,   r  r    s7     
 @LTLHHK

r/   r  c                   >    \ rS rSrSrSrSrSr\S 5       r	S
S jr
S	rg)ImageBatchRepeatInterleavingi  r%   r   repeatr1   z
Repeats each image in a batch by the specified number of times.  
Example batch of 5 images: 0, 1 ,2, 3, 4  
with repeats 2 becomes batch of 10 images: 0, 0, 1, 1, 2, 2, 3, 3, 4, 4  
c                 "    SSSSSS.4S.SS0S	.$ )
Nr$   r  rd   r  )rJ   rT   rU   )r   repeatsr   r   r&   r)   r*   s    r,   r-   (ImageBatchRepeatInterleaving.INPUT_TYPES$  s1     &"!D$IJ
 	
 	
r/   Nc                 L   UR                   S   nXB-  n[        R                  " XSS9nUb  [        R                  " X2SS9nXc4$ [        R                  " XQR                   S   UR                   S   4UR                  UR
                  S9n[        U5       H
  nSX7U-  '   M     Xc4$ )Nr   )r  r   rd   r   r  rO   )r   rm   repeat_interleaverh  r   rZ  r   )r4   r   r  r   original_counttotal_countrepeated_imagesrr   s           r,   r  #ImageBatchRepeatInterleaving.repeat0  s    a$.11&qQ**4aHD  && ;;\\!_fll1oN%+]]&,,HD>*$'[! +  &&r/   r)   r3   )r6   r7   r8   r9   r;   r<   r=   r>   r:   r-   r  r?   r)   r/   r,   r  r    s1    %LHHK 	
 	
'r/   r  c                   >    \ rS rSr\S 5       rSrSrSrSr	S
S jr
Srg	)ImageUpscaleWithModelBatchedi?  c                 P    SSSSSSSS.4S.S	S
SS
SS.4/ SQSS04/ SQSS04S.S.$ )N)UPSCALE_MODELr$   r  r  rd   r  rS   )upscale_modelr   	per_batchrN   rO   rR   nearest-exactr  areard  r  rJ   r  )r   float16bfloat16r   )downscale_ratiodownscale_method	precisionr&   r)   r*   s    r,   r-   (ImageUpscaleWithModelBatched.INPUT_TYPES@  sa    /A(2,1r!TXbc3d+e 
 )0SVYcg1h'i)dgpr{f|(}"DyR[F\!]	 	r/   r$   upscaler1   z
Same as ComfyUI native model upscaling node,  
but allows setting sub-batches for reduced VRAM usage.
Optionally downscale the result with a ratio.
c                    US:X  a  [         R                  O%US:X  a  [         R                  O[         R                  n[        R
                  " 5       nUR                  XS9  UR                  SS5      R                  U5      n	U	R                  S   n
[        U
5      n/ n[        SU	R                  S   U5       H]  nU" XX-    R                  U5      5      nUR                  UR                  5       5        UR                  S   nUR                  U5        M_     UR                  5         [         R                  " USS9R                  SSS	S
5      R                  5       R!                  5       nUS:  am  UR                  S
   nUR                  S   n[#        UU-  5      n[#        UU-  5      nUR                  SS
5      n[%        UUUUS5      nUR                  S
S5      nU4$ )Nr  r  r  r   r   r   r   r   rd   rO   r  )rm   r  r  r   r   r   r   r  r   r   r   r-  r   rm  r  r   r   r  r   )r4   r  r   r  r  r  r  rZ  r   in_imgstepsr  t	start_idx
sub_imagesbatch_countr  r  
new_height	new_widths                       r,   r  $ImageUpscaleWithModelBatched.upscaleS  s   !*i!7y\fOfU^^lqlyly!224-2&))%0Q5!q&,,q/9=I&v	8K'L'O'OPV'WXJHHZ^^%&$**1-KKK$ > 	IIaQ''1a3779??A S ggajOWWQZN_>?JN_<=I		"a Aq)Z9I:VA		!R Atr/   r)   N)rO   r  r   )r6   r7   r8   r9   r:   r-   r;   r<   r=   r>   r  r?   r)   r/   r,   r  r  ?  s1    	 	 LHHK
r/   r  c                   :    \ rS rSr\S 5       rSrSrSrSr	S r
Srg	)
ImageNormalize_Neg1_To_1it  c                     SSS00$ Nr'   r   r$   r)   r*   s    r,   r-   $ImageNormalize_Neg1_To_1.INPUT_TYPESu  s    &
  ! 	!r/   r$   	normalizer1   z3
Normalize the images to be in the range [-1, 1]  
c                     US-  S-
  nU4$ )N       @rO   r)   )r4   r   s     r,   r  "ImageNormalize_Neg1_To_1.normalize  s    ##yr/   r)   N)r6   r7   r8   r9   r:   r-   r;   r<   r=   r>   r  r?   r)   r/   r,   r  r  t  s1    ! !
 LHHKr/   r  c                   :    \ rS rSr\S 5       rSrSrSrSr	S r
Srg	)
RemapImageRangei  c           	      8    SSSSSSSS.4SSSS	SS.4S
SS04S.0$ )Nr'   r$   rN   rP   g      $rO   rR   rS   rQ   rW   rJ   T)r#   rT   rU   clampr)   r*   s    r,   r-   RemapImageRange.INPUT_TYPES  sF    E#tTUCdST)T!23	  	r/   r$   remapr1   z2
Remaps the image values to the specified range. 
c                     UR                   [        R                  :X  a  UR                  [        R                  5      nX!X2-
  -  -   nU(       a  [        R
                  " USSS9nU4$ )NrP   rO   )rT   rU   )rZ  rm   r  r   r   r  )r4   r#   rT   rU   r  s        r,   r  RemapImageRange.remap  sP    ;;%--'HHU]]+Esy))KK3C8Eyr/   r)   N)r6   r7   r8   r9   r:   r-   r;   r<   r=   r>   r  r?   r)   r/   r,   r  r    s1      LHHKr/   r  c                   >    \ rS rSr\S 5       rSrSrSrSr	Sr
S rS	rg
)SplitImageChannelsi  c                     SSS00$ r  r)   r*   s    r,   r-   SplitImageChannels.INPUT_TYPES  s    Z  	r/   )r%   r%   r%   r   )redgreenbluer   rI  r1   zx
Splits image channels into images where the selected channel  
is repeated for all channels, and the alpha as a mask. 
c                    US S 2S S 2S S 2SS24   nUS S 2S S 2S S 2SS24   nUS S 2S S 2S S 2SS24   nUR                   S   S:X  a  US S 2S S 2S S 2S4   nOH[        R                  " UR                   S   UR                   S   UR                   S   UR                  S9n[        R                  " X"U/SS9n[        R                  " X3U/SS9n[        R                  " XDU/SS9nX#XE4$ )Nr   rd   r   r   r  r   r   )r   rm   rh  r   r  )r4   r#   r  r  r  r0  s         r,   rI  SplitImageChannels.split  s    Aq!QqSL!aAqsl#Q1ac\";;q>Q!Q1*%EKKAAAW\WcWcdE ii3Q/		5/Q7yy$d+3D((r/   r)   N)r6   r7   r8   r9   r:   r-   r;   r   r<   r=   r>   rI  r?   r)   r/   r,   r  r    s6      7L3LHHK
)r/   r  c                   B    \ rS rSr\S 5       rSrSrSrSr	Sr
SS	 jrS
rg)MergeImageChannelsi  c                      SSSS.SSSS 040S.$ )Nr$   )r  r  r  r0  r   rJ   r&   r)   r*   s    r,   r-   MergeImageChannels.INPUT_TYPES  s2      &9d"34	 		r/   r$   r]   merger1   z&
Merges channel data into an image.  
Nc                     [         R                  " US   US   US   /SS9nUR                  S5      nUb%  [         R                  " XTR	                  S5      /SS9nU4$ )N).r   N).rd   N).r   Nr   r   )rm   r   r   r  rg  )r4   r  r  r  r0  r#   s         r,   r  MergeImageChannels.merge  sk    Ll\
 	
 b!IIuoob&9:CExr/   r)   r3   )r6   r7   r8   r9   r:   r-   r;   r   r<   r=   r>   r  r?   r)   r/   r,   r  r    s6    
 
 LLHHK	r/   r  c                   :    \ rS rSr\S 5       rSrSrSrS	S jr	Sr
g)
ImagePadForOutpaintMaskedi  c                     SSSS[         SS.4SSS[         SS.4SSS[         SS.4SSS[         SS.4SSS[         SS.4S.SS	0S
.$ )Nr$   r  r   r  rS   rd   )r#   rJ  r-  rH  bottom
featheringr   r   r&   r?  r*   s    r,   r-   %ImagePadForOutpaintMasked.INPUT_TYPES  s|     $AaXY Z[1Q~WXYZQqYZ![\ a.Z["\]$!An^_&`a 	
 	
r/   r  expand_imager#   Nc                    UbH  [         R                  " U[         R                  " U5      5      (       a  [        R                  " S5        S nUR                  5       u  pp[         R                  " XU-   U-   X-   U-   U4[         R                  S9S-  nXS S 2X3U	-   2X"U
-   2S S 24'   UcV  [         R                  " XU-   U-   X-   U-   4[         R                  S9n[         R                  " XU
4[         R                  S9nO4[        R                  " XrXCU4SSS9nSU-
  n[         R                  " U5      nUS:  a  US-  U	:  a  US-  U
:  a  [        U	5       H  n[        U
5       Hr  nUS:w  a  UOU	nUS:w  a  X-
  OU	nUS:w  a  UOU
nUS:w  a  U
U-
  OU
n[        UUUU5      nUU:  a  MF  UU-
  U-  nUc  UU-  US S 2UU4'   M`  UU-  US S 2X?-   UU-   4'   Mt     M     Uc  UWS S 2X3U	-   2X"U
-   24'   X4$ X4$ )	N6The incoming mask is fully black. Handling it as None.r        ?constantr   r  valuerd   r   )rm   allclose
zeros_likerp   rq   rk   onesr   rh  rk  padr   rT   )r4   r#   rJ  r-  rH  r  r  r   r   r   r   r   	new_imagenew_maskr  rr   jdtdbdldrdvs                          r,   r  &ImagePadForOutpaintMasked.expand_image  s&   ~~dE$4$4T$:;;OO$\]DZZ\
aJJC& !(U"2A6--
 	
 7<!Sq[$ax-23<zzGf$ah&67mmH
 1I--A 55e&9
RSTDt8D  &A>j1nq0Z!^a5G1XqA!QhAB"(A+1B"aiQB"'1*Q!BBB+AJ #a:5A|%&U!Q'
23a%!SWdQh./# " ( <67HQ!GT(]23))%%r/   r)   r3   r6   r7   r8   r9   r:   r-   r;   r<   r=   r  r?   r)   r/   r,   r  r    s*    
 
 %LHH8&r/   r  c                   B    \ rS rSr/ SQr\S 5       rSrSrSr	S
S jr
S	rg)ImagePadForOutpaintTargetSizei2  r  c           	      t    SSSS[         SS.4SSS[         SS.4SSS[         SS.4U R                  4S.SS	0S
.$ )Nr$   r  r   r  rS   rd   )r#   r  r  r  upscale_methodr   r   r&   r   upscale_methodsr*   s    r,   r-   )ImagePadForOutpaintTargetSize.INPUT_TYPES4  sd     $!&Aa`a(b c"'Qqab)c!d$!An^_&`a#$#4#4"6 	
 	
r/   r  r  r#   Nc           
      .   UR                  5       u  pxpUnU	n[        X)-  X8-  5      nUS:  aJ  UR                  SS5      n[        X-  5      n[        X-  5      n[	        XXS5      R                  SS5      nOUnUb:  UR                  S5      n[        R                  " XU4SS9nUR                  S5      nOS n[        SX;-
  S-  5      n[        SX;-
  U-
  5      n[        SX,-
  S-  5      n[        SX,-
  U-
  5      n[        R                  XUUUUXO5      $ )Nrd   r   r  r   nearestr  r   )rk   rT   r  r  r   rg  rk  rl  r   rU   r  r  )r4   r#   r  r  r  r  r   r   r   r   r   r  r  scaling_factorimage_scaledmask_scaledpad_top
pad_bottompad_left	pad_rights                       r,   r  *ImagePadForOutpaintTargetSize.expand_imageH  sB   ZZ\
a
	\-}/@A AMM"Q'EA./IQ/0J *%JXbckklmnpqL !L ..+K--y:QXabK%--a0KK a-4:;M6@A
q<39:<3h>?	 )55d(T[]fhrt~  M  	Mr/   r)   r3   )r6   r7   r8   r9   r  r:   r-   r;   r<   r=   r  r?   r)   r/   r,   r  r  2  s0    QO
 
 %LHH#Mr/   r  c                   :    \ rS rSr\S 5       rSrSrSrS	S jr	Sr
g)
ImagePrepForICLoraim  c           	      H    SSSSSSS.4SSSSSS.4SSSSSS.4S.SS	S	S
.S.$ )Nr$   r     rd   r  rS   r   )reference_imageoutput_widthoutput_heightborder_widthr   )latent_imagelatent_maskreference_maskr&   r)   r*   s    r,   r-   ImagePrepForICLora.INPUT_TYPESn  s\     $.!&D4YZ([ \"'T!DZ[)\!]!&AaVW(X Y	 !+("+
 	
r/   r  r  r#   Nc                 *   UbH  [         R                  " U[         R                  " U5      5      (       a  [        R                  " S5        S nUnUbA  UR
                  S   UR
                  S   :w  a!  UR                  UR
                  S   SSS5      nUR                  5       u  ppUb[  [         R                  R                  R                  UR                  S5      X4SS9R                  S5      nXR                  S5      -  n[        X-  U-  5      n[        UR                  SS5      XSS5      R                  SS5      nUc"  [         R                   " XX,4UR"                  S	9nO[        UR                  SS5      X#SS5      R                  SS5      nUnUbc  [         R                  R                  R                  UR                  S5      UR
                  S   UR
                  S
   4SS9R                  S5      nUS:  a  [         R                   " XXL4UR"                  S	9n[         R$                  " UUU4S
S9nUbP  [         R                   " U	UR
                  S   UR
                  S
   4UR"                  S	9nWUS S 2S S 2X-   S 24'   UU4$ [         R&                  " U	UR
                  S   UR
                  S
   4UR"                  S	9nSUS S 2S S 2S X-   24'    UU4$ [         R$                  " UU4S
S9nUbN  [         R                   " U	UR
                  S   UR
                  S
   4UR"                  S	9nWUS S 2S S 2US 24'   UU4$ [         R&                  " U	UR
                  S   UR
                  S
   4UR"                  S	9nSUS S 2S S 2S U24'   UU4$ )Nr  r   rd   r"  r  r   r  r  r  r   r   )rm   r  r  rp   rq   r   r  rk   r  r  rl  rg  r   r  r   r  rh  r   r  r  )r4   r/  r0  r1  r2  r3  r5  r4  r#   r   r   r   r   resized_maskr  r  	pad_imageresized_latent_imageresized_latent_maskborderpadded_imagepadded_masks                         r,   r  ImagePrepForICLora.expand_image  s   %~~ne.>.>~.NOOOO$\]%)N#{{1~!3!3A!66\%7%7%:Aq!DZZ\
a % 88..::((+V ;  gaj	 
 22266E -/0	 'u}}R':IV_aklttuvwyz Q|$GPUP\P\]I#1,2F2Fr!2Llkt  wA  $B  $J  $J  KL  MO  $P ,I&&+hh&9&9&E&E))!,#//!,iooa.@A" 'F ' '!*	 $ ![[!L!DU\\ZF 99mVY%GQOL&#kk1l.@.@.C\EWEWXYEZ*[didpdpqATAq9#;"==> k** $jj!\-?-?-BLDVDVWXDY)Zchcocop?@Aq";9#;";;< k** !99mY%?QGL&#kk1l.@.@.C\EWEWXYEZ*[didpdpq0CAq)*,-
 k** $jj!\-?-?-BLDVDVWXDY)Zchcocop01Aq*9*,-k**r/   r)   NNNr  r)   r/   r,   r,  r,  m  s*    
 
 %LHH:+r/   r,  c                   H    \ rS rSrS r\S 5       rSrSrSr	Sr
SrSS
 jrSrg	)ImageAndMaskPreviewi  c                     [         R                  " 5       U l        SU l        SSR	                  S [        S5       5       5      -   U l        SU l        g )Ntemp_temp_r   c              3   N   #    U  H  n[         R                  " S 5      v   M     g7fabcdefghijklmnopqrstupvxyzNr  choice.0r5  s     r,   	<genexpr>/ImageAndMaskPreview.__init__.<locals>.<genexpr>        /nem`a>Z0[0[em   #%r  r  r   get_temp_directoryr   r   r,  r   r   r  r   s    r,   r   ImageAndMaskPreview.__init__  D    &99;	%/nejklem/n(nnr/   c                 B    SSSSSS.4SSSS	.4S
SS04S.SSS.SSS.S.$ )NrN   rO   rP   rR   rS   r   z255, 255, 255zHRGB (255,255,255) or RGBA (255,255,255,128) or Hex (#RRGGBB / #RRGGBBAA)rJ   tooltiprW   rJ   F)mask_opacity
mask_colorpass_throughr$   r   r#   r   r   r   r   r'   r(   r   r)   r*   s    r,   r-   ImageAndMaskPreview.INPUT_TYPES  sa     ")c#c[_*` a'_  R\  *]  ^!*Y,> ? $! "*OL
 	
r/   r$   r   r   zKJNodes/maskingac  
Preview an image or a mask, when both inputs are used  
composites the mask on top of the image.
with pass_through on the preview is disabled and the  
composite is returned from the composite slot instead,  
this allows for the preview to be passed for video combine  
nodes for example. Supports RGBA for mask_color to adjust transparency per color.  
Nc	           	      r   UbV  UcS  UR                  SSUR                  S   UR                  S   45      R                  SS5      R                  SSSS5      n	GOBUc  Ub  Un	GO8UGb4  UGb0  Xa-  n
UR                  SSUR                  S   UR                  S   45      R                  SS5      R                  SSSS5      R	                  5       n[        U5      nUS   S-  US S 2S S 2S S 2S4'   US   S-  US S 2S S 2S S 2S4'   US   S-  US S 2S S 2S S 2S4'   [        U5      S:X  a  US   S	-  nX-  n
[        R                  " X[5      u  pUR	                  5       R                  SS5      n[        XR                  SS5      SSU
SS
5      R                  SS5      n	U(       a  W	4$ U R                  W	XGU5      $ )Nr   rd   r  r   r   r  r   r  r  T)reshaper   r  r   cloner   rD  node_helpersimage_alpha_fixr   save_images)r4   rX  rY  rZ  r   r#   r   r   r   previewmask_adjusted
mask_image
color_listalpha_factordestinationsources                   r,   r   ImageAndMaskPreview.execute  s   llB4::b>4::b>#JKSSTUWYZaabdfhjlnopG\e/G%"3 /Mr1djjndjjn&MNVVWXZ\]ddegikmoqrsyy{J )4J &0]S%8Jq!Qz"%/]S%8Jq!Qz"%/]S%8Jq!Qz":!#)!}u4 - <".">">u"QK%++-55b!<K^^B-BAq-YZ\`aiijkmopG;-PQr/   r  r   r   r   )r   NNNN)r6   r7   r8   r9   r   r:   r-   r;   r   r<   r=   r>   r   r?   r)   r/   r,   rB  rB    s>      
 
 L!LH HKRr/   rB  c                      SU-
  U -  X!-  -   nU$ Nrd   r)   )images_1images_2r0  	crossfades       r,   rq  rq    s    Uh&)99Ir/   c                 
    X -  $ r3   r)   r  s    r,   ease_inrt    s	    5Lr/   c                     SSU -
  SU -
  -  -
  $ rn  r)   rs  s    r,   ease_outrv    s    A!a%   r/   c                 *    SU -  U -  SU -  U -  U -  -
  $ )Nr   r   r)   rs  s    r,   ease_in_outrx    s!    q519q1uqy1}$$r/   c                 ^    U S:  a  [        U S-  5      S-  $ [        U S-
  S-  5      S-  S-   $ )Nr  r   )rv  rt  rs  s    r,   bouncerz    s9    3wA$$C1}%+c11r/   c                     [         R                  " S[         R                  -  S-  U -  5      [         R                  " SSU S-
  -  5      -  $ )N   r   rk  rd   )mathsinpipowrs  s    r,   elasticr    s;    88BL1$q()DHHQa!e,EEEr/   c                 @    U S[         R                  " SU -  5      -  -   $ )Nr  (   )r}  r~  rs  s    r,   glitchyr    s    sTXXb1f%%%%r/   c                     SSU -
  S-  -
  $ )Nrd   r  r)   rs  s    r,   exponential_ease_outr    s    A!|r/   c                     U $ r3   r)   rs  s    r,   <lambda>r    s    r/   linearrt  rv  rx  rz  r  r  r  c                   6    \ rS rSrSrSrSr\S 5       rS r	Sr
g)	CrossFadeImagesi  r$   crossfadeimagesr1   c                 X    SSS/ SQ4SSSSSS.4SSS	SSS.4S
SSSSS.4S
SSSSS.4S.0$ )Nr'   r$   r  r  rd    r  rS   r   rN   rP   rO   rR   )ro  rp  interpolationtransition_start_indextransitioning_framesstart_level	end_levelr)   r*   s    r,   r-   CrossFadeImages.INPUT_TYPES$  sr     '' $L  #N,1qVZde3f+g*/QaPT^_1`)a!(cSZ^*_ `&Cs3X\(]^

 
	r/   c                 4   / nUS:  a  [        U5      U-   nUS:  a  [        S5      e[        U[        U5      U-
  [        U5      5      n[        R                  " XgU5      n	[        U5       HL  n
X   nXU
-      nX*   n[        R                  U5      nU" U5      n[        XU5      nUR                  U5        MN     [        R                  " USS9nUS U n[        R                  " UU/SS9nX$S  n[        U5      S:  a  [        R                  " UU/SS9nU4$ )Nr   z4Transition start index is out of range for images_1.r   )rD  rF  rT   rm   linspacer   easing_functionsgetrq  r-  r   r  )r4   ro  rp  r  r  r  r  r  crossfade_imagesalphasrr   r0  rA  rD  easing_functioncrossfade_imagebeginning_images_1remaining_images_2s                     r,   r  CrossFadeImages.crossfadeimages2  sA   !A%%(]5K%K"%) !WXX"#7XI_9_ademano8LM+,AIEq89F[F.22=AO#E*E'>O##O4 - !;;'7Q? &&='=> 99&8:J%KQRS &&;<!"Q&$yy*:<N)OUVW ##r/   r)   Nr6   r7   r8   r9   r;   r<   r=   r:   r-   r  r?   r)   r/   r,   r  r    s(    L HH "$r/   r  c                   6    \ rS rSrSrSrSr\S 5       rS r	Sr
g)	CrossFadeImagesMultiiV  r$   r  r1   c           	      <    SSSSSS.4S/ SQ4SSSS	SS.4S
.SS0S.$ )Nr  r     rd   rS   r$   r  r   r  )
inputcountimage_1r  r  image_2r&   r)   r*   s    r,   r-    CrossFadeImagesMulti.INPUT_TYPES[  sS     !&1QtUV'WX& $L  #N*/QaPT^_1`)a	
 z

 
	r/   c                 &   US   nUR                   nUR                  nUR                   S   nUR                   S   n	[        U   n
[        SU5       GH:  n/ nUR	                  SUS-    3[
        R                  " U5      5      R                  U5      nUR                   S   nUR                   S   nX:w  d  X:w  a0  [        UR                  SS5      XSS5      nUR                  SS5      nUS   nUS   n[        U5       H[  nUUS-
  -  nU
" U5      n[
        R                  " UUR                  UR                  S	9n[        UUU5      nUR                  U5        M]     [
        R                  " U5      n[
        R                  " X\U4SS
9nGM=     U4$ )Nr  rd   r   image_r   r  r  r   rY  r   )r   r   r  r   r  rm   rh  r   r   r  tensorrZ  rq  r-  r   r  )r4   r  r  r  r%  r  rn  first_image_devicer  r  r  cr  r  new_image_heightnew_image_widthlast_frame_image_1first_frame_image_2r  r  r0  alpha_tensorframe_images                          r,   r  $CrossFadeImagesMulti.crossfadeimagesi  s   ##MM$^^q!a *=9q*%AF

VAE7#3U[[AR5STWWXjkI(q1'ooa0O)_-E*9+<+<R+CUT]_ij	%--a4	!("+A,341A56'*$||E9K9Q9QZlZsZst'(:<OQ]^k* 5 [[(Fii) <!DG+ &. xr/   r)   Nr  r)   r/   r,   r  r  V  s(    L HH !r/   r  c           	         U R                   S   nU R                   S   n[        R                  " X R                  S9nUR	                  5       nU(       a  SU-
  nSU;   a  [        Xb-  5      n	SUS S 2S U	2S S 24'   GOSU;   a  [        Xr-  5      n	SUS U	2S S 2S S 24'   GOSU;   a>  [        Xb-  5      n
[        Xr-  5      nXj-
  S-  nX{-
  S-  nX-   nX-   nSXU2X2S S 24'   GOuS	U;   a  [        R                  " [        R                  " [        US5      [        US5      -   5      U-  S-  5      nUS-  nUS-  n[        R                  " SU[        R                  S
S9n[        R                  " SU[        R                  S
S9n[        R                  " UU4SS9u  nnUU-
  S-  UU-
  S-  -   US-  :*  nSUU'   OSU;   a?  [        R                  " Xr-  S-  5      nUS:  a  SUS U2S S 2S S 24'   SUU* S 2S S 2S S 24'   OXSU;   a?  [        R                  " Xb-  S-  5      nUS:  a  SUS S 2S U2S S 24'   SUS S 2U* S 2S S 24'   OSU;   a  X(S S 2S S 2S S 24'   [        X5      nU SU-
  -  X-  -   $ )Nrd   r   r  horizontal sliderO   vertical slideboxr   circler   rY  ij)indexinghorizontal doorvertical doorfade)r   rm   r  r   itemr  r}  ceilsqrtr  aranger   meshgridgaussian_blur)ro  rp  r0  transition_typeblur_radiusreverser  r  r   posbox_wbox_hx1y1x2y2radiusc_xc_yr5  r  r  bars                          r,   transition_imagesr    s   NN1E^^AFH__=DJJLEE	 _,EM"QaZ	_	,FN#TcT1aZ	/	!em$fn%m!n"ZZ #UBE1_	_	$499S]S^%CDuLqPQqjkLLEuELLF%--F~~q!ft41s7q.AG>1v{CV	o	-ii*+7"D#q!"D#q!	O	+ii)*7!DDSDO"DSDE!	?	"Q1W+Dq4x 8?22r/   c                    US:  GaX  [        US-  5      S-   nUS-  S:X  a  US-  nUS-  n[        R                  " U* S-  S-   US-  S-   [        R                  S9n[        R                  " SXC-  S-  -  5      nXDR                  5       -  nUS S 2S 4   US S S 24   -  nUR                  U R                  5      nUR                  U R                  S   SUR                  S   UR                  S   5      nU R                  SSS5      R                  S5      n [        R                  " XUS-  U R                  S   S9n U R                  S5      R                  SSS5      n U $ )Nr   r   rd   r   r  g      ࿩paddinggroups)r  rm   r  r   expsumr   r   r   r   r   rg  rk  conv2dr   )r   r  kernel_sizesigmar5  kernel1dkernel2ds          r,   r  r    sI   Q+/*Q.?a1KaLL+*Q.q0@10DEMMZIIdaiA--.uuw;AtG$xa'88;;t{{+??4::a=!X^^A5FWXHYZ||Aq!$..q1xxq0@TUW||A&&q!Q/Kr/   c                   :    \ rS rSrSrSrSrSr\S 5       r	S r
Srg	)
TransitionImagesMultii  r$   
transitionr1   z%
Creates transitions between images.
c                 l    SSSSSS.4S/ SQ4/ SQ4SSSS	SS.4S
SSSSS.4SSS04SS/SS04S.SS0S.$ )Nr  r   r  rd   rS   r$   r  r  r  r  r  r  r  r  r  rN   rP         Y@r  rW   rJ   FCPUGPU)r  r  r  r  r  r  r  r   r  r&   r)   r*   s    r,   r-   !TransitionImagesMulti.INPUT_TYPES  s     !&1QtUV'WX& $L  #N &I  %K*/QaPT^_1`)a!(cU\_*` a&E(:;"ENY,>?	 : 	r/   c           
         [         R                  " 5       n	US   n
U
R                  S   nU
R                  S   nU
R                  nU
R                  n[        U   n[        SU5       GH  n/ nUR                  SUS-    3[        R                  " U5      5      R                  U5      nUR                  S   nUR                  S   nUU:w  d  UU:w  a0  [        UR                  SS5      XSS5      nUR                  SS5      nU
S   nUS   nUS	:X  a"  UR                  U	5      nUR                  U	5      nU(       a  UUnn[        U5       H]  nUUS-
  -  nU" U5      n[        R                  " UUR                  UR                  S
9n[        UUUX6U5      nUR                  U5        M_     [        R                   " U5      R#                  5       n[        R$                  " U
UU4SS9n
GM     U
R#                  5       4$ )Nr  rd   r   r  r   r  r  r   r  rY  r   )r   r   r   r   r  r   r  rm   rh  r   r   r  r  rZ  r  r-  r   r   r  )r4   r  r  r  r  r   r  r  r%  gpur  r  r  rn  r  r  r  r  r  r  r  r  r  r  r  r0  r  r  s                               r,   r   TransitionImagesMulti.transition  s   //1#q!a #MM$^^*=9q*%AF

VAE7#3U[[AR5STWWXjkI(q1'ooa0O6)_-E*9+<+<R+CUT]_ij	%--a4	!("+A,%7%:%:3%?"&9&<&<S&A#:MOa$7"341A56'*$||E9K9Q9QZlZsZst/0BDWYegv  FM  Nk* 5 [[(,,.Fii&) <!DG7 &: {{}~r/   r)   Nr6   r7   r8   r9   r;   r<   r=   r>   r:   r-   r  r?   r)   r/   r,   r  r    s1    LHHK  ")r/   r  c                   :    \ rS rSrSrSrSrSr\S 5       r	S r
Srg	)
TransitionImagesInBatchi  r$   r  r1   z0
Creates transitions between images in a batch.
c                 V    SS/ SQ4/ SQ4SSSSSS	.4S
SSSSS	.4SSS04SS/SS04S.0$ )Nr'   r$   r  r  r  rd   r   r  rS   rN   rP   r  r  rW   rJ   Fr  r  )r   r  r  r  r  r  r   r)   r*   s    r,   r-   #TransitionImagesInBatch.INPUT_TYPES  st     % $L  #N &I  %K*/QaPT^_1`)a!(cU\_*` a&E(:;"ENY,>?

 
	r/   c           
         UR                   S   S:X  a  U4$ [        R                  " 5       n[        U   n	/ n
[	        UR                   S   S-
  5      n[        UR                   S   S-
  5       H  n/ nX   nXS-      nUS:X  a"  UR                  U5      nUR                  U5      nU(       a  Xp[        U5       H\  nUUS-
  -  nU	" U5      n[        R                  " UUR                  UR                  S9n[        XUX6U5      nUR                  U5        M^     UR                  S5        [        R                  " U5      R                  5       nU
R                  U5        M     [        R                   " U
SS9nUR                  5       4$ )Nr   rd   r  rY  r   )r   r   r   r  r   r   r   rm   r  rZ  r   r  r-  rm  r   r   r  )r4   r   r  r  r  r   r  r  r  r  images_listr  rr   r  r  r  r  r  r0  r  r  s                        r,   r  "TransitionImagesInBatch.transition,  s]   <<?a7N//1*=96<<?Q./v||A*+AFiGUmG!**S/!**S/#*341A56'*$||Ew~~^/,P_nuvk* 5 KKN[[(,,.Fv&+ ,, ;A.zz|}r/   r)   Nr  r)   r/   r,   r  r    s1    LHHK  "r/   r  c                   :    \ rS rSrSrSrSrSr\S 5       r	S r
Srg	)
ImageBatchJoinWithTransitioniP  r$   transition_batchesr1   z
Transitions between two batches of images, starting at a specified index in the first batch.
During the transition, frames from both batches are blended frame-by-frame, so the video keeps playing.
c                 h    SSSSSSSSS.4/ S	Q4/ S
Q4SSSSSS.4SSSSSS.4SSS04SS/SS04S.	0$ )Nr'   r$   r  r   ir)  rd   rS   r  r  r  rN   rP   r  r  rW   rJ   Fr  r  )	ro  rp  start_indexr  r  r  r  r  r   r)   rZ   s    r,   r-   (ImageBatchJoinWithTransition.INPUT_TYPESY  s     && %1VE[\']^ #K  "M %H  $J).AaPT^_0`(a 'SU\_)`a%	5'9:!5>Iu+=>

 	
r/   c
           	         UR                   S   S:X  d  UR                   S   S:X  a  [        S5      eUS:  a  UR                   S   U-   nUS:  d  X1R                   S   :  a  [        S5      e[        R                  " 5       n
[        U   n/ nUS:  a  UR                  US U 5        [        XaR                   S   U-
  UR                   S   5      n[        U5       H  nXU-      nX.   nU	S:X  a"  UR                  U
5      nUR                  U
5      nU(       a  UUnnUS:  a  XS-
  -  OSnU" U5      n[        R                  " UUR                  UR                  S9n[        UUUXWU5      nUR                  UR                  5       R                  S5      5        M     UR                   S   U:  a  UR                  X-S  5        [        R                   " USS9nUR                  5       4$ )	Nr   z0Both input batches must have at least one image.zstart_index is out of range.r  rd   rO   rY  r   )r   rF  r   r   r  r-  rT   r   r   rm   r  rZ  r   r  r   rg  r  )r4   ro  rp  r  r  r  r  r  r  r   r  r  
out_framesmax_transitionrr   img1img2r  r0  r  r  r   s                         r,   r  /ImageBatchJoinWithTransition.transition_batchesi  s   >>!!X^^A%6!%;OPP?"..+k9K?kNN1,==;<<//1*=9
 ?h|45 1>>!3D{3RT\TbTbcdTef ~&A!O,D;Dwws|wws|!4d,:Q,>a'(CA#A&E <<TZZTL+D$odklKkoo/99!<= ' >>!~-h78 ii
*	|r/   r)   N)r6   r7   r8   r9   r;   r<   r=   r>   r:   r-   r  r?   r)   r/   r,   r  r  P  s1    L#HHK
 
 
)r/   r  c                   6    \ rS rSrSrSrSr\S 5       rS r	Sr
g)	ShuffleImageBatchi  r$   shuffler1   c                     SSSSSSSS.4S	.0$ )
Nr'   r$   r  {   r       rd   rS   )r   seedr)   r*   s    r,   r-   ShuffleImageBatch.INPUT_TYPES  s,     %SBT^_!`a
 	r/   c                     [         R                  " U5        UR                  u  p4pV[         R                  " U5      nX   nU4$ r3   )rm   manual_seedr   randperm)	r4   r   r  r   r   r   r   indicesshuffled_imagess	            r,   r  ShuffleImageBatch.shuffle  s;    $\\
a..# /r/   r)   N)r6   r7   r8   r9   r;   r<   r=   r:   r-   r  r?   r)   r/   r,   r  r    s(    LHH  r/   r  c                   >    \ rS rSrSrSrSrSr\S 5       r	S
S jr
S	rg)GetImageRangeFromBatchi  r  imagesfrombatchr1   z)
Returns a range of images from a batch.
c                 4    SSSSSS.4SSSSSS.4S.SS	S
.S.$ )Nr  r   r   r  rd   rS   )r  r  r$   r   r   masksr&   r)   r*   s    r,   r-   "GetImageRangeFromBatch.INPUT_TYPES  sD     "'ARVW(X Y %1AdTU'VW

 !
	 		r/   Nc                    S nS nUbY  US:X  a  [        S[        U5      U-
  5      nUS:  d  U[        U5      :  a  [        S5      e[        X-   [        U5      5      nX1U nUbY  US:X  a  [        S[        U5      U-
  5      nUS:  d  U[        U5      :  a  [        S5      e[        X-   [        U5      5      nXAU nXV4$ )Nr   r   Start index is out of rangez%Start index is out of range for masks)rU   rD  rF  rT   )r4   r  r  r   r  chosen_imageschosen_masks	end_indexs           r,   r  &GetImageRangeFromBatch.imagesfrombatch  s     b !!S[:%=>Q+V"< !>??K4c&kBI"y9M b !!SZ*%<=Q+U"; !HIIK4c%jAI Y7L--r/   r)   NN)r6   r7   r8   r9   r;   r<   r=   r>   r:   r-   r  r?   r)   r/   r,   r  r    s1    &L HHK 
 
.r/   r  c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)RandomImageFromBatchi  c                    [         R                  R                  S[         R                  [         R                  /5      n[         R
                  " SS/ SQSS[         R                  R                  SUSS	9[         R                  R                  S
SSSSS9[         R                  R                  SSSSSS9[         R                  R                  SSSSSS9[         R                  R                  SSSSSSS9[         R                  R                  SSSSSS9[         R                  R                  SSSSSS9[         R                  R                  S SSS!SS"S9/[         R                  R                  US#S$9/S%9$ )&N
input_typer  zRandom Image From Batch)r  r   sequencer  r1   aM  Picks a sequence of frames from an image or mask batch within a selected index range. At randomness=0 the picks are evenly spaced across the range; at randomness=1 they are uniformly random without replacement; values in between blend linearly. Output is always sorted by batch index. Negative indices count from the end (-1 = last).inputz#Image or mask batch to sample from.)rC  rW  r  r   r  r  zJInclusive start of the sampling range. Negative values count from the end.rJ   rT   rU   rW  r  r   z=Inclusive end of the sampling range. -1 means the last frame.r  rd   z'How many frames to pick from the range.
randomnessrO   rP   rR   z0 = evenly spaced across the range, 1 = uniformly random without replacement, in-between = linear blend (jittered even spacing).rJ   rT   rU   rV   rW  min_distancezMinimum gap (in frames) between consecutive picks. 0 = no minimum. Picks are pushed forward to satisfy this; later picks may clamp to the range end.max_distancezMaximum gap (in frames) between consecutive picks. 0 = no maximum. Picks are pulled in to satisfy this, which may compress the sequence toward the start.r  r  zDRandom seed for reproducible sampling. Ignored when randomness is 0.r   rM  )r   r   search_aliasesr   r   r   r   )
r   rN  rO  r   rP  r   r   r  r   r   )r[   rC  s     r,   r   "RandomImageFromBatch.define_schema  s   <<(("''7JKyy*2B$s
 ""7X+P # R]A5d%q  s["%T%d  f\1!%N  P|ScsQU(\  ] ^QA4&y  z ^QA4&~   VQA;MTU%k  m%, ##XH#M=!
 !	
r/   r   c	           
        ^^ UR                   S   n	U	S:X  a  [        S5      eUS:  a  UOX-   mUS:  a  UOX-   m[        S[        TU	S-
  5      5      m[        S[        TU	S-
  5      5      mTT:  a  TTsmmTT-
  S-   n
US:X  a
  TT-   S-  /nO*[	        U5       Vs/ s H  nTUTT-
  -  US-
  -  -   PM     nnUS::  a  UnO[
        R                  " U5      nXJ::  a   UR                  [	        TTS-   5      U5      nO+[	        U5       Vs/ s H  nUR                  TT5      PM     nnUR                  5         [        X5       VVs/ s H  u  nnSU-
  U-  UU-  -   PM     nnn[        UU4S jU 5       5      nUS:  a  US:  d  US:  a{  US   /n[	        S[        U5      5       HZ  nUS   nUU   nUS:  a  UU-
  U:  a  UU-   nUS:  a  UU-
  U:  a  UU-   nUR                  [        T[        TU5      5      5        M\     Un[        R                  " U[        R                   UR"                  S9nUR%                  SU5      n[&        R(                  " U5      $ s  snf s  snf s  snnf )Nr   zInput batch is empty.rd   r   c              3   t   >#    U  H-  n[        T[        T[        [        U5      5      5      5      v   M/     g 7fr3   )rU   rT   r  r  )rL  prw   r+   s     r,   rM  /RandomImageFromBatch.execute.<locals>.<genexpr>  s*     Jks1c!Sq]344ks   58r   rY  )r   rF  rU   rT   r   r  Randomsampler  sortr  r  rD  r-  rm   r  longr   index_selectr   r   )r[   r!  r  r  r  r#  r%  r&  r  n
range_sizeevenrr   picks_floatrngrandom_picksr  evrppicksadjustedprevtargetr  chosenrw   r+   s                            @@r,   r   RandomImageFromBatch.execute  sm   KKN6455&!+K"aIQ]3q!a%=!3q!a%=!q5aDAqUQY
?UaK=D@Ej@QR@Q1AQUzA~66@QDR?K--%C'"zz%1q5/:F;@;LM;LaAq 1;LMQTUYQhiQhvr2A
Nb0:?BQhKiJkJJ>|a/<!3CazH1c%j)|q!#(D!L0F!#(D!L0FAs1f~ 67 * Ell5

5<<H##As+}}V$$= S  Nis   II#I(r)   Nr   r)   r/   r,   r  r    s7    #
 #
J .%qsq~q~ .% .%r/   r  c                   F    \ rS rSrSrSrSrSrSrSr	\
S 5       rSS
 jrSrg	)ImageBatchExtendWithOverlapi0  )r%   r%   r%   )source_imagesstart_imagesextended_images)z(The original source images (passthrough)z9The input images used as the starting point for extensionzRThe extended images with overlap, if no new images are provided this will be emptyr  r1   z
Helper node for video generation extension   
First input source and overlap amount to get the starting frames for the extension.  
Then on another copy of the node provide the newly generated frames and choose how to overlap them.
c                 V    SSS04SSSSSSS	.4S
S/S
SS.4/ SQSSS.4S.SSSS040S.$ )Nr%   rW  zThe source images to extendr  r|  rd   r  z:Number of overlapping frames between source and new imagesr$  rj  
new_imageszWhich side to overlap onrV  )cutlinear_blendrx  filmic_crossfadeperceptual_crossfaderH  z$Method to use for overlapping frames)rB  overlapoverlap_sideoverlap_modezThe new images to extend withr&   r)   r*   s    r,   r-   'ImageBatchExtendWithOverlap.INPUT_TYPESA  s     #*I7T+U!V!r4QR  `\  $]  ^"*L!9x\v;w x!s  BP  ]C  vD  !E	
 7Y0O$PQ

 
	r/   Nc                 x   U[        U5      :  a  XU4$ UGb  UR                  SS UR                  SS :w  a+  [        SUR                  SS  SUR                  SS  35      eUS U*  nUS:X  a  X* S  nUS U nOUS:X  a
  US U nX* S  nXRS  n	US:X  am  [        R                  " SSUS	-   WR
                  UR                  S
9SS n
U
R                  SSSS5      n
SU
-
  U-  U
W-  -   n[        R                  " XkU	4SS9nGOUS:X  a  Sn[        R                  " SSUS	-   WR
                  UR                  S
9SS n
U
R                  SSSS5      n
[        R                  " X}5      n[        R                  " WU5      nSU
-
  U-  X-  -   n[        R                  " USU-  5      n[        R                  " XkU	4SS9nGOUS:X  a  SS K
n[        R                  " SSUS	-   WR
                  UR                  S
9SS n
UR                  SS5      nWR                  SS5      nUR                  R                  U5      nUR                  R                  U5      nU
R                  SSSS5      n
SU
-
  U-  U
U-  -   nUR                  R                  U5      nUR                  SS5      n[        R                  " XkU	4SS9nOUS:X  a  [        R                  " SSUS	-   WR
                  UR                  S
9SS nSU-  U-  S	U-  U-  U-  -
  nUR                  SSSS5      nSU-
  U-  UW-  -   n[        R                  " XkU	4SS9nOsUS:X  aW  [        R                  " Xi4SS9nUS:X  a  [        R                  " XUS  4SS9nO7US:X  a  [        R                  " US U*  U4SS9nO[        R                  " SSS9nX* S  nUUW4$ )Nrd   r   z0Source and new images must have the same shape: z vs rj  rF  rH  r   r   r  r   r   rI  g@rO   rJ  rx  rG  rd   @   rQ  r   r   r  )rD  r   rF  rm   r  r   rZ  r   r  r  r   r  r   r   r   rh  )r4   rB  rK  rL  rM  rF  prefix	blend_src	blend_dstsuffixr0  blended_imagesrD  gamma
linear_src
linear_dstblendedr   src_nchwdst_nchwlab_srclab_dstblended_labblended_rgbr  eased_trC  s                              r,   r  +ImageBatchExtendWithOverlap.imagesfrombatchO  s;   S'' >>!""1Q':+;+;Aa+@@ #STaTgTghijkTlSmmqr|  sC  sC  DE  FG  sH  rI  "J  K  K"9WH-Fx')()4	&x0	-&x0	)()4	)F~-q!Wq[AQAQYbYhYhijklno

2q!Q/"#e)y!859;L!L"'))VV,LRS"T!33q!Wq[AQAQYbYhYhijklno

2q!Q/"YYy8
"YYy%8
u9
2U5GG!&7C%K!@"'))VV,LRS"T!77q!Wq[AQAQYbYhYhijklno$,,R3$,,R3 ,,11(; ,,11(; 

2q!Q/ 5yG3egoE %ll55kB!,!4!4Q!;"'))VV,LRS"T.NN1a1Y=M=MU^UdUdefghjka%!)a!eai!m3!,,r1a3"#g+!:Wy=P!P"'))VV,LRS"T&"'))V,<!"D</&+ii78@T0U[\&]O!X-&+iiy1I:0V\]&^O#kk.GO$XY/|_==r/   r)   r3   )r6   r7   r8   r9   r;   r   OUTPUT_TOOLTIPSr<   r=   r>   r:   r-   r  r?   r)   r/   r,   rA  rA  0  s@    0LGLO
 !HHK  G>r/   rA  c                   :    \ rS rSrSrSrSrSr\S 5       r	S r
Srg	)
GetLatentRangeFromBatchi  r  latentsfrombatchKJNodes/latentsz*
Returns a range of latents from a batch.
c           	      .    SSSSSSSS.4SSSSSS.4S	.0$ )
Nr'   r  r  r   r   r  rd   rS   )latentsr  r  r)   r*   s    r,   r-   #GetLatentRangeFromBatch.INPUT_TYPES  s=     & %1BtUV'WX$!2dTU&VW
 	r/   c                    S nUS   n[        UR                  5      S:X  a  UR                  u  pgpUn
O+[        UR                  5      S:X  a  UR                  u  pgpn	Un
US:X  a  [        SW
U-
  5      nUS:  d  UW
:  a  [        S5      eUS:X  a  U
O[	        X#-   U
5      n[        UR                  5      S:X  a  XRU nO&[        UR                  5      S:X  a  US S 2S S 2X,24   nSUR                  5       04$ )Nr  r  r  r   r   r  )rD  r   rU   rF  rT   r   )r4   ri  r  r  chosen_latentsr  r   r   r   r   num_latentsr  r  s                r,   rf  (GetLatentRangeFromBatch.latentsfrombatch  s    )$w}}" JA!K1$#MMMA!K"az!9:K?k[8:;;#-#3K[=UWb9c	w}}"$;N1$$Q;+@%@ANN5579;;r/   r)   N)r6   r7   r8   r9   r;   r<   r=   r>   r:   r-   rf  r?   r)   r/   r,   re  re    s1    L!H HK  <r/   re  c                   :    \ rS rSrSrSrSrSr\S 5       r	S r
Srg	)
InsertLatentToIndexi  r  insertrg  zI
Inserts a latent at the specified index into the original latent batch.
c           	           SSSSSSSSS.4S	.0$ )
Nr'   r  r  r   r   r  rd   rS   )rj  ri  indexr)   r*   s    r,   r-   InsertLatentToIndex.INPUT_TYPES  s-     %*Qbq!QR
 	r/   c           	          US   nUS   R                  U5      n[        UR                  5      S:X  a  UR                  u  pgpUn
O+[        UR                  5      S:X  a  UR                  u  pgpn	Un
UW
:  d  US:  a  [        SU SU
 S35      e[        UR                  5      S:X  a!  [        R
                  " US U UXCS-   S  /SS	9nO3[        R
                  " US S 2S S 2S U24   UUS S 2S S 2US-   S 24   /S
S	9nSU04$ )Nr  r  r  r   zIndex z out of bounds for tensor with z latentsrd   r   r   )r   rD  r   rF  rm   r  )r4   rj  ri  rs  samples_destinationsamples_sourcer   r   r   r   rm  r  joined_latentss                r,   rq  InsertLatentToIndex.insert  s4   ))4	*--.AB~##$)'--JA!K%%&!+*00MA!KK519veW,KK=X`abb~##$)"YY#FU+#!GH-( 	N #YY#Aq&5&L1#Aq%'(N3( 	N N,..r/   r)   N)r6   r7   r8   r9   r;   r<   r=   r>   r:   r-   rq  r?   r)   r/   r,   rp  rp    s1    LH HK  /r/   rp  c                   B    \ rS rSrSrSrSrSrSr\	S 5       r
SS	 jrS
rg)ImageBatchFilteri  )r%   r   )r   removed_indicesfilterr1   z!Removes empty images from a batchc                 .    SSSS04SSSSSS	.4S
.SS0S.$ )Nr$   r   rJ   0, 0, 0rN   rR   rP   rO   rS   )r   empty_colorempty_thresholdreplacement_imager&   r)   r*   s    r,   r-   ImageBatchFilter.INPUT_TYPES  sB     &!)Iy+A B$+SQT^b-c#d
  
	 		r/   Nc                 P   UR                   u  pVpxUR                  5       n	UR                  S5       V
s/ s H  n
[        U
R	                  5       5      PM     nn
[
        R                  " U[
        R                  S9R                  U	R                  5      n[
        R                  " X-
  5      nUR                  SS9nX:*  nSR                  [        U5       Vs/ s H  nUU   (       d  M  [        U5      PM     sn5      nUb  UR                   u  nnnnUR                  5       nUUR                   S   :w  d&  UUR                   S   :w  d  UUR                   S   :w  a.  [        UR!                  S	S5      XvS
S5      R!                  SS	5      nUS   X'   U	U4$ X)    nUU4$ s  sn
f s  snf )NrC  r  )rd   r   r   r   r  rd   r   r   r   r  centerr   )r   r`  rI  r  r{  rm   r  r   r   r   r  rf  r,  r   r  r   r  )r4   r   r  r  r  r   r   r   r   input_imagesr   empty_color_listempty_color_tensor
color_diff	mean_diffempty_indicesrr   empty_indices_stringB_repH_repW_repC_repreplacementnon_empty_imagess                           r,   r}  ImageBatchFilter.filter	  s   \\
a||~<G<M<Mc<RS<R5C.<RS"\\*:%--PSST`TgTghYY|@A
OO	O2	!4#yy%()W(QmTUFV&#a&()WX():)@)@&E5%+113Ka(ev||A.FEU[UaUabcUdLd,[-@-@Q-GyZbckklmoqr*5a.L' "688+N;$&:<<' T *Xs   #FF#)F#r)   r3   )r6   r7   r8   r9   r;   r   r<   r=   r>   r:   r-   r}  r?   r)   r/   r,   r{  r{    s2    'L1LHH5K
 
=r/   r{  c                   :    \ rS rSrSrSrSrSr\S 5       r	S r
Srg	)
GetImagesFromBatchIndexedi"	  r$   indexedimagesfrombatchr1   zL
Selects and returns the images at the specified indices as an image batch.
c                     SSSSSS.4S.0$ )Nr'   r$   r   0, 1, 2Tr:  )r   indexesr)   r*   s    r,   r-   %GetImagesFromBatchIndexed.INPUT_TYPES+	  s&     %%94'PQ
 	r/   c                     UR                  S5       Vs/ s H  n[        UR                  5       5      PM     nn[        R                  " U[        R
                  S9nX   nU4$ s  snf )NrC  r  )rI  r  r{  rm   r  r0  )r4   r   r  rs  
index_listindices_tensorr  s          r,   r  0GetImagesFromBatchIndexed.indexedimagesfrombatch4	  s]     7>mmC6HI6HUc%++-(6H
I j

C . Js   #A#r)   N)r6   r7   r8   r9   r;   r<   r=   r>   r:   r-   r  r?   r)   r/   r,   r  r  "	  s1    L'HHK   r/   r  c                   >    \ rS rSrSrSrSrSr\S 5       r	S
S jr
Srg	)InsertImagesToBatchIndexediA	  r$   insertimagesfrombatchr1   zH
Inserts images at the specified indices into the original image batch.
c                 (    SSSSSS.4S.SSS	/40S
.$ )Nr$   r   r  Tr:  )original_imagesimages_to_insertr  r  replacerq  r&   r)   r*   s    r,   r-   &InsertImagesToBatchIndexed.INPUT_TYPESJ	  s:     $.$.$)$&OP )X.0	
 		
r/   c                    US:X  a  U4$ UR                  5       nUR                  S5       Vs/ s H  n[        UR                  5       5      PM     nn[        R
                  " U[        R                  S9n[        U[        R                  5      (       d  [        R
                  " U5      nUS:X  a  [        X5       H	  u  piXU'   M     U4$ / n
Sn[        [        U5      [        U5      -   5       HV  nU[        U5      :  a.  XU   :X  a&  U
R                  X+[        U5      -     5        US-  nM@  U
R                  X\U-
     5        MX     [        R                  " U
SS9nU4$ s  snf )Nr   rC  r  r  r   rd   r   )r`  rI  r  r{  rm   r  r0  
isinstanceTensorr  r   rD  r-  r   )r4   r  r  r  r  r  rs  r  r  r#   rF  insert_offsetrr   s                r,   r  0InsertImagesToBatchIndexed.insertimagesfrombatchW	  sQ   b=#%%&,,. 7>mmC6HI6HUc%++-(6H
I j

C *ELL99$||,<=9 #N E&+U# !F$  JM3|,s>/BBC 3~#661}@];]%%&6sK[G\7\&]^!Q&M%%l}3D&EF D !;;zq9L; Js   #E!r)   N)r  )r6   r7   r8   r9   r;   r<   r=   r>   r:   r-   r  r?   r)   r/   r,   r  r  A	  s1    L&HHK 

 

$r/   r  c                   >    \ rS rSrSrSrSrSrSr\	S 5       r
S rS	rg
)PadImageBatchInterleavedi}	  r  r  r  r1   z5
Inserts empty frames between the images in a batch.
c           	      8    SSSSSSSS.4SS	S	S
SS.4SSS04S.0$ )Nr'   r$   r  rd   r   r  rS   rN   rP   rO   rR   rW   rJ   F)r   empty_frames_per_imagepad_frame_valueadd_after_lastr)   r*   s    r,   r-   $PadImageBatchInterleaved.INPUT_TYPES	  sL     $+0aqQU_`2a*b$+CPS]a-b#c#,y%.@"A	
 	
r/   c                    UR                   u  pVpxUS:X  a  U(       a  SU-   OSn	OXUS-
  U-  -   n	U(       a  X-  n	[        R                  " XXx4UR                  UR                  S9U-  n
[        R
                  " XU4UR                  UR                  S9n[        U5       H  nUS:X  a  SnOXS-   -  nX   X'   SX'   M     X4$ )Nrd   rY  r   rO   )r   rm   r  rZ  r   rh  r   )r4   r   r  r  r  r   r   r   r   total_framespadded_batchr   rr   new_poss                 r,   r  PadImageBatchInterleaved.pad	  s    \\
a 69G155QL !'===L6 zz<A"9&,ll'-}}68GH {{LQ/$ll%}}.
 qAAv 9:$*IL!DM  ##r/   r)   N)r6   r7   r8   r9   r;   r   r<   r=   r>   r:   r-   r  r?   r)   r/   r,   r  r  }	  s6    %L'LHHK 
 
"$r/   r  c                   >    \ rS rSrSrSrSrSr\S 5       r	S
S jr
S	rg)ReplaceImagesInBatchi	  r  r  r1   zi
Replaces the images in a batch, starting from the specified start index,  
with the replacement images.
c                 (    SSSSSSS.40SSSSS	.S
.$ )Nr  r  rd   r   r  rS   r$   r   )r  replacement_imagesoriginal_masksreplacement_masksr&   r)   r*   s    r,   r-    ReplaceImagesInBatch.INPUT_TYPES	  s:     AQtUV(W X
  *",'!*	
	
 
	r/   Nc                    S nS nUb  Ub  U[        U5      :  a  [        S5      eU[        U5      -   nU[        U5      :  a  [        S5      eUR                  5       n	U	R                  S   UR                  S   :w  d   U	R                  S   UR                  S   :w  aI  [	        UR                  SS5      U	R                  S   U	R                  S   SS5      R                  SS5      nX)X8& U	nO[        R                  " S	5      nUb  Ub  U[        U5      :  a  [        S5      eU[        U5      -   nU[        U5      :  a  [        S5      eUR                  5       n
U
R                  S   UR                  S   :w  d   U
R                  S   UR                  S   :w  aG  [	        UR                  S5      U
R                  S   U
R                  S   S
S5      R                  S5      nXZX8& U
nXg4$ [        R                  " S5      nXg4$ )Nz1ReplaceImagesInBatch: Start index is out of rangez/ReplaceImagesInBatch: End index is out of ranger   r   r   rd   r  r  rP  r  r   )rd   rQ  rQ  )
rD  rF  r`  r   r   r  rm   rh  rg  r   )r4   r  r  r  r  r  r   r  r  original_images_copyoriginal_masks_copys              r,   r  ReplaceImagesInBatch.replace	  s   &+=+Ic/22 !TUU#c*<&==I3// !RSS#2#8#8#: #))!,0B0H0H0KKOcOiOijkOl  qC  qI  qI  JK  qL  PL%34F4N4NrST4UWkWqWqrsWt  wK  wQ  wQ  RS  wT  V_  ai  &j  &r  &r  st  vx  &y":L7)F[[0F%*;*Gc.11 !TUU#c*;&<<I3~.. !RSS"0"6"6"8"((+/@/F/Fq/IIM`MfMfghMim~  nE  nE  FG  nH  NH$23D3N3Nq3QSfSlSlmnSo  rE  rK  rK  LM  rN  P_  ai  %j  %r  %r  st  %u!9J6'E  KK,Er/   r)   )NNrd   NN)r6   r7   r8   r9   r;   r<   r=   r>   r:   r-   r  r?   r)   r/   r,   r  r  	  s1    %LHHK
  $r/   r  c                   :    \ rS rSrSrSrSrSr\S 5       r	S r
Srg	)
ReverseImageBatchi	  r$   reverseimagebatchr1   z.
Reverses the order of the images in a batch.
c                     SSS00$ r  r)   r*   s    r,   r-   ReverseImageBatch.INPUT_TYPES	  s     :
 	r/   c                 8    [         R                  " US/5      nU4$ )Nr   )rm   flip)r4   r   reversed_imagess      r,   r  #ReverseImageBatch.reverseimagebatch
  s    **VaS1""r/   r)   N)r6   r7   r8   r9   r;   r<   r=   r>   r:   r-   r  r?   r)   r/   r,   r  r  	  s1    L"HHK  #r/   r  c                   >    \ rS rSr\S 5       rSrSrSrSr	Sr
S rS	rg
)ImageBatchMultii

  c                 $    SSSSSS.4SS.SS0S	.$ )
Nr  r   r  rd   rS   r$   )r  r  r  r&   r)   r*   s    r,   r-   ImageBatchMulti.INPUT_TYPES
  s4      %!AdTU&VW&
 ; 	r/   r$   r   combiner1   z
Creates an image batch from multiple images.  
You can set how many inputs the node has,  
with the **inputcount** and clicking update.
c           
         US   nUR                   S   UR                   S   pTUR                   S   nUR                   S   n[        SU5       HY  nUR                  SUS-    35      n	U	b+  [        XiR                   S   5      nXyR                   S   -  nMH  XsR                   S   -  nM[     [        R
                  " XtXV4UR                  S9n
Sn[        U5       GH  nUR                  SUS-    3[        R                  " UR                   S   XEU4UR                  S95      n	U	R                   SS XE4:w  a.  [        U	R                  SS5      XTS	S
5      R                  SS5      n	U	R                   S   U:  a;  [        R                  R                  R                  U	SXiR                   S   -
  4SSS9n	U	R                   S   nXX-    R                  U	SS9  X-  nA	GM     U
R                  5       4$ )Nr  rd   r   r   r   r  r  r   r  r  r  rO   r	  Trb  )r   r   r  rU   rm   r  rZ  rh  r   r  r  r  r  r\  r   )r4   r  r%  firstrM  rL  max_chr  r  r2  r   offsetr2  s                r,   r  ImageBatchMulti.combine!
  s   y!{{1~u{{1~1 R{{1~q*%A**va!eW-.CVYYr]3		!,A. & kk<A6ekkJz"A**va!eW-u{{EKKNARX;Yafalal/mnCyy1~!'$S[[Q%7z8T\\]^`bcyy}v%hh))--cAv		"7M3NU_gj-k		!Avz"((4(@KF # 	|r/   r)   N)r6   r7   r8   r9   r:   r-   r;   r   r<   r=   r>   r  r?   r)   r/   r,   r  r  

  s6    	 	 LLHHK!r/   r  c                   :    \ rS rSr\S 5       rSrSrSrSr	S r
Srg	)
ImageTensorListiE
  c                     SSSS.0$ )Nr'   r$   )rA  rD  r)   r*   s    r,   r-   ImageTensorList.INPUT_TYPESF
  s      
  	r/   r$   r-  r1   z.
Creates an image list from the input images.
c                    / n[        U[        R                  5      (       a%  [        U[        R                  5      (       a  X/nU4$ [        U[        5      (       a'  [        U[        R                  5      (       a  X/-   nU4$ [        U[        R                  5      (       a  [        U[        5      (       a	  U/U-   nU4$ [        U[        5      (       a  [        U[        5      (       a  X-   nU4$ r3   )r  rm   r  r   )r4   rA  rD  
image_lists       r,   r-  ImageTensorList.appendT
  s    
fell++
65<<0P0P )J { %%*VU\\*J*J(*J
 {	 --*VT2J2J F*J { %%*VT*B*BJ{r/   r)   N)r6   r7   r8   r9   r:   r-   r;   r<   r=   r>   r-  r?   r)   r/   r,   r  r  E
  s1      LHHK
r/   r  c                   >    \ rS rSr\S 5       rSrSrSrSr	Sr
S rS	rg
)ImageAddMultii`
  c                 >    SSSSSSS.4SS/ SQS	S
04SSSSSS.4S.0$ )Nr'   r  r   r  rd   rS   r$   )addsubtractmultiply
differencerJ   r  rN   r  r   rR   )r  r  r  blendingblend_amountr)   r*   s    r,   r-   ImageAddMulti.INPUT_TYPESa
  sX     $!AdTU&VW&& 5 ")c!AW[*\ ] 	r/   r$   r  r  r1   z
Add blends multiple images together.    
You can set how many inputs the node has,  
with the **inputcount** and clicking update.
c                 \   US   n[        SU5       H  nUSUS-    3   nUS:X  a  [        R                  " XS-  Xs-  5      nM1  US:X  a  [        R                  " XS-  Xs-  5      nMT  US:X  a  [        R                  " XS-  Xs-  5      nMw  US:X  d  M  [        R                  " XW5      nM     U4$ )Nr  rd   r  r  r  r  r  )r   rm   r  submul)r4   r  r  r  r%  r#   r  r  s           r,   r  ImageAddMulti.add
  s    y!q*%AAw/0I5 		%"6	8PQZ'		%"6	8PQZ'		%"6	8PQ\)		%3 & xr/   r)   N)r6   r7   r8   r9   r:   r-   r;   r   r<   r=   r>   r  r?   r)   r/   r,   r  r  `
  s6     & LLHHKr/   r  c                   T    \ rS rSr\S 5       r\SS\R                  4S jj5       rSr	g)ImageConcatMultii
  c                 T   [         R                  R                  S[         R                  [         R                  /S9n[         R
                  " SSSSS[         R                  R                  SS	S	S
SS9[         R                  R                  SUS9[         R                  R                  S/ SQSS9[         R                  R                  SSS9[         R                  R                  S[         R                  [         R                  /SS9/[         R                  R                  USS9/S9$ )Nmulti_image_or_maskr?  r  zImage Concatenate Multir1   zCreates an image from multiple images or masks.
Set the input count and click 'Update inputs' to add more slots.
The output type follows image_1; other inputs are converted to match.Tr  r   r  rd   rS   r  rB  rF  rG  rH  r   rL  Fr   r  )rE  r(   r   rM  )r   r   r   r   accept_all_inputsr   r   )r   rN  rO  r   rP  r   r  r   r   r   rQ  r   rR  s     r,   r   ImageConcatMulti.define_schema
  s    --.CTVT\T\^`^e^eSf-gyy&2$X #\1!AN""9}"E{4S]de

  !3U C""9RXXrww4GRV"W ##]#R#
 	
r/   Nr   c           	      P   X&S'   Ub  XVS'   UnUR                   n[        R                  " 5       n	[        R                  " 5       n
[	        SU5       H>  nSUS-    3nX;   a  Xl   O[
        R                  " XU	S9n[        R                  X}X4US9nM@     [        R                  " U5      $ )Nr  r  rd   r  rY  )rn  )r   r   rj  ri  r   rm   rh  r<  rV  r   r   )r[   r  r  rF  rL  r  r%  r#   rn  r   rZ  r  keyr  s                 r,   r   ImageConcatMulti.execute
  s    #y '9!KK!557 335q*%A1q5'"C'*}%++!v;I #..u  qB.  CE & }}U##r/   r)   r3   r   r)   r/   r,   r  r  
  s6    
 
2 $bdbobo $ $r/   r  c                   P    \ rS rSrS rSSSS.r\S 5       rSrS	r	S
r
SrSS jrSrg)PreviewAnimationi
  c                     [         R                  " 5       U l        SU l        SSR	                  S [        S5       5       5      -   U l        SU l        g )NrD  rE  r   c              3   N   #    U  H  n[         R                  " S 5      v   M     g7frG  rI  rK  s     r,   rM  ,PreviewAnimation.__init__.<locals>.<genexpr>
  rO  rP  r  rd   rQ  r   s    r,   r   PreviewAnimation.__init__
  rT  r/   r  r      )rJ   fastestslowestc                 $    SSSSSSS.40SSS	.S
.$ )NfpsrN   g       @rR        @@rS   r$   r   r  r&   r)   r*   s    r,   r-   PreviewAnimation.INPUT_TYPES
  s4     W#d6[_&`a *'	 	r/   r)   rd  Tr1   Nc                    Sn[         R                  " X@R                  5      u  pVpxn[        5       n	/ n
UGb  UGb  U H~  nSUR	                  5       R                  5       -  n[        R                  " [        R                  " USS5      R                  [        R                  5      5      nU
R                  U5        M     U H  nU
(       d  M  UR	                  5       R                  5       n[        R                  " US-  SS5      R                  [        R                  5      n[        R                  " USS9nU
R                  S5      nUR                  S5      n[        R                  " SUR                   S5      nUR#                  U5        [        R$                  " UU5      nU
R                  U5        M     GO4Ub  Uc  U H~  nSUR	                  5       R                  5       -  n[        R                  " [        R                  " USS5      R                  [        R                  5      5      nU
R                  U5        M     OUb  Uc  U H~  nSUR	                  5       R                  5       -  n[        R                  " [        R                  " USS5      R                  [        R                  5      5      nU
R                  U5        M     O[&        R(                  " S	5        S
U	SSS.0$ [+        U
5      n[+        U
5      n[-        SUU5       Hy  nU SUS S3nX   R/                  [0        R2                  R5                  UU5      S[7        SU-  5      XS-   UU-    SSSS9  U	R                  UUU R8                  S.5        US-  nM{     US:g  nS
U	U4U SU
S   R                   S    SU
S   R                   S    3/S.0$ )NAnimPreviewr  r   r  r  r  RGBA)r  r  r  r  z-PreviewAnimation: No images or masks providedr   r3   r  )r   animatedr  r  r  z_.webpTr   rd   F2   )save_alldurationappend_imageslosslessqualityrM   r  r5  )r   r  r   r   r   rj   r   r  r  r   r!  r"  r-  poprK  r  rk   r%  alpha_compositerp   rq   rD  r   r*  r   r+  r,  r  r   )r4   r  r   r  r   r  r  r.  r  r/  
pil_imagesr#   rr   r2  r   mask_npmask_imgrgba_mask_imgcomposited_imgr  r  r6  r  s                          r,   rd  PreviewAnimation.preview
  s   'LXLlLlm|  N  N  MOIg/&
%"3599;,,..oobggaC&8&?&?&IJ!!#&   :"hhj..0G gggmQ<CCBHHMG$wSAH$..+C++f-C %*IIfchh@T$UM!**84 &+%:%:3%NN%%n5   EM599;,,..oobggaC&8&?&?&IJ!!#&  
 6>!1!1!33 ??2777As+C+J+J288+TU!!(+ 
 OOKLwGWVWW_

Oq!Z(AZqF3DMrww||,>EPT_bcijmcm_n  I  NO  JO  PQ  T^  P^  _  jo  y{  DE  FNN &		 
 qLG ) ?7Q[P\\]^hij^k^p^pqr^s]ttu  wA  BC  wD  wI  wI  JK  wL  vM  ON  NO  Q  S  	Sr/   rl  r  )r6   r7   r8   r9   r   methodsr:   r-   r;   r<   r:  r=   rd  r?   r)   r/   r,   r  r  
  sC      a8G	 	 LHKH9Sr/   r  c                   P    \ rS rSr/ SQr\S 5       rSrSrSr	Sr
SrS	r SS jrSrg
)ImageResizeKJi  r  c                     SSSS[         SS.4SSS[         SS.4U R                  4SSS	04SS
SSSS.4S.S/ SQSS04S.S.$ )Nr$   r  r  r   rd   rS   rW   rJ   Fr   )r#   r  r  r  keep_proportiondivisible_by)r  r  r   rW  z0 will do the default center crop, this is a workaround for the widget order changing with the new frontend, as in old workflows the value of this widget becomes 0 automatically)get_image_sizecropr&   r  r*   s    r,   r-   ImageResizeKJ.INPUT_TYPES  s     $c!N\]!`a s1^]^"ab#$#4#4"6$-E/C#D!&QqVW(Z [ #-1Y  At  4v  w	
 	
r/   )r%   r  r  )r%   r  r  r#  r1   Tz
DEPRECATED!

Due to ComfyUI frontend changes, this node should no longer be used, please check the   
v2 of the node. This node is only kept to not completely break older workflows.  

Nc                 f   UR                   u  ppU(       a  UnU(       a  UnU	b  U	R                   u  pp/U(       az  U	cw  US:X  a  US:w  a  X<-  n[        UU-  5      nOhUS:X  a  US:w  a  X--  n[        UU-  5      nOIUS:w  a2  US:w  a,  [        X--  X<-  5      n[        UU-  5      n[        UU-  5      nOUS:X  a  UnUS:X  a  UnUS:  a  U	c  X"U-  -
  nX3U-  -
  nU
S:X  a  Sn
UR                  SS5      n[	        XX5U
5      nUR                  SS5      nXR                   S   UR                   S   4$ )Nr   rd   r  r   r   )r   r  rT   r  r   )r4   r#   r  r  r  r  r  width_inputheight_inputr  r  r   r   r   r   r  ratios                    r,   r#  ImageResizeKJ.resize0  sO   [[
aE!F%"0"6"6Au~5A:&A+"JE!!e),Eq[UaZ!IE"1u9-FaZFaK	6:6E!!e),E"1u9-Fz{! 6\12E45F19Db#uVTJa#kk!nekk!n66r/   r)   )NNNr  )r6   r7   r8   r9   r  r:   r-   r;   r   r<   r=   r   r>   r#  r?   r)   r/   r,   r  r    sG    QO
 
$ ,L0LHHJK OY)7r/   r  c                   J    \ rS rSr/ SQr\S 5       rSrSrSr	Sr
SrSS
 jrSrg	)ImageResizeKJv2i[  )r  r  r  rd  r  nvidia_rtx_vsrc                     SSSS[         SS.4SSS[         SS.4U R                  4/ SQSS	04S
SSS.4/ SQSS04SSSSSS.4S.SSS/4S.SS0S.$ )Nr$   r  r  r   rd   rS   )stretchr#  r  pad_edgepad_edge_pixelr  pillarbox_blurtotal_pixelsrJ   Fr   r  Color to use for padding.rV  r  r-  r  rJ  rH  r  r   )r#   r  r  r  r  	pad_colorcrop_positionr  r   r   r  )r   r   	unique_id	UNIQUE_IDr\  r  r*   s    r,   r-   ImageResizeKJv2.INPUT_TYPES]  s     $c!N\]!`a s1^]^"ab#$#4#4"6 %I  MV  X]  K_  $`&YKf(gh"NR[]ePg!h!&QqVW(Z [	 "!5>+ [!
 	
r/   )r%   r  r  r   )r%   r  r  r   r#  r1   z
Resizes the image to the specified width and height.  
Size can be retrieved from the input.

Keep proportions keeps the aspect ratio of the image, by  
highest dimension.  
Nc                   ^ ^^^^^^^^
^1^2 UR                   u  pnnUb!  UR                   SS  S:X  a  US:w  d  US:w  a  S nUb>  UR                   SS  X4:w  a*  [        UR                  S5      XSSS9R                  S5      nT
S:X  a'  TS	:X  a  [	        S
5      e[
        R                  " 5       m
O[        R                  " S5      m
TS:H  m2S=n=n=nnTS;   d  TR                  S5      (       d  T2(       Ga  TS:X  aN  TT-  nX-  n[        [        R                  " UU-  5      5      n[        [        R                  " UU-  5      5      nOTS:X  a  TS:X  a  UnUnOTS:X  a  TS:w  a  TU-  n[        UU-  5      nTnOaTS:X  a  TS:w  a  TU-  nTn[        UU-  5      nO?TS:w  a5  TS:w  a/  [        TU-  TU-  5      n[        UU-  5      n[        UU-  5      nOTnTnTR                  S5      (       d  T2(       a  TS:X  a!  TU-
  S-  nTU-
  U-
  nTU-
  S-  nTU-
  U-
  nOwTS:X  a  TU-
  S-  nTU-
  U-
  nSnTU-
  nOYTS:X  a  TU-
  S-  nTU-
  U-
  nTU-
  nSnO;TS:X  a  SnTU-
  nTU-
  S-  nTU-
  U-
  nOTS:X  a  TU-
  nSnTU-
  S-  nTU-
  U-
  nUmUmOTS:X  a  UmTS:X  a  UmTS:  a  TTT-  -
  mTTT-  -
  mUS:w  a  X:  a   UR                  5       nUT-  T-  U-  U-  nUS-  nSUS SU SU S3nU	(       a)  [         b"   [         R"                  R%                  UU	5        O![(        R*                  " SUS SU SU 35         S m1S nTS:X  a   SS KnUR1                  UR2                  R4                  R6                  5      nUR9                  5       m1[;        S [        TS -  5      S -  5      T1l        [;        S [        TS -  5      S -  5      T1l        T1RA                  5         UU
UUUU1UU2U UU4S! jn US:X  d  X::  a  U " XUUUU5      u  n!n"GO^/ n#Ub  / OS n$X-   S-
  U-  n%Sn&[C        SX5       H  n'U&S-  n&[        U'U-   U5      n(UU'U( n)Ub  UU'U( OS n*U " U)U*UUUU5      u  n+n,U#RE                  U+RG                  5       5        Ub$  U$RE                  U,b  U,RG                  5       OS 5        U	(       a7  [         b0   [         R"                  R%                  S"U& SU% S#U( SU S3	U	5        M  [(        R*                  " S$U& SU% S#U( SU 35        M     [        RH                  " U#SS%9n!UbC  [K        S& U$ 5       5      (       a,  [        RH                  " U$ V-s/ s H
  n-U-c  M  U-PM     sn-SS%9n"OS n"Ub  URM                  S S S 5        U	(       a  [         b~   U!RO                  5       n.U!R                  5       n/U.U/-  S-  n0[         R"                  R%                  S'U!R                   S    S(U!R                   S    S(U!R                   S    S)U0S S*3	U	5        U!RG                  5       U!R                   S   U!R                   S   U"b  U"RG                  5       4$ [        RP                  " SS[        R                  " S5      [        RR                  S+94$ ! [&         a     GNPf = f! [&         a     GNaf = f! [.         a    [/        S5      ef = f! [&         a     GM  f = fs  sn-f ! [&         a     Nf = f),Nr  rQ  rQ  rQ  rd   r  r  r  r  r  z#Lanczos is not supported on the GPUr   r)  r   r#  r*  r  r*  r  r   r-  r  rJ  rH  rB  z,<tr><td>Resize v2</td><td>estimated output ~z.2fz MB; batching /z
</td></tr>z$[ImageResizeKJv2] estimated output ~r$  zNVIDIA RTX Video Super Resolution is not available. Please install the nvidia-vfx library and ensure you have a compatible NVIDIA GPU.r  c                 H  > U R                   T:X  a  U OU R                  T5      nUc  S O"UR                   T:X  a  UOUR                  T5      nTS:X  a  UR                  S   nUR                  S   n	X-  n
T%T-  nX:  a  [        X-  5      nUnOU	n[        X-  5      nTS:X  a  X-
  S-  nX-
  S-  nOCTS:X  a
  X-
  S-  nSnO3TS:X  a  X-
  S-  nX-
  nO!TS	:X  a
  SnX-
  S-  nOTS
:X  a  X-
  nX-
  S-  nUR	                  SWU5      R	                  SWU5      nUb"  UR	                  SX5      R	                  SX5      nT$S:X  Ga  UR                  SS5      R                  5       R                  5       n/ n[        UR                  S   5       HT  nT R                  UU   5      R                  nUR                  [        R                  " U5      R                  5       5        MV     [        R                  " USS9R                  SS5      R!                  5       nUb+  [#        UR%                  S5      T%TSSS9R'                  S5      nO[#        UR                  SS5      T%TT$SS9R                  SS5      nUb}  T$S:X  aL  [#        UR%                  S5      R)                  SSSS5      T%TT$SS9R                  SS5      S S 2S S 2S S 2S4   nO+[#        UR%                  S5      T%TT$SS9R'                  S5      nTR+                  S5      (       d  T"(       a  US:  d  US:  d  US:  d  US:  aw  T%U-   U-   nTU-   U-   nTS:  a*  UT-  nUT-  nUS:  a
  TU-
  nUU-  nUS:  a
  TU-
  nUU-  nT"(       a  SOTS:X  a  SO	TS:X  a  SOSn[,        R/                  T#XbX4UST!UUS9
u  pgXg4$ )Nr  r  r  r  r   r-  r   r  rJ  rH  r   r$  rd   r   r  r  r4  r  r   r  r)  r'  edger(  
edge_pixelr   )r   )r   r   r   r  narrowr  cudar   r   runr#   r-  rm   from_dlpackr`  r   r   r   rg  r   r  
startswith
ImagePadKJr  )&in_imagein_maskr(  r)  r&  r'  	out_imageout_mask
old_height	old_width
old_aspect
new_aspectcrop_wcrop_hr5  r  
frames_chwupscaled_framesr  
dlpack_outpadded_widthpadded_heightwidth_remainderheight_remainderextra_widthextra_heightpad_moder.  r   r  r  r  nvvfx_srr-  r)  r4   r  r  s&                              r,   _process_subbatch1ImageResizeKJv2.resize.<locals>._process_subbatch  sw   $,OOv$=8;;vCVI&tRX@XW^e^h^hio^pH &(&__R0
%OOB/	&3
"V^
*":#:;F'F&F"9#9:F H,"+1A#,2A"e+"+1AA"h."+1A"+A"f,A#,2A"g-!*A#,2A%,,RF;BB2q&Q	''r1=DDRSH!11&..r15::<GGI
"$z//23A!)jm!<!B!BJ#**5+<+<Z+H+N+N+PQ 4 "KKQ?GG2NRRT	'-h.@.@.CUFT^eopxxyz{H*9+<+<R+BE6Sahrs{{|}  A  B	'%2#1(2D2DQ2G2N2NqRSUVXY2Z\aciky  AK  $L  $T  $T  UV  WY  $Z  [\  ^_  ab  de  [e  $f#1(2D2DQ2GPVXfmw#x  $A  $A  BC  $D  **511^(UV,ZcfgZgkruvkv  {E  HI  {I$x/); & 0: =!#&2\&AO'4|'C$&*&2_&D![0	'!+'36F'F"l2
 )7$-;F$37G$GL	  '1nnT9PYdnpqs|  G  NVn  'W#	&&r/   z <tr><td>Resize v2</td><td>batch u    · images z[ImageResizeKJv2] batch r   c              3   (   #    U  H  oS Lv   M
     g 7fr3   r)   )rL  ms     r,   rM  )ImageResizeKJv2.resize.<locals>.<genexpr>d  s     'K{!{s   z<tr><td>Output: </td><td><b>z
</b> x <b>z | zMB</b></td></tr>r  )*r   r   rg  r   rF  r   r   rm   r   r>  r  r}  r  r  rT   element_sizer   instancesend_progress_textro   rp   r  nvvfxr   VideoSuperReseffectsQualityLevelULTRA	__enter__rU   r0  r1  loadr   r-  r   r  any__exit__numelrh  r   )3r4   r#   r  r  r  r  r  r-  r.  r/  r   r   r  r   r   r   r   r(  r)  r&  r'  r*  aspect_ratior  r  r   bytes_per_elemest_total_bytesest_mbmsg	nvvfx_ctxr]  rU  rB  rC  chunksmask_chunkstotal_batchescurrent_batchr  end_idxsub_imgsub_masksub_out_imgsub_out_maskrX  num_elementsrZ  memory_size_mbrT  r)  s3   ` ``````` `                                      @@r,   r#  ImageResizeKJv2.resize  s_   [[
a 

238 ;bAQSGD 

23A6 9!$.."3Q:JW__`abDU?* !FGG%668F\\%(F(,<< 787797w88O<V<VW\<]<]ao.0$v~ u <,+F!GH
		,*E FG	 !!	
!!
!!e),	#
1!	!	"1u9-
!!EAIvz2!!e),	"1u9-
!	#
))%00N H, %	 1a7H %	 1H <I%
2q8G!'*!4w!>J"e+ %	 1a7H %	 1H <IG!'*!4J"h. %	 1a7H %	 1H <I$z1G!"J"f, H %	 1I%
2q8G!'*!4w!>J"g-$y0H !I%
2q8G!'*!4w!>JEFz{!U\12Ev45F >am!&!3!3!5"#f*u"4q"8>"I(K8DVCLP^_h^iijkljmmwx!9$--@@iP LL#Gs|Sabkallmnomp!qr
 	--l ++EMM,F,F,L,LMI **,H$'5+;a+?$@H!%(E&1*,=,A%BH"MMOL	' L	'^ >Q^"3E9V]_i"jIxF $ 0"dK]Q.9<MM"1a3	"i)3Q7	'26:6F4	'2D,=gxQY[dfmoy,z)\koo/0#&&\=U|'7'7'9[_`!9$--@@>}oQ}o]hiphqqrstruu  A% LL#;M?!M?Zefmennopqor!st' 4( 		&a0IC'K{'K$K$K 99%NAa%NTUV  tT40 1	(0(557"."=+!N%%8829??13E2FjQZQ`Q`abQcPddnoxo~o~  @A  pB  oC  CF  GU  VY  FZ  Zj  k !3Y__Q5G[c[o  z  	zuz  vA  vA  BD  EG  PU  P\  P\  ]b  Pc  kp  kx  kx  vy  z  	zm %     l!  #k  l  ll\ %  &O$  ss   >Z$  Z / Z$ Z5 -[[ )[ A=[% 
Z!Z$  Z!!Z$ $
Z21Z25[
[[%
[21[2r)   )r   NrQ  )r6   r7   r8   r9   r  r:   r-   r;   r   r<   r=   r>   r#  r?   r)   r/   r,   r#  r#  [  s=    cO
 
, 4L8LHHKzzr/   r#  c                   R    \ rS rSr/ SQr\S 5       rSrSrSr	Sr
S r\S	 5       rS
rg)LoadAndResizeImagei|  )r0  r  r  r  c                    [         R                  " 5       n[        R                  " U5      R	                  5        Vs/ s H%  o"R                  5       (       d  M  UR                  PM'     nnS[        U5      SS04SSS04SSS	[        S
S.4SSS	[        S
S.4SSSSSS.4SSS04SSS	SSS.4U R                  SS04SSSS.4S.	0$ s  snf )Nr'   image_uploadTrW   rJ   Fr  r  r   r  rS   rd   r  r   rW  z"Channel to use for the mask outputr   r   z1Fills the alpha channel with the specified color.rV  )	r#   r#  r  r  r  r  r  mask_channelbackground_color)
r   get_input_directorypathlibPathiterdiris_filenamer  r   _color_channels)r+   	input_dirffiless       r,   r-   LoadAndResizeImage.INPUT_TYPES~  s     446	!(i!8!@!@!BR!BAiik!BR$Umnd-CD(Iu*>?##a`a%de$3qab&ef$1QtUV&YZ(1Y3G'H%*1SZ[,^$_%&%6%6Dh8i$j)1  PC  4D  )E
 	 Ss   CCr1   )r%   r   r  r  r   )r#   r   r  r  
image_path
load_imagec
                 P
   [         R                  " U5      n
[        R                  " [        R
                  U
5      n[        R                  " U5      nU	(       a5  [        U	5      n[        U5      S:X  a  [        U5      S-   nO[        U5      nOS n/ n/ nSu  nnS/nUR                  u  nnU(       a[  U(       a/  [        UU-  UU-  5      n[        UU-  5      n[        UU-  5      nOUS:X  a  UnUS:X  a  UnUS:  a  X3U-  -
  nXDU-  -
  nOUUpC[        R                  " U5       GHv  n[        R                  " [        R                  U5      nUR                   S:X  a  UR#                  S 5      nUR                   S	:X  a  UR%                  S
5      nO%SUR'                  5       ;   a  UR%                  S
5      nSUR'                  5       ;   a  U(       a  [(        R*                  " UR-                  S5      5      R/                  [(        R0                  5      S-  nS[2        R4                  " U5      -
  n[        R6                  " S
UR                  U5      n[        R8                  " UU5      nO$[2        R:                  " S[2        R0                  SS9nUR%                  S5      n[        U5      S:X  a  UR                  S   nUR                  S   nUR                  S   U:w  d  UR                  S   U:w  a  GM  U(       a+  UR=                  X44[        R>                  R@                  5      n[(        R*                  " U5      R/                  [(        R0                  5      S-  n[2        R4                  " U5      S   nUS   RC                  5       nUUR'                  5       ;   a  U(       a+  UR=                  X44[        R>                  R@                  5      n[(        R*                  " UR-                  U5      5      R/                  [(        R0                  5      S-  n[2        R4                  " U5      nUS:X  a
  U(       a  UnO0US:X  a  SU-
  nO$[2        R:                  " S[2        R0                  SS9nURE                  U5        URE                  URG                  S5      5        GMy     [        U5      S:  a;  URH                  U;  a+  [2        RJ                  " USS9n[2        RJ                  " USS9nO7US   nUS   nUS:  a'  URM                  USSS5      nURM                  USS5      nUUX4U
4$ )Nr   )r  r  MPOr   rd   Ic                     U S-  $ )Ngp?r)   )rr   s    r,   r  /LoadAndResizeImage.load_image.<locals>.<lambda>  s    a7mr/   Pr  Ar  rO   r3  r   rY  r  r3   r   )'r   get_annotated_filepathra  pillowr   rJ  r   exif_transposer   rD  r  rk   rT   r  r	   Iteratorr  pointrK  getbandsr  r  
getchannelr!  r   rm   rn   r  r  rh  r#  
ResamplingBILINEARupperr-  rg  formatr  r  )r4   r#   r#  r  r  r  r  r  r}  r~  r  r2  rg  bg_color_rgbaoutput_imagesoutput_masksrL  rM  excluded_formatsr   r   r   r  
alpha_maskbg_imager  r   output_imageoutput_masks                                r,   r  LoadAndResizeImage.load_image  s<   !88?
!!%**j9%%c* ()9:J:!# %j 1F : %j 1 M1!7xx1EAIvz2a%i(q5y)A:EQ;Fa!56L#89q6"++C0E ''(?(?GEzzS $;<zzS f-((f- enn&&=XXe&6&6s&;<CCBJJORWW
%"2"2:">>
 99VUZZG--h>"[[uU
MM%(E=!Q&JJqMJJqMzz!}!UZZ]a%7e_e6F6F6O6OPHHUO**2::6>E$$U+E2EQ%%'AENN$$!LL%%:J:J:S:STExx 0 0 34;;BJJG%O''-8%D#X9D{{85==O  'q 12c 1f }!cjj8H&H 99]:L))La8K(+L&q/Kz+2261aC)00A>k5*EEr/   c                 \    [         R                  " U5      (       d  SR                  U5      $ g)NzInvalid image file: {}T)r   exists_annotated_filepathr  )r+   r#   s     r,   VALIDATE_INPUTS"LoadAndResizeImage.VALIDATE_INPUTS  s'    55e<<+22599r/   r)   N)r6   r7   r8   r9   r  r:   r-   r=   r;   r   r<   r  r  r?   r)   r/   r,   rz  rz  |  sK    7O " H=LELHfFb  r/   rz  c                   b    \ rS rSr0 r\S 5       r\S 5       rSrSr	Sr
SrSrSS	 jrS
 rS rSrg)LoadImagesFromFolderKJi  c                   ^ U(       ag  [         R                  R                  U5      (       dC  [        R                  (       a.  [         R                  R                  [        R                  U5      nU(       a$  [         R                  R                  U5      (       d  [        S5      $ / SQnUR                  SS5      n/ nU(       a  [         R                  " U5       H}  u  pgnU Hq  m[        U4S jU 5       5      (       d  M  [         R                  R                  UT5      n	 [         R                  R                  U	5      n
UR                  X45        Ms     M     O[        [         R                  " U5      5       Hq  m[        U4S jU 5       5      (       d  M  [         R                  R                  UT5      n	 [         R                  R                  U	5      n
UR                  X45        Ms     UR!                  5         ["        R$                  " 5       nUR'                  UR)                  S5      5        UR'                  [+        [-        U5      5      R)                  S5      5        U H*  u  pUR'                  U	 SU
 3R)                  S5      5        M,     UR/                  5       nU R0                  R                  U5      nXR0                  U'   X:X  a  U$ U$ ! [         a     GM  f = f! [         a     GM~  f = f)	Nr"  z.jpgz.jpegr  z.webpz.tgainclude_subfoldersFc              3   b   >#    U  H$  nTR                  5       R                  U5      v   M&     g 7fr3   lowerendswithrL  extr6  s     r,   rM  4LoadImagesFromFolderKJ.IS_CHANGED.<locals>.<genexpr>  '     RAQ#4::<0055AQ   ,/c              3   b   >#    U  H$  nTR                  5       R                  U5      v   M&     g 7fr3   r  r  s     r,   rM  r  (  '     N=Mctzz|,,S11=Mr  utf-8:)r   r+  isabsr   base_directoryr,  isdirr   r  walkrd  getmtimer-  OSErrorr  r  r/  hashlibmd5rm  encoder  rD  	hexdigestfolder_hashes)r[   folderr%  valid_extensionsr  	file_datarootr  r  r+  mtimecombined_hashcurrent_hashold_hashr6  s                 @r,   r  !LoadImagesFromFolderKJ.IS_CHANGED  s=   "''--//D4G4GWW\\$"5"5v>FRWW]]622<E#ZZ(<eD	"$''&/!DRAQRRR!ww||D$7!$&GG$4$4T$:E%,,d]; " #2 rzz&12N=MNNN77<<5D " 0 0 6!(($7 3 	V]]734SY077@A$KD  D65'!2!9!9'!BC % %..0$$((0$0&!#O;  ' ! ! # s$   #1K<1K,
K)(K),
K;:K;c                 d    SSS04SSSSS.4SSSSS.4/ S	Q4S
.SSSSS.4SSSSS.4SSS04S.S.$ )Nr   rJ   r   r  r.  r   rd   )rJ   rT   rV   )r  r  r&  )r  r  r  keep_aspect_ratior   rW   F)image_load_capr  r  r&   r)   r*   s    r,   r-   "LoadImagesFromFolderKJ.INPUT_TYPESC  su     $i_5T"a!HI d2q"IJ&A%C	 $)a1*M"N %1Q'JK'09e2D&E
 	
r/   )r%   r   r  r   )r#   r   r  r  load_imagesr1   zTLoads images from a folder into a batch, images are resized and loaded into a batch.c                 	  ^ U(       ag  [         R                  R                  U5      (       dC  [        R                  (       a.  [         R                  R                  [        R                  U5      nU(       a$  [         R                  R                  U5      (       d  [        SU S35      e/ SQn/ n	U(       au  [         R                  " U5       HZ  u  pnU HN  m[        U4S jU 5       5      (       d  M  U	R                  [         R                  R                  U
T5      5        MP     M\     Oq[        [         R                  " U5      5       HN  m[        U4S jU 5       5      (       d  M  U	R                  [         R                  R                  UT5      5        MP     [        U	5      n[        U5      S:X  a  [        SU S35      eXS  n/ n/ n/ nS	nUS:  a  S
nSn[        [        U5      5      nU GH]  n[         R                  R                  U5      (       a  M*  U(       a	  UU:  a    GO([        R                   " U5      n["        R$                  " U5      nUS:X  a$  US:X  a  UR&                  S   nUR&                  S   nUR&                  X#4:w  a  U R)                  UX#U5      nUR+                  S5      n[,        R.                  " U5      R1                  [,        R2                  5      S-  n[4        R6                  " U5      S   nSUR9                  5       ;   a  [,        R.                  " UR;                  S5      5      R1                  [,        R2                  5      S-  nS[4        R6                  " U5      -
  nUR<                  X24:w  aW  [4        R>                  R@                  RC                  URE                  S5      RE                  S5      X24SS	S9RG                  5       nO%[4        RH                  " X24[4        R2                  SS9nUR                  U5        UR                  U5        UR                  U5        US-  nURK                  S5        GM`     [        U5      S:X  a  US   US   SU4$ [        U5      S:  a}  US   nUS   RE                  S5      nUSS   H  n[4        RL                  " UU4SS9nM     USS   H)  n[4        RL                  " UURE                  S5      4SS9nM+     UU[        U5      U4$ g )NzFolder 'z' cannot be found.r  c              3   b   >#    U  H$  nTR                  5       R                  U5      v   M&     g 7fr3   r  r  s     r,   rM  5LoadImagesFromFolderKJ.load_images.<locals>.<genexpr>d  r  r  c              3   b   >#    U  H$  nTR                  5       R                  U5      v   M&     g 7fr3   r  r  s     r,   rM  r  h  r  r  r   zNo files in directory 'z'.FTr   rd   r  r  r3   r  rO   r  )rk   r  align_cornersr   rY  r   )'r   r+  r  r   r  r,  r  FileNotFoundErrorr  rd  r-  r  r  rD  r   r   rJ  r   r  rk   resize_with_aspect_ratiorK  r  r  r!  r   rm   rn   r  r  r   r  r  rl  rg  r   rh  rm  r  )r4   r  r  r  r  r  r  r  r  image_pathsr  r  r  	dir_filesr   r  image_path_listlimit_imagesimage_countr  r  rr   r#   r   rA  mask1rD  mask2r6  s                               @r,   r  "LoadImagesFromFolderKJ.load_imagesY  s   "''--//D4G4GWW\\$"5"5v>FRWW]]622#hvh6H$IJJE"$''&/!DRAQRRR#**277<<d+CD " #2
 rzz&12N=MNNN&&rww||FD'AB 3 ;'	y>Q#&=fXR$HII l+	AL3y>*#Jww}}Z((~ =

:&A''*A {v|q	vv%(11!UDUV IIe$EHHUO**2::6>E$$U+E2Eajjl"xxS 1299"**EME,,T22::&0 88..::4>>!;L;V;VWX;Y?Eo>HGL ; N OVgi 
 {{F?%--PUVMM% LL"":.1KKKNG $J v;!1IuQxO<<[1_AYF!H&&q)E *FF#3; % qr		5%//!*<"=1E # E3v;@@ r/   c                    US:X  a+  UR                  X#4[        R                  R                  5      $ UR                  u  pVXV-  nX#-  nUS:X  a  Xx:  aV  [        X7-  5      n	UR                  X4[        R                  R                  5      nX-
  S-  n
UR                  U
SX-   U45      $ [        X'-  5      nUR                  X+4[        R                  R                  5      nX-
  S-  nUR                  SXX-   45      $ US:X  a  U R                  U5      nXx:  an  [        X'-  5      nUR                  X+4[        R                  R                  5      nX;-
  S-  n[        R                  " SX#4U5      nUR                  USU45        U$ [        X7-  5      n	UR                  X4[        R                  R                  5      nX)-
  S-  n[        R                  " SX#4U5      nUR                  XS45        U$ g )Nr&  r  r   r   r  r  )
r#  r   r  r$  rk   r  r  get_edge_colorr  paste)r4   r2  r  r  r  	img_width
img_heightrg  target_ratior  rJ  r  r-  r-  r  paddeds                   r,   r  /LoadImagesFromFolderKJ.resize_with_aspect_ratio  s   9::uou/?/?/G/GHH #	 -~6>* 56	jj)!4e6F6F6N6NO!)a/xxq$, ?@@ !!56
jj%!4e6F6F6N6NO!*q0xxC =>>U]++C0I* !56
jj%!4e6F6F6N6NO!.146E?IFS1g,/   56	jj)!4e6F6F6N6NO ,26E?IFSA,/% r/   c                    UR                   u  p#UR                  S5      nUR                  SSUS45      nUR                  SUS-
  X#45      nUR                  SSSU45      nUR                  US-
  SX#45      n[        R                  " SUS-  US-  -   S45      nUR                  US5        UR                  XRS45        UR                  UR                  US45      US-  S45        UR                  UR                  US45      US-  U-   S45        [        R                  " U5      n	[        [        [        U	R                  5      5      n
U
$ )z&Sample edges and return dominant colorr  r   rd   r   r  )rk   rK  r  r   r  r  r#  r
   Statr  r   r  median)r4   r2  r  r  r-  r  rJ  rH  edgesstatr  s              r,   r  %LoadImagesFromFolderKJ.get_edge_color  s5   kk&! hh1eQ'(1fQh67xxAq&)*%'1e45 		&57VAX#5q"9:C FAJ'DKK,uQwl;ELL&!-a&0@!/DE ~~e$s3,-r/   r)   NF)r6   r7   r8   r9   r  r:   r  r-   r;   r   r<   r=   r>   r  r  r  r?   r)   r/   r,   r  r    s\    M/ /b 
 
 7L<LHHlKWAp)Tr/   r  c                   :    \ rS rSr\S 5       rSrSrSrSr	S r
Srg	)
ImageGridtoBatchi  c           	      .    SSSSSSSS.4SS	SSS
S.4S.0$ )Nr'   r$   r  r   rd   r  z"The number of columns in the grid.r"  r   zCThe number of rows in the grid. Set to 0 for automatic calculation.)r#   columnsrowsr)   r*   s    r,   r-   ImageGridtoBatch.INPUT_TYPES  sE    ( %1QqUy'z{"!A  SX  %Y  Z  	r/   r$   	decomposer1   z/Converts a grid of images to a batch of images.c                 >   UR                   u  pEpgXb-  nUS:X  a	  XR-  n	XY-  nOXS-  n	US S 2S X9-  2S X(-  2S S 24   nUR                  XCXX5      nUR                  SSSSSS5      R                  5       nUR                  XCU-  XU5      nUR                  SXU5      n
U
4$ )Nr   rd   r   r   r  r  r   )r   r   r   r   )r4   r#   r  r  r   r   r   r   
cell_widthcell_heightrO  s              r,   r  ImageGridtoBatch.decompose  s    [[
a \
19,K#D )K a*$**,?W-?,?BC 

1K*HaAq!Q/::<

1WnkqI ZZKQ?
}r/   r)   N)r6   r7   r8   r9   r:   r-   r;   r<   r=   r>   r  r?   r)   r/   r,   r  r    s/      LHHCKr/   r  c                   L    \ rS rSrS r\S 5       rSrSrSr	Sr
SrS	rSS jrSrg
)SaveImageKJi  c                 .    SU l         SU l        SU l        g )Nr   r   r  )r   r   r  r   s    r,   r   SaveImageKJ.__init__  s    	r/   c                 R    SSS04SSSS.4SSS	S.4S
.SSSS.4SSSS.4S.SSS.S.$ )Nr%   rW  zThe images to save.r   r   The prefix for the file to save. This may include formatting information such as %date:yyyy-MM-dd% or %Empty Latent Image.width% to include values from nodes.rV  r   z!The folder to save the images to.)r   r   output_folder.txtzGThe extension for the caption file. Limited to plain-text/data formats.Tstring to save as .txt filers  rW  )caption_file_extensionrr  r   r   r   r\  r)   r*   s    r,   r-   SaveImageKJ.INPUT_TYPES"  s     #Y0E$FG$,)  Qq  /r  $s"*Mp,q!r ,4  U^  6_  +`$TFc&de
 #_
 	
r/   r   r  rc  Tr1   z8Saves the input images to your ComfyUI output directory.Nc           	      2   X0R                   -  n[        R                  R                  U5      (       ax  [        R                  R	                  U5      (       d  [        R
                  " USS9  Un[        R                  " X2US   R                  S   US   R                  S   5      u  ppnO`[        R                  " 5       U l
        [        R                  " X0R                  US   R                  S   US   R                  S   5      u  ppnUb  [        R                  R                  U5      nU(       a  UR                  S5      (       d  SU-   nUR                  5       [        R                  ;  a.  [!        SU SSR#                  [        R                  5       35      e[%        5       n['        U5       GHL  u  pS	UR)                  5       R+                  5       -  n[,        R.                  " [0        R2                  " USS
5      R5                  [0        R6                  5      5      nS n[8        R:                  (       dh  [=        5       nUb&  UR?                  S[@        RB                  " U5      5        Ub2  U H,  nUR?                  U[@        RB                  " UU   5      5        M.     U
RE                  S[G        U5      5      nU SUS S3nU S3nURI                  [        R                  R#                  UU5      UU RJ                  S9  URM                  UUU RN                  S.5        Ub  UU-   n[        R                  R#                  UU5      n[        R                  RQ                  [        R                  RS                  U5      [        R                  RS                  U5      45      [        R                  RS                  U5      :w  a  [!        SU 35      e[U        USSS9 nURW                  U5        S S S 5        US-  nGMO     W4$ ! , (       d  f       N= f)NTexist_okr   rd   .zDisallowed caption extension ''. Allowed: r  r  r  r   z%batch_num%r  r  r  r  r  z5Refusing to write caption outside the target folder: rL  r  encoding),r   r   r+  r  existsmakedirsr   r  r   r   r   basenamer>  r  SaveStringKJALLOWED_EXTENSIONSrF  r,  r   r  r   rj   r   r  r  r   r!  r"  r   r&  r   r'  r(  r)  r  r  r*  r  r-  r   
commonpathabspathrJ  r`  )r4   r   r  r   r   r   rr  r	  r  r  r  r.  r  r/  batch_numberr#   rr   r2  r4  r5  filename_with_batch_numbase_file_namer6  txt_file	file_pathr  s                             r,   rc  SaveImageKJ.save_images<  s   ---77==''77>>-00MD9!.?K?_?_`o  AG  HI  AJ  AP  AP  QR  AS  U[  \]  U^  Ud  Ud  ef  Ug  @h<A_*??ADOP\PpPp  rA  CR  CR  TZ  [\  T]  Tc  Tc  de  Tf  hn  op  hq  hw  hw  xy  hz  Q{M'o %'WW%5%56L%M"%.D.O.OPS.T.T),/E)E&%++-\5T5TT #ABXAYYefjfofop|  qP  qP  gQ  fR  "S  T  T&%.v%6!\uyy{((**A//"''!Q"4";";BHH"EFCH(("9%%%h

60BC ,* ))!TZZa8H-IJ + '/&6&6}c,FW&X# 78'"QGN$%T*DHHRWW\\"4d;X^b^q^qHrNN &		 
 "),BBGGLL);XF	77%%rww7I'JBGGOO\eLf&ghlnlslsl{l{  }O  mP  P$'\]f\g%hii)S7;qGGG$ < qLG= &7@ u <;s   !P
P	rl  )r   NNNr  )r6   r7   r8   r9   r   r:   r-   r;   r   r<   r:  r=   r>   rc  r?   r)   r/   r,   r   r     s@     
 
 
  L LHKHLK5r/   r   c                   T    \ rS rSr/ SQrS r\S 5       rSrSr	Sr
SrS	rS
rSS jrSrg)r  is  )r  z.captionz.jsonz.yamlz.ymlz.mdz.csvz.tsvz.xmlz.logz.iniz.tomlc                 T    [         R                  " 5       U l        SU l        SU l        g r   r   r   s    r,   r   SaveStringKJ.__init__v  r   r/   c                 @    SSSS.4SSSS.4SSS	S.4S
.SSSSS.40S.$ )Nr   Tr  r  r  r  rV  r   ztSubfolder within the ComfyUI output directory to save to. Paths resolving outside the output directory are rejected.)stringr   r  file_extensionr  zEThe extension for the saved file. Limited to plain-text/data formats.r&   r)   r*   s    r,   r-   SaveStringKJ.INPUT_TYPES{  sr     $DEb%cd$,&  Nn  /o  $p"*  ND  -E  "F !8  MT  .U  #V	
 		
r/   r  r  save_stringTKJNodes/miscz8Saves the input string to your ComfyUI output directory.c                 j   X0R                   -  n[        R                  R                  U R                  5      nU(       a  US:w  a~  [        R                  R                  U5      S   R                  SS5      R                  S5      n[        R                  R                  [        R                  R                  XV5      5      nOUn [        R                  R                  XW45      U:H  nU(       d  [        SU 35      e[        R                  " USS9  [        R                  " X75      u  ppn[        R                  R                  U5      nU(       a  UR                  S	5      (       d  S	U-   nUR!                  5       U R"                  ;  a*  [        S
U SSR                  U R"                  5       35      eU SUS S3nX-   n[        R                  R                  X5      n[        R                  R%                  U5      (       aW  US-  nU SUS S3nX-   n[        R                  R                  X5      n[        R                  R%                  U5      (       a  MW  [        R                  R                  [        R                  R                  U	5      [        R                  R                  U5      45      [        R                  R                  U	5      :w  a  [        SU 35      e['        USSS9 nUR)                  U5        S S S 5        U4$ ! [         a    Sn GN5f = f! , (       d  f       U4$ = f)Nr   rd   \r6  Fz@output_folder must resolve within the ComfyUI output directory: Tr  r  zDisallowed file extension 'r  r  r  r  z-Refusing to write outside the target folder: rL  r  r  )r   r   r+  r  r   
splitdriver  lstripr,  r  rF  r  r   r  r  r>  r  r  r  rJ  r`  )r4   r%  r  r   r&  r   r  
target_dirinsider  r  r.  r  r  r  r  r  s                    r,   r(  SaveStringKJ.save_string  s   ---WW__T__5
]h6''$$]3A6>>tSIPPQTUCj)FGJ#J	WW''(@AZOF _`j_klmm
J.LXLlLlm|  MJIg/)).9.";";C"@"@ >1N!)@)@@:>:J,W[W`W`aeaxaxWyVz{||+,Agb\;!2GGLL!3>	ggnnY''qLG /0'"Q?N%6H%7BI	 ggnnY'' 77rww/ABBGGOOT]D^_`dfdkdkdsds  uG  eH  HLYKXYY)S73qGGFO 4 z=  	F	6 43 zs   #L 2L"LL"
L2r8  N)r  r  )r6   r7   r8   r9   r  r   r:   r-   r;   r   r<   r:  r=   r>   r(  r?   r)   r/   r,   r  r  s  sF     
 

 

 L LHKHLK*r/   r  c                   B    \ rS rSr\S 5       rSrSrSrSr	Sr
S
S	 jrSrg)FastPreviewi  c           	      6    SSS/SS04SSSSS	S
S.4S.SSS.S.$ )Nr$   JPEGPNGrJ   r        r  rQ  z`Maximum width or height for the preview. Images larger than this are downscaled before encoding.r$  )r#   r  max_sizer0  	PROMPT_ID)r/  	prompt_idr   r)   rZ   s    r,   r-   FastPreview.INPUT_TYPES  sR     %"E?Y,?@"CVX )K%L M )(
 	
r/   r)   rd  rU  TzJFast image preview using binary websocket, bypassing base64/JSON overhead.Nc                 j   US   R                  5       R                  S5      R                  SS5      R                  5       R	                  5       nUR
                  S S u  pxX:  d  Xs:  a  U[        X5      -  n	[        X-  5      [        Xy-  5      p[        (       a<  [        R                  " XjU4[        R                  S9n[        R                  " U5      nOL[        R                  " U5      R                  X4[        R                  5      nO[        R                  " U5      nUS:X  a!  UR                  S:w  a  UR!                  S5      n["        b  Ub  ["        R$                  nSn['        [(        S5      (       a.   SS	KJn  UR/                  UR0                  UR2                  S
5      nU(       a=  UR7                  [(        R8                  X,S 4UUU=(       d    SS.4UR2                  5        O-UR7                  [(        R:                  X,S 4UR2                  5        SS/0SS.$ ! [4         a    Sn Nf = f)Nr   r  r   )r  r4  r  FPREVIEW_IMAGE_WITH_METADATA)feature_flagssupports_preview_metadatar   )r   display_node_idr:  fast_previewTr)   r  )r   r  r  byterj   r   rU   r  HAS_CV2r^  r#  INTER_LINEARr   r  r  r  rK  r   r[  r\  r   	comfy_apir>  supports_featuresockets_metadata	client_idro   	send_syncr=  UNENCODED_PREVIEW_IMAGE)r4   r#   r  r8  r/  r:  arrrM  rL  scalenew_wnew_hr  serverclient_supports_metadatar>  s                   r,   rd  FastPreview.preview  s   Ahlln  %++As388:@@Byy!}<1<s1y(Eqy>3qy>5wjjenCDTDTU!OOC0	!OOC077W	,IV	% 7!))%0I#	(=!**F',$')FGG57/</M/M//1A1AC^0, (  $@@D1'0/8)2b $$   $<<-$$ &v."==/ ! 5/4,5s   =-H# #H21H2r  )r6   r7   r8   r9   r:   r-   r;   r<   r=   r:  r>   rd  r?   r)   r/   r,   r2  r2    s4    
 
 LH%HK^K2>r/   r2  c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)FastPreviewBatchi  c                 r   [         R                  " SSSS[         R                  R                  S[         R                  [         R
                  /SS9[         R                  R                  SS	S	S
SSS9[         R                  R                  SSSSSSS9[         R                  R                  SS
SSSSS9/SS9$ )NrS  zFast Preview BatchrU  zEncodes an image batch as an all-I-frame H.264 MP4 thumbnail strip and shows it as an interactive grid. Click a tile to enlarge with prev/next browsing. Avoids materializing N PNGs.r!  zImage or mask batch to preview.rW  max_thumb_sizer  r.  r  zWDetail-view (mp4) thumbnail max side. Strip thumbs for the grid are auto-capped at 256.r$  crf   r   3   rd   z0H.264 CRF. Lower = higher quality / larger file.max_grid_framesr  z8If batch exceeds this, frames are stride-sampled evenly.T)r   r   r   r   r   is_output_node)r   r   rQ  r   r   rP  r  rZ   s    r,   r   FastPreviewBatch.define_schema	  s    yy&-+K ""7RXXrww,?Ij"k-sTU%~  @UBA2A%W  Y.!TU%_  a  !
 	
r/   r   c                 
  ^,^-^.^/^0^1^2^3^4^5^6^7^8^9^: SS K nSS KnSS KnUR                  S:X  aR  UR	                  SSUR
                  S   UR
                  S   45      R                  SS5      R                  SSSS5      m0OUm0T0R
                  u  ppX:  aF  [        R                  " SUS-
  U5      R                  5       R                  5       R                  5       m/O[        [        U5      5      m/[        T/5      m9[!        SU[#        X5      -  5      n[#        S[%        [        X-  5      5      5      m5[#        S[%        [        X-  5      5      5      m4T5T5S-  -  m5T4T4S-  -  m4Sn[!        SU[#        T4T55      -  5      n[#        S[%        [        T5U-  5      5      5      m8[#        S[%        [        T4U-  5      5      5      m7[&        R(                  " 5       nS	S
R+                  S [        S5       5       5      -   n[&        R,                  " UUT5T45      u  nnnnnU SUS S3n[.        R0                  R+                  UU5      nU SUS S3n[.        R0                  R+                  UU5      n[#        S[%        [2        R4                  " [2        R6                  " T95      5      5      5      n[%        [2        R4                  " T9U-  5      5      n[8        R:                  " UT7-  UT8-  S4[8        R<                  S9nSnUR?                  USS9n URA                  S[C        US5      S9nT5Ul"        T4Ul#        SUl$        [K        U5      SSSS.Ul&        Sm-T4T54X4:g  m2T7T84T4T54:g  m3US:  a  SOSm1[N        RP                  " 5       m:S m,URS                  SS 9m.S /m6U,U-U.U/U0U1U2U3U4U5U6U7U8U9U:4S! jnURU                  US"S#9n U RW                  5         [Y        T95      n! T.R[                  5       n"U"c  OU"u  n#n$n%[        U$R
                  S   5       H  n&U#U&-   n'U'U-  n(U'U-  n)U%U&   UU(T7-  U(S-   T7-  2U)T8-  U)S-   T8-  24'   UR\                  R_                  U$U&   S$S%9n*URa                  U*5       H  n+URc                  U+5        M     U!Re                  S5        M     M  U R+                  5         T6S   b  T6S   eURa                  5        H  n+URc                  U+5        M     URg                  5         [h        Rj                  " U5      Rm                  US&S'9  [n        Rp                  " S(UUS)T9UT5T4UUT8T7S*./0S+9$ ! URg                  5         f = f),Nr   r   r   rd   r  rO   r   r   kj_batch_preview_r   c              3   N   #    U  H  n[         R                  " S 5      v   M     g7f)abcdefghijklmnopqrstuvwxyzNrI  )rL  r  s     r,   rM  +FastPreviewBatch.execute.<locals>.<genexpr>>  s      .mdl_`v}}=Y/Z/ZdlrP  r  r  r  z_.mp4z	_grid.jpgr     rL  r  libx264)rateyuv420p	ultrafast1
fastdecode)rW  presetgtunerm  r  r  c                     U R                  S5      R                  SS5      R                  [        R                  SS9R                  SSSS5      R                  5       R                  5       $ )Nr  r   r   rY  r   r   rd   )r  r  r   rm   r"  r   r   rj   rs  s    r,   _to_numpy_nhwc_u83FastPreviewBatch.execute.<locals>._to_numpy_nhwc_u8[  sN    c
((C0"5;;u"=!'!Q1-jjl557Dr/   )maxsizec                    >  [        STT	5       H  n TX T	-    nTUSS S24   R                  SSSS5      R                  5       R                  TSS9nT(       a  [        R
                  " UTT4TS9OUnT(       a  [        R
                  " UTT4S	S9OUnT" U5      nXCL a  UOT" U5      nAAAT
R                  XU45        M     T
R                  S 5        g ! [         a  nUTS'    S nAN&S nAff = f! T
R                  S 5        f = f)
Nr   .r   rd   r   T)r   rc  r  r  )r   r   r   r   rk  rl  putro   )c_startc_idxsel	sel_video	sel_stripvideo_framesstrip_framesrw   rm  
chunk_sizeframe_queuer  r   r  need_resizeneed_strip_resizerN  rM  producer_errorstrip_hstrip_wtotalwork_devices           r,   producer*FastPreviewBatch.execute.<locals>.producerf  s   *#(E:#> #Gj,@ A%eS"1"n5==aAqITTV79r[_r7` ZeAMM#UENQU$Vkn	fwAMM)7GBT[a$b  ~G	'8'C7@7M|SdenSoI#(MN $?  OOD) ! *()N1%*  OOD)s*   CC 
C/ C*%C2 *C//C2 2DT)r=  daemonrgb24r  U   )r  kj_batch_previewrD  )r  r  r   frame_countr  thumb_wthumb_hstrip_filename
strip_colsstrip_cell_wstrip_cell_hr   )9av	threadingqueuendimr_  r   r  r   rm   r  r  r0  tolistr   r   rD  rT   rU   r  r   rR  r,  r  r   r+  r}  r  r  r  rh  r"  rJ  
add_streamr   r  r  pix_fmtr  r   r   r   QueueThreadstartr   r  
VideoFramefrom_ndarrayr  muxrm  closer   r  r*  r   r   );r[   r!  rV  rW  rZ  r  r  _queuer   r   r   r  rL  	STRIP_MAXstrip_scaler   rR  r  r  r.  r  r6  filepath
strip_file
strip_pathr  
strip_rows	strip_arrr  	containerstreamr  producer_threadr  r  rr  rw  rx  rr   
global_idxsrscr  packetrm  ry  rz  r  r   r  r{  r|  rN  rM  r}  r~  r  r  r  s;                                               @@@@@@@@@@@@@@@r,   r   FastPreviewBatch.execute  s!   ::?]]B5;;r?EKKO#LMUUVWY[\ccdfhjlnpqrFF\\
a..AE?;AACHHJQQSCuQx.CCC#a)34As5+,-As5+,- 	#y3ue+<<=aU5;#6789aU5;#6789!446
$rww.mdijkdl.m'mm>J>^>^Ju?
;Hgy! 1WRL.77<< 2D9 z72,i8
WW\\"4jA
 C		$))E*: ;<=
5:#567
HHj72J4H!LTVT\T\]	GGH3G/	C	)))(3:J)KF FL!FM&FN%(X3XdeFNJ %.QF2K!(' 2uen D"S[6jD*;;=KD !,,q,1K"VN* * *" (..ht.LO!!#u%D"(<6:3||11!45A!(1J#z1B#j0BbnopbqIb7lBFg+==rG|RRSVW^L^?^^_MM66|Aw6WE"(--"6!f- #7KKN 6    "a ,$Q'' --/f% * OO	"''
B'?}}!3" ($##7
 6 !  		 OOs   GT, ,T>r)   Nr   r)   r/   r,   rS  rS    s6    
 
( BR]] B Br/   rS  c                   H    \ rS rSr\S 5       rSrSrSrSr	SS jr
SS	 jrS
rg)ImageCropByMaskAndResizei  c                 p    SSSSSS[         SS.4SSS[         S	S.4SS
S[         SS.4SSS[         SS.4S.0$ )Nr'   r$   r   r  r  r   r  rS   rd   r7  )r#   r   base_resolutionr  min_crop_resolutionmax_crop_resolutionr?  r*   s    r,   r-   $ImageCropByMaskAndResize.INPUT_TYPES  sf     $"$)Anfg+j#k!!N\]#`a(-CR`jk/n'o(-CR`jk/n'o	
 		
r/   )r%   r   BBOX)r   r  r  r  r1   Nc           
      l   US:H  R                  SS9u  pVUR                  u  pxUR                  5       S:X  a  US-  n	US-  n
SnSnOUR                  5       R	                  5       nUR                  5       R	                  5       nUR                  5       R	                  5       nUR                  5       R	                  5       nX-
  S-   nUU-
  S-   nX-   S-  n	UU-   S-  n
U(       a  [        X5      n[        X5      nU(       a  [        X5      n[        X5      n[        X-
  S-  U5      n[        X|-
  S-  U5      nUSU-  -   nUSU-  -   n[        UU5      n[        UU5      n[        S[        [        U	US-  -
  5      UU-
  5      5      n[        S[        [        U
US-  -
  5      UU-
  5      5      nUUUU4$ )z
Calculate bounding box from mask with proper padding boundary protection
Ensures crop region never exceeds original image boundaries
rd   Tas_tupler   r  r   )nonzeror   rf  rT   r  rU   r  )r4   r   r  r  r  iyixh0w0x_cy_cr  r  x_minx_maxy_miny_maxmax_padding_xmax_padding_yfinal_widthfinal_heightx0y0s                          r,   crop_by_mask%ImageCropByMaskAndResize.crop_by_mask  s   
 !)$$d$3 88:?s(Cs(CEFFFHMMOEFFHMMOEFFHMMOEFFHMMOEMA%EU]Q&F=C'C5=C'C 3E5F3E5F RZA-w7R[Q.8 a-//M 11 +r*<, CC+/12B4DEFCC,"223R,5FGHB\22r/   c                    UR                  5       n/ n/ n/ n	/ n
/ n[        UR                  S   5       HD  nU R                  X,   XEU5      u  pnnU
R	                  XUU45        UR	                  UU-  5        MF     [        U
 VVVVs/ s H	  u  pnnUPM     snnnn5      n[        U
 VVVVs/ s H	  u  pnnUPM     snnnn5      n[        U5      nUS-   S-  S-  nUS-   S-  S-  nUS:  a  Un[        UU-  5      nOUn[        UU-  5      nUS-   S-  S-  nUS-   S-  S-  n[        UR                  S   5       GH  nX   u  nnnnUUS-  -   nUUS-  -   n[        S[        [        UUS-  -
  5      UR                  S   U-
  5      5      n[        S[        [        UUS-  -
  5      UR                  S   U-
  5      5      nUU-   nUU-   nX   UU2UU2SS24   n X,   UU2UU24   n!U R                  S5      R                  SS5      n [        U UUSS	5      n U R                  SS5      R                  S5      n U!R                  S5      R                  S5      n![        U!UUS
S	5      n!U!R                  S5      R                  S5      n!UR	                  U 5        UR	                  U!5        U	R	                  UUUU45        GM     [        R                  " U5      [        R                  " U5      U	4$ s  snnnnf s  snnnnf )zR
Main crop and resize function with uniform target dimensions for all batch items
r      r  rd   r   Nr   r  r  r  )r  r   r   r  r-  rU   r  rT   rg  r  r   r   rm   r   )"r4   r#   r   r  r  r  r  r  	mask_list	bbox_listbbox_paramsaspect_ratiosrr   r  r  rL  rM  max_wmax_hmax_aspect_ratior  r  orig_x0orig_y0orig_worig_hx_centery_centerx0_newy0_newx1_newy1_newcropped_imagecropped_masks"                                     r,   r  ImageCropByMaskAndResize.crop  s<    zz|
		 u{{1~&A,,TWgTghLBAq1~.  Q' ' ;7;<21aQ;78;7;<21aQ;78}- "R'"R' a*L2B BCM+M1AABL %r)b025&+2R7 u{{1~&A/:~,GWff !+H!+H CHuqy$8 95;;q>E;QRSFCHuqy$8 95;;q>E;QRSFe^Fe^F "HVF]F6M1%DEM76&=&-#?@L *33A6>>r1EM*=,W`blmM)11!R8@@CM (11!4>>qAL),mU_aklL'//2::1=Lm,\*ffff=>? 'B J'Y)?KKm 87s   K4-K<r)   )r   NN)r   r7  r  )r6   r7   r8   r9   r:   r-   r;   r   r<   r=   r  r  r?   r)   r/   r,   r  r    s7    

 

 /L/LHH23hHLr/   r  c                   >    \ rS rSr\S 5       rSrSrSrSr	Sr
S rS	rg
)ImageCropByMaski5  c                     SSSS.0$ )Nr'   r$   r   r[  r)   r*   s    r,   r-   ImageCropByMask.INPUT_TYPES6  s     $"
 	
r/   r$   r]   r  r1   z2Crops the input images based on the provided mask.c           	      8   UR                   u  p4pVUR                  5       n/ n[        U5       H  n[        R                  " U[        XR                   S   S-
  5         S:  SS9n	[        R                  " U[        XR                   S   S-
  5         S:  SS9n
[        R                  " U	5      S   SS/   u  p[        R                  " U
5      S   SS/   u  pXUS-   2XS-   2XS-   2S S 24   nUR                  U5        M     [        R                  " USS9nU4$ )Nr   rd   r   r   )	r   r  r   rm   rd  rT   wherer-  r  )r4   r#   r   r   r   r   r   cropsbr  colsr  r  r  r  r  cropped_imagess                    r,   r  ImageCropByMask.cropE  s   [[
azz| qA99T#aAq"9:Q>AFD99T#aAq"9:Q>AFD !;;t,Q/B8LE ;;t,Q/B8LE 1Q3Agu1W}a?@DLL  5a0!!r/   r)   Nr6   r7   r8   r9   r:   r-   r;   r   r<   r=   r>   r  r?   r)   r/   r,   r  r  5  s4    
 
 LLHHFK"r/   r  c                   >    \ rS rSr\S 5       rSrSrSrSr	S
S jr
S	rg)ImageUncropByMaski`  c                     SSSSSS.0$ )Nr'   r$   r   )r  )ri  rj  r   r  r)   r*   s    r,   r-   ImageUncropByMask.INPUT_TYPESb  s     '1", ) )	 	r/   r1   r$   r]   uncropNc           
         / nUR                   u  pgp[        UR                   S   5       GH  n
XJ   u  ppX-
  nX-
  n[        X*   R                  S5      R	                  SS5      UUSS5      nUR	                  SS5      R                  S5      n[        X:   R                  S5      R                  S5      UUSS5      nUR                  S5      R                  S5      nUnX-
  nUnX~-
  n[        R                  " USSUUUU4SSS9n[        R                  " UUUUU4SSS9nUR                  S	5      R                  SSX   R                   S	   5      nUR                  S	5      R                  SSSX   R                   S	   5      R                  S	5      nX   S
U-
  -  UU-  -   nUR                  U5        GM     [        R                  " U5      4$ )Nr   r   rd   r  r  r  r  )r  r  r
  r   rO   )r   r   r   rg  r  r   rk  r  r   r-  rm   r   )r4   ri  rj  r   r  output_listr   r   r   r   rr   r  r  r  r  bbox_height
bbox_widthresized_sourcer8  r(  r)  r&  r'  padded_sourcer>  r  s                             r,   r  ImageUncropByMask.uncropr  s    &&
av||A'A!WNBB'KJ ,FI,?,?,B,J,J2q,QS]_jlu  xB  CN+33Ar:BB1EN *$'*;*;A*>*H*H*KZYdfpr|}L'//2::1=L HIGJ EE.q!XyRY[e6fmw  @A  BM%%8YQ[2\cmuvwK &//299"b+.BVBVWXBYZK)33A6==b"b+.J^J^_`JabjjklmM !^s['89MK<WWFv&A (F K(**r/   r)   r3   )r6   r7   r8   r9   r:   r-   r=   r;   r   r<   r  r?   r)   r/   r,   r  r  `  s/      HLLH)+r/   r  c                   >    \ rS rSr\S 5       rSrSrSrSr	Sr
S rS	rg
)ImageCropByMaskBatchi  c                 f    SSSSSS[         SS.4SSS[         SS.4SSSS	S
S.4SSS04SSSS.4S.0$ )Nr'   r$   r   r  r  r   r  rS   r  rd   rW   rJ   Fr   r  HColor as RGB values in range 0-255 or 0.0-1.0, or color name or hex coderV  )r#   r  r  r  r  preserve_sizebg_colorr?  r*   s    r,   r-    ImageCropByMaskBatch.INPUT_TYPES  su    ('#Q~_`%cd$#a`a&de %1QtUV'YZ&/)U1C%D!)y  NX  ,Y  !Z 	 		r/   r  r  r  r1   z3Crops the input images based on the provided masks.c                    UR                   u  ppUR                   u  pnUnX:w  d  X:w  a5  [        R                  " UR                  S5      X4SS9R	                  S5      n/ n/ n[        U5      nU Vs/ s H  nUS-  PM
     nn[        U5       GH  nUU   n[        R                  " USS9u  nn[        U5      S:X  d  [        U5      S:X  a  MA  [        SUR                  5       R                  5       U-
  5      n[        U	UR                  5       R                  5       S-   U-   5      n[        SUR                  5       R                  5       U-
  5      n[        U
UR                  5       R                  5       S-   U-   5      nUR                  S5      R                  SSU5      nUSUU2UU2S S 24   nUUU2UU2S S 24   nUR                   SS	 u  nnUn Un!U(       a  UU:  d  UU:  a  [        UU-  UU-  5      n"[        UU"-  5      n [        UU"-  5      n![        UR!                  S	SS5      R                  S5      U U!S
S5      R	                  S5      R!                  SS	S5      n#[        R"                  R$                  R                  UR!                  S	SS5      R                  S5      U!U 4SS9R	                  S5      R!                  SS	S5      n$OUn#Un$[        R&                  " XCS4UR(                  S9n%[        R&                  " XC4UR(                  S9n&UU -
  S	-  n'UU!-
  S	-  n(U#U%U(U(U!-   2U'U'U -   2S S 24'   [        U$R                   5      S:X  a  U$S S 2S S 2S4   n$U$U&U(U(U!-   2U'U'U -   24'   UR+                  U%5        UR+                  U&5        GM     U(       d#  [        R&                  " SXCS4UR(                  S94$ [        R,                  " USS9n)[        R,                  " USS9n*U*R                  S5      R                  SSSS5      n+[        R.                  " U[        R0                  UR2                  S9n,U)U+-  U,SU+-
  -  -   n)U)U*4$ s  snf )Nrd   r  r  r  Tr  r   r   r   r  r  r"  r   r  r   rY  )r   rk  rl  rg  r   r   r   rm   r  rD  rU   rT   r  r   r  r   r   r  r  rh  rZ  r-  r   r  r   r   )-r4   r#   r  r  r  r   r  r  r   r   r   r   BMHMWM
mask_countr  r  rg  r5  rr   	curr_mask	y_indices	x_indicesmin_ymax_ymin_xmax_xcropped_imgr  rI  rH  rM  rN  rL  resized_imgr8  new_imgr  pad_xpad_yout_rgb	out_masksmask_expandedr~  s-                                                r,   r  ImageCropByMaskBatch.crop  sn   [[
a[[

7bgMM%//!"4A6X``abcE %X.
'12z!AIz2 z"AaI $)==T#J Iy9~"c)n&9 9==?//1G;<E9==?//1A5?@E9==?//1G;<E9==?//1A5?@E "++B/66r2qAI  5;eQ >?K$U5[%+q%@AL(..q3NFFEE FUNfvoE&L&-8FUN+FUN+ -[-@-@1Q-G-Q-QRS-TV[]bdmoyz  C  C  DE  F  N  N  OP  QR  ST  U$xx22>> ((1Q/99!<"  ?   '!*WWQq^	  *+ kk6!"4EKKHG{{F?%++FH U]q(Ee^)E?JGE%+%uU5['8!;<<%%&!++AaE2=IHU5;&eEk(99:  ))m #p KKF1 5U[[IKK++m3KK!4	 "++B/66r2r1E <<ell[M),<M@Q,RR##M 3s   3Qr)   Nr  r)   r/   r,   r  r    s5    
 
 'L'LHHGKQ$r/   r  c                   B    \ rS rSr\S 5       rSrSrSrSr	Sr
SS	 jrS
rg)r?  i  c                     SSSS[         SS.4SSS[         SS.4SSS[         SS.4SSS[         SS.4SSS[         SS.4/ SQ4SSS	S
.4S.SSSS[         SSS.4SSS[         SSS.4S.S.$ )Nr$   r  r   rd   rS   )r8  r9  r   r)  r   r  r  rV  )r#   rJ  rH  r-  r  extra_paddingrS  r   r   r  T)rJ   rT   rU   rV   rs  )r   r  r  r&   r?  r*   s    r,   r-   ImagePadKJ.INPUT_TYPES  s     )"!N\]$`a#1^]^%ab!q>[\#_`$!An^_&bc&+1^ef-i%j!R T&I  KU  )V  W	 '%*Anfgw{,|$}&+Q~ghx|-}%~ 	r/   r  r  r  r1   zCPad the input image and optionally mask with the specified padding.Nc                 &   UR                   u  ppU	bQ  U	R                   u  nnnUU:w  d  UU:w  a5  [        R                  " U	R                  S5      X4SS9R	                  S5      n	[        U5      nU Vs/ s H  nUS-  PM
     nn[        U5      S:X  a  US-  n[        R                  " UUR                  UR                  S9nU
bp  Ubm  US:  aB  [        UR                  SS5      X-
  X-
  S	S
5      R                  SS5      nUR                   u  ppU
nUnUU-
  S-  nUU-
  U-
  nUU-
  S-  nUU-
  U-
  nO X&-   nX6-   nXF-   nXV-   nUU-   U-   nUU-   U-   nUS:X  Gav  S n[        R                  " UUUU4UR                  UR                  S9n[        U5       GH  nUS:  a*  US:  a$  [        U[!        U5      -  U[!        U5      -  5      OSn[        S[#        [%        UU-  5      5      5      n [        S[#        [%        UU-  5      5      5      n!UU   R                  SS5      R                  S5      n"[        U"U U!SS
S9n#[        SU!U-
  S-  5      n$[        SU U-
  S-  5      n%['        U!U$U-   5      n&['        U U%U-   5      n'U#S S 2S S 2U$U&2U%U'24   n#U#R                   S   U:w  d  U#R                   S   U:w  az  UU#R                   S   -
  n(UU#R                   S   -
  n)[        SU(S-  5      n*[        SU(U*-
  5      n+[        SU)S-  5      n,[        SU)U,-
  5      n-[        R(                  " U#U,U-U*U+4SS9n#[        SS[!        ['        UU5      5      -  5      n.U" U#U.S9n#US:  a  U#S S 2SS24   U#S S 2SS24   U#S S 2SS24   n1n0n/SU/-  SU0-  -   SU1-  -   n2[        R*                  " U2U2U2/SS9n3Sn4[        R*                  " U/U0U1/SS9n5U5SU4-
  -  U3U4-  -   n5U5U#S S 2SS2S S 2S S 24'   Sn6[        R,                  " U#U6-  SS5      n#U#R	                  S5      R                  SS5      UU'   GM     UUS S 2UUU-   2UUU-   2S S 24'   U	bG  U	n7[        R.                  " UUU4UR                  UR                  S9n8U7U8S S 2UUU-   2UUU-   24'   UU84$ [        R.                  " UUU4UR                  UR                  S9n8SU8S S 2UUU-   2UUU-   24'   UU84$ [        R                  " UUUU4UR                  UR                  S9n[        U5       GHu  nUS:X  a  UUSS S 2S S 24   n9UUUS-
  S S 2S S 24   n:UUS S 2SS S 24   n;UUS S 2US-
  S S 24   n<U9R1                  SS9UUS U2S S 2S S 24'   U:R1                  SS9UUUU-   S 2S S 2S S 24'   U;R1                  SS9UUS S 2S U2S S 24'   U<R1                  SS9UUS S 2UU-   S 2S S 24'   UU   UUUUU-   2UUU-   2S S 24'   M  US:X  GaU  [        U5       H  n=UUSS S 2S S 24   UUU=UUU-   2S S 24'   M      [        UU-   U5       H!  n=UUUS-
  S S 2S S 24   UUU=UUU-   2S S 24'   M#     [        U5       H  nUUS S 2SS S 24   UUUUU-   2US S 24'   M      [        UU-   U5       H!  nUUS S 2US-
  S S 24   UUUUU-   2US S 24'   M#     UUSSS S 24   UUS U2S U2S S 24'   UUSUS-
  S S 24   UUS U2UU-   S 2S S 24'   UUUS-
  SS S 24   UUUU-   S 2S U2S S 24'   UUUS-
  US-
  S S 24   UUUU-   S 2UU-   S 2S S 24'   UU   UUUUU-   2UUU-   2S S 24'   GM0  UR                  S5      R                  S5      UUS S 2S S 2S S 24'   UU   UUUUU-   2UUU-   2S S 24'   GMx     U	b1  [        R2                  R4                  R)                  U	UUUU4SS9n8UU84$ [        R.                  " UUU4UR                  UR                  S9n8[        U5       H  n>SU8U>UUU-   2UUU-   24'   M     UU84$ s  snf )Nrd   r  r  r  r   rY  r   r   r  r  r   r)  c           	      p   US::  a  U $ [        S[        S[        U5      -  5      5      nSU-  S-   n[        R                  " U* US-   U R
                  U R                  S9n[        R                  " XD-  * S[        U5      -  [        U5      -  -  5      nXUR                  5       -  nUR                  SSSU5      nUR                  SSUS5      nU R                  S   nUR                  USSS5      nUR                  USSS5      n[        R                  " XSU4US9n [        R                  " XUS4US9n U $ )Nr   rd   g      @r   r  r  r  )rU   r  r   rm   r  r   rZ  r  r  r   r   r  rk  r  )	img_nchwsigma_pxr  kr5  k1kxkyr  s	            r,   _gaussian_blur_nchw+ImagePadKJ.pad.<locals>._gaussian_blur_nchwD  s   q=#OQC%/$9 :;JNLL&&1*X__T\TbTbcYYx3x+@5?+RST&&(]WWQ1a(WWQ1a(NN1%YYq!Q*YYq!Q*88H1f+aP88H61+aPr/   rO   r  r4  	replicater  g~jtx?)r  gz6?g,C?g]m{?r   g?gffffff?rP   r8  r9  )r   rk  rl  rg  r   r   rD  rm   r  rZ  r   r   r  rh  r   rU   r   r  r  rT   r  r  r  r  rf  r  r  )?r4   r#   rJ  rH  r-  r  r  r   rS  r   r  r  r   r   r   r   r  r  r  rg  r5  r   rM  rN  r(  r)  r&  r'  r#  rB  r  
scale_fillbg_wbg_hsrc_bbgr  r  r  r  pad_hpad_wpad_top_fixpad_bottom_fixpad_left_fixpad_right_fixr  rrj  bchlumagraydesatrgbr   fg_maskr  top_edgebottom_edge	left_edge
right_edger  rX  s?                                                                  r,   r  ImagePadKJ.pad  s	   [[
aJBBQw"'}}T^^A%6aV/Zbbcde %U+
'12z!AIz2x=A!|H<<ELLQ #(Aq &u}}R';Q=NPQPaclnxy  B  B  CD  FH  I"[[
a'L)M$q(Q.H$q(83I$q(Q.G&*W4J+H-I)G/Jx<)3LK*4M '' " Q|Q$Gu{{chcocopI1XXY\]X]bcfgbgSa!8-%PQ(:RSnq
1c%J"7891c%J"789a((Q/99!<#E4z
STM1a78TL0Q67rM12rL011beRU*+88A;-/288A;,3N)BHHQK7E(288A;6E"%a!"4K%(EK,?%@N#&q%1*#5L$'5<+?$@MrL-n#]dopBCs=,/O)P!PQ(e<6 "1ac6
Bq!A#vJ1ac6
#qA!A:
2Vc\AD 99dD$%7Q?D E))Q3KQ7Cu-u<C'*Bq!A#q!|$[[c34!zz!}44Q;	!? @ GLIa*HXaZ,?BC!JJ=,'Gu{{chcocop	GN	!WWQY.!0CCD y)) "JJ=,'Gu{{chcocop	GJ	!WWQY.!0CCDy)) KKM< C5;;_d_k_kl	qAv%$Q1aZ0H"'1Q31"5K %aAqj 1I!&q!QqS!|!4J3;==Q=3GIa'1a/05@5E5E!5E5LIaQ124=NNqN4IIaIXIq016@oo!o6LIaHQJK23NSTUhIa!2HXaZ4GJK-"7^BG1aQR
BS	!Q!(;Q">? ,"719m<BG1Q3PQSTBU	!Q!(;Q">? ="8_@EaAqj@Q	!WWQY%61"<= -"8A:|<@EaAaCQRl@S	!WWQY%61"<= =;@Aq!;LIa'9H9a78=B1a1a<=PIa'8A:;9:=B1ac1a<=PIaYhY9:?DQ!QqSRS^?TIaXaZ[!;<NSTUhIa!2HXaZ4GJK -5,>,>q,A,K,KA,NIaAqj)NSTUhIa!2HXaZ4GJK= @ ++//9gz:  0 I 9%%	 

A}l#C5;;_d_k_klI1XGJ	!WWQY.!0CCD  9%%M 3s   3`r)   r@  )r6   r7   r8   r9   r:   r-   r;   r   r<   r=   r>   r  r?   r)   r/   r,   r?  r?    s5     $ 'L'LHHWKP&r/   r?  c                   ^    \ rS rSr\S 5       r\S 5       rSrSrSr	Sr
SS jr\S 5       rS	rg
)LoadVideosFromFolderi  c                     [         R                  " S5      U l        g ! [         a     [         R                  " S5      U l         g ! [         a    SS KnS nUR
                   H9  nSU;   d  M  SUR
                  U   R                  ;   d  M*  UR
                  U   n  O   Uc:  UR
                   H*  nUR                  S5      (       d  M  UR
                  U   n  O   Ub	  X l          g [        S5      ef = f[         a    [        S5      ef = f)Nz)ComfyUI-VideoHelperSuite.videohelpersuitez)comfyui-videohelpersuite.videohelpersuiter   videohelpersuite<This node requires ComfyUI-VideoHelperSuite to be installed.)	importlibimport_module	vhs_nodesr   sysmodules__dict__r  )r[   rE  
vhs_modulemodule_names       r,   r   LoadVideosFromFolder.__init__  s	   	^%334_`CM 	ff ) 7 78c d f!
#&;;K)[8=OSVS^S^_jSkStSt=t%([[%=
 $/
 %'*{{&//0BCC),[)AJ! (3
 )$.M%&dee'f*  	^\]]	^s8    
DA#C4-C49C4	C4%D(C44Dc                     SSS04SSSSSSS.4S	SSS
SS.4S	SSS
SS.4S	SSSSSS.4S	SSSSS.4S	SSSSS.4SS/SS04S	SSSSSS.4SSS04S.
SSS.S.$ )Nr   rJ   zX://insert/path/rN   r   <   rd   )rJ   rT   rU   rV   disabler  r  )rJ   rT   rU   rM  r)  rS   r  batchr  r  r  rW   F)
video
force_ratecustom_widthcustom_heightframe_load_capskip_first_framesselect_every_nthoutput_typegrid_max_columns	add_labelr0  )
force_sizer/  r   r)   r*   s    r,   r-    LoadVideosFromFolder.INPUT_TYPES  s     #Y0B$CE&AaTUbc(de!&AaYZ([ \"'QqZ[)\!]#(a%YZgh*i"j&+1U\]-^%_%*!DZ[,\$]!(& 1Iw3GH%*!BXYfg,h$i(9e*<> '(
 	
r/   r)  r$   
load_videoc                 Z   UR                  S5      (       ap  [        R                  R                  US   5      (       dI  [        R
                  (       a4  [        R                  R                  [        R
                  US   5      US'   U R                  c  [        S5      e/ n/ n[        [        R                  " US   5      5       H  n[        R                  R                  [        R                  R                  US   U5      5      (       d  MJ  UR                  S5      n[        U5      S:  d  Ml  US   R                  5       S;   d  M  UR                  [        R                  R                  US   U5      5        UR                  U5        M     UR!                  S5        / n	[#        U5       GH  u  pU R                  R$                  R&                  " SSU0UD6S   nU(       Ga;  UR)                  5       S:X  a  UR*                  u  pnnOUR*                  u  pnXj   R-                  SS5      S   n[/        S	US
-  5      n [0        R2                  " SU5      n[8        R:                  " SUS4S5      n[<        R>                  " U5      nURA                  SUUS9n[/        SUS-  5      nUS   US   -
  U-   n[8        R:                  " SUU4S5      n[<        R>                  " U5      nURC                  US-  US   US   -
  S-  -
  S4UUSS9  [D        RF                  " U5      RI                  [D        RJ                  5      S-  n[L        RN                  " U5      nUS:X  a  URQ                  SSS9nO?US:X  a9  [L        RR                  " UUS4URT                  S9n[L        RV                  " UU/SS9nUR)                  5       S:X  aH  URY                  S5      R[                  UR*                  S   SSS5      n[L        RV                  " UU/SS9nO[L        RV                  " UU/SS9nU	R                  U5        GM     US:X  a  [L        RV                  " U	5      nU4$ US:X  Ga  [        U	5      U-   S-
  U-  nUU-  n[        U	5      U:  a9  U	R                  [L        R\                  " U	S   5      5        [        U	5      U:  a  M9  / n [_        U5       GH  n!U!U-  n"U"U-   n#U	U"U# n$U$ V%s/ s H  n%U%R*                  S   PM     n&n%[/        U&5      n'/ n(U$ H  n%U'U%R*                  S   -
  n)U)S:  a  U%R)                  5       S:X  a=  SSSSSU)SS4n*[L        R`                  Rb                  Re                  U%SSSSSU)SS45      n%O0[L        R`                  Rb                  Re                  U%SSSSU)S45      n%U(R                  U%5        M     [L        RV                  " U(SS9n+U R                  U+5        GM     [L        RV                  " U SS9nW4$ ! [4         a    [0        R6                  " 5       n GNf = fs  sn%f )NrO  rA  r  rd   r   )webmmp4mkvgifmovr   r  r     z	arial.ttfr  rk  r  r  )r     r   r   )r  r  r  r  r  T)r   r   r  r   rN  r  r)   )3r  r   r+  r  r   r  r,  rD  r   r  r  isfilerI  rD  r  r-  r  r  load_video_nodesr[  r   r   rsplitrU   r   r  r  load_defaultr   r  r   r  textbboxr  r  r  r!  r   rm   rn   rf  r  rZ  r  rg  r   r  r   r  r  r  ),r4   rV  rW  rX  r%  videos_list	filenamesr  
file_partsloaded_videosr  rO  video_tensorr  rM  rL  r  
label_textr  r  	dummy_imgr  	text_bboxr  label_height	label_imglabel_nplabel_tensorr0  r  r  total_slotsrow_tensorsrow_idxr  rq  
row_videosr  heights
max_heightpadded_row_videos
pad_heightr  
row_tensors,                                               r,   r[  LoadVideosFromFolder.load_video  s   ::grww}}VG_'E'E$J]J] ggll4+>+>wPF7O>>!\]]	

6'?34Aww~~bggll6'?A>??WWS\
z?Q&JrN,@,@,BFj,j&&rww||F7OQ'GH$$Q' 5 	

7#K0JC>>::EE\E\U[\]^_L##%*!-!3!3JA!Q*00GA!&^223:1=
AG,	4$--k9ED "IIeaWg>	 ~~i0 MM%$MG	 #B	Q 7(|il:]J!IIea->H	 ~~i0		1a49Q<	!#<q"@@!DjW[bo	p::i077

CeK$//96#/#4#4D#4#IL!V!JJa';<CUCUVE#(99lE-B#JL##%*#/#9#9!#<#C#CLDVDVWXDY[]_ace#fL#(99lL-Iq#QL#(99lL-Iq#QL  .G 1H '!=1J< {; F"&)99A=BRRD!11Km${2$$U%5%5mA6F%GH m${2 K ;#&66	#&66*9W=
/9:z!1771:z: \
$&!#A!+aggaj!8J!A~557a<#$Q!Qz1Q"?C % 3 3 7 7Aa!AjQRST;U VA % 3 3 7 7Aa!Jq;Q RA%,,Q/ $ #YY'8a@
"":.' '( ;A6J{m  4$113D4L ;s   X$X(X%$X%c                 h    U R                   b%  U R                   R                  R                  U5      $ g r3   )rD  utils	hash_path)r+   rO  r%  s      r,   r  LoadVideosFromFolder.IS_CHANGEDC  s*    ;;";;$$..u55r/   r)   Nr  )r6   r7   r8   r9   r:   r   r-   r=   r;   r   r<   r[  r  r?   r)   r/   r,   r>  r>    s[    ^ ^< 
 
( HLLHTl  r/   r>  c                   `    \ rS rSr\S 5       r\S 5       r\S\R                  4S j5       r
Srg)EncodeVideoComponentsiJ  c                    / SQn[         R                  R                  S/ S9[         R                  R                  S/ S9[         R                  R                  S/ S9[         R                  R                  S[         R                  R	                  SUSS	9/S9[         R                  R                  S
[         R
                  R	                  SSSS9[         R                  R	                  SUSS	9/S9[         R                  R                  S[         R                  R	                  SUSS	9/S9[         R                  R                  S[         R                  R	                  SUSS	9/S9[         R                  R                  S[         R                  R	                  SUSS	9/S9/n[         R                  " S/ SQSSS[         R                  R	                  SSS9[         R                  R	                  SSS9[         R                  R	                  SSS S!S"S#S$9[         R                  R	                  S%S&S S!S"S'S$9[         R                  R	                  S(S S S)S*S+S$9[         R                  R	                  S,/ S-QS.S/S09[         R                  R	                  S1US2S3S49/[         R                  R                  S5S69[         R                  R                  S7S69[         R                  R                  S8S69[         R                  R                  S9S:S;9/S<9$ )=Nr,  r&  r  r   r#  r*  r  r.  zPosition to crop from.)r   rW  r  r-  r  r+  rV  pad_positionz3Position to align the image within the padded area.r'  r(  r)  r  )video to latentzencode videozvae encode videozEncode Video Componentsr1   zmExtracts video frames, resizes them, and encodes with a VAE directly, avoiding storing the full image tensor.rO  z The video to extract and encode.rU  vae"The VAE model to use for encoding.r  r6  r   i @  r   z@Target width for the frames before encoding. 0 = original width.r$  r  r  zBTarget height for the frames before encoding. 0 = original height.
max_framesi?B rd   z'Maximum number of frames. 0 = no limit.r  r  r  z"Interpolation method for resizing.r   rJ   rW  r  zKeep Proportionz2How to handle aspect ratio mismatch when resizing.)r   r   rW  r  r   audior  r  z5Number pixel space frames after any possible cropping)r   rW  )r   r'  r   r   r   r   r   )r   DynamicComboOptionr   r   Stringr   VideoVaer  Latentr   Audior   )r[   position_optionsr   s      r,   r   #EncodeVideoComponents.define_schemaK  s   GOO""y"<OO""x";OO""~b"AOO""v8HRjk7"  OO""u		YHcd~7G  RG  H6"  OO""z~7G  RG  H;"  OO""'7~7G  RG  HA"  OO""'7~7G  RG  HA" #
* yy+R2$ Hw0RSU,PQWcqe!  VX  YXsu1  W[  \\1!a  ZC  D/9t  H  Rv  w%%%#!2P	 &  		  h 7W5U3=Byz	)
 	
r/   c                 "   US:X  a  UnUS:X  a  UnU S:H  nS=n=n=pSnU S;   d  U R                  S5      (       d  U(       Ga,  U S:X  aK  X#-  nXE-  n[        [        R                  " X-  5      5      n[        [        R                  " X-  5      5      nO,[	        X$-  X5-  5      n[        UU-  5      n[        UU-  5      nU R                  S5      (       d  U(       a  US:X  a  X/-
  S-  nX/-
  U-
  nX>-
  S-  n	X>-
  U	-
  n
OkUS	:X  a  X/-
  S-  nX/-
  U-
  nSn	X>-
  n
OPUS
:X  a  X/-
  S-  nX/-
  U-
  nX>-
  n	Sn
O5US:X  a  SnX/-
  nX>-
  S-  n	X>-
  U	-
  n
OUS:X  a  X/-
  nSnX>-
  S-  n	X>-
  U	-
  n
UnUnU S:X  a  XE-  nX#-  nUU:  a  [        UU-  5      nUnOUn[        UU-  5      nUS:X  a  UU-
  S-  nUU-
  S-  nOIUS	:X  a  UU-
  S-  nSnO8US
:X  a  UU-
  S-  nUU-
  nO$US:X  a  SnUU-
  S-  nOUS:X  a  UU-
  nUU-
  S-  nWWUU4nX#XXU
44$ )zUCompute target resize dimensions, crop region, and padding from keep_proportion mode.r   r)  Nr5  r  r*  r  r   r-  r  rJ  rH  r  )r>  r  r}  r  rT   r  )r  positionr  r  src_wsrc_hr)  r(  r)  r&  r'  crop_regionr*  rg  r  r  r   rF  rG  rH  rI  r5  r  s                          r,   _compute_resize_params,EncodeVideoComponents._compute_resize_params  s    A:EQ;F!11677797w--1G1G>~%$~$} <+F!GH
		,*E FG	EM6>:!%%-0	"55=1
u%%x' % 1a7H % 1H <I%2q8G!'!4w!>J& % 1a7H % 1H <IG!'!4J) % 1a7H % 1H <I$1G!"J' H % 1I%2q8G!'!4w!>J($0H !I%2q8G!'!4w!>JEF6>JJJ&uz12uz128#V^)V^)U"V^)X%V^)FNV#V^)W$FNV^)a0Kki*+UUUr/   r   c                 n   SS K nSS Kn	US   n
UR                  S5      =(       d    UR                  SS5      nUR                  SS5      nUR                  nUR	                  5       n[        USS5      n[        US	S5      n UR                  5       nUS:  a  US:  a  [        UU5      nUS:  a  [        U5      OS nUS
:g  nU(       a  [        R                  " 5       O[        R                  " S5      nUR                  USS9 nUR                   R"                  S   n[%        UUR&                  -  5      nU(       a  [%        UU-   UR&                  -  5      OSnUR)                  UUS9  Su  nnnn/ nUR+                  U5       GH]  nUR,                  U:  a  M  U(       a  UR,                  U:  a    GO2US:  a  [/        U5      U:  a    GOUc1  UR0                  UR2                  n nU R5                  XX4U U5      u  nnnn[        R6                  " UR9                  SS95      R;                  U[        R<                  S9S-  n!Ub  Uu  n"n#n$n%U!U#U#U%-   2U"U"U$-   2S S 24   n![?        U!RA                  S5      RC                  SS5      UUUSS9RC                  SS5      RE                  S5      R;                  USS9n!URG                  U!5        Uc  GML  URI                  S5        GM`     URJ                  (       a  URJ                  OSn&S S S 5        W(       a  [        RL                  " U5      O[        RN                  " SXCSUS9n'U
S:H  n(Wu  n)n*n+n,U
RQ                  S5      (       d  U((       aS  U)S:  d  U*S:  d  U+S:  d  U,S:  a;  U((       a  SOU
S:X  a  SO	U
S:X  a  S OS!n-[R        RU                  S U'U)U*U+U,SUU-5	      u  n'n. URV                  S   n/URX                  S   n0U0" U/" U'RZ                  S   5      5      n1U1U'RZ                  S   :  aB  [\        R^                  " S"U'RZ                  S   U1-
   S#U'RZ                  S    S$U1 S%35        U'S U1 n'URe                  U'5      n2S n3[g        U[h        5      (       a  UR)                  S5        UR                  USS9 n[/        UR                   Rj                  5      (       Ga  UR                   Rj                  S   n4US:  a(  [%        UU4R&                  -  5      n5UR)                  U5U4S9  / n6URj                  Rl                  Ro                  S&S9Rp                  n7U	Rr                  Ru                  [w        U7UR+                  U45      5      5      n8S'n9U8 H>  n:UU:Rx                  -
  n;[%        U;U4Rz                  -  5      n<U<U:R|                  :  d  M<  S(n9  O   U9(       aj  U6RG                  W:R9                  5       S)W<S 24   5        U8 H>  n:U(       a  U:Rx                  UU-   :  a    O#U6RG                  U:R9                  5       5        M@     U6(       a  [~        R                  " U6SS*9n=U(       a  U=S)S [%        UU4Rz                  -  5      24   n=[        R6                  " U=5      RA                  S5      U4Rz                  (       a  [%        U4Rz                  5      OSS+.n3S S S 5        [        R                  " S,U20U3[        W&5      U'RZ                  S   5      $ ! [        [        4 a    Sn GNhf = f! , (       d  f       GN = f! [`        [b        4 a     GNf = f! , (       d  f       N= f)-Nr   r  r.  r  r  r-  r  _VideoFromFile__start_time_VideoFromFile__durationr  r   r1  r  )r  )NNN)r   r   r   r   r  r  r  r  r   rd   r  r4  rY  r   r  r)  r  r'  r8  r(  r9  r   z![EncodeVideoComponents] Trimming z	 frames (z -> z)) to match VAE temporal compression ratiofltpFT.)axiswaveformsample_rater  )Dr  	itertoolsr  	vae_dtypeget_stream_sourcegetattrget_frame_countrF  AttributeErrorrT   r   r   r   rm   r   rJ  streamsrO  r  	time_baseseekdecodeptsrD  r  r  r  rn   
to_ndarrayr   r   r   rg  r  r   r-  rm  average_rater   rh  r>  r?  r  r  upscale_ratior   rp   rq   	TypeError
IndexErrorr  r  r   r  	resamplerAudioResamplerresamplechainfrom_iterabler   r  r  r  r  rV  r   r   r   )>r[   rO  r  r  r  r  r  r  r  r  r  r  r-  target_dtyperj  r  r  r  r  use_gpur   r  video_stream	start_ptsend_ptsres_wres_hr  r  r  r  r  r  r2  cxcycwrp  
frame_rater+   r)  r(  r)  r&  r'  rS  r  temporal_compresstemporal_decompressvalid_framesr  r  audio_streamaudio_start_ptsaudio_framesr  aframeshas_first_frameaframeoffset_secondsto_skip
audio_datas>                                                                 r,   r   EncodeVideoComponents.execute  s   01"&&7h?;N;N~_g;h#''Y?	}} ((*U$@!D
5"<a@	 002L >lQ.|Z8L,81,<{<($ !I-8?!224U\\RWEX WWV#W&)$,,2215LJ)?)??@IOWc:0L4J4JJK]^GNN9\N:1O.E5+wF")),799y(		W 4>c&kZ&?=#(<<5E9<9S9Sue:6E5+w
 &&u'7'7w'7'GHKKSYafananKorww *%0NBBbBh2b5!34C %MM!$,,R3UE>Xb'!R.BB\%B,P  c"#KKN; 8> 7C6O6O22UVJO 'R $*EKKu{{1fQVb/c !113:0)WjOOE""n8a<9WX=\cfg\gkuxyky$2 *, $(8 8	  >>$8YUVXacklDAq	 # 3 3A 6"%"3"3A"6./@/LMLaggaj("CAGGAJQ]D]C^^ghihohopqhrgssw  yE  xF  Fo  !p  qm|$ JJqM fg&&KKNWWV#W&)9$$**++(0066r:>&)*|7M7M*M&NONN?<NH!88--<<F<KTT#//77)"2"2<"@A #(%F%/&++%=N!.<3K3K"KLG/*. & # ''(9(9(;CM(JK")#j86K(K!$++F,=,=,?@ #*  !#1!EJ%/5^c(\E]E]:]6^5^0^%_
$)$4$4Z$@$J$J1$MHTH`H`s<+C+C'DfgE9 'B }}i^UE*4EqwwqzRRi N+ 	L	 '&~ :& 		 '&sL   [$ G[=5[==B\ D\&$D\&$[:9[:=
\\#"\#&
\4r)   N)r6   r7   r8   r9   r:   r   r  r  r   r   r   r?   r)   r/   r,   r  r  J  sV    1
 1
f MV MV^ ES`b`m`m ES ESr/   r  c                       \ rS rSr\S 5       r\SS\R                  4S jj5       r\S 5       r	\SS j5       r
\S 5       r\S\R                  4S	 j5       rS
rg)DecodeAndSaveVideoiX  c           "         [         R                  " SSS/SSS[         R                  R                  SSS	9[         R                  R                  S
SSS9[         R                  R                  SSSSSSS9[         R
                  R                  SSSS9[         R                  R                  S[        R                  R                  5       SSS9[         R                  R                  S[        R                  R                  5       SSS9[         R                  R                  SS S	9[         R                  R                  S!SS"S9[         R                  R                  S#[         R                  R                  S$/ S%9[         R                  R                  S&[         R                  R                  S'S(S)S*S+S,S9[         R                  R                  S-S)S.S*S+S/S9[         R                  R                  S0S*S1S*S2S3S9[         R                  R                  S4S5S2S*S2S6S9/S%9/S79/	[         R                  R                   [         R                  R"                  /SS89$ )9Nr  r  zdecode videozDecode and Save Videor1   zDecodes video frames and audio from latent representations, combines them, and saves as a video file, without keeping intermediate images in memory.video_latentz.The latent representation of the video frames.rU  audio_latentTz.The latent representation of the audio frames.)r(   rW  r        9@rP   g     8@rR   z Frame rate for the output video.r$  r   zvideo/ComfyUIr  rV  r  autoz The format to save the video as.r  codeczThe codec to use for the video.	video_vaer  	audio_vaez(The VAE model to use for decoding audio.tilingr  r  enabled	tile_sizer  rQ  r  rm  zNSize of the tiles to decode. Smaller tiles use less memory but take more time.rK  r   zAmount of overlap between tiles. Higher overlap can improve quality at the edges of tiles but uses more memory and takes more time.temporal_sizer  r  zmOnly used for video VAEs: Amount of frames to decode at a time. Higher value than number of frames = disabledtemporal_overlapr  zOnly used for video VAEs: Amount of frames to overlap. Higher overlap can improve quality at the edges of temporal tiles but uses more memory and takes more time.r  )r   r'  r   r   r   r   r   r[  )r   r   r  r   r   r  r   r   VideoContaineras_input
VideoCodecr  r  r  r  Hiddenr   r   rZ   s    r,   r    DecodeAndSaveVideo.define_schemaY  s*   yy(-~>0$ o		8hi		GwxudT[}~		 1?  Uu  vx1E1E1N1N1PZ`  kM  Nw0@0@0I0I0KU[  fG  H[2VW[4Akl%%hOO**z"*EOO**y[#24VX  cs  tYtRT  _d  e_dtZ[  fU  V%7PT[\  gK  L	B* 9% & II$$bii&=&=>5
 	
r/   Nr   c
                    US   S:X  Ga(  US   n
US   nUS   nUS   nXS-  :  a  U
S-  nXS-  :  a  US-  nUR                  5       nUb*  [        SX-  5      n[        S	[        US-  X-  5      5      nOS nS nUR                  5       nU R	                  X!S
   [        SU5      X-  X-  Ub  UOS	[        S	X-  5      [        S	X-  5      4S9R                  S	S5      n[        UR                  5      S:X  a;  UR                  SUR                  S   UR                  S   UR                  S   5      nOU R                  X!5      nUb   Uc  [        S5      eU R                  Xx5      nOS n[        R                  " [        R                  " UU[!        U	5      S95      nU R#                  UX4U5      u  nn[$        R&                  " [(        R*                  " [(        R,                  " UU[$        R.                  R0                  5      /5      S9$ )Nr  r  r  rK  r  r  r  r   rd   r  )tile_ttile_xtile_yrK  r   r  r  r  z7Audio VAE must be provided if audio latent is provided.)r   r  r  r  )temporal_compression_decoderU   rT   spacial_compression_decodedecode_tiledr  rD  r   r_  decode_videorF  decode_audior   VideoFromComponentsr   VideoComponentsr   
save_videor   r   r   PreviewVideoSavedResult
FolderTyper   )r[   r  r  r   r  r  r  r  r  r  r  rK  r  r  temporal_compressioncompressionr   r  rO  r6  r  s                        r,   r   DecodeAndSaveVideo.executex  s@   (y({+IY'G"?3M%&89Q;&#q.!33#3q#8 #,#H#H#J #/ #A}'L M#&q#mq.@BRBj*k#l  $#' #>>@K%%ii1H-0M-B-6-E-6-ECSC_/?efhklmov  pF  iG  IL  MN  PW  Pf  Ig  /h	 & 
 gan  6<< A%FLL,<fll2>NPVP\P\]_P`a%%i>F#  !Z[[$$\=EE--e.C.C6Y^kstwkx.yz..Oi}}iQSQ^Q^QeQe1f0g hiir/   c           	         US   nUR                   (       a  UR                  5       S   nUR                  5         S nSnUR                  S:X  a  UR                  S:X  a  US S 2S S 2S4   n UR                  UR                  UR                  5      n[        R                  " UR                  /USS9  UR                  R                  UR                  5      n[        Xv-  5      n[        SU5      n[        SUR                  S   U5       H  n	X9X-    R!                  UR                  5      R!                  UR                  5      nUR#                  UR$                  R'                  U5      R!                  UR(                  5      R!                  [*        R,                  5      5      n
UcQ  [*        R.                  " UR                  S   4[1        U
R                  SS  5      -   UR(                  U
R2                  S	9nXXU-   & M     U(       a}  UR                  S-
  nUS:X  d  U R<                  b  UR?                  U5      nOIUS:X  a  URA                  U5      nO1US:X  a+  SURC                  5       -  nUS-  nURE                  X=USX4S9nUR!                  UR(                  5      RG                  SS5      n[I        UR                  5      S:X  a;  URK                  SUR                  S   UR                  S   UR                  S   5      nU$ ! [4         a9  n[        R6                  " U5        [8        R:                  " S
5        Sn S nAGNCS nAff = f)Nr  r   Fr   r  Tmemory_requiredforce_full_loadrd   r  zWWarning: Ran out of memory when regular VAE decoding, retrying with tiled VAE decoding.r   r   r  )r  r  rK  r   r  r  )&	is_nestedunbindthrow_exception_if_invalid
latent_dimr  memory_used_decoder   r  r   load_models_gpupatcherget_free_memoryr   r  rU   r   r   process_outputfirst_stage_modelr  output_devicerm   r  r  r  rZ  ro   raise_non_oomrp   rq   extra_1d_channeldecode_tiled_1ddecode_tiled_2dr  decode_tiled_3dr  rD  r_  )r[   r  r  
samples_inpixel_samplesdo_tilememory_usedfree_memoryr  r5  r   rw   dimstilerK  s                  r,   r  DecodeAndSaveVideo.decode_video  s   Y'
#**,Q/J&&(>>Q:??a#7#Aq!G,J	001A1A3==QK,,ckk]Kimn++55cjjAK{89Lq,/L1j..q1<@$q~699#--HKKCJJW(()>)>)E)Eg)N)Q)QRURcRc)d)g)ghmhuhu)vw ($)KK1A1A!1D0FsyyYZY[}I]0]fifwfw  @C  @I  @I  %JM25a,/ A ??Q&DqyC00< # 3 3J ? # 3 3J ?c<<>>!) # 3 3JTXcdfmbw 3 x%(():):;CCAbI}""#q()11"m6I6I"6M}ObObceOfhuh{h{|~h  AM)  	**1-OOuvG	s   +FL 
M.MMc                 b  ^ TR                  5         TR                  UR                  TR                  5      n[        R
                  " TR                  /UTR                  S9  U4S jnTR                  [        X(X4U4UTR                  TR                  TR                  TR                  S95      $ )Nr  c                    > TR                   R                  U R                  TR                  5      R                  TR                  5      5      R                  [
        R                  5      $ r3   )r  r  r   r  r   rm   r  )r1  r  s    r,   r  1DecodeAndSaveVideo.decode_tiled.<locals>.<lambda>  sG    c33::144;N;Q;QRUR\R\;]^aabgbobopr/   )r  rK  upscale_amountout_channelsindex_formulasr  )r  r  r   r  r   r  r  disable_offloadr  r   r  output_channelsupscale_index_formular  )	r[   r  r  r  r  r  rK  r  	decode_fns	    `       r,   r  DecodeAndSaveVideo.decode_tiled  s    &&(,,W]]CMMJ((#++ehexexyp	!!"6wQWagPhryFIFWFWfifyfy  KN  Kd  Kd  tw  tE  tE#F G 	Gr/   c           	      t   US   nUR                   (       a  UR                  5       S   nUR                  U5      n[        US5      (       a  UR	                  SS5      nUR                  UR                  5      n[        US[        USS 5      5      nUc  [        [        USS 5      SS5      nU[        U5      S.$ )	Nr  r   r  rd   audio_sample_rate_outputoutput_sample_rateiD  r  )	r  r  r  r\  r  r   r   r  r  )r[   r  r  r  r  output_audio_sample_rates         r,   r  DecodeAndSaveVideo.decode_audio  s    y)!!'..04L  . 9122MM"a(E,,-#*&I3T:$
 
 $+'.	#6=?SUZ($ "#6N2OPPr/   c                    UR                  5       u  pV[        R                  " U[        R                  " 5       UU5      u  pxpnS n[        R
                  (       d  0 nU R                  R                  b%  UR                  U R                  R                  5        U R                  R                  b  U R                  R                  US'   [        U5      S:  a  UnU SU	S S[        R                  R                  U5       3nUR                  [        R                   R#                  X}5      [        R                  " U5      UUS9  X4$ )Nr   r   r  r  z_.)r  r  r4  )get_dimensionsr   r  r   r   r&  r   r   rm  r   rD  r   r  get_extensionsave_tor   r+  r,  )r[   rO  r   r  r  r  r  r  r  r.  r  saved_metadatar4  r6  s                 r,   r  DecodeAndSaveVideo.save_video  s   ,,.LXLlLl--/	M
Ig/ $$Hzz''3

 8 89zz  ,%(ZZ%6%6"8}q !)1WRL5+?+?+M+Mf+U*VWGGLL+2''/#	 	 	
 r/   r)   )NNr  )i  rm  rm  )rd   r  r  )r6   r7   r8   r9   r:   r   r   r   r   r  r  r  r  r?   r)   r/   r,   r  r  X  s    
 
< *j  GI  GT  GT *j *jX + +Z G G Q Q* "--  r/   r  c                   P    \ rS rSr\S 5       r\S\R                  4S j5       rSr	g)PreviewImageOrMaski  c                    [         R                  " SSSSS/[         R                  R                  S[         R                  [         R
                  /SS9/[         R                  R                  [         R                  R                  /S	S
9$ )Nr,  zPreview Image Or Maskr)  z#Previews the input images or masks.r   r!  zThe image or mask to preview.rU  T)r   r   r   r   r'  r   r   r[  )	r   r   rQ  r   r   rP  r  r   r   rZ   s    r,   r    PreviewImageOrMask.define_schema  sq    yy(0#=$:""7RXXrww,?Ih"i II$$bii&=&=>
 	
r/   r   c                     UR                   S:X  a&  [        R                  " [        R                  " XS9S9$ [        R                  " [        R
                  " XS9S9$ )Nr   rZ   r  )r  r   r   r   PreviewMaskPreviewImage)r[   r!  s     r,   r   PreviewImageOrMask.execute  s=    ::?==BNN5$BCC}} ?@@r/   r)   Nr   r)   r/   r,   r,  r,    s6    
 
 Ar}} A Ar/   r,  )rj   r  r  rm   torch.nn.functionalr  r  rk  torchvision.transforms
transformsr  rG  r  r}  r   r  r(  rB  r  r  rp   r   r   r^  rC  r   rq   PILr   r   r   r   r   r	   r
   PIL.PngImagePluginr   nodesr   r   comfy_extras.nodes_maskr   comfy.cli_argsr   comfy.utilsr   r   r   comfyr   comfy_api.latestr   r   r   	fractionsr   ra  r   utility.utilityr   rO  r   r   concurrent.futuresr   r+  dirnamer  __file__r  r    rA   	ComfyNoder   r   r<  r  r  r  r  r  r  r5  rR  ri  r  r  r  r  r  r  r  r  r  r  r,  rB  rq  rt  rv  rx  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rA  re  rp  r{  r  r  r  r  r  r  r  r  r  r  r  r#  rz  r  r  r   r  r2  rS  r  r  r  r  r?  r>  r  r  r,  r)   r/   r,   <module>rD     s        "    	 	      G
 [ Z Z & + -  I I " 5 5    -5 277??277??277??83L#MN  (P Pdg"2<< g"RE/ E/PzR\\ zzZ" Z"z . <=)BLL =)~/- /-b++ ++Z1 1f7) 7)r@" @"D
 
4
 
<#' #'J3 3j $ 4) )@ BO& O&b9M 9MvP+ P+f<R) <R|!%2
F& 0	 6$ 6$p4 4l13f"C CJ9 9vB BH   ,,. ,.\V%2<< V%pf> f>P)< )<V./ ./`-= -=^   >: :x7$ 7$r< <~# #*8 8v 6+ +\*$r|| *$XRS RShK7 K7Z_z _zB	O Obc cJ( (TU UnH HTH> H>VYr|| YxOL OLb'" '"V;+ ;+ze$ e$Nj& j&ZV VrKSBLL KS\t tnA Au_  OO*+G*  Ls$   P, .Q ,Q
	Q

QQ