
    >iB                        S SK Jr  S SKJr  S SKJr  S SKJr  S SKJ	r	  S SK
7  S SKJrJr  S SKJr  S S	KJr  S S
KrS SKJr  S SKJr  S SKJr  S SKJr  S SK7  S S
KrS S
KrS SKJr  S SKJr  S SKJ r J!r!J"r"  S SKJ	r	J#r#  SSK$7  S SK%J&r&  S SK'J(r(  S SK)Jr   " S S\5      r* " S S\5      r+ " S S\5      r, " S S\5      r- " S S\5      r. " S  S!\5      r/ " S" S#\5      r0 " S$ S%\5      r1 " S& S'\5      r2 " S( S)\5      r3 " S* S+\5      r4 " S, S-\5      r5 " S. S/\5      r6 " S0 S1\5      r7 " S2 S3\5      r8 " S4 S5\5      r9 " S6 S7\5      r: " S8 S9\5      r; " S: S;\5      r< " S< S=\5      r= " S> S?\5      r> " S@ SA\5      r?g
)B    )render)	timesince)Response)APIViewstatus)*)make_passwordcheck_password)RefreshToken)adminauthenticatedN)settings)render_to_string)mail)User)	send_mail)r
   )	Paginator	EmptyPagePageNotAnInteger)r   permissions   )Count)
TruncMonthc                       \ rS rSrS rSrg)AdminRegister   c                 J    UR                   R                  S5      nUR                   R                  S5      nU(       a  U(       d  [        SS0[        R                  S9$ [
        R                  R                  US9R                  5       (       a  [        SS0[        R                  S9$ [
        R                  R                  UUUS9n[        R                  R                  UU[        U5      S	9n[        R                  " U5      n[        UR                   5      [        U5      UR"                  UR$                  S
.n[        [        R&                  SUS.[        R(                  S9$ ! [*         a0  n[        SS[        U5       30[        R,                  S9s S nA$ S nAff = f)Nemailpasswordstatus_messageEmail and password are requiredr   r   #User with this email already exists)usernamer   r   )userr   r   )accessrefreshuser_idr   zAdmin registered successfullystatus_coder    datazRegistration failed: )r+   getr   r   HTTP_400_BAD_REQUESTr   objectsfilterexistscreate_user
SuperAdmincreater
   r   for_userstraccess_tokenidr   HTTP_200_OKHTTP_201_CREATED	ExceptionHTTP_500_INTERNAL_SERVER_ERROR)	selfrequestr   r   r%   super_adminr'   all_dataes	            ./var/www/html/tms-backend/admin_panel/views.pypostAdminRegister.post   s}   $w<<G$5llz*8
x%'HIRXRmRmnn
ll&--//%'LMV\VqVqrr
,,
"
"
 # 4 ##**	
8$ + ; ""4(7'&&'7|wwZZ	8 %%5 $$	& & 
 w
$(=c!fX&FGPVPuPu
vvws,   AE(  A	E( *B=E( (
F"2%FF"F" N__name__
__module____qualname____firstlineno__rB   __static_attributes__rD       rA   r   r      s    %wrK   r   c                       \ rS rSrS rSrg)
LoginAdminF   c                     UR                   R                  S5      nUR                   R                  S5      nU(       a  U(       d  [        SS0[        R                  S9$ U(       d  [        SS0[        R                  S9$ U(       d  [        SS0[        R                  S9$  [
        R                  R                  US9n[        X4R                  5      (       d  [        SS
0[        R                  S9$ [        R                  " U5      nUR                  [        UR                  5      [        U5      SS.n[        [        R                   SUS.[        R                   S9$ ! [
        R                   a    [        SS	0[        R                  S9s $ f = f! ["         a0  n[        SS[        U5       30[        R$                  S9s S nA$ S nAff = f)Nr   r   r    r!   r   zemail is requiredzpassword is requiredr"   zEmail not existzInvalid credentials
superadmin)r   r&   r'   typezLogin successfulr)   zLogin failed: )r+   r,   r   r   r-   r2   r.   DoesNotExistHTTP_401_UNAUTHORIZEDr   r   r   r4   r   r5   r6   r8   r:   r;   )r<   r=   r   r   r%   r'   r?   r@   s           rA   rB   LoginAdmin.postG   s   #p<<G$5llz*8
x%'HIRXRmRmnn %&9:&B]B]^^
%&<=VE`E`aa`!!!.D ==
1
1%'<=fFbFbcc""4(7ZZ'&&'7|	8 %%( 	! ! 
!
! `%'89&B^B^__`& 
 p
$s1vh&?@InIn
oopsU   AF   F  F #E!  3F 4A,F !.FF FF 
G%G
G
GrD   NrE   rD   rK   rA   rM   rM   F   s    $prK   rM   c                        \ rS rSrS rS rSrg)AdminProfileo   c                      [        U5      n[        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ [        R                  R                  5       R                  5       nU(       d%  [        SUR                  S.[        R                  S9$ UR                  UR                  UR                   UR"                  S.n[        [        R$                  SUS	.[        R$                  S9$ ! [         a-  n[        S[        U5      0[        R
                  S9s S nA$ S nAff = f! [         a-  n[        S[        U5      0[        R&                  S9s S nA$ S nAff = f)
Nr    r   r7   user not foundz8Your account has been Inactive, Please contact to admin.r    r   )r   namephone_numberimageFetched Successfullyr)   )r   r:   r   r5   r   rS   r   r.   r/   firstHTTP_404_NOT_FOUNDr2   allr   HTTP_406_NOT_ACCEPTABLEr\   phoneNumberr^   r8   r;   )r<   r=   uidr@   user_obj	admin_objr?   s          rA   r,   AdminProfile.getp   sc   [U
W
%C ll!!S!)//18
%'78AZAZ[[""&&(..09
&`irixixy  BH  B`  B`  a  aOO>>((OO	8 &"4"4F\dlmu{  vH  vH  I  I!  U%s1v.v7S7STTU" 
 [
$SV,F4Y4Y
ZZ[sU   D AE AE 2AE 
E"D=7E8E =EE 
E<"E71E<7E<c                      [        U5      n[        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ UR                  R                  S5      nUR                  R                  S5      nUR                  R                  S5      nU(       d  [        SS0[        R                  S9$ U(       d  [        SS	0[        R                  S9$ U(       d  [        SS
0[        R                  S9$ [        S[        R                   5        [        R                   n[        US5        [        US5        XTl        Xdl        Xtl        UR)                  5         UR"                  UR*                  (       a  UR*                  R,                  OS UR$                  UR&                  UR.                  S.n	[        [        R0                  SU	S.5      $ ! [         a-  n[        S[        U5      0[        R
                  S9s S nA$ S nAff = f! [         a-  n[        S[        U5      0[        R2                  S9s S nA$ S nAff = f)Nr    r   r(   Admin not foundr\   rd   r^   zname is requiredzphoneNumber is requiredzimage is requiredzMEDIA_ROOT:z----------media_rootz ---------------image,)r\   r   r]   r^   
updated_atz"Admin profile updated successfullyr)   )r   r:   r   r5   r   rS   r2   r.   r/   r`   ra   r+   r,   r-   printr   
MEDIA_ROOTr\   rd   r^   saver%   r   rl   r8   r;   )
r<   r=   re   r@   rg   r\   rd   r^   
media_rootr+   s
             rA   rB   AdminProfile.post   s   -]U
W
%C !!(((5;;=9
%'89&B[B[\\
,,

6
"4!!-0;<<G$5
%'9:6C^C^__
%'@A&JeJeff
%':;FD_D_``++,!!:*+'(>&?>> NN%.^^Y^^!!))OO&&4 %%:  I  U%s1v.v7S7STTUR 
 ]
$c!f-f6[6[
\\]sa   G& AH  A1H   H  - H  CH  &
H0"HHH  HH   
I*"IIIrD   NrF   rG   rH   rI   r,   rB   rJ   rD   rK   rA   rV   rV   o   s    [0.]rK   rV   c                       \ rS rSrS rSrg)AdminForgetPassword   c                 ~    UR                   R                  SS5      R                  5       R                  5       nU(       d  [	        SS0[
        R                  S9$ [        R                  R                  US9R                  5       nU(       d  [	        SS0[
        R                  S9$ [        R                  R                  US9R                  5       nU(       d  [	        SS	0[
        R                  S9$ [        R                  " S
S5      nXTl        UR!                  5         Sn[#        SXRS.5      nSU 3n[$        R&                  n	[(        R*                  " XhX/US9  [	        SUS.[
        R,                  S9$ ! [.         a;  n
[1        U
5        [	        SS[3        U
5       30[
        R4                  S9s S n
A
$ S n
A
ff = f)Nr    r    Email is requiredr   r"   z5This email does not exist or is not an admin account.r%   z+SuperAdmin profile not found for this user.i  i'  zAdmin Password Reset OTPzforget_password_otp.html)otpr   z#Your OTP for resetting password is )html_messagez/Password reset OTP has been sent to your email.r[   messagezError: )r+   r,   striplowerr   r   r-   r   r.   r/   r`   ra   r2   randomrandintforgot_password_otpro   r   r   EMAIL_HOST_USERr   r   r8   r:   rm   r5   r;   )r<   r=   r   rf   rg   rz   subjectr{   plain_message
from_emailr@   s              rA   rB   AdminForgetPassword.post   s   #b<<GR(..06685
%':;FD_D_``ll!!!.4468
%'^_((* * !!((h(7==?9
%'TU((* * 
d	#3#& >>'7"#=s?[\<8>=((:>>'*gLY
G ! !
 
 b8
IQ126;`;`
aabs3   AE7 AE7 'AE7 3BE7 7
F<0F71F<7F<rD   NrE   rD   rK   rA   rt   rt      s    $brK   rt   c                       \ rS rSrS rSrg)AdminVerifyForgetPasswordOTP   c                     UR                   R                  S5      R                  5       R                  5       nU(       d)  [	        [
        R                  SS.[
        R                  S9$ UR                   R                  S5      nU(       d)  [	        [
        R                  SS.[
        R                  S9$ [        R                  R                  US9nUR                  5       (       d)  [	        [
        R                  SS.[
        R                  S9$ [        R                  R                  X#S	9R                  5       nU(       a)  [	        [
        R                  S
S.[
        R                  S9$ [	        [
        R                  SS.[
        R                  S9$ ! [         a<  n[	        [
        R                  [!        U5      S.[
        R                  S9s S nA$ S nAff = f)Nr   rx   r*   r    r   rz   zOTP is requiredr"   z)This email does not exist in our database)r   r   zSuccessfully VerifiedzInvalid OTP)r+   r,   r}   r~   r   r   r-   r2   r.   r/   r0   ra   r`   r8   r:   r;   r5   )r<   r=   r   rz   check_emailrg   r@   s          rA   rB   !AdminVerifyForgetPasswordOTP.post   s   '4<<G$**,2245
//* ))+ +
 
		%	 3
//( ))+ +
 ##***7;




--B '') )
 !!((u(NTTV9&&.   " "
 //$ ))+ +
 
 4
88!f 224 44s9   A&F )A
F 4AF AF *(F 
G1GGGrD   NrE   rD   rK   rA   r   r      s    (4rK   r   c                        \ rS rSrS rS rSrg)AdminPrivacyPolicyi  c                 j     [        U5      n[        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ [        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ [        R                  R                  5       R                  5       nU(       d  [        SS0[        R                  S9$ UR                  UR                  UR                   S.n[        [        R"                  S	US
.[        R"                  S9$ ! [         a-  n[        S[        U5      0[        R
                  S9s S nA$ S nAff = f! [         a-  n[        S[        U5      0[        R$                  S9s S nA$ S nAff = f)Nr    r   rY   rZ   ry   rk   zNo Privacy Policy found.titlecontentlast_updatedFetched Successfulyr)   )r   r:   r   r5   r   rS   r   r.   r/   r`   ra   r2   PrivacyPolicyrb   r   r   rl   r8   r;   )r<   r=   re   r@   rf   rg   policyr?   s           rA   r,   AdminPrivacyPolicy.get  s   ]U
W
%C ll!!s!+1138
%'78AZAZ[[!!((h(7==?9
%'89&B[B[\\ !!%%'--/6
%'AB6KdKdee\\~~%%8
 %%+ 	! !'  U%s1v.v7S7STTU2 
 ]
$c!f-f6[6[
\\]\   E AE; AE; &AE; 3AE; 
E8"E3-E8.E; 3E88E; ;
F2"F-'F2-F2c                     [        U5      n[        R                  R                  US9n[        R                  R	                  US9R                  5       nU(       d  [        SS0[        R                  S9$ UR                  R                  S5      nU(       d  [        SS0[        R                  S9$ [        R                  R                  5       R                  5       nU(       a  XVl        X6l        UR                  5         SnO[        R                  R!                  XSS9  S	n[        [        R"                  US
.[        R"                  S9$ ! [$         a-  n[        S['        U5      0[        R(                  S9s S nA$ S nAff = f)NrY   r    rZ   r   r   Content is requiredz$Privacy Policy updated successfully.r   
created_byz$Privacy Policy created successfully.r   )r   r   r.   r,   r/   r`   r   r   ra   r+   r-   r   rb   r   r   ro   r3   r8   r:   r5   r;   )	r<   r=   re   r%   rf   r   r   r|   r@   s	            rA   rB   AdminPrivacyPolicy.post.  s<   ]	G	$3
,,

c

"4ll!!S!)//18
%'78AZAZ[[ \\i(7
%'<=fFaFabb!!%%'--/6N
KKM4G   B4G
6#5#5PY_YkYk
ll	 ]
$c!f-f6[6[
\\]s+   A3E 6;E 2BE 
F"E>8F>FrD   Nrr   rD   rK   rA   r   r     s    ]B]rK   r   c                        \ rS rSrS rS rSrg)AdminTermsConditioniM  c                 j     [        U5      n[        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ [        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ [        R                  R                  5       R                  5       nU(       d  [        SS0[        R                  S9$ UR                  UR                  UR                  S.n[        [        R                   S	US
.[        R                   S9$ ! [         a-  n[        S[        U5      0[        R
                  S9s S nA$ S nAff = f! [         a-  n[        S[        U5      0[        R"                  S9s S nA$ S nAff = f)Nr    r   rY   rZ   ry   rk   zNo Terms and Conditions found.r   r   r)   )r   r:   r   r5   r   rS   r   r.   r/   r`   ra   r2   TermsAndConditionsr   r   rl   r8   r;   )r<   r=   re   r@   rf   rg   termsr?   s           rA   r,   AdminTermsCondition.getN  s   ]U
W
%C ll!!s!+1138
%'78AZAZ[[!!((h(7==?9
%'89&B[B[\\%%,,.4465
%'GHQWQjQjkk [[}}$$8
 %%+ 	! !'  U%s1v.v7S7STTU4 
 ]
$c!f-f6[6[
\\]r   c                 t    [        U5      n[        R                  R                  US9nUR                  R                  S5      nU(       d  [        SS0[        R                  S9$ [        R                  R                  5       R                  5       nU(       a  XEl        X5l        UR                  5         SnO[        R                  R                  XCS9  Sn[        [        R                  US	.[        R                  S9$ ! [          a-  n[        S[#        U5      0[        R$                  S9s S nA$ S nAff = f)
NrY   r   r    r   r   z(Terms & Conditions updated successfully.r   z(Terms & Conditions created successfully.r   )r   r   r.   r,   r+   r   r   r-   r   r/   r`   r   r   ro   r3   r8   r:   r5   r;   )r<   r=   re   r%   r   r   r|   r@   s           rA   rB   AdminTermsCondition.postp  s    ]	G	$3
,,

c

"4\\i(7
%'<=fFaFabb%%,,.4465M	JJL8G%%g%G8G
6#5#5PY_YkYk
ll	 ]
$c!f-f6[6[
\\]s%   A#D  &BD   
D7
"D2,D72D7rD   Nrr   rD   rK   rA   r   r   M  s     ]D]rK   r   c                       \ rS rSrS rSrg)AdminUserListi  c                     [        U5      n[        R                  R                  US9R	                  5       nU(       d  [        SS0[        R                  S9$ [        R                  R                  5       n/ nU HN  nUR                  UR                  UR                  UR                  UR                  S.nUR                  U5        MP     [        [        R                   SUR#                  5       US.[        R                   S9$ ! [$         a-  n[        S['        U5      0[        R(                  S9s S nA$ S nAff = f)Nrj   r    Unauthorized Accessr   r7   r\   r   r]   
created_atr   )r*   r    total_usersr+   )r   r2   r.   r/   r`   r   r   HTTP_403_FORBIDDENEndUserrb   r7   r\   r   r]   r   appendr8   countr:   r5   r;   )	r<   r=   re   adminusersall_Datarf   r+   r@   s	            rA   r,   AdminUserList.get  s   ]	G	$3$$S$17795
%'<=fF_F_``?? 58x
++MM^^))%%D OOD  %%+;;=	
 ! ! 
 ]
$c!f-f6[6[
\\]s%   AD B,D 
D="D82D=8D=rD   NrF   rG   rH   rI   r,   rJ   rD   rK   rA   r   r     s    ]rK   r   c                       \ rS rSrS rSrg)AdminUserDetailsi  c                     [        U5      n[        R                  R                  US9R	                  5       nU(       d  [        SS0[        R                  S9$ UR                  R                  S5      nU(       d  [        SS0[        R                  S9$ [        R                  R                  US9R	                  5       nU(       d  [        SS0[        R                  S9$ UR                  [        US	S
5      [        USS
5      [        USS
5      UR                  S.n[        [        R                   SUS.[        R                   S9$ ! ["         a-  n[        S[%        U5      0[        R&                  S9s S nA$ S nAff = f)Nrj   r    r   r   r(   zuser_id is requiredrY   User not foundr\   rw   r   r]   r   r   r)   )r   r2   r.   r/   r`   r   r   r   GETr,   r-   r   ra   r7   getattrr   r8   r:   r5   r;   )r<   r=   re   r   r(   rf   r+   r@   s           rA   r,   AdminUserDetails.get  s\   ]	G	$3$$S$17795
%'<=fF_F_``[[__Y'7
%'<=fFaFabboo$$$06688
%'78AZAZ[[ ++Hfb)Xw+Hnb9%%4 6#5#5H]fjktz  uG  uG  H  H	 ]
$c!f-f6[6[
\\]s2   AE ;E AE !A&E 
E?"E:4E?:E?rD   Nr   rD   rK   rA   r   r     s    ]rK   r   c                       \ rS rSrS rSrg)AdminChangePasswordi  c                     UR                   R                  SS5      R                  5       R                  5       nUR                   R                  S5      nUR                   R                  S5      nU(       d)  [	        [
        R                  SS.[
        R                  S9$ U(       a  U(       d)  [	        [
        R                  SS.[
        R                  S9$ X4:w  a)  [	        [
        R                  S	S.[
        R                  S9$ [        R                  R                  US
9R                  5       nU(       d)  [	        [
        R                  SS.[
        R                  S9$ [        U5      Ul        S Ul        UR                  5         [	        [
        R                   SS.[
        R                   S9$ ! ["         a<  n[	        [
        R$                  ['        U5      S.[
        R$                  S9s S nA$ S nAff = f)Nr   rw   new_passwordconfirm_passwordrx   r   r   z!Both password fields are requiredzPasswords do not matchr"   rk   zPassword changed successfully)r+   r,   r}   r~   r   r   r-   r2   r.   r/   r`   ra   r
   r   r   ro   r8   r:   r;   r5   )r<   r=   r   r   r   rg   r@   s          rA   rB   AdminChangePassword.post  s   +4<<GR(..06685,,"">2<ll&&'9:
//* ))+ +
 .//: ))+ +
 &/// ))+ +
 !!((u(5;;=9
--( '') )
 &l39#'9 >>
%%5 ! !
 
 4
88!f 224 44s8   BF0  6F0 -F0 AF0  AF0 0
G6:1G1+G61G6rD   NrE   rD   rK   rA   r   r     s    ,4rK   r   c                       \ rS rSrS rSrg)AdminCreateUseri  c                 ~    [        U5      n[        R                  R                  US9R	                  5       nU(       d  [        SS0[        R                  S9$ UR                  R                  S5      nUR                  R                  S5      nUR                  R                  S5      nU(       a  U(       d  [        SS0[        R                  S9$ [        R                  R                  US	9R                  5       (       a  [        SS
0[        R                  S9$ SR                  [        R                  " [         R"                  [         R$                  -   SS95      n['        U5      n[        R                  R)                  UUUUS9n	Sn
SU SU SU S3n[+        U
U[,        R.                  U/SS9  [        [        R0                  SU	R2                  S.[        R4                  S9$ ! [6         a-  n[        S[9        U5      0[        R:                  S9s S nA$ S nAf[6         a  n[=        U5         S nAg S nAff = f)Nrj   r    r   r   r\   r   r]   zName and email are requiredr"   r#   rw   
   )k)r\   r   r]   r   zYour Account Has Been CreatedzHello z^,

Your account has been created by the admin.
Login using the following credentials:

Email: z
Password: zI

Please change your password after logging in.

Best regards,
Admin TeamF)fail_silentlyz;User created successfully and password sent to user's email)r*   r    r(   )r   r2   r.   r/   r`   r   r   r   r+   r,   r-   r   r0   joinr   choicesstringascii_lettersdigitsr
   r3   r   r   DEFAULT_FROM_EMAILr8   r7   r9   r:   r5   r;   rm   )r<   r=   re   r   r\   r   r]   r   password_hashedr%   r   r|   r@   s                rA   rB   AdminCreateUser.post  s   =	G	$3$$S$17795
%'<=fF_F_``
,,

6
"4<<G$5,,"">2<
e%'DEfNiNijjoo5)0022%'LMV\VqVqrrggfnnV%9%9FMM%IRPQ8"8,?
//
 
 	
	 ! 4 -7TF  W 
  	!  
G &&T
 ""  
 ]
$c!f-f6[6[
\\	 88s?   AG( A8G( A	G( CG( (
H<2"HH<H<'H77H<rD   NrE   rD   rK   rA   r   r     s    >rK   r   c                       \ rS rSrS rSrg)AdminEditUseri4  c                     [        U5      n[        R                  R                  US9R	                  5       nU(       d  [        SS0[        R                  S9$ [        R                  R                  US9R	                  5       nU(       d  [        SS0[        R                  S9$ UR                  R                  S5      nUR                  R                  S5      nUR                  R                  S	5      nU(       aW  [        R                  R                  US
9R                  US9R                  5       (       a  [        SS0[        R                  S9$ U(       a  Xel        U(       a  Xul        U(       a  Xl        UR%                  5         [        [        R&                  SS.[        R&                  S9$ ! [(         a-  n	[        S[+        U	5      0[        R,                  S9s S n	A	$ S n	A	ff = f)Nrj   r    r   r   rY   r   r\   r   r]   r"   z$Email already in use by another userzUser updated successfullyr   )r   r2   r.   r/   r`   r   r   r   r   ra   r+   r,   excluder0   r-   r\   r   r]   ro   r8   r:   r5   r;   )
r<   r=   r(   re   r   r%   r\   r   r]   r@   s
             rA   putAdminEditUser.put5  s    ]	G	$3$$S$17795
%'<=fF_F_``
//
 
 G
 
,
2
2
44
%'78AZAZ[[
,,

6
"4<<G$5,,"">2<&&U&3;;w;GNNPP%'MNW]WrWrss
IJ$99;
&&9TU 
 
 ]
$c!f-f6[6[
\\]s3   AF4 AF4 %B.F4 AF4 4
G+>"G& G+&G+rD   N)rF   rG   rH   rI   r   rJ   rD   rK   rA   r   r   4  s    !]rK   r   c                       \ rS rSrS rSrg)AdminDeleteUseriY  c                 0    [        U5      n[        R                  R                  US9R	                  5       nU(       d  [        SS0[        R                  S9$ [        R                  R                  US9R	                  5       nU(       d  [        SS0[        R                  S9$ UR                  5         [        [        R                  SS.[        R                  S9$ ! [         a-  n[        S[        U5      0[        R                  S9s S nA$ S nAff = f)	Nrj   r    r   r   rY   r   zUser deleted successfullyr   )r   r2   r.   r/   r`   r   r   r   r   ra   deleter8   r:   r5   r;   )r<   r=   r(   re   r   r%   r@   s          rA   r   AdminDeleteUser.deleteZ  s    ]	G	$3$$S$17795
%'<=fF_F_``
//
 
 G
 
,
2
2
44
%'78AZAZ[[;;=
6#5#5Hcdmsmm  A  A	 ]
$c!f-f6[6[
\\]s+   AC AC %8C 
D("D
DDrD   N)rF   rG   rH   rI   r   rJ   rD   rK   rA   r   r   Y  s    ]rK   r   c                   0    \ rS rSrS rSS jrS rS rSrg)	AddAdminProjectModulesim  c                      [        U5      n[        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ / SQnU Vs/ sH&  oaR                  R                  U5      (       a  M$  UPM(     nnU(       a,  [        SSSR                  U5       30[        R                  S9$ [        R                  R!                  UR                  R                  S5      UR                  R                  S	5      UR                  R                  S
5      UR                  R                  S5      UR                  R                  S5      UR                  R                  S5      UR                  R                  S5      UR                  R                  S5      UR                  R                  S5      UR                  R                  S5      UR                  R                  S5      UR                  R                  S5      UR                  R                  S5      UR                  R                  S5      UR                  R                  S5      UR                  R                  S5      UR                  R                  S5      S9n[        [        R"                  SS.[        R$                  S9$ ! [         a-  n[        S[        U5      0[        R
                  S9s S nA$ S nAff = fs  snf ! [         a9  n['        SU5        [        S[        U5      0[        R(                  S9s S nA$ S nAff = f)Nr    r   rj   r   deliverabes_listformat_specsresolution_aspect_rationotes_spec_reqinitial_bid_budgetdeposite_percentagedeposite_valuepayment_structureproducerexecutive_producer_supervisor
start_dateend_datekey_milestonesproject_titleclient_nameproject_typeclient_initialszMissing required fields: z, r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   z#Project module created successfullyr   Error:)r   r:   r   r5   r   rS   r2   r.   r/   r`   r   r+   r,   r   r-   ProjectModuler3   r8   r9   rm   r;   )	r<   r=   re   r@   r   required_fieldsfieldmissing_fieldsproject_datas	            rA   rB   AddAdminProjectModules.postn  s   2]U
W
%C $$S$17795
%'<=fF_F_``? )8Wu||?O?OPU?VU>W3DIIn4M3NOP'' 
  ''..\\%%&89!!.1#LL,,-FG<<##$45||''(<=(()>?<<##$45ll&&':;\\j)"),,"2"23R"S||-\\j)<<##$45,,""?3  /!!.1LL$$%67# / <( 6#5#5Hmnw}  xO  xO  P  PW  U%s1v.v7S7STTU  X: 
 ]1
$c!f-f6[6[
\\]sf   K AL L ""K<K<4L G>L 
K9"K4.K9/L 4K99L 
M.L?9M?MNc                 
     [        U5      n[        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ U(       Ga  [        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ 0 SUR                  _S	UR                  _S
UR                  _SUR                   _SUR"                  _SUR$                  _SUR&                  _SUR(                  _SUR*                  _SUR,                  _SUR.                  _SUR0                  _SUR2                  _SUR4                  _SUR6                  _SUR8                  _SUR:                  _UR<                  UR>                  [@        R                  R                  XVS9RC                  5       URD                  (       a  URD                  OS[G        US5      (       a  URH                  OSS.En[        [        RJ                  SUS.[        RJ                  S9$ [        R                  RM                  5       RO                  S5      n [Q        URR                  RU                  SS 5      5      n	[Q        URR                  RU                  S!S"5      5      n
[Y        X5      n UR[                  U	5      nURb                   Vs/ sGHb  n0 SUR                  _S	UR                  _S
UR                  _SUR                   _SUR"                  _SUR$                  _SUR&                  _SUR(                  _SUR*                  _SUR,                  _SUR.                  _SUR0                  _SUR2                  _SUR4                  _SUR6                  _SUR8                  _SUR:                  _UR<                  UR>                  [@        R                  R                  XVS9RC                  5       URD                  (       a  URD                  OS[G        US5      (       a  URH                  OSS.EPGMe     nn[        UR^                  UR`                  URd                  [Q        U
5      US#.[        RJ                  S9$ ! [         a-  n[        S[        U5      0[        R
                  S9s SnA$ SnAff = f! [V         a    S n	S"n
 GN&f = f! [\         a5    [        UR^                  UR`                  U	U
/ S#.[        RJ                  S9s $ f = fs  snf ! [         a9  n[g        S$U5        [        S[        U5      0[        Rh                  S9s SnA$ SnAff = f)%z;Get single project detail or paginated list of all projectsr    r   Nrj   r   rY   Project not foundr7   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   projectr   )r   is_archivedis_favoriteproject_statusr   r_   r)   z-idpager   	page_sizer   )total_projectstotal_pagescurrent_pager  projectsr   )5r   r:   r   r5   r   rS   r2   r.   r/   r`   r   r   ra   r7   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   	Favoritesr0   r   hasattrr   r8   rb   order_byintr   r,   
ValueErrorr   r   r   r   	num_pagesobject_listnumberrm   r;   )r<   r=   pkre   r@   r   r   r   r  page_numberr  	paginatorpage_objproject_lists                 rA   r,   AddAdminProjectModules.get  s   i]U
W
%C $$S$17795
%'<=fF_F_``##**b*1779G&(;<VE^E^__	7::g++ G'' //	
 W)) 11 W))  ? ? w-- 755 G77 w-- '33 !! %g&K&K  7%%!" !!#$ --&&%%,,5,JQQS181G1Gw--T)0,)G)G7%%T/L2 F$6$6I_htu  E  Q  Q  R  R##'')22598gkkoofa01KGKKOOK45I
 -9	"~~k*HJ ''54 (3	7::g++ G'' //	
 W)) 11 W))  ? ? w-- 755 G77 w-- '33 !! %g&K&K  7%%!" !!#$ --&&%%,,5,JQQS181G1Gw--T)0,)G)G7%%T/2 (5  : oo&&OOY ! !y  U%s1v.v7S7STTUZ  KI  " ''    " ""J 
 ]1
$c!f-f6[6[
\\]s   R	 AT AT .FT 6-T $A
S .T :S T E)TAT 	
S "R;5S 6T ;S  T ST ST <TT TT 
U").UU"U"c                 D     [        U5      n[        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ [        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ / SQnU H9  nXR                  ;   d  M  [        XhUR                  R                  U5      5        M;     UR!                  5         [        [        R"                  S	S
.[        R"                  S9$ ! [         a-  n[        S[        U5      0[        R
                  S9s SnA$ SnAff = f! [         a9  n[%        SU5        [        S[        U5      0[        R&                  S9s SnA$ SnAff = f)z!Update an existing project moduler    r   Nrj   r   rY   r   r   z#Project module updated successfullyr   r   )r   r:   r   r5   r   rS   r2   r.   r/   r`   r   r   ra   r+   setattrr,   ro   r8   rm   r;   )	r<   r=   r  re   r@   r   r   updatable_fieldsr   s	            rA   r   AddAdminProjectModules.put  ss   ]U
W
%C $$S$17795
%'<=fF_F_``""))R)06687
%':;FD]D]^^ !uWW\\--e45 ! <<>
6#5#5Hmnw}  xJ  xJ  K  K/  U%s1v.v7S7STTU2 
 ]1
$c!f-f6[6[
\\]s[   D" AE AE &E  A!E "
E,"EEE EE 
F&.FFFc                      [        U5      n[        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ [        R                  R                  US9R                  5       nU(       d)  [        [        R                  SS.[        R                  S9$ UR                  5         [        [        R                  S	S.[        R                  S9$ ! [         a<  n[        [        R                  [        U5      S.[        R                  S9s SnA$ SnAff = f! [         aH  n[        S
U5        [        [        R                  [        U5      S.[        R                   S9s SnA$ SnAff = f)zDelete a project moduler   r   Nrj   r    r   rY   r   z#Project module deleted successfullyr   )r   r:   r   r   rS   r5   r2   r.   r/   r`   r   r   ra   r   r8   rm   r;   )r<   r=   r  re   r@   r   r   s          rA   r   AddAdminProjectModules.delete7  sd   A
W
%C $$S$17795
%'<=fF_F_``""))R)06687
F$=$=Pcdms  nG  nG  H  H
>>
6#5#5Hmnw}  xJ  xJ  K  K  AF$@$@SVWXSYZcicc  A  AA 
 1
6#5#5AOX^X}X}
~~sT   C. AD7 AD7 58D7 .
D481D/)D4*D7 /D44D7 7
F	=F>F	F	rD   N)	rF   rG   rH   rI   rB   r,   r   r   rJ   rD   rK   rA   r   r   m  s    3]nk]^ ]FrK   r   c                       \ rS rSrS rSrg)getAdminNotificationsiM  c                 \     [        U5      n[        R                  R                  US9R                  5       nU(       d)  [        [        R                  SS.[        R                  S9$ [        R                  R                  UR                  S9n/ nU HZ  nUR                  UR                  UR                  UR                  [!        UR"                  5      S-   S.nUR%                  U5        M\     [        [        R&                  SUS.[        R&                  S9$ ! [         a<  n[        [        R                  [        U5      S.[        R                  S9s S nA$ S nAff = f! [         a<  n[        [        R(                  [        U5      S.[        R(                  S9s S nA$ S nAff = f)	Nr   r   rY   rk   z ago)r7   r|   is_readrQ   r   r_   r)   )r   r:   r   r   rS   r5   r2   r.   r/   r`   ra   AdminNotificationsr7   r|   r  rQ   r   r   r   r8   r;   )	r<   r=   re   r@   rg   
notify_objr   notifyr?   s	            rA   r,   getAdminNotifications.getN  s   SA
W
%C !!((C(06689
F$=$=Pabkq  lE  lE  F  F"**11Y\\1B:8v99[[V../&8H OOH  6#5#5I_iqr  {A  {M  {M  N  N'  AF$@$@SVWXSYZcicc  A  AA( 
 S
6#H#H\_`a\bclr  mR  mR  S  SSsN   D AE% )B2E% 
E"&1EE"E% E""E% %
F+/1F& F+&F+rD   Nr   rD   rK   rA   r  r  M  s    SrK   r  c                       \ rS rSrS rSrg)deleteAdminNotificationsij  c                      [        U5      n[        R                  R                  US9R                  5       nU(       d)  [        [        R                  SS.[        R                  S9$ UR                  R                  S5      nU(       d)  [        [        R                  SS.[        R                  S9$ [        R                  R                  US9R                  5       nU(       a;  UR                  5         [        [        R                  [        R                  SS.5      $ [        [        R                  S	S.[        R                  S9$ ! [         a<  n[        [        R                  [        U5      S.[        R                  S9s S nA$ S nAff = f! [         a<  n[        [        R                   [        U5      S.[        R                   S9s S nA$ S nAff = f)
Nr   r   rY   rk   notification_idznotification_id is requiredzDeleted Successfully)r*   r*   r    zNotification not found)r   r:   r   r   rS   r5   r2   r.   r/   r`   ra   r+   r,   r  r   r8   r;   )r<   r=   re   r@   rg   r&  not_objs          rA   rB   deleteAdminNotifications.postk  s   SA
W
%C !!((C(06689
F$=$=Pabkq  lE  lE  F  F\\%%&78?
F$=$=Pmnw}  xQ  xQ  R  R''../.BHHJ7NNF$6$6fFXFX  mC  D  E  EF$=$=Phirx  sL  sL  M  M!  AF$@$@SVWXSYZcicc  A  AA$ 
 S
6#H#H\_`a\bclr  mR  mR  S  SSs[   E
 AF )A
F 4A,F !(F 

F1FFF FF 
G1GGGrD   NrE   rD   rK   rA   r$  r$  j  s    SrK   r$  c                       \ rS rSrS rSrg)ArchiveProjectAdmini  c                 V     [        U5      n[        R                  R                  US9R                  5       nU(       d)  [        [        R                  SS.[        R                  S9$ UR                  R                  S5      nU(       d)  [        [        R                  SS.[        R                  S9$  [        R                  R                  US9nSUl        UR!                  5         [        [        R"                  SS.[        R"                  S9$ ! [         a<  n[        [        R                  [        U5      S.[        R                  S9s S nA$ S nAff = f! [        R$                   a,    [        [        R                  S	S.[        R                  S9s $ [         a<  n[        [        R                  [        U5      S.[        R&                  S9s S nA$ S nAff = f! [         a<  n[        [        R&                  [        U5      S.[        R&                  S9s S nA$ S nAff = f)
Nr   r   rY   rk   
project_idproject_id is requiredTzProject archived successfullyr   )r   r:   r   r   rS   r5   r2   r.   r/   r`   ra   r+   r,   r-   r   r   ro   r8   rR   r;   r<   r=   re   r@   rg   r,  r   s          rA   rB   ArchiveProjectAdmin.post  s   SA
W
%C !!((C(06689
F$=$=Pabkq  lE  lE  F  F  .:
F$?$?Sklu{  vQ  vQ  R  RH##'':'6GGLLNF$6$6Jijsy  tF  tF  G  G  AF$@$@SVWXSYZcicc  A  AA 
$
$ IF$=$=Qdent  oH  oH  I  I
 HF$=$=QTUVQWXag  bG  bG  H  HH 
 S
6#H#H\_`a\bclr  mR  mR  S  SSs   D AG" )A
G" 5AE 
E1EEG" EG" =GG" 	G#1GGG" GG" "
H(,1H#H(#H(rD   NrE   rD   rK   rA   r*  r*    s    SrK   r*  c                        \ rS rSrS rS rSrg)favoritei  c                      [        U5      n[        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ UR                  R                  S5      nU(       d  [        SS0[        R                  S9$ [        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ [        R                  R                  XFS9R!                  5       (       a  [        SS	0[        R                  S9$ [        R                  R#                  XFS9  [        [        R$                  S
S.[        R&                  S9$ ! [         a-  n[        S[        U5      0[        R
                  S9s S nA$ S nAff = f! [         a-  n[        S[        U5      0[        R(                  S9s S nA$ S nAff = f)Nr    r   rY   rk   r,  r-  r   r   zProject already in favoriteszProject added to favoritesr   )r   r:   r   r5   r   rS   r2   r.   r/   r`   ra   r+   r,   r-   r   r  r0   r3   r8   r9   r;   r.  s          rA   rB   favorite.post  s   ]U
W
%C !!((C(06689
%'89&B[B[\\  .:
%'?@IdIdee""))Z)8>>@7
%':;FD]D]^^ Y@GGII%'EFvOjOjkk)=
6#5#5Iefou  pG  pG  H  H)  U%s1v.v7S7STTU, 
 ]
$c!f-f6[6[
\\]sb   E2 AF, ;F, AF, "A	F, ,AF, 2
F)<"F$F)F, $F))F, ,
G#6"GG#G#c                 .     [        U5      n[        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ [        R                  R                  US9R                  S5      n/ nU H{  nUR                  nU(       d  M  UR                  UR                  UR                  UR                   UR"                  UR$                  UR&                  R)                  S5      S.5        M}     [        S	U0[        R*                  S9$ ! [         a-  n[        S[        U5      0[        R
                  S9s S nA$ S nAff = f! [         a-  n[        S[        U5      0[        R,                  S9s S nA$ S nAff = f)
Nr    r   rY   rk   r   -created_at%Y-%m-%d %H:%M:%S)favorite_idr,  r   r   r   r   	favorites)r   r:   r   r5   r   rS   r2   r.   r/   r`   ra   r  r  r   r   r7   r   r   r   r   strftimer8   r;   	r<   r=   re   r@   rg   
favoritessr+   favr   s	            rA   r,   favorite.get  sb   ]U
W
%C !!((C(06689
%'89&B[B[\\!!((y(9BB=Q:
4skkGw	[[VVJJ,,((**NN++,?@   K&v/A/A
BB-  U%s1v.v7S7STTU0 
 ]
$c!f-f6[6[
\\]sU   D# AE AE "B E #
E-"EEE EE 
F'"F	FFrD   N)rF   rG   rH   rI   rB   r,   rJ   rD   rK   rA   r1  r1    s    ]:]rK   r1  c                       \ rS rSrS rSrg)RemoveFavoriteProjecti  c                      [        U5      n[        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ UR                  R                  S5      nU(       d  [        SS0[        R                  S9$ [        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ [        R                  R                  XFS9R                  5       nU(       a9  UR!                  5         [        [        R"                  S	S
.[        R"                  S9$ [        SS0[        R                  S9$ ! [         a-  n[        S[        U5      0[        R
                  S9s S nA$ S nAff = f! [         a-  n[        S[        U5      0[        R$                  S9s S nA$ S nAff = f)Nr    r   rY   rk   r,  r-  r   r   zProject removed from favoritesr   r|   zProject is not in favorites)r   r:   r   r5   r   rS   r2   r.   r/   r`   ra   r+   r,   r-   r   r  r   r8   r;   )r<   r=   re   r@   rg   r,  r   r1  s           rA   rB   RemoveFavoriteProject.post  s   ]U
W
%C !!((C(06689
%'89&B[B[\\  .:
%'?@IdIdee""))Z)8>>@7
%':;FD]D]^^&&Y&HNNP8OOF$6$6Jjktz  uG  uG  H  HY =>vGbGbcc+  U%s1v.v7S7STTU. 
 ]
$c!f-f6[6[
\\]sa   E' AF! ;F! AF! "A*F! F! '
F1"FFF! FF! !
G+"GGGrD   NrE   rD   rK   rA   r@  r@    s    ]rK   r@  c                       \ rS rSrS rSrg)favoriteListingi  c                 \     [        U5      n[        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ [        R                  R                  US9R                  S5      R                  S5      n/ nU GHs  nUR                  nUR                  0 SUR                   _S	UR                   _S
UR"                  _SUR$                  _SUR&                  _SUR(                  _S
UR"                  _SUR$                  _SUR&                  _SUR(                  _SUR*                  _SUR,                  _SUR.                  _SUR0                  _SUR2                  _SUR4                  _SUR6                  _UR8                  UR:                  UR<                  UR>                  UR@                  URB                  URD                  URF                  URH                  RK                  S5      S.	E5        GMv     [        [        RL                  US.[        RL                  S9$ ! [         a-  n[        S[        U5      0[        R
                  S9s S nA$ S nAff = f! [         a-  n[        S[        U5      0[        RN                  S9s S nA$ S nAff = f)Nr    r   rY   rk   r5  r   r6  r8  r,  r   r   r   r   r   r   r   r   r   r   r   r7  )	r   r   r   r   r   r   r   r   r   )r*   r9  )(r   r:   r   r5   r   rS   r2   r.   r/   r`   ra   r  select_relatedr  r   r   r7   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r:  r8   r;   r;  s	            rA   r,   favoriteListing.get  s   /]U
W
%C !!((C(06689
%'89&B[B[\\!!((y(9HHS\\]jk:
4skkGKK CFF7:: g++ G''	
 W)) g,, g++ G'' W)) w-- 11 W))  ? ? w-- 755  G77!" w--#$ "33!!&-&K&K%%!!--//''>>**+>?5  > 6#5#54HQWQcQc
ddS  U%s1v.v7S7STTUV 
 ]
$c!f-f6[6[
\\]sN   H: AI4 GI4 :
I1"I,&I1'I4 ,I11I4 4
J+>"J& J+&J+rD   Nr   rD   rK   rA   rD  rD    s    0]rK   rD  c                       \ rS rSrSS jrSrg)UpdateAdminprojectStatusi5  Nc                 "     [        U5      n[        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ U(       d  [        SS0[        R                  S9$ [        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ UR                  R                  S5      nU(       d  [        SS	0[        R                  S9$ Xvl        UR!                  5         [        S
U S3UR"                  UR                  UR$                  (       a  UR$                  R"                  OS UR$                  (       a  UR$                  R                  OS S.[        R&                  S9$ ! [         a-  n[        S[        U5      0[        R
                  S9s S nA$ S nAff = f! [         a-  n[        S[        U5      0[        R(                  S9s S nA$ S nAff = f)Nr    r   rY   rk   r-  r   r   r|   zproject_status is requiredzProject status updated to '')r|   r,  r   r(   user_status)r   r:   r   r5   r   rS   r2   r.   r/   r`   ra   r-   r   r+   r,   r   ro   r7   r%   r8   r;   )r<   r=   r,  re   r@   rg   r   new_project_statuss           rA   rB   UpdateAdminprojectStatus.post7  s   "]U
W
%C !!((C(06689
%'89&B[B[\\
%'?@IdIdee""))Z)8>>@7
%':;FD]D]^^(()9:
Y <=fFaFabb /
<<>
,-?,@B**,,"),,w||D*1,,7<<&&D ! !-  U%s1v.v7S7STTU< 
 ]
$c!f-f6[6[
\\]sa   F AG  G ;AG ;G BG 
G'"G	G
G GG 
H!"H	H	HrD   r  rE   rD   rK   rA   rI  rI  5  s    #]rK   rI  c                       \ rS rSrS rSrg)	dashboardi^  c           	           [        U5      n[        R                  R                  US9R                  5       nU(       d  [        SS0[        R                  S9$ [        R                  R                  SS9R                  5       [        R                  R                  SS9R                  5       [        R                  R                  SS9R                  5       [        R                  R                  S	S9R                  5       [        R                  R                  S
S9R                  5       [        R                  R                  SS9R                  5       S.n[        UR                  5       5      US'   [        R                  R                  S5      R                  5       R                  5       US'   [        R                  R!                  [#        S5      S9R                  S5      R!                  [%        S5      S9R'                  S5       Vs0 sH  nUS   R)                  S5      US   _M     nnXuS'   [        SUS.[        R*                  S9$ ! [         a-  n[        S[        U5      0[        R
                  S9s S nA$ S nAff = fs  snf ! [         a-  n[        S[        U5      0[        R,                  S9s S nA$ S nAff = f)Nr    r   rY   rk   Pending)r   InquiryBidApproved	DeliveredArchived)rR  rS  rT  rU  rV  rW  Total_Projectsr(   Total_Usersr   )monthrZ  r7   )totalz%b %Yr[  Projects_Per_Monthsuccess)r    r+   )r   r:   r   r5   r   rS   r2   r.   r/   r`   ra   r   r   sumvaluesdistinctannotater   r   r  r:  r8   r;   )r<   r=   re   r@   rg   status_countsentryprojects_per_months           rA   r,   dashboard.get_  s}   ']U
W
%C !!((C(06689
%'89&B[B[\\ ##**)*DJJL$$++9+EKKM  ''u'=CCE%%,,J,GMMO&&--[-IOOQ%%,,J,GMMO= &))=)=)?%@=!""/"7"7">">y"I"R"R"T"Z"Z"\= &&hZ-h.fWohU4[h!hw	 
'NG$eGn4   *<%&  	! !;  U%s1v.v7S7STTU"$ 
 ]
$c!f-f6[6[
\\]sZ   I AJ F5J !J0 J 
J"J=J>J JJ 
K"K<KKrD   Nr   rD   rK   rA   rP  rP  ^  s    (]rK   rP  )@django.shortcutsr   django.utilsr   rest_framework.responser   rest_framework.viewsr   rest_frameworkr   admin_panel.modelsdjango.contrib.auth.hashersr
   r   rest_framework_simplejwt.tokensr   admin_panel.authenticationr   r   django.confr   django.template.loaderr   django.corer   django.contrib.auth.modelsr   panel_api.modelsr   django.core.mailr   django.core.paginatorr   r   r   r   modelsdjango.db.modelsr   django.db.models.functionsr   django.utils.timesincer   rM   rV   rt   r   r   r   r   r   r   r   r   r   r   r  r$  r*  r1  r@  rD  rI  rP  rD   rK   rA   <module>rz     s   # " , ( !   E 8 9    3  +    & 5 H H .  " 1 ,&wG &wR%p %pRG]7 G]T%b' %bN)47 )4X=] =]B9]' 9]v]G ]<]w ]8-4' -4`?g ?D"]G "]J]g ](]W ]@SG S:Sw S8S' S:;]w ;]|]G ]@2]g 2]h%]w %]R)] )]rK   