Ë
    ¸2Úi:  ã                   ó  — d dl mZ d dl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e	«      Zd	„ Z G d
„ d«      Z G d„ d«      Z G d„ de«      Z G d„ d«      Z G d„ d«      Z G d„ d«      Z G d„ de«      Z G d„ de«      Zy)é    )Údeepcopy©Úwraps)Ú
FieldError)Úmodels)Ú	FieldFileÚFileDescriptor)ÚDeferredAttributec                   ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚLightStateFieldFilea�  
    FieldFile subclass with the only aim to remove the instance from the state.

    The change introduced in Django 3.1 on FieldFile subclasses results in pickling the
    whole instance for every field tracked.
    As this is done on the initialization of objects, a simple queryset evaluation on
    Django 3.1+ can make the app unusable, as CPU and memory usage gets easily
    multiplied by magnitudes.
    c                 ó6   •— t         ‰| �  «       }d|v rd|d<   |S )zQ
        We don't need to deepcopy the instance, so nullify if provided.
        ÚinstanceN)ÚsuperÚ__getstate__)ÚselfÚstateÚ	__class__s     €úJ/var/www/html/acx/venv/lib/python3.12/site-packages/model_utils/tracker.pyr   z LightStateFieldFile.__getstate__   s)   ø€ ô ‘Ñ$Ó&ˆØ˜ÑØ $ˆE�*ÑØˆó    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__classcell__©r   s   @r   r   r   
   s   ø„ ñ÷ð r   r   c                 ó�   — t        | t        «      r,t        | j                  | j                  | j
                  ¬«      } t        | «      S )zZ
    Use our lightweight class to avoid copying the instance on a FieldFile deepcopy.
    )r   ÚfieldÚname)Ú
isinstancer   r   r   r   r   r   )Úvalues    r   Úlightweight_deepcopyr!      s9   € ô �%œÔ#Ü#Ø—^‘^Ø—+‘+Ø—‘ô
ˆô
 �E‹?Ðr   c                   ó(   ‡ — e Zd ZdZˆ fd„Zd„ Zˆ xZS )ÚDescriptorMixinNc                 óò   •— |€| S d}| j                  «       }||j                  v r|j                  j                  |«       d}t        ‰| �  ||«      }|r"t        |«      | j                  j                  |<   |S )NFT)Ú_get_field_nameÚ_deferred_fieldsÚremover   Ú__get__r!   Útracker_instanceÚ
saved_data)r   r   ÚownerÚwas_deferredÚ
field_namer    r   s         €r   r(   zDescriptorMixin.__get__.   s|   ø€ ØÐØˆKØˆØ×)Ñ)Ó+ˆ
Ø˜×2Ñ2Ñ2Ø×%Ñ%×,Ñ,¨ZÔ8ØˆLÜ‘‘ ¨%Ó0ˆÙÜ;OÐPUÓ;VˆD×!Ñ!×,Ñ,¨ZÑ8Øˆr   c                 ó   — | j                   S ©N)r-   ©r   s    r   r%   zDescriptorMixin._get_field_name;   s   € Ø�‰Ðr   )r   r   r   r)   r(   r%   r   r   s   @r   r#   r#   +   s   ø„ ØÐôör   r#   c                   ó.   — e Zd Zd„ Zd„ Zd„ Zed„ «       Zy)ÚDescriptorWrapperc                 ó.   — || _         || _        || _        y r/   )r-   Ú
descriptorÚtracker_attname)r   r-   r4   r5   s       r   Ú__init__zDescriptorWrapper.__init__A   s   € Ø$ˆŒØ$ˆŒØ.ˆÕr   c                 ó*  — |€| S | j                   |j                  «       v }	 | j                  j                  ||«      }|r8t        || j                  «      }t        |«      |j                  | j                   <   |S # t        $ r | j                  }Y ŒSw xY wr/   )	r-   Úget_deferred_fieldsr4   r(   ÚAttributeErrorÚgetattrr5   r!   r*   )r   r   r+   r,   r    r)   s         r   r(   zDescriptorWrapper.__get__F   s‘   € ØÐØˆKØ—‘¨(×*FÑ*FÓ*HÐHˆð	$Ø—O‘O×+Ñ+¨H°eÓ<ˆEñ Ü& x°×1EÑ1EÓFÐÜ;OÐPUÓ;VÐ×'Ñ'¨¯©Ñ8Øˆøô ò 	$Ø—O‘OŠEð	$ús   ¢A: Á:BÂBc                 óð  — t        |d«      }| j                  |j                  «       v }d| j                  z   }t        ||«      }|rD|rB|s@t        ||d«       	 t	        || j                  «       |j
                  j                  |d «       t        | j                  d«      r| j                  j                  ||«       y ||j
                  | j                  <   y # |j
                  j                  |d «       w xY w)NÚ_instance_initializedÚ	_setting_TÚ__set__)	Úhasattrr-   r8   Úsetattrr:   Ú__dict__Úpopr4   r>   )r   r   r    Úinitializedr,   Úrecursion_sentinel_attnameÚalready_settings          r   r>   zDescriptorWrapper.__set__S   sÖ   € Ü˜hÐ(?Ó@ˆØ—‘¨(×*FÑ*FÓ*HÐHˆð
 &1°4·?±?Ñ%BÐ"Ü! (Ð,FÓGˆá™<±Ü�HÐ8¸$Ô?ðHô ˜ $§/¡/Ô2à×!Ñ!×%Ñ%Ð&@À$ÔGÜ�4—?‘? IÔ.Ø�O‰O×#Ñ# H¨eÕ4à16ˆH×Ñ˜dŸo™oÒ.øð	 ×!Ñ!×%Ñ%Ð&@À$ÕGús   ÁC ÃC5c                 ó2   — t        | d«      rt        S t        S )NÚ
__delete__)r?   ÚFullDescriptorWrapperr2   )r4   s    r   Úcls_for_descriptorz$DescriptorWrapper.cls_for_descriptorj   s   € ä�:˜|Ô,Ü(Ð(ä$Ð$r   N)r   r   r   r6   r(   r>   ÚstaticmethodrI   © r   r   r2   r2   ?   s%   „ ò/ò
ò7ð. ñ%ó ñ%r   r2   c                   ó   — e Zd ZdZd„ Zy)rH   zD
    Wrapper for descriptors with all three descriptor methods.
    c                 ó:   — | j                   j                  |«       y r/   )r4   rG   )r   Úobjs     r   rG   z FullDescriptorWrapper.__delete__v   s   € Ø�‰×"Ñ" 3Õ'r   N)r   r   r   r   rG   rK   r   r   rH   rH   r   s   „ ñó(r   rH   c                   ó(   — e Zd ZdZddœd„Zd„ Zd„ Zy)ÚFieldsContextaÒ  
    A context manager for tracking nested reset fields contexts.

    If tracked fields is mentioned in more than one FieldsContext, it's state
    is being reset on exiting last context that mentions that field.

    >>> with fields_context(obj.tracker, 'f1', state=state):
    ...     with fields_context(obj.tracker, 'f1', 'f2', state=state):
    ...         obj.do_something_useful()
    ...     # f2 is reset after inner context exit
    ...     obj.do_something_else()
    ... # f1 is reset after outer context exit
    >>>

    * Note that fields are counted by passing same state dict
    * FieldsContext is instantiated using FieldInstanceTracker (`obj.tracker`)
    * Different objects has own state stack

    N)r   c                ó6   — |€i }|| _         || _        || _        y)aï  
        :param tracker: FieldInstanceTracker instance to be reset after
            context exit
        :param fields: a list of field names to be tracked in current context
        :param state: shared state dict used to count number of field
            occurrences in context stack.

        On context enter each field mentioned in `fields` has +1 in shared
        state, and on exit it receives -1. Fields that have zero after context
        exit are reset in tracker instance.
        N)ÚtrackerÚfieldsr   )r   rR   r   rS   s       r   r6   zFieldsContext.__init__�   s#   € ð ˆ=ØˆEØˆŒØˆŒØˆ�
r   c                 óŽ   — | j                   D ]5  }| j                  j                  |d«       | j                  |xx   dz  cc<   Œ7 | S )zN
        Increments tracked fields occurrences count in shared state.
        r   é   )rS   r   Ú
setdefault)r   Úfs     r   Ú	__enter__zFieldsContext.__enter__¡   sD   € ð —‘ò 	ˆAØ�J‰J×!Ñ! ! QÔ'Ø�J‰J�q‹M˜QÑŒMð	ð ˆr   c                 óø   — g }| j                   D ]J  }| j                  |xx   dz  cc<   | j                  |   dk(  sŒ-|j                  |«       | j                  |= ŒL |r| j                  j	                  |¬«       yy)z»
        Decrements tracked fields occurrences count in shared state.

        If any field has no more occurrences in shared state, this field is
        being reset by tracker.
        rU   r   ©rS   N)rS   r   ÚappendrR   Úset_saved_fields)r   Úexc_typeÚexc_valÚexc_tbÚreset_fieldsrW   s         r   Ú__exit__zFieldsContext.__exit__ª   sv   € ð ˆØ—‘ò 	"ˆAØ�J‰J�q‹M˜QÑ‹MØ�z‰z˜!‰} Ó!Ø×#Ñ# AÔ&Ø—J‘J˜q‘Mð		"ñ
 Ø�L‰L×)Ñ)°Ð)Õ>ð r   )r   r   r   r   r6   rX   ra   rK   r   r   rP   rP   z   s   „ ñð( 04ô ò$ó?r   rP   c                   ób   — e Zd Zd„ Zd„ Zd„ Zd„ Zed„ «       Zd„ Z	dd„Z
dd	„Zd
„ Zd„ Zd„ Zd„ Zy)ÚFieldInstanceTrackerc                 ód   — || _         || _        || _        t        | g| j                  ¢­Ž | _        y r/   )r   rS   Ú	field_maprP   Úcontext)r   r   rS   re   s       r   r6   zFieldInstanceTracker.__init__¼   s,   € Ø ˆŒØˆŒØ"ˆŒÜ$ TÐ8¨D¯K©KÒ8ˆ�r   c                 ó6   — | j                   j                  «       S r/   )rf   rX   r0   s    r   rX   zFieldInstanceTracker.__enter__Â   s   € Ø�|‰|×%Ñ%Ó'Ð'r   c                 ó<   — | j                   j                  |||«      S r/   )rf   ra   )r   r]   r^   r_   s       r   ra   zFieldInstanceTracker.__exit__Å   s   € Ø�|‰|×$Ñ$ X¨w¸Ó?Ð?r   c                 óH   — t        | g|¢­d| j                  j                  iŽS )Nr   )rP   rf   r   ©r   rS   s     r   Ú__call__zFieldInstanceTracker.__call__È   s!   € Ü˜TÐE FÒE°$·,±,×2DÑ2DÑEÐEr   c                 ó6   — | j                   j                  «       S r/   )r   r8   r0   s    r   Údeferred_fieldsz$FieldInstanceTracker.deferred_fieldsË   s   € à�}‰}×0Ñ0Ó2Ð2r   c                 óH   — t        | j                  | j                  |   «      S r/   )r:   r   re   ©r   r   s     r   Úget_field_valuez$FieldInstanceTracker.get_field_valueÏ   s   € Ü�t—}‘} d§n¡n°UÑ&;Ó<Ð<r   Nc                 ó<  — | j                   j                  si | _        nD|€| j                  «       | _        n, | j                  j                  di | j                  |¬«      ¤Ž | j                  j                  «       D ]  \  }}t        |«      | j                  |<   Œ y )NrZ   rK   )r   Úpkr*   ÚcurrentÚupdateÚitemsr!   )r   rS   r   Úfield_values       r   r\   z%FieldInstanceTracker.set_saved_fieldsÒ   s‚   € Ø�}‰}×ÒØ ˆD�OØˆ^Ø"Ÿl™l›nˆD�Oà"ˆD�O‰O×"Ñ"ÑA T§\¡\¸ \Ó%@ÒAð #'§/¡/×"7Ñ"7Ó"9ò 	GÑˆE�;Ü%9¸+Ó%FˆD�O‰O˜EÒ"ñ	Gr   c                 óÊ   — |€8| j                   }|r| j                  D �cg c]  }||vr|‘Œ
 }}n| j                  }|D �ci c]  }|| j                  |«      “Œ c}S c c}w c c}w )z5Returns dict of current values for all tracked fields)rm   rS   rp   )r   rS   rm   r   rW   s        r   rs   zFieldInstanceTracker.currentÞ   st   € àˆ>Ø"×2Ñ2ˆOÙà'+§{¡{öØ#Ø OÑ3ò ð�ñ ð
 Ÿ™�à4:Ö;¨q��4×'Ñ'¨Ó*Ñ*Ò;Ð;ùòùò <s
   ŸA¿A c                 óÎ   — || j                   v rJ|| j                  v r|| j                  j                  vry| j	                  |«      | j                  |«      k7  S t        d|z  «      ‚)ú@Returns ``True`` if field has changed from currently saved valueFúfield "%s" not tracked)rS   rm   r   rA   Úpreviousrp   r   ro   s     r   Úhas_changedz FieldInstanceTracker.has_changedì   s`   € à�D—K‘KÑà˜×,Ñ,Ñ,°¸d¿m¹m×>TÑ>TÑ1TØØ—=‘= Ó'¨4×+?Ñ+?ÀÓ+FÑFÐFäÐ5¸Ñ=Ó>Ð>r   c                 óâ  — | j                   j                  r¿|| j                  v r±|| j                  vr£|| j                   j                  vr| j                  |«       ny| j                  |«      }| j                   j                  |g¬«       t        | j                  |«      «      | j                  |<   t        | j                   | j                  |   |«       | j                  j                  |«      S )z,Returns currently saved value of given fieldrZ   )r   rr   rm   r*   rA   rp   Úrefresh_from_dbr!   r@   re   Úget)r   r   Úcurrent_values      r   r{   zFieldInstanceTracker.previousö   sÁ   € ð �=‰=×Ò ¨×)=Ñ)=Ñ =À%ÈtÏÉÑB^ð ˜DŸM™M×2Ñ2Ñ2Ø×$Ñ$ UÕ+ð
 !%× 4Ñ 4°UÓ ;�Ø—‘×-Ñ-°e°WÐ-Ô=Ü)=¸d×>RÑ>RÐSXÓ>YÓ)Z�—‘ Ñ&Ü˜Ÿ™ t§~¡~°eÑ'<¸mÔLà�‰×"Ñ" 5Ó)Ð)r   c                 ó‚   — | j                   D �ci c]%  }| j                  |«      r|| j                  |«      “Œ' c}S c c}w ©z@Returns dict of fields that changed since save (with old values))rS   r|   r{   ro   s     r   ÚchangedzFieldInstanceTracker.changed
  sD   € ð Ÿ™ö
àØ×Ñ Ô&ð �4—=‘= Ó'Ñ'ò
ð 	
ùò 
s   �*<c                 óª  ‡ — t        «       ‰ j                  _        t        ‰ j                  d«      r‰ j                  j                  sy  G ˆ fd„dt
        t        «      } G ˆ fd„dt
        t        «      }‰ j                  j                  «       ‰ j                  _        ‰ j                  j                  D ]ž  }‰ j                  j                  j                  j                  |«      }t        |t        «      r4 ||j                  «      }t        ‰ j                  j                  ||«       Œv ||«      }t        ‰ j                  j                  ||«       Œ  y )NÚ	_deferredc                   ó   •— e Zd ZW ° Zy)úKFieldInstanceTracker.init_deferred_fields.<locals>.DeferredAttributeTrackerN)r   r   r   r)   r0   s   €r   ÚDeferredAttributeTrackerr‡     s	   ø„ Ù#Ñr   rˆ   c                   ó   •— e Zd ZW ° Zd„ Zy)úHFieldInstanceTracker.init_deferred_fields.<locals>.FileDescriptorTrackerc                 ó.   — | j                   j                  S r/   )r   r   r0   s    r   r%   zXFieldInstanceTracker.init_deferred_fields.<locals>.FileDescriptorTracker._get_field_name  s   € Ø—z‘z—‘Ð&r   N)r   r   r   r)   r%   r0   s   €r   ÚFileDescriptorTrackerrŠ     s   ø„ Ù#Ðó'r   rŒ   )Úsetr   r&   r?   r…   r#   r
   r	   r8   r   rA   r   r   r   r@   )r   rˆ   rŒ   r   Ú	field_objÚfield_trackers   `     r   Úinit_deferred_fieldsz)FieldInstanceTracker.init_deferred_fields  sï   ø€ Ü),«ˆ�‰Ô&Ü�4—=‘= +Ô.°t·}±}×7NÒ7NØö	$¤Ô8Iô 	$ö	'¤O´^ô 	'ð *.¯©×)JÑ)JÓ)Lˆ�‰Ô&Ø—]‘]×3Ñ3ò 	GˆEØŸ™×/Ñ/×8Ñ8×<Ñ<¸UÓCˆIÜ˜)¤^Ô4Ù 5°i·o±oÓ F�Ü˜Ÿ™×/Ñ/°¸ÕFá 8¸Ó ?�Ü˜Ÿ™×/Ñ/°¸ÕFñ	Gr   r/   )r   r   r   r6   rX   ra   rk   Úpropertyrm   rp   r\   rs   r|   r{   rƒ   r�   rK   r   r   rc   rc   »   sQ   „ ò9ò(ò@òFð ñ3ó ð3ò=ó
Gó<ò?ò*ò(
óGr   rc   c                   óJ   — e Zd ZeZdd„Zdd„Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zd
„ Zy)ÚFieldTrackerNc                 ó   — || _         y r/   rZ   rj   s     r   r6   zFieldTracker.__init__/  s	   € Øˆ�r   c                 ó*   ‡ ‡— ˆˆ fd„}|€|S  ||«      S )Nc                 ó4   •‡ — t        ‰ «      ˆ ˆˆfd„«       }|S )Nc                 óž   •— t        | ‰j                  «      }‰€|j                  n‰} ||Ž 5   ‰| g|¢­i |¤Žcd d d «       S # 1 sw Y   y xY wr/   )r:   ÚattnamerS   )rN   ÚargsÚkwargsrR   Ú
field_listrW   rS   r   s        €€€r   Úinnerz7FieldTracker.__call__.<locals>.decorator.<locals>.inner4  sQ   ø€ ä! # t§|¡|Ó4�Ø/5¨~˜WŸ^š^À6�
Ù˜jÐ)ñ 3Ù˜SÐ2 4Ò2¨6Ñ2÷3÷ 3ò 3ús   ­AÁAr   )rW   rœ   rS   r   s   ` €€r   Ú	decoratorz(FieldTracker.__call__.<locals>.decorator3  s    ù€ Ü�1‹Xõ3ó ð3ð ˆLr   rK   )r   ÚfuncrS   r�   s   ` ` r   rk   zFieldTracker.__call__2  s   ù€ õ	ð ˆ<ØÐÙ˜‹Ðr   c           
      ó:  — | j                   D �ci c]  }||“Œ }}|j                  j                   D �ci c]  }|j                  |j                  “Œ }} |j                  di |j                  «       D ��ci c]  \  }}||v r||“Œ c}}¤Ž |S c c}w c c}w c c}}w )z:Returns dict mapping fields names to model attribute namesrK   )rS   Ú_metar   r˜   rt   ru   )r   Úclsr   re   rW   Ú
all_fieldsÚkÚvs           r   Úget_field_mapzFieldTracker.get_field_map@  s›   € à/3¯{©{Ö; e�U˜E‘\Ð;ˆ	Ð;Ø14·±×1AÑ1AÖB¨A�a—f‘f˜aŸi™iÑ'ÐBˆ
ÐBØˆ	×Ññ 	0¨z×/?Ñ/?Ó/A÷ /¡V a¨Ø  I™~ð ˜q™Dó /ò 	0àÐùò	 <ùÚBùó/s   �
B³BÁ4Bc                 ó�   — || _         d|z  | _        t        j                  j                  j                  | j                  |¬«       y )Nz_%s)Úsender)r   r˜   r   ÚsignalsÚclass_preparedÚconnectÚfinalize_class)r   r¡   r   s      r   Úcontribute_to_classz FieldTracker.contribute_to_classH  s7   € ØˆŒ	Ø˜t‘|ˆŒÜ�‰×%Ñ%×-Ñ-¨d×.AÑ.AÈ#Ð-ÕNr   c                 ó*  — | j                   €"d„ |j                  j                   D «       | _         t        | j                   «      | _         | j                   D ]D  }t        ||«      }t        j                  |«      } |||| j                  «      }t        |||«       ŒF | j                  |«      | _	        t        j                  j                  j                  | j                  «       || _        t        || j                   | «       | j#                  |«       y )Nc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr/   )r˜   )Ú.0r   s     r   ú	<genexpr>z.FieldTracker.finalize_class.<locals>.<genexpr>O  s   è ø€ ÒJ¨U˜5Ÿ=�=ÑJùs   ‚)rS   r    r�   r:   r2   rI   r˜   r@   r¥   re   r   r¨   Ú	post_initrª   Úinitialize_trackerÚmodel_classr   Ú
patch_save)r   r§   rš   r-   r4   Úwrapper_clsÚwrapped_descriptors          r   r«   zFieldTracker.finalize_classM  s×   € Ø�;‰;ÐÙJ°f·l±l×6IÑ6IÔJˆDŒKÜ˜$Ÿ+™+Ó&ˆŒØŸ+™+ò 	<ˆJÜ  ¨Ó4ˆJÜ+×>Ñ>¸zÓJˆKÙ!,¨Z¸ÀTÇ\Á\Ó!RÐÜ�F˜JÐ(:Õ;ð		<ð
 ×+Ñ+¨FÓ3ˆŒÜ�‰× Ñ ×(Ñ(¨×)@Ñ)@ÔAØ!ˆÔÜ�˜Ÿ	™	 4Ô(Ø�‰˜Õr   c                 óÜ   — t        || j                  «      sy | j                  || j                  | j                  «      }t        || j                  |«       |j                  «        d|_        y )NT)	r   r³   Útracker_classrS   re   r@   r˜   r\   r<   )r   r§   r   rš   rR   s        r   r²   zFieldTracker.initialize_tracker\  sU   € Ü˜( D×$4Ñ$4Ô5ØØ×$Ñ$ X¨t¯{©{¸D¿N¹NÓKˆÜ�˜$Ÿ,™,¨Ô0Ø× Ñ Ô"Ø)-ˆÕ&r   c                 óP   — | j                  |dd«       | j                  |dd«       y )NÚ	save_baseÚupdate_fieldsr~   rS   )Ú_patch)r   Úmodels     r   r´   zFieldTracker.patch_saved  s#   € Ø�‰�E˜;¨Ô8Ø�‰�EÐ,¨hÕ7r   c                 óf   ‡ ‡‡— t        ||«      Št        ‰«      ˆˆˆ fd„«       }t        |||«       y )Nc                 óÔ   •— |j                  ‰«      }|€‰j                  }nˆfd„|D «       }t        | ‰j                  «      } ||Ž 5   ‰| g|¢­i |¤Žcd d d «       S # 1 sw Y   y xY w)Nc              3   ó>   •K  — | ]  }|‰j                   v r|–— Œ y ­wr/   rZ   )r¯   r   r   s     €r   r°   z5FieldTracker._patch.<locals>.inner.<locals>.<genexpr>q  s%   øè ø€ ò Ø#Ø˜TŸ[™[Ñ(ô ñùs   ƒ)r   rS   r:   r˜   )	r   r™   rš   r»   rS   rR   Úfields_kwargÚoriginalr   s	         €€€r   rœ   z"FieldTracker._patch.<locals>.innerk  sp   ø€ à"ŸJ™J |Ó4ˆMØÐ$ØŸ™‘óØ'4ô�ô ˜h¨¯©Ó5ˆGÙ˜&Ð!ñ ;Ù Ð:¨4Ò:°6Ñ:÷;÷ ;ò ;ús   ÁAÁA')r:   r   r@   )r   r½   ÚmethodrÁ   rœ   rÂ   s   `  ` @r   r¼   zFieldTracker._patchh  s3   ú€ Ü˜5 &Ó)ˆä	ˆx‹õ	;ó 
ð	;ô 	��v˜uÕ%r   c                 ó6   — |€| S t        || j                  «      S r/   )r:   r˜   )r   r   r+   s      r   r(   zFieldTracker.__get__{  s   € ØÐØˆKä˜8 T§\¡\Ó2Ð2r   r/   )NN)r   r   r   rc   r¸   r6   rk   r¥   r¬   r«   r²   r´   r¼   r(   rK   r   r   r“   r“   +  s5   „ à(€MóóòòOò
 ò.ò8ò&ó&3r   r“   c                   ó   — e Zd Zd„ Zd„ Zy)ÚModelInstanceTrackerc                 ó®   — | j                   j                  sy|| j                  v r#| j                  |«      | j	                  |«      k7  S t        d|z  «      ‚)ry   Trz   )r   rr   r*   r{   rp   r   ro   s     r   r|   z ModelInstanceTracker.has_changed„  sN   € à�}‰}×ÒØØ�d—o‘oÑ%Ø—=‘= Ó'¨4×+?Ñ+?ÀÓ+FÑFÐFäÐ5¸Ñ=Ó>Ð>r   c                 óÐ   — | j                   j                  si S | j                  j                  «       }| j	                  «       }|D ��ci c]  \  }}|||   k7  sŒ||“Œ c}}S c c}}w r‚   )r   rr   r*   ru   rs   )r   Úsavedrs   r£   r¤   s        r   rƒ   zModelInstanceTracker.changed�  sW   € à�}‰}×ÒØˆIØ—‘×%Ñ%Ó'ˆØ—,‘,“.ˆØ!&×:™˜˜A¨!¨w°q©z«/��1‘Ó:Ð:ùÓ:s   ÁA"ÁA"N)r   r   r   r|   rƒ   rK   r   r   rÆ   rÆ   ‚  s   „ ò?ó;r   rÆ   c                   ó   — e Zd ZeZd„ Zy)ÚModelTrackerc                 óB   — | j                   D �ci c]  }||“Œ c}S c c}w r/   rZ   )r   r¡   r   s      r   r¥   zModelTracker.get_field_map™  s   € Ø*.¯+©+Ö6 ��u‘Ò6Ð6ùÒ6s   �
N)r   r   r   rÆ   r¸   r¥   rK   r   r   rË   rË   –  s   „ Ø(€Mó7r   rË   N)Úcopyr   Ú	functoolsr   Údjango.core.exceptionsr   Ú	django.dbr   Údjango.db.models.fields.filesr   r	   Údjango.db.models.query_utilsr
   r   r!   r#   r2   rH   rP   rc   r“   rÆ   rË   rK   r   r   ú<module>rÓ      sŠ   ðÝ Ý å -Ý ß CÝ :ô˜)ô ò(
÷ñ ÷(0%ñ 0%ôf(Ð-ô (÷>?ñ >?÷BmGñ mG÷`T3ñ T3ôn;Ð/ô ;ô(7�<õ 7r   