o
    þÞh¸R  ã                   @   sò   d dl Z d dlZd dlZd dlZd dlmZ d dlmZ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 G d
d„ deƒZG dd„ dƒZG dd„ deƒZG dd„ deeƒZG dd„ deƒZeƒ ZdS )é    N)Úmd5)ÚunquoteÚ	urldefragÚurlsplitÚ
urlunsplit)ÚSTATICFILES_STORAGE_ALIASÚsettings)Úcheck_settingsÚmatches_patterns)ÚImproperlyConfigured)ÚContentFile)ÚFileSystemStorageÚstorages)Ú
LazyObjectc                       s.   e Zd ZdZd‡ fdd„	Z‡ fdd„Z‡  ZS )ÚStaticFilesStoragez˜
    Standard file system storage for static files.

    The defaults for ``location`` and ``base_url`` are
    ``STATIC_ROOT`` and ``STATIC_URL``.
    Nc                    sX   |d u rt j}|d u r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__© úb/var/www/html/premium_crap/venv/lib/python3.10/site-packages/django/contrib/staticfiles/storage.pyr      s   
þzStaticFilesStorage.__init__c                    s   | 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   r   r   r    %   s
   ÿzStaticFilesStorage.path©NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r    Ú__classcell__r   r   r   r   r      s    r   c                       sœ   e Zd ZdZdZdZdZdZdZ‡ fdd„Z	d d
d„Z
d!dd„Zd"‡ fdd„	Zd#dd„Zd dd„Zd#dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )$ÚHashedFilesMixinzurl("%(url)s")é   F)ú*.js))za(?P<matched>import(?s:(?P<import>[\s\{].*?|\*\s*as\s*\w+))\s*from\s*['"](?P<url>[./].*?)["']\s*;)z import%(import)s from "%(url)s";)zT(?P<matched>export(?s:(?P<exports>[\s\{].*?))\s*from\s*["'](?P<url>[./].*?)["']\s*;)z!export%(exports)s from "%(url)s";)z2(?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"))zG(?m)^(?P<matched>/\*#[ \t](?-i:sourceMappingURL)=(?P<url>.*)[ \t]*\*/)$z/*# sourceMappingURL=%(url)s */)r+   ))z9(?m)^(?P<matched>//# (?-i:sourceMappingURL)=(?P<url>.*))$z//# sourceMappingURL=%(url)sTc                    s˜   | j r|  j| jf7  _tƒ j|i |¤Ž i | _i | _| jD ]+\}}|D ]$}t|tt	fƒr2|\}}n| j
}t |tj¡}| j |g ¡ ||f¡ q$q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   Ú	extensionr-   ÚpatternÚtemplateÚcompiledr   r   r   r   m   s   
úÿzHashedFilesMixin.__init__Nc                 C   s>   |du rdS t dd�}| ¡ D ]}| |¡ q| ¡ 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Úchunkr   r   r   Ú	file_hash|   s   
zHashedFilesMixin.file_hashc                 C   s*  t t|ƒƒ}|j ¡ }|rt t|ƒƒj ¡ p|}|d u }|r>|  |¡s+td|| f ƒ‚z|  |¡}W n ty=   | Y S w z|  ||¡}W |rL| 	¡  n|rT| 	¡  w w t
j |¡\}}t
j |¡\}	}
|rkd| nd}t
j |d|	||
f ¡}t|ƒ}||d< d|v r‘|d s‘|d  d7  < t|ƒS )	Nz)The file '%s' could not be found with %r.z.%sÚ z%s%s%sé   ú?#é   ú?)r   r   r    ÚstripÚexistsÚ
ValueErrorÚopenÚOSErrorrF   ÚcloseÚosÚsplitÚsplitextÚjoinr3   r   )r   r"   rC   ÚfilenameÚparsed_nameÚ
clean_nameÚopenedrF   r    ÚrootÚextÚhashed_nameÚunparsed_namer   r   r   r\   ‡   s>   


ÿþ€ÿ
ÿzHashedFilesMixin.hashed_namec                    sÀ   t jr|s|d}}n!t|ƒ\}}t|ƒj d¡r|}n|f}|dur(||f7 }||Ž }tƒ  |¡}	d|v }
|s:|
r\tt|	ƒƒ}|rJ|d sJ||d< |
rX|d sX|d  d7  < t	|ƒ}	t
|	ƒS )	ú:
        Return the non-hashed URL in DEBUG mode.
        rG   ú/NrI   é   rJ   rH   rK   )r   ÚDEBUGr   r   r    Úendswithr   Úurlr3   r   r   )r   Úhashed_name_funcr"   Úforcer0   r\   ÚfragmentrX   r   Ú	final_urlÚquery_fragmentÚurlpartsr   r   r   Ú_url©   s&   

zHashedFilesMixin._urlc                 C   s   |   | j||¡S )r^   )rj   Ústored_name)r   r"   re   r   r   r   rc   È   s   zHashedFilesMixin.urlc                    s$   ˆdu rˆj ‰‡ ‡‡‡fdd„}|S )zJ
        Return the custom URL converter for the given file name.
        Nc           
         s(  |   ¡ }|d }|d }t d|¡s| d¡r|S | d¡r&| tj¡s&|S t|ƒ\}}|s0|S | d¡rD| tj¡s=J ‚| tj¡}ntj	dkrKˆnˆ 
tj	d¡}t t |¡|¡}ˆjˆjt|ƒdˆ d�}d | d¡dd	… | d¡d	d…  ¡}	|rŠ|	d
|v r…d
nd| 7 }	t|	ƒ|d< ˆ| 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.
            Úmatchedrc   z^[a-z]+:z//r_   T)re   r0   NéÿÿÿÿrI   ú#)Ú	groupdictr5   ÚmatchÚ
startswithr   r   r   ÚremoveprefixrR   ÚsepÚreplaceÚ	posixpathrU   Údirnamerj   Ú_stored_namer   rS   )
ÚmatchobjÚmatchesrl   rc   Úurl_pathrf   Útarget_nameÚsource_nameÚ
hashed_urlÚtransformed_url©r0   r"   r   r<   r   r   Ú	converterÕ   s8   
ü"ÿz1HashedFilesMixin.url_converter.<locals>.converter)r4   )r   r"   r0   r<   r€   r   r   r   Úurl_converterÎ   s   8zHashedFilesMixin.url_converterc                 +   s  � |rdS i }‡fdd„ˆ D ƒ}i }ˆ  ˆ ||¡D ]\}}}	}
||vs(t|	tƒr/|||	fV  q|||	f||< q‡ fdd„|D ƒ‰ g }tˆjƒD ]$}g }ˆ  ˆ ||¡D ]\}}}	}|||	f||< |rf| |¡ qR|sk nqG|r}d t|ƒ¡}|dtdƒfV  ˆj	 
|¡ | ¡ E dH  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                    s   g | ]
}t |ˆ jƒr|‘qS r   )r
   r/   ©Ú.0r    ©r   r   r   Ú
<listcomp>%  s
    ÿÿz1HashedFilesMixin.post_process.<locals>.<listcomp>c                    s   i | ]}|ˆ | “qS r   r   r‚   )Úpathsr   r   Ú
<dictcomp>6  s    z1HashedFilesMixin.post_process.<locals>.<dictcomp>z, z!Max post-process passes exceeded.)Ú_post_processr1   Ú	ExceptionÚrangeÚmax_post_process_passesr9   rU   ÚsortedÚRuntimeErrorr0   rA   Úvalues)r   r†   Údry_runÚoptionsr0   Úadjustable_pathsÚprocessed_adjustable_pathsr"   r\   Ú	processedÚ_Úunresolved_pathsÚiÚsubstÚproblem_pathsr   )r†   r   r   Úpost_process  sB   €
ÿÿÿ
€ÿzHashedFilesMixin.post_processc                 c   s.  � dd„ }t ||dd�D �]}d}|| \}}| |¡�ï}	|  |¡}
|  |
¡}||vr2|  ||	¡}n|| }t|	dƒr@|	 d¡ |  |¡}d}||v rè|}z	|	 ¡  	d¡}W n t
yo } z|d |dfV  W Y d }~nd }~ww | j ¡ D ]9\}}t||fƒr®|D ],\}}|  |||¡}z| ||¡}W q� ty­ } z|d |dfV  W Y d }~q�d }~ww qu|r¶|  |¡ t| ¡ ƒ}| jrÅ|  ||¡ |  ||¡}|  |¡rÕ|  |¡ |  ||¡}|  |¡}||kræd}d}|sù|sùd}|  ||	¡}|  |¡}|||< ||||fV  W d   ƒ n	1 �sw   Y  qd S )	Nc                 S   s   t |  tj¡ƒS r   )ÚlenrS   rR   rs   )r"   r   r   r   Ú
path_levelQ  s   z2HashedFilesMixin._post_process.<locals>.path_levelT)ÚkeyÚreverseÚseekr   Fzutf-8)rŒ   rO   rX   Úhash_keyr\   Úhasattrrž   rM   ÚreadÚdecodeÚUnicodeDecodeErrorr/   Úitemsr
   r�   ÚsubrN   Údeleter   ÚencodeÚkeep_intermediate_filesÚ_save)r   r†   r‘   r0   r›   r"   ÚsubstitutionsÚstorager    Úoriginal_fileÚcleaned_namerŸ   r\   Úhashed_file_existsr“   Úold_hashed_namerC   Úexcr:   r-   r;   r<   r€   Úcontent_fileÚ
saved_namer   r   r   rˆ   O  sv   €




€ÿÿ€ÿ€




¿€ûzHashedFilesMixin._post_processc                 C   s   |  dd¡S )Nú\r_   )rt   r!   r   r   r   rX   œ  s   zHashedFilesMixin.clean_namec                 C   s   |S r   r   r!   r   r   r   rŸ   Ÿ  s   zHashedFilesMixin.hash_keyc                 C   sD   t  |¡}|  |¡}|  |¡}| |¡}|d u r |  |  |¡¡}|S r   )ru   ÚnormpathrX   rŸ   Úgetr\   )r   r"   r0   r­   rŸ   Ú
cache_namer   r   r   rw   ¢  s   



zHashedFilesMixin._stored_namec                 C   s„   |   |¡}|  |¡}| j |¡}|r|S |}t| jd ƒD ]}|   | j|d |d�¡}||kr7|| j|< |  S |}qtd|| f ƒ‚)Né   )rC   rV   z*The name '%s' could not be hashed with %r.)rX   rŸ   r0   rµ   rŠ   r‹   r\   rN   )r   r"   r­   rŸ   r¶   Úintermediate_namer–   r   r   r   rk   ®  s   

ÿ
zHashedFilesMixin.stored_namer   r#   )FN)F)r$   r%   r&   r4   r‹   r,   r.   r-   r¨   r   rF   r\   rj   rc   r�   r™   rˆ   rX   rŸ   rw   rk   r(   r   r   r   r   r)   /   s&    

"


A@Mr)   c                       s^   e Zd ZdZdZdZdZddœ‡ fdd„
Zd	d
„ Zdd„ Z	‡ fdd„Z
dd„ Zdd„ Z‡  ZS )ÚManifestFilesMixinú1.1zstaticfiles.jsonTFN)Úmanifest_storagec                   s8   t ƒ j|i |¤Ž |d u r| }|| _|  ¡ \| _| _d S r   )r   r   r»   Úload_manifestr0   Úmanifest_hash)r   r»   r   r   r   r   r   r   Ì  s
   zManifestFilesMixin.__init__c                 C   sX   z!| j  | j¡�}| ¡  ¡ W  d   ƒ W S 1 sw   Y  W d S  ty+   Y d S w r   )r»   rO   Úmanifest_namer¡   r¢   ÚFileNotFoundError)r   Úmanifestr   r   r   Úread_manifestÓ  s   
(ÿÿz ManifestFilesMixin.read_manifestc                 C   sz   |   ¡ }|d u ri dfS zt |¡}W n
 tjy   Y nw | d¡}|dv r3| di ¡| dd¡fS td| j| jf ƒ‚)NrG   Úversion)z1.0rº   r†   Úhashz(Couldn't load manifest '%s' (version %s))rÁ   ÚjsonÚloadsÚJSONDecodeErrorrµ   rN   r¾   Úmanifest_version)r   rC   ÚstoredrÂ   r   r   r   r¼   Ú  s    ÿ

ÿÿz ManifestFilesMixin.load_manifestc                 /   s:   � i | _ tƒ j|i |¤ŽE d H  | d¡s|  ¡  d S d S )Nr�   )r0   r   r™   rµ   Úsave_manifest)r   r   r   r   r   r   r™   ë  s   €
ÿzManifestFilesMixin.post_processc              	   C   sz   |   d tt t| j ¡ ƒ¡ ¡ ƒ¡| _| j| j	| jdœ}| j
 | j¡r*| j
 | j¡ t |¡ ¡ }| j
 | jt|ƒ¡ d S )N)r†   rÂ   rÃ   )rF   r   rÄ   ÚdumpsrŒ   r0   r¤   r§   r½   rÇ   r»   rM   r¾   r¦   r©   )r   ÚpayloadÚcontentsr   r   r   rÉ   ñ  s   ÿýz ManifestFilesMixin.save_manifestc                 C   sŽ   t t|ƒƒ}|j ¡ }|  |¡}| j |¡}|d u r+| jr#td| ƒ‚|  	|  
|¡¡}t|ƒ}||d< d|v rC|d sC|d  d7  < t|ƒS )Nz+Missing staticfiles manifest entry for '%s'rH   rI   rJ   rK   )r   r   r    rL   rŸ   r0   rµ   Úmanifest_strictrN   rX   r\   r3   r   )r   r"   rW   rX   rŸ   r¶   r]   r   r   r   rk   ÿ  s   

ÿzManifestFilesMixin.stored_name)r$   r%   r&   rÇ   r¾   rÍ   r¨   r   rÁ   r¼   r™   rÉ   rk   r(   r   r   r   r   r¹   Æ  s    r¹   c                   @   s   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    rÎ   c                   @   s   e Zd Zdd„ ZdS )ÚConfiguredStoragec                 C   s   t t | _d S r   )r   r   Ú_wrappedr„   r   r   r   Ú_setup  s   zConfiguredStorage._setupN)r$   r%   r&   rÑ   r   r   r   r   rÏ     s    rÏ   ) rÄ   rR   ru   r5   Úhashlibr   Ú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.functionalr   r   r)   r¹   rÎ   rÏ   Ústaticfiles_storager   r   r   r   Ú<module>   s*       M	
