o
    ht                     @   s  d dl 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 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 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  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* d dl+m,Z,m-Z- d dl.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl2m4Z5 d dl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> d dl?m@Z@ G dd dZAG dd deAZBG d d! d!ZCG d"d# d#ZDG d$d% d%ZEG d&d' d'ZFG d(d) d)ZGdS )*    N)settings)quote)ContentType)modelstransaction)Media)get_object_or_404)render_to_string)reverse)timezone)cached_property)format_html)	mark_safe)capfirst)gettext)hooks)messages)EditingSession)user_display_name)EditingSessionsModule)TitleColumn)get_latest_strset_query_params)	BasicLockScheduledForPublishLockWorkflowLock)log)registry)DraftStateMixinLocaleLockableMixinPreviewableMixinRevisionMixinTranslatableMixinWorkflowMixinWorkflowState)render_timestampc                   @   s   e Zd ZdZdd ZdS )HookResponseMixinzD
    A mixin for class-based views to run hooks by `hook_name`.
    c                 O   s4   t |D ]}||i |}t|dr|  S qdS )z
        Run the named hook, passing args and kwargs to each function registered under that hook name.
        If any return an HttpResponse, stop processing and return that response
        status_codeN)r   	get_hookshasattr)self	hook_nameargskwargsfnresult r1   b/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/wagtail/admin/views/generic/mixins.pyrun_hook.   s   
zHookResponseMixin.run_hookN)__name__
__module____qualname____doc__r3   r1   r1   r1   r2   r'   )   s    r'   c                       s<   e Zd ZdZdd Zdd Z fddZ fdd	Z  ZS )
BeforeAfterHookMixinz
    A mixin for class-based views to support hooks like `before_edit_page` and
    `after_edit_page`, which are triggered during execution of some operation and
    can return a response to halt that operation and/or change the view response.
    c                 C      dS )a  
        Define how to run the hooks before the operation is executed.
        The `self.run_hook(hook_name, *args, **kwargs)` from HookResponseMixin
        can be utilised to call the hooks.

        If this method returns a response, the operation will be aborted and the
        hook response will be returned as the view response, skipping the default
        response.
        Nr1   r+   r1   r1   r2   run_before_hookA      
z$BeforeAfterHookMixin.run_before_hookc                 C   r9   )av  
        Define how to run the hooks after the operation is executed.
        The `self.run_hook(hook_name, *args, **kwargs)` from HookResponseMixin
        can be utilised to call the hooks.

        If this method returns a response, it will be returned as the view
        response immediately after the operation finishes, skipping the default
        response.
        Nr1   r:   r1   r1   r2   run_after_hookM   r<   z#BeforeAfterHookMixin.run_after_hookc                    s&   |   }|d ur
|S t j|i |S N)r;   superdispatch)r+   r-   r.   hooks_result	__class__r1   r2   r@   Y   s   zBeforeAfterHookMixin.dispatchc                    s$   t  |}|  }|d ur|S |S r>   )r?   
form_validr=   )r+   formresponserA   rB   r1   r2   rD   `   s
   zBeforeAfterHookMixin.form_valid)	r4   r5   r6   r7   r;   r=   r@   rD   __classcell__r1   r1   rB   r2   r8   :   s    r8   c                       sN   e Zd Zedd Zedd Zdd Zdd Z fd	d
ZdddZ	  Z
S )LocaleMixinc                 C   s   |   S r>   )
get_localer:   r1   r1   r2   localek   s   zLocaleMixin.localec                 C   s   | j r|  S g S r>   )rJ   get_translationsr:   r1   r1   r2   translationso   s   zLocaleMixin.translationsc                 C   sn   t | dd sd S t tdd}|rt| jtsd S t| dr$| jr$| jjS | jj	
d}|r3tt|dS t S )NmodelWAGTAIL_I18N_ENABLEDFobjectrJ   )language_code)getattrr   
issubclassrM   r#   r*   rO   rJ   requestGETgetr   r   get_default)r+   i18n_enabledselected_localer1   r1   r2   rI   s   s   zLocaleMixin.get_localec                 C   s   g S r>   r1   r:   r1   r1   r2   rK      s   zLocaleMixin.get_translationsc                    s4   t  jdi |}| js|S | j|d< | j|d< |S )NrJ   rL   r1   )r?   get_context_datarJ   rL   r+   r.   contextrB   r1   r2   rY      s   

zLocaleMixin.get_context_dataNc                 C   s"   |p| j  }s	|S t|d|jiS )NrJ   )rJ   r   rP   )r+   urlrJ   r1   r1   r2   _set_locale_query_param   s   z#LocaleMixin._set_locale_query_paramr>   )r4   r5   r6   r   rJ   rL   rI   rK   rY   r]   rG   r1   r1   rB   r2   rH   j   s    

	rH   c                       sH   e Zd ZdZ fddZdd Zdd Z fdd	Z fd
dZ  Z	S )
PanelMixinNc                    s(   t  j|g|R i | |  | _d S r>   )r?   setup	get_panelpanelr+   rS   r-   r.   rB   r1   r2   r_      s   zPanelMixin.setupc                 C   s   | j S r>   )ra   r:   r1   r1   r2   r`      s   zPanelMixin.get_panelc                 C   s    | j sd S | j j| j|j|dS )N)rS   instancerE   )ra   get_bound_panelrS   rc   r+   rE   r1   r1   r2   rd      s
   
zPanelMixin.get_bound_panelc                    s    | j s| jst  S | j S r>   )
form_classra   r?   get_form_classr:   rB   r1   r2   rg      s   

zPanelMixin.get_form_classc                    sd   t  jdi |}|d}| |}|dt }|r!||j7 }|r(||j7 }|||d |S )NrE   media)ra   rh   r1   )r?   rY   rU   rd   r   rh   update)r+   r.   r[   rE   ra   rh   rB   r1   r2   rY      s   



zPanelMixin.get_context_data)
r4   r5   r6   ra   r_   r`   rd   rg   rY   rG   r1   r1   rB   r2   r^      s    r^   c                       s0   e Zd ZdZef fdd	Z fddZ  ZS )IndexViewOptionalFeaturesMixinz
    A mixin for generic IndexView to support optional features that are applied
    to the model as mixins (e.g. DraftStateMixin, RevisionMixin).
    c                    s6   | dd }|s|dkrt}t j||fd|i|S )Naccessor__str__)popr   r?   _get_title_column)r+   
field_namecolumn_classr.   rk   rB   r1   r2   rn      s   z0IndexViewOptionalFeaturesMixin._get_title_columnc                    s8   t |jtr|d}|jtdd}|S t |S )Nlatest_revisionlatest_revision__created_at)_updated_at)	rR   rM   r"   select_relatedannotater   Fr?   _annotate_queryset_updated_atr+   querysetrB   r1   r2   rw      s   
z<IndexViewOptionalFeaturesMixin._annotate_queryset_updated_at)r4   r5   r6   r7   r   rn   rw   rG   r1   r1   rB   r2   rj      s    
rj   c                       st  e Zd ZdZdZdZdZdZdZdZ	dZ
dZ fddZedd Zedd	 Zed
d Zedd Zedd Z fddZdd Z fddZdF fdd	Zdd Zdd Zdd Zdd Zd d! Zd"d# Z fd$d%ZdFd&d'Z fd(d)Zd*d+ Z d,d- Z!d.d/ Z"d0d1 Z#d2d3 Z$d4d5 Z%d6d7 Z&d8d9 Z' fd:d;Z(d<d= Z)d>d? Z*d@dA Z+ fdBdCZ,dDdE Z-  Z.S )G#CreateEditViewOptionalFeaturesMixinz
    A mixin for generic CreateView/EditView to support optional features that
    are applied to the model as mixins (e.g. DraftStateMixin, RevisionMixin).
    createNc                    s   || _ || _|| _| jot| jt| _| jot| jt| _| jo%t| jt	| _
| jo4t| jto4| jdk| _|  | _|  | _| joI| j|j| _t j|g|R i | d S Nr{   )rS   r-   r.   rM   rR   r!   preview_enabledr"   revision_enabledr   draftstate_enabledr    	view_namelocking_enabled
get_objectrO   get_locklockfor_useruserlocked_for_userr?   r_   rb   rB   r1   r2   r_      s   


z)CreateEditViewOptionalFeaturesMixin.setupc                 C   s0   | j r	t| j tsd S | jr| j S | j  S r>   )rM   rR   r$   rO   get_workflowget_default_workflowr:   r1   r1   r2   workflow  s
   

z,CreateEditViewOptionalFeaturesMixin.workflowc                 C   s
   | j d uS r>   )r   r:   r1   r1   r2   workflow_enabled
  s   
z4CreateEditViewOptionalFeaturesMixin.workflow_enabledc                 C   s*   | j r| jsd S | jjp| jjd S )N
created_at)r   rO   current_workflow_stateworkflow_statesorder_bylastr:   r1   r1   r2   workflow_state  s
   z2CreateEditViewOptionalFeaturesMixin.workflow_statec                 C   s   | j r| jsd S | jjS r>   )r   rO   current_workflow_taskr:   r1   r1   r2   r     s   z9CreateEditViewOptionalFeaturesMixin.current_workflow_taskc                 C   s   | j sg S | j  S r>   )r   all_tasks_with_statusr:   r1   r1   r2   workflow_tasks  s   
z2CreateEditViewOptionalFeaturesMixin.workflow_tasksc                    s   | j j}|dkr| jr|jrdS | j| j|S |dkr5|jr!dS | jj|jkr*dS | jr5| j| j|S t	 
|}|r?dS |dkrR| jrR| j| j| j jrRdS dS )Nr   TunlockchangeF)rS   r   r   is_superuseruser_can_lockrO   locked_by_idpkuser_can_unlockr?   user_has_permissionuser_can_access_editor)r+   
permissionr   has_base_permissionrB   r1   r2   r   #  s0   
z7CreateEditViewOptionalFeaturesMixin.user_has_permissionc                 C   sF   | j sdS | jjd| _| j | j| jj}dd |D }| j|v S )NFzworkflow-action-namec                 S   s   g | ]\}}}|qS r1   r1   ).0nameverbose_namemodalr1   r1   r2   
<listcomp>T  s    
zPCreateEditViewOptionalFeaturesMixin.workflow_action_is_valid.<locals>.<listcomp>)r   rS   POSTrU   workflow_actionget_actionsrO   r   )r+   available_actionsavailable_action_namesr1   r1   r2   workflow_action_is_validM  s   

z<CreateEditViewOptionalFeaturesMixin.workflow_action_is_validc                    s   g t   }| jjdkr|S | jr#| jr| j| jjdr#|d | j	rP|d | j
rG| j
| jjrG|d | jrG| jjsG|d |  rP|d |S )Nr   publishsubmitcancel-workflowrestart-workflowzworkflow-action)r?   get_available_actionsrS   methodr   permission_policyr   r   appendr   r   user_can_cancelrO   workflow_in_progressr   )r+   actionsrB   r1   r2   r   Y  s(   




z9CreateEditViewOptionalFeaturesMixin.get_available_actionsc                    s2   | j dkrd S t || _| jr| j S | jS r|   )r   r?   r   live_objectr   get_latest_revision_as_objectrx   rB   r1   r2   r   t  s   

z.CreateEditViewOptionalFeaturesMixin.get_objectc                 C   s   | j sd S | j S r>   )r   rO   r   r:   r1   r1   r2   r   |  s   
z,CreateEditViewOptionalFeaturesMixin.get_lockc                 C   (   | j r| jsd S t| jt| jjgdS Nr-   )r   lock_url_namer
   r   rO   r   r:   r1   r1   r2   get_lock_url     z0CreateEditViewOptionalFeaturesMixin.get_lock_urlc                 C   r   r   )r   unlock_url_namer
   r   rO   r   r:   r1   r1   r2   get_unlock_url  r   z2CreateEditViewOptionalFeaturesMixin.get_unlock_urlc                 C   s:   | j r| jsd S | jdkrg nt| jjg}t| j|dS )Nr{   r   )r}   preview_url_namer   r   rO   r   r
   )r+   r-   r1   r1   r2   get_preview_url  s   z3CreateEditViewOptionalFeaturesMixin.get_preview_urlc                 C   r   r   )r   workflow_history_url_namer
   r   rO   r   r:   r1   r1   r2   get_workflow_history_url  r   z<CreateEditViewOptionalFeaturesMixin.get_workflow_history_urlc                 C   r   r   )r   &confirm_workflow_cancellation_url_namer
   r   rO   r   r:   r1   r1   r2   %get_confirm_workflow_cancellation_url  s
   zICreateEditViewOptionalFeaturesMixin.get_confirm_workflow_cancellation_urlc                    s8   | j dkrd S | jrttdd| jjji S t  S )Nr   z5The %(model_name)s could not be saved as it is locked
model_name)	actionr   r   _rM   _metar   r?   get_error_messager:   rB   r1   r2   r     s   

z5CreateEditViewOptionalFeaturesMixin.get_error_messagec                 C   s   |p| j }td}| jdkrtd}| jdkrD|jr7|jt kr7td}| jdkr/td}n|jr6td}ntd}| jdkrDtd	}| jd
krVtd}| jdkrVtd}| jdkr_td}| jdkrhtd}|t| j	j
jt|d S )Nz$%(model_name)s '%(object)s' updated.r{   z$%(model_name)s '%(object)s' created.r   z>%(model_name)s '%(object)s' has been scheduled for publishing.zA%(model_name)s '%(object)s' created and scheduled for publishing.zW%(model_name)s '%(object)s' is live and this version has been scheduled for publishing.z2%(model_name)s '%(object)s' updated and published.z2%(model_name)s '%(object)s' created and published.r   z>%(model_name)s '%(object)s' has been submitted for moderation.zA%(model_name)s '%(object)s' created and submitted for moderation.r   z;Workflow on %(model_name)s '%(object)s' has been restarted.r   z;Workflow on %(model_name)s '%(object)s' has been cancelled.)r   rO   )rO   r   r   r   
go_live_atr   nowliver   rM   r   r   r   )r+   rc   rO   messager1   r1   r2   get_success_message  sJ   








z7CreateEditViewOptionalFeaturesMixin.get_success_messagec                    s*   h d}| j r| j|v r|  S t  S )N>   editr{   r   )r   r   get_edit_urlr?   get_success_url)r+   remain_actionsrB   r1   r2   r     s   
z3CreateEditViewOptionalFeaturesMixin.get_success_urlc                 C   s   | j r$| jj| jdko| jj d}| jdkr#d|_|  | j  n| j }| jdkp2| j | _d| _	| j
rC|j| jjd| _	t|| jdkrLdnd| j	| jd	 |S )
z
        Called after the form is successfully validated - saves the object to the db
        and returns the new object. Override this to implement custom save logic.
        r   commitr{   FNr   zwagtail.createzwagtail.edit)rc   r   revisioncontent_changed)r   rE   saver   rO   r   save_m2mhas_changedhas_content_changesnew_revisionr~   save_revisionrS   r   r   )r+   rc   r1   r1   r2   save_instance  s*   


z1CreateEditViewOptionalFeaturesMixin.save_instancec                 C   sT   |  d| j| j}|d ur|S | jj| jjdd |  d| j| j}|d ur(|S d S )Nbefore_publishT)r   skip_permission_checksafter_publish)r3   rS   rO   r   r   r   )r+   hook_responser1   r1   r2   publish_action  s   z2CreateEditViewOptionalFeaturesMixin.publish_actionc                 C   s@   | j r| j jtjkr| j | jj d S | j| j	| jj d S r>   )
r   statusr%   STATUS_NEEDS_CHANGESresumerS   r   r   startrO   r:   r1   r1   r2   submit_action  s   z1CreateEditViewOptionalFeaturesMixin.submit_actionc                 C   s*   | j j| jjd | j| j| jj d S Nr   )r   cancelrS   r   r   r   rO   r:   r1   r1   r2   restart_workflow_action  s   z;CreateEditViewOptionalFeaturesMixin.restart_workflow_actionc                 C   s   | j j| jjd d S r   )r   r   rS   r   r:   r1   r1   r2   cancel_workflow_action$  s   z:CreateEditViewOptionalFeaturesMixin.cancel_workflow_actionc                 C   sB   | j jdd}t|}| jjj| jj| j j	| j
fi | d S )Nzworkflow-action-extra-dataz{})rS   r   rU   jsonloadsrO   r   	on_actioncurrent_workflow_task_stater   r   )r+   extra_workflow_data_jsonextra_workflow_datar1   r1   r2   workflow_action_action(  s   
z:CreateEditViewOptionalFeaturesMixin.workflow_action_actionc                 C   s(   t | | jddd d }|r| S d S )N-r   _action)rQ   r   replace)r+   action_methodr1   r1   r2   run_action_method5  s   z5CreateEditViewOptionalFeaturesMixin.run_action_methodc                 C   sl   || _ t  |  | _W d    n1 sw   Y  |  }|d ur&|S |  }|  }|d ur4|S |S r>   )rE   r   atomicr   rO   r   save_actionr=   )r+   rE   rF   r   r1   r1   r2   rD   ;  s   
z.CreateEditViewOptionalFeaturesMixin.form_validc                    sZ   | j dkr'|   tj| j|  |  d |  | _| jo%| j	| jj
| _t |S )Nr   )buttons)r   r   r   successrS   r   get_success_buttonsr   r   r   r   r   r?   form_invalidre   rB   r1   r2   r   L  s   

z0CreateEditViewOptionalFeaturesMixin.form_invalidc                 C   sx   | j dkrd S | jr| jjsd S d }| jr| jjr| jj}n| jr)| jjr)| jj}|s3t| j	 S |j
t|jdS )Nr{   )	timestampr   )r   r   rO   r   live_revisionr~   rq   log_registryget_logs_for_instancefirstr   r   r   )r+   r   r1   r1   r2   get_last_updated_info[  s   

z9CreateEditViewOptionalFeaturesMixin.get_last_updated_infoc                 C   s&  | j si S | j pt| jto| d}t| jto| d}t| jto)| d}| j| j|  | 	 ||d}| jrB| j
jdkrD|S | j| j
j}|r|r[td|| 	 td}|rttd|t| jt| jj| jjjgdtd	}t| jts| jrtj| j
|dd
 |S tj| j
|dd
 |S )Nr   r   r   )r   r   lock_url
unlock_urlr   r   rT   z{} <span class="buttons"><button type="button" class="button button-small button-secondary" data-action="w-action#post" data-controller="w-action" data-w-action-url-value="{}">{}</button></span>Unlockr   zCancel scheduled publish)
extra_tags)r   r   
isinstancer   r   r   r   r   r   r   rS   r   get_messager   r   r   r
   revisions_unschedule_url_namer   rO   r   scheduled_revisionidr   warninginfo)r+   r   r   user_can_unscheduler[   lock_messager1   r1   r2   get_lock_contextu  sd   


z4CreateEditViewOptionalFeaturesMixin.get_lock_contextc                 C   s   | j dkrd S t  tj| j}tjj| jj	|| j
jt d}| jr)| j
jnd }t|td| jjj| jjjt| j
j|jfdtd|jfdg |S )Nr{   )r   content_type	object_idlast_seen_atz"wagtailadmin_editing_sessions:pingr   z%wagtailadmin_editing_sessions:release)r   r   cleanupr   objectsget_for_modelrM   r{   rS   r   rO   r   r   r   r~   latest_revision_idr   r
   r   	app_labelr   r   r  )r+   r  sessionrevision_idr1   r1   r2   get_editing_sessions  s8   

	z8CreateEditViewOptionalFeaturesMixin.get_editing_sessionsc                    s   t  jdi |}||   | j|d< | j|d< | j|d< |  |d< |  |d< t	t
ddo5t| j|d< | j|d	< |  |d
< |S )Nr~   r   r   workflow_history_url!confirm_workflow_cancellation_url"WAGTAIL_WORKFLOW_CANCEL_ON_PUBLISHTpublishing_will_cancel_workflowrevisions_compare_url_nameediting_sessionsr1   )r?   rY   ri   r  r~   r   r   r   r   rQ   r   boolr   r#  r  rZ   rB   r1   r2   rY     s$   



z4CreateEditViewOptionalFeaturesMixin.get_context_datac                 O   s*   |   }| js| r| |S | |S r>   )get_formr   is_validrD   r   )r+   rS   r-   r.   rE   r1   r1   r2   post  s   

z(CreateEditViewOptionalFeaturesMixin.postr>   )/r4   r5   r6   r7   r   r   r   r   r  r#  r   r   r_   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rD   r   r  r  r  rY   r(  rG   r1   r1   rB   r2   rz      s`    




*

2#;rz   c                       sr   e Zd ZdZdZ fddZ fddZdd Zd	d
 Zdd Z	d fdd	Z
dd Zdd Z fddZ  ZS )RevisionsRevertMixinr  Nc                    s,   | | j| _t j|g|R i | d S r>   )rU   revision_id_kwargr  r?   r_   rb   rB   r1   r2   r_     s   zRevisionsRevertMixin.setupc                    s"   |    t j|g|R i |S r>   )_add_warning_messager?   rU   rb   rB   r1   r2   rU     s   zRevisionsRevertMixin.getc                 C   s   t | jt| jj| jgdS r   )r
   revisions_revert_url_namer   rO   r   r  r:   r1   r1   r2   get_revisions_revert_url  s   z-RevisionsRevertMixin.get_revisions_revert_urlc                 C   sH   t dd| jji}td}t| jjjt| jj	|d}t
|| }|S )Nz$wagtailadmin/shared/user_avatar.htmlr   z`You are viewing a previous version of this %(model_name)s from <b>%(created_at)s</b> by %(user)s)r   r   r   )r	   r   r   r   r   rM   r   r   r&   r   r   )r+   user_avatarmessage_stringmessage_datar   r1   r1   r2   get_warning_message  s   
z(RevisionsRevertMixin.get_warning_messagec                 C   s   t | j|   d S r>   )r   r  rS   r1  r:   r1   r1   r2   r+  
  s   z)RevisionsRevertMixin._add_warning_messagec                    s(   t  |}t|j| jd| _| j S )N)r  )r?   r   r   	revisionsr  r   	as_object)r+   ry   rO   rB   r1   r2   r     s   
zRevisionsRevertMixin.get_objectc                 C   sN   t | jt p| jj }| jj|d}| j | _|j	| j
jd| jd| _|S )Nr   T)r   
log_actionprevious_revision)rR   rM   r   rO   r   rE   r   r   r   r   rS   r   r   r   )r+   r   rc   r1   r1   r2   r     s   z"RevisionsRevertMixin.save_instancec                 C   sd   t d}| jr | jdkr t d}| jjr | jjt kr t d}|t| jj	j
| jt| jjd S )NzN%(model_name)s '%(object)s' has been replaced with version from %(timestamp)s.r   zMVersion from %(timestamp)s of %(model_name)s '%(object)s' has been published.z\Version from %(timestamp)s of %(model_name)s '%(object)s' has been scheduled for publishing.)r   rO   r   )r   r   r   rO   r   r   r   r   rM   r   r   r&   r   r   )r+   r   r1   r1   r2   r      s    
z(RevisionsRevertMixin.get_success_messagec                    s,   t  jdi |}| j|d< |  |d< |S )Nr   
action_urlr1   )r?   rY   r   r-  rZ   rB   r1   r2   rY   4  s   
z%RevisionsRevertMixin.get_context_datar>   )r4   r5   r6   r*  r,  r_   rU   r-  r1  r+  r   r   r   rY   rG   r1   r1   rB   r2   r)    s    r)  )Hr   django.confr   django.contrib.admin.utilsr   "django.contrib.contenttypes.modelsr   	django.dbr   r   django.formsr   django.shortcutsr   django.template.loaderr	   django.urlsr
   django.utilsr   django.utils.functionalr   django.utils.htmlr   django.utils.safestringr   django.utils.textr   django.utils.translationr   r   wagtailr   wagtail.adminr   wagtail.admin.modelsr   ,wagtail.admin.templatetags.wagtailadmin_tagsr   !wagtail.admin.ui.editing_sessionsr   wagtail.admin.ui.tablesr   wagtail.admin.utilsr   r   wagtail.locksr   r   r   wagtail.log_actionsr   r   r  wagtail.modelsr   r   r    r!   r"   r#   r$   r%   wagtail.utils.timestampsr&   r'   r8   rH   r^   rj   rz   r)  r1   r1   r1   r2   <module>   sL    (
0,-    