
     hQ                     >   d dl Z d dlZd dlZd dlZd dlmZmZmZmZ d dl	m
Z
mZ d dlmZmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d d	lmZ  G d
 de          Z G d d          Z G d de          Z G d dee          Z G d de          Z e            ZdS )    N)unquote	urldefragurlsplit
urlunsplit)STATICFILES_STORAGE_ALIASsettings)check_settingsmatches_patterns)ImproperlyConfigured)ContentFile)FileSystemStoragestorages)md5)
LazyObjectc                   .     e Zd ZdZd fd	Z fdZ xZS )StaticFilesStoragez
    Standard file system storage for static files.

    The defaults for ``location`` and ``base_url`` are
    ``STATIC_ROOT`` and ``STATIC_URL``.
    Nc                     |t           j        }|t           j        }t          |            t	                      j        ||g|R i | |sd | _        d | _        d S d S N)r   STATIC_ROOT
STATIC_URLr	   super__init__base_locationlocation)selfr   base_urlargskwargs	__class__s        a/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/django/contrib/staticfiles/storage.pyr   zStaticFilesStorage.__init__   s}    +H*Hx   8=d===f===  	!!%D DMMM	! 	!    c                 r    | j         st          d          t                                          |          S )NzaYou're using the staticfiles app without having set the STATIC_ROOT setting to a filesystem path.)r   r   r   path)r   namer   s     r    r#   zStaticFilesStorage.path%   s<    } 	&0  
 ww||D!!!r!   NN)__name__
__module____qualname____doc__r   r#   __classcell__r   s   @r    r   r      s`         ! ! ! ! ! !" " " " " " " " "r!   r   c                        e Zd ZdZdZdZdZdZdZ fdZ	dd	Z
dd
Zd fd	ZddZddZddZd Zd Zd Zd Zd Z xZS )HashedFilesMixinzurl("%(url)s")   F)*.js))zU(?P<matched>import(?s:(?P<import>[\s\{].*?))\s*from\s*['"](?P<url>[\.\/].*?)["']\s*;)z import%(import)s from "%(url)s";)zV(?P<matched>export(?s:(?P<exports>[\s\{].*?))\s*from\s*["'](?P<url>[\.\/].*?)["']\s*;)z!export%(exports)s from "%(url)s";)z4(?P<matched>import\s*['"](?P<url>[\.\/].*?)["']\s*;)zimport"%(url)s";)z+(?P<matched>import\(["'](?P<url>.*?)["']\))zimport("%(url)s")))z*.css)z5(?P<matched>url\(['"]{0,1}\s*(?P<url>.*?)["']{0,1}\)))z.(?P<matched>@import\s*["']\s*(?P<url>.*?)["'])z@import url("%(url)s"))zI(?m)(?P<matched>)^(/\*#[ \t](?-i:sourceMappingURL)=(?P<url>.*)[ \t]*\*/)$z/*# sourceMappingURL=%(url)s */)r/   ))z;(?m)(?P<matched>)^(//# (?-i:sourceMappingURL)=(?P<url>.*))$z//# sourceMappingURL=%(url)sTc                    | j         r| xj        | j        fz  c_         t                      j        |i | i | _        i | _        | j        D ]\  }}|D ]z}t          |t          t          f          r|\  }}n| j
        }t          j        |t          j                  }| j                            |g                               ||f           {d S r   )$support_js_module_import_aggregationpatterns&_js_module_import_aggregation_patternsr   r   	_patternshashed_files
isinstancetuplelistdefault_templaterecompile
IGNORECASE
setdefaultappend)	r   r   r   	extensionr2   patterntemplatecompiledr   s	           r    r   zHashedFilesMixin.__init__l   s    4 	LMMdIKKMM$)&)))#'= 	V 	VIx# V Vgt}55 5(/%GXX#4H:gr}==)))R88??8@TUUUUV	V 	Vr!   Nc                     |dS t          d          }|                                D ]}|                    |           |                                dd         S )zU
        Return a hash of the file with the given name and optional content.
        NF)usedforsecurity   )r   chunksupdate	hexdigest)r   r$   contenthasherchunks        r    	file_hashzHashedFilesMixin.file_hash{   sg     ?4U+++^^%% 	! 	!EMM%    !!#2#&&r!   c                    t          t          |                    }|j                                        }|r3t          t          |                    j                                        p|}|d u }|rT|                     |          st          d|d| d          	 |                     |          }n# t          $ r |cY S w xY w	 |                     ||          }|r|	                                 n# |r|	                                 w w xY wt          j                            |          \  }}t          j                            |          \  }	}
|rd|z  nd}t          j                            ||	||
          }t          |          }||d<   d|v r|d         s|dxx         d	z  cc<   t          |          S )
Nz
The file 'z' could not be found with .z.%s    ?#   ?)r   r   r#   stripexists
ValueErroropenOSErrorrL   closeossplitsplitextjoinr8   r   )r   r$   rI   filenameparsed_name
clean_nameopenedrL   r#   rootexthashed_nameunparsed_names                r    rd   zHashedFilesMixin.hashed_name   s    wt}}-- %++--
I'(*;*;!<!<!A!G!G!I!IXjD 		;;x((  jCK88TTTR  ))H--   	 z7;;I      z22hG$$X..	c+4<UY&&"	gll4TT99cc)JKK[))&a 4<<a 0<!#-(((s   B5 5CCC5 5Dc                    t           j        r|s|d}}nLt          |          \  }}t          |          j                            d          r|}n|f}|||fz  } || }t                                          |          }	d|v }
|s|
rTt          t          |	                    }|r|d         s||d<   |
r|d         s|dxx         dz  cc<   t          |          }	t          |	          S )	:
        Return the non-hashed URL in DEBUG mode.
        rO   /NrQ      rR   rP   rS   )r   DEBUGr   r   r#   endswithr   urlr8   r   r   )r   hashed_name_funcr$   forcer5   rd   fragmentr`   r   	final_urlquery_fragmenturlpartsr   s               r    _urlzHashedFilesMixin._url   s#    > 
	6% 
	6$("KK#,T?? J
##(11#66 6""}+\O+D..5GGKK,,	  	-~ 	-HY//00H ' '& #hqk #s""8,,Iy!!!r!   c                 :    |                      | j        ||          S )rg   )rs   stored_name)r   r$   rn   s      r    rl   zHashedFilesMixin.url   s     yy)4777r!   c                 0      j          fd}|S )zJ
        Return the custom URL converter for the given file name.
        Nc                    |                                  }|d         }|d         }t          j        d|          r|S |                    d          r!|                    t          j                  s|S t          |          \  }}|s|S |                    d          rC|                    t          j                  sJ |t          t          j                  d         }nYt          j	        dk    rn
                    t          j	        d          }t          j        t          j        |          |          }                    j        t!          |          d
          }d                    |                    d          dd         |                    d          dd         z             }	|r|	d	|v rd	nd
|z   z  }	t!          |	          |d<   |z  S )z
            Convert the matched URL to a normalized and hashed URL.

            This requires figuring out which files the matched URL resolves
            to and calling the url() method of the storage.
            matchedrl   z^[a-z]+:rh   NT)rn   r5   rQ   #)	groupdictr:   match
startswithr   r   r   lenrZ   sepreplace	posixpathr]   dirnamers   _stored_namer   r[   )matchobjmatchesrx   rl   url_pathro   target_namesource_name
hashed_urltransformed_urlr5   r$   r   rA   s             r    	converterz1HashedFilesMixin.url_converter.<locals>.converter   s    ((**Gi(G%.C xS))  ~~c"" 3>>(:M+N+N  "+3Hh  ""3'' W**8+>?????&s8+>'?'?'A'AB ')fmmddbfc9R9R'nY->{-K-KXVV !$$)	 #  J "hhs##CRC(:+;+;C+@+@+EE O
  MDCKKDDSH#LL %_55GENg%%r!   )r9   )r   r$   r5   rA   r   s   ```` r    url_converterzHashedFilesMixin.url_converter   sG     ,H6	& 6	& 6	& 6	& 6	& 6	& 6	& 6	&p r!   c              +      K   |rdS i } fdD             }i }                      ||          D ]0\  }}}	}
||vst          |	t                    r|||	fV  (|||	f||<   1fd|D             d}t           j                  D ]3}d}                      ||          D ]\  }}}	}|||	f||<   |p|}|s n4|rddt          d          fV   j                            |           |                                E d{V  dS )a  
        Post process the given dictionary of files (called from collectstatic).

        Processing is actually two separate operations:

        1. renaming files to include a hash of their content for cache-busting,
           and copying those files to the target storage.
        2. adjusting files which contain references to other files so they
           refer to the cache-busting filenames.

        If either of these are performed on a file, then that file is considered
        post-processed.
        Nc                 >    g | ]}t          |j                  |S  )r
   r4   ).0r#   r   s     r    
<listcomp>z1HashedFilesMixin.post_process.<locals>.<listcomp>$  s;     
 
 
&6tT^&L&L

 
 
r!   c                 "    i | ]}||         S r   r   )r   r#   pathss     r    
<dictcomp>z1HashedFilesMixin.post_process.<locals>.<dictcomp>5  s    @@@tuT{@@@r!   FAllz!Max post-process passes exceeded.)	_post_processr6   	Exceptionrangemax_post_process_passesRuntimeErrorr5   rG   values)r   r   dry_runoptionsr5   adjustable_pathsprocessed_adjustable_pathsr$   rd   	processed_substitutionsisubsts   ``            r    post_processzHashedFilesMixin.post_process  s       	F 
 
 
 
"
 
 

 &(" 04/A/A#\0
 0
 	R 	R+D+y! +++z)Y/O/O+K2222248+y3Q*400@@@@/?@@@t344 
	 
	A!M7;7I7I'8 8 7 73k9e 59+y3Q*40 - 6    	Q|,OPPPPPP 	  ... .4466666666666r!   c           	   #   :  K   d }t          ||d          D ]}d}||         \  }}|                    |          5 }	|                     |          }
|                     |
          }||vr|                     ||	          }n||         }t          |	d          r|	                    d           |                     |          }d}||v rx|}|	                                	                    d          }| j
                                        D ]k\  }}t          ||f          rU|D ]R\  }}|                     |||          }	 |                    ||          }4# t          $ r}|d |dfV  Y d }~Kd }~ww xY wl|r|                     |           t#          |                                          }| j        r|                     ||           |                     ||          }|                     |          r|                     |           |                     ||          }|                     |          }||k    rd}d}|s/|s-d}|                     ||	          }|                     |          }|||<   ||||fV  d d d            n# 1 swxY w Y   d S )Nc                 Z    t          |                     t          j                            S r   )r~   r[   rZ   r   )r$   s    r    
path_levelz2HashedFilesMixin._post_process.<locals>.path_levelO  s    tzz"&))***r!   T)keyreverseseekr   Fzutf-8)sortedrW   r`   hash_keyrd   hasattrr   rU   readdecoder4   itemsr
   r   subrV   deleter   encodekeep_intermediate_files_save)r   r   r   r5   r   r$   r   storager#   original_filecleaned_namer   rd   hashed_file_existsr   old_hashed_namerI   r?   r2   r@   rA   r   exccontent_file
saved_names                            r    r   zHashedFilesMixin._post_processM  s     	+ 	+ 	+ 5j$??? C	B C	BD M "$KMGTd## >B}#t44==66 <//"&"2"24"G"GKK".x"8K =&11 *!&&q)))%)[[%=%="!	 +++&1O+002299'BBG/3~/C/C/E/E 	A 	A+	8+D9,?? A5= A A 1,0,>,>$(,-" -"	!A.5kk)W.M.MGG'1 !A !A !A*.c5*@$@$@$@$@$@$@$@$@!A) 1K000#.w~~/?/?#@#@L3 >

;==="&"2"24"F"FK{{;// 1K000!%K!F!FJ"&//*"="=K&+55(- $I  B . B$(	%)ZZ]%K%K
&*ooj&A&A *5X&KMAAAA}>B >B >B >B >B >B >B >B >B >B >B >B >B >B >BC	B C	Bs=   DJEJ
E6$E1,J1E66DJJ	J	c                 .    |                     dd          S )N\rh   )r   r   r$   s     r    r`   zHashedFilesMixin.clean_name  s    ||D#&&&r!   c                     |S r   r   r   s     r    r   zHashedFilesMixin.hash_key  s    r!   c                     t          j        |          }|                     |          }|                     |          }|                    |          }|(|                     |                     |                    }|S r   )r   normpathr`   r   getrd   )r   r$   r5   r   r   
cache_names         r    r   zHashedFilesMixin._stored_name  st     !$''t,,==..!%%h//
)9)9$)?)?@@Jr!   c                 x   |                      |          }|                     |          }| j                            |          }|r|S |}t	          | j        dz             D ]C}|                      |                     |d |                    }||k    r|| j        |<   |c S |}Dt          d|d| d          )N   )rI   r^   z
The name 'z' could not be hashed with rN   )r`   r   r5   r   r   r   rd   rV   )r   r$   r   r   r   intermediate_namer   s          r    ru   zHashedFilesMixin.stored_name  s    t,,==..&**844
 	 t3a788 
	/ 
	/A  t>O PP J !J...8!(+!!!! %/!! jtttTUUUr!   r   r%   )FN)F)r&   r'   r(   r9   r   r1   r3   r2   r   r   rL   rd   rs   rl   r   r   r   r`   r   r   ru   r*   r+   s   @r    r-   r-   /   sD       ++0(.*6H8 #V V V V V	' 	' 	' 	' )  )  )  )D" " " " " ">8 8 8 8? ? ? ?B=7 =7 =7 =7~HB HB HBT' ' '  
 
 
V V V V V V Vr!   r-   c                   V     e Zd ZdZdZdZdZdd fd
Zd Zd	 Z	 fd
Z
d Zd Z xZS )ManifestFilesMixin1.1zstaticfiles.jsonTFN)manifest_storagec                     t                      j        |i | || }|| _        |                                 \  | _        | _        d S r   )r   r   r   load_manifestr5   manifest_hash)r   r   r   r   r   s       r    r   zManifestFilesMixin.__init__  sU    $)&)))## 0040B0B0D0D-4---r!   c                     	 | j                             | j                  5 }|                                                                cd d d            S # 1 swxY w Y   d S # t
          $ r Y d S w xY wr   )r   rW   manifest_namer   r   FileNotFoundError)r   manifests     r    read_manifestz ManifestFilesMixin.read_manifest  s    	&++D,>?? 08}}--//0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  	 	 	44	s4   A! &AA! AA! AA! !
A/.A/c                 V   |                                  }|i dfS 	 t          j        |          }|                    d          }|dv r,|                    di           |                    dd          fS n# t          j        $ r Y nw xY wt          d| j        d| j        d          )	NrO   version)z1.0r   r   hashzCouldn't load manifest 'z' (version ))r   jsonloadsr   JSONDecodeErrorrV   r   manifest_version)r   rI   storedr   s       r    r   z ManifestFilesMixin.load_manifest  s    $$&&?r6M	GZ((F jj++G.((zz'2..

620F0FFF )	 # 	 	 	D	 j!!!4#8#8#8:
 
 	
s   A6 6BBc              /      K   i | _          t                      j        |i |E d {V  |                    d          s|                                  d S d S )Nr   )r5   r   r   r   save_manifest)r   r   r   r   s      r    r   zManifestFilesMixin.post_process  ss      '577'8888888888zz)$$ 	!     	! 	!r!   c                 2   |                      d t          t          j        t	          | j                                                                                                                | _        | j        | j	        | j        d}| j
                            | j                  r| j
                            | j                   t          j        |                                          }| j
                            | j        t          |                     d S )N)r   r   r   )rL   r   r   dumpsr   r5   r   r   r   r   r   rU   r   r   r   )r   payloadcontentss      r    r   z ManifestFilesMixin.save_manifest  s    !^^+dj0A0G0G0I0I)J)JKKRRTTUU
 
 &,&
 

  ''(:;; 	=!(();<<<:g&&--//##D$6H8M8MNNNNNr!   c                    t          t          |                    }|j                                        }|                     |          }| j                            |          }|A| j        rt          d|z            | 	                    | 
                    |                    }t          |          }||d<   d|v r|d         s|dxx         dz  cc<   t          |          S )Nz+Missing staticfiles manifest entry for '%s'rP   rQ   rR   rS   )r   r   r#   rT   r   r5   r   manifest_strictrV   r`   rd   r8   r   )r   r$   r_   r`   r   r   re   s          r    ru   zManifestFilesMixin.stored_name  s    wt}}-- %++--
==,,&**844
#  AJN   )9)9$)?)?@@J[))%a 4<<a 0<!#-(((r!   )r&   r'   r(   r   r   r   r   r   r   r   r   r   ru   r*   r+   s   @r    r   r     s        &MO#/3 E E E E E E E  
 
 
"! ! ! ! !O O O) ) ) ) ) ) )r!   r   c                       e Zd ZdZdS )ManifestStaticFilesStoragezh
    A static file system storage backend which also saves
    hashed copies of the files it saves.
    N)r&   r'   r(   r)   r   r!   r    r   r     s         
 	Dr!   r   c                       e Zd Zd ZdS )ConfiguredStoragec                 4    t           t                   | _        d S r   )r   r   _wrapped)r   s    r    _setupzConfiguredStorage._setup  s     !:;r!   N)r&   r'   r(   r   r   r!   r    r   r     s#        < < < < <r!   r   ) r   rZ   r   r:   urllib.parser   r   r   r   django.confr   r    django.contrib.staticfiles.utilsr	   r
   django.core.exceptionsr   django.core.files.baser   django.core.files.storager   r   django.utils.cryptor   django.utils.functionalr   r   r-   r   r   r   staticfiles_storager   r!   r    <module>r      s    				     				 A A A A A A A A A A A A ; ; ; ; ; ; ; ; M M M M M M M M 7 7 7 7 7 7 . . . . . . A A A A A A A A # # # # # # . . . . . ." " " " "* " " ">OV OV OV OV OV OV OV OVdJ) J) J) J) J)) J) J) J)Z	 	 	 	 	!35G 	 	 	< < < < <
 < < <
 ('))   r!   