=Og@ ddlZddlZddlZddlmZddlmZddlZddlZ ddl m Z ddl Z ddl mZ ddlZn #e$rdZYnwxYwdZdejddzZd Zd Zd Zd Zd ZdZdZd ZdZdZd ZdZdZ dZ!Gdde"Z#Gdde#Z$Gdde#Z%Gdde#Z&e'xZ(Z)edddZ*dZ+e+drd Z,ne+d!rd"Z,nd#Z,[*[+d$Z-Gd%d&Z.d'Z/d(Z0Gd)d*Z1d+Z2e.e1fZ3Gd,d-Z4Gd.d/Z5Gd0d1Z6Gd2d3Z7Gd4d5Z8Gd6d7Z9dxZ:xZ;ZdMd;Z?d<Z@dOd>ZAGd?d@erejBneCZDGdAdBZEGdCdDZFGdEdFeFZGGdGdHZHeHZIeJdIkreHdJZK eLeKjMNn#e#$rZOeLdKeOYdZO[OndZO[OwwxYwe9eKZPePQePRddLePSdd ePD] ZTeLeTdS#e#$rZOeLdKeOYdZO[OdSdZO[OwwxYwdS)PN)datetime)Decimal)expat)BytesIOc|dd}|dd}|ddS)N&z&z>)replace)ss 4/opt/alt/python311/lib64/python3.11/xmlrpc/client.pyescapers< #wA #vA 99S& " ""z%d.%diiiDii ipiԁiCiBiiiceZdZ ejZdS)ErrorN)__name__ __module__ __qualname__object__str__rr rrs'nGGGrrceZdZ dZdZdS) ProtocolErrorcrt|||_||_||_||_dSN)r__init__urlerrcodeerrmsgheaders)selfrrr r!s r rzProtocolError.__init__s4 t   rc Rd|jjd|jd|jd|jd S)Nr  for :  r ) __class__rrrr r"s r __repr__zProtocolError.__repr__s7^ $ $ $dhhh dkkk K rNrrrrr)rrr rrs5+ rrceZdZ dS) ResponseErrorN)rrrrrr r,r,s.Drr,ceZdZ dZdZdS)Faultc Vt|||_||_dSr)rr faultCode faultString)r"r0r1extras r rzFault.__init__s) t"&rcBd|jjd|jd|jdS)Nr r&r%r )r'rr0r1r(s r r)zFault.__repr__s2 $ 7 7 7 $0@0@0@B BrNr*rrr r.r.s:-'''BBBBBrr.cb t|dkS#t$rYdSwxYw)N0001F)_day0strftime ValueError)fmts r _tryr; s@~~c""f,, uus  ..z%Yc,|dSN%Y%m%dT%H:%M:%Sr8values r _iso8601_formatrBs~~/000rz%4Yc,|dS)Nz%4Y%m%dT%H:%M:%Sr?r@s r rBrBs~~0111rcR|ddS)Nr>)r8zfillr@s r rBrBs#~~/0066r:::rct|trt|St|ttjfs-|dkrt j}t j|}d|ddzS)Nrz%04d%02d%02dT%02d:%02d:%02d) isinstancerrBtupletime struct_time localtimer@s r _strftimerNsr%""&u%%% eeT%56 7 7& A::IKKEu%% (5!9 44rcZeZdZ ddZdZdZdZdZdZdZ d Z d Z d Z d Z d ZdS)DateTimercjt|tr ||_dSt||_dSr)rIstrrArN)r"rAs r rzDateTime.__init__.s2 eS ! ! *DJJJ"5))DJJJrclt|tr|j}|j}nt|tr|j}t |}nat|t r |j}|}nBt |dr)|}|}n |}t}||fS)N timetuple) rIrPrArrBrRhasattrrTNotImplementedr"otherr os r make_comparablezDateTime.make_comparable4s eX & &  A AA x ( (  A&&AA s # #  AAA UK ( (   A!!AAAA!t rc^||\}}|turtS||kSrrZrVrWs r __lt__zDateTime.__lt__F3##E**1   ! !1u rc^||\}}|turtS||kSrr\rWs r __le__zDateTime.__le__L3##E**1   ! !Av rc^||\}}|turtS||kSrr\rWs r __gt__zDateTime.__gt__Rr^rc^||\}}|turtS||kSrr\rWs r __ge__zDateTime.__ge__Xrarc^||\}}|turtS||kSrr\rWs r __eq__zDateTime.__eq__^rarc6tj|jdSr=)rKstrptimerAr(s r rTzDateTime.timetupleds}TZ):;;;rc|jSrr@r(s r rzDateTime.__str__ls zrcJd|jj|jt|fzS)Nz<%s %r at %#x>)r'rrAidr(s r r)zDateTime.__repr__os!4>#:DJ4"QQQrcRt||_dSr)rRstriprAr"datas r decodezDateTime.decodersYY__&& rc|d||j|ddSNzz )writerA)r"outs r encodezDateTime.encodeusB -... $* 122222rN)r)rrrrrZr]r`rcrergrTrr)rqrvrrr rPrP(s **** $     <<<RRR'''33333rrPcLt}|||Sr)rPrqrprAs r _datetimeryzs" JJE LL Lrc,tj|dSr=)rri)rps r _datetime_typer{s  T#4 5 55rc0eZdZ ddZdZdZdZdZdS)BinaryNc|d}nGt|ttfstd|jjzt|}||_dS)Nrz#expected bytes or bytearray, not %s)rIbytes bytearray TypeErrorr'rrpros r rzBinary.__init__s] <DDdUI$677 9 E $ 7!8999;;D rc,t|jdS)Nzlatin-1)rRrpr(s r rzBinary.__str__s49i(((rcPt|tr|j}|j|kSr)rIr}rp)r"rXs r rgz Binary.__eq__s( eV $ $ JEyE!!rc8tj||_dSr)base64 decodebytesrpros r rqz Binary.decodes&t,, rc|dtj|j}||d|ddSNz asciiz )rtr encodebytesrprq)r"ruencodeds r rvz Binary.encodes^ %&&&$TY// '..))*** '(((((rr)rrrrrrgrqrvrrr r}r}sg")))""" ---)))))rr}cLt}|||Sr)r}rqrxs r _binaryrs" HHE LL Lrc eZdZdZdZdZdS) ExpatParserctjddx|_}||_|j|_|j|_|j|_ d}| |ddSr) r ParserCreate_parser_targetstartStartElementHandlerendEndElementHandlerrpCharacterDataHandlerxml)r"targetparserencodings r rzExpatParser.__init__s_ % 24 > >> v %+\"#): &,k# 8T"""""rc<|j|ddSNF)rParseros r feedzExpatParser.feeds  4'''''rcl |j}|`|`|dddS#t$rYdSwxYw)NrT)rrrAttributeError)r"rs r closezExpatParser.closesW $\F dl LLd # # # # #     DD s % 33N)rrrrrrrrr rrsA###((($$$$$rrceZdZ ddZiZdZdZdZeeed<dZ e ee <dZ e ee <e Z d Zeee<efd Zeee<d Zeee<eee<d Zeee<eee<efd Zeee<dZeee<dZeee<eee<eed<dS) MarshallerNFc>i|_d|_||_||_dSr)memorpr allow_none)r"rrs r rzMarshaller.__init__s"    $rcTg}|j}|j}t|tr0|d||j|jd||dn=|d|D]$}|d||||d%|dd|}|S) Nz )r0r1z z z z z )append_Marshaller__dumprIr.r0r1join)r"valuesrurtdumpvresults r dumpszMarshaller.dumpss { fe $ $ ! E+    Dv/!'!355    E,     E,    $ $k"""Ql#### E-  rc |jt|}n#t$rt|dst dt|zt|jD]<}||jvrt dt|z=|jd}YnwxYw||||dS)N__dict__zcannot marshal %s objects_arbitrary_instance)dispatchtypeKeyErrorrUr__mro__keys)r"rArtftype_s r __dumpzMarshaller.__dumps 5 d5kk*AA 5 5 55*-- K ;d5kk IJJJe, O ODM..0000#$?$u++$MNNN1 34AAA 5 $usBB76B7cH|jstd|ddS)Nz0cannot marshal None unless allow_none is enabledz)rrr"rArts r dump_nilzMarshaller.dump_nils3 PNOO O %&&&&&rcP|d||rdpd|ddS)Nz10z rrs r dump_boolzMarshaller.dump_bool sC  !!! em"s### $%%%%%rc|tks |tkrtd|d|tt ||ddS)Nzint exceeds XML-RPC limitsz z )MAXINTMININT OverflowErrorrRintrs r dump_longzMarshaller.dump_long&se 6>>UV^^ <== = n c#e**oo  !!!!!rcb|d|t||ddS)Nzz )reprrs r dump_doublezMarshaller.dump_double1s@     d5kk #$$$$$rcZ|d||||ddS)Nzz r)r"rArtrs r dump_unicodezMarshaller.dump_unicode7sB     ffUmm #$$$$$rc|dtj|}||d|ddSr)rrrq)r"rArtrs r dump_byteszMarshaller.dump_bytes=sV !"""$U++ gnnW%%&&& #$$$$$rct|}||jvrtdd|j|<|j}|d|D]}||||d|j|=dS)Nz"cannot marshal recursive sequencesz z )rlrrr)r"rArtirrs r dump_arrayzMarshaller.dump_arrayEs uII  >>@AA A ! { &'''  A DENNNN )*** IaLLLrct|}||jvrtdd|j|<|j}|d|D]b\}}|dt |t std|d||z||||dc|d|j|=dS)Nz%cannot marshal recursive dictionariesz z zdictionary key must be stringz%s z z )rlrrritemsrIrR)r"rArtrrrkrs r dump_structzMarshaller.dump_structSs uII  >>CDD D ! { !"""KKMM ! !DAq E,   a%% A ?@@@ E%q 1 2 2 2 DENNN E-  #$$$ IaLLLrcb|d|t||ddSrs)rNrs r dump_datetimezMarshaller.dump_datetimeesB )*** i -.....rc|jtvr ||_|||`dS||j|dSr)r'WRAPPERSrtrvrrrs r dump_instancezMarshaller.dump_instanceksQ ?h & &DJ LL       U^U 3 3 3 3 3rrr) rrrrrrrrrrboolrrdump_intrfloatrrrRrrrrrJlistrdictrrrrPr}rrr rrs%%%% H6$'''$HTT$ZZ&&&HTN""" HSMH%%%"HUO06%%%%!HSM%%% !HUO$HY   !HUOHTN/5 !HTN///'HX444'HX$HV'4H "###rrcleZdZ d.dZdZdZdZdZdZdZ d Z iZ d Z e e d <d Z e e d <dZee d<ee d<ee d<ee d<ee d<ee d<dZee d<ee d<dZee d<dZee d<ee d<dZee d<dZee d <d!Zee d"<d#Zee d$<d%Zee d&<d'Zee d(<d)Zee d*<d+Zee d,<d-S)/ UnmarshallerFcd|_g|_g|_g|_d|_d|_d|_|jj|_|p||_||_ dS)NFutf-8) _type_stack_marks_data_value _methodname _encodingr _use_datetime _use_bytes)r" use_datetimeuse_builtin_typess r rzUnmarshaller.__init__sX      k( .>,+rc|j|jrt|jdkrtdi|jdt |jS)Nfaultrr)rrr,r.rrJr(s r rzUnmarshaller.closesR :  // ! : ))$+a.)) )T[!!!rc|jSr)rr(s r getmethodnamezUnmarshaller.getmethodnames rc||_dSr)r)r"r standalones r rzUnmarshaller.xmls !rcd|vr|dd}|dks|dkr,|jt|jg|_|jr||jvrtd|z|dk|_dS)N:arraystructzunknown tag %rrA) splitrrlenrrrrr,)r"tagattrss r rzUnmarshaller.starts #::))C..$C '>>SH__ K  s4;// 0 0 0 ; 83dm33 03 677 7g~ rc:|j|dSr)rr)r"texts r rpzUnmarshaller.datas $rc  |j|}nQ#t$rDd|vrYdS |j|dd}n#t$rYYdSwxYwYnwxYw||d|jS)Nrrr)rrrrr)r"rrs r rzUnmarshaller.ends  c"AA   #~~ M#))C.."45      qrwwtz**+++2 A&A A AAAAAc |j|}nQ#t$rDd|vrYdS |j|dd}n#t$rYYdSwxYwYnwxYw|||S)Nrr)rrr)r"rrprs r end_dispatchzUnmarshaller.end_dispatchs  c"AA   #~~ M#))C.."45      qt}}rc>|dd|_dSNr)rrros r end_nilzUnmarshaller.end_nils D rnilc|dkr|dn+|dkr|dntdd|_dS)NrFrTzbad boolean valuer)rrrros r end_booleanzUnmarshaller.end_booleansX 3;; KK     S[[ KK    /00 0 rbooleancX|t|d|_dSr)rrrros r end_intzUnmarshaller.end_ints% CII ri1i2i4i8r bigintegercX|t|d|_dSr)rrrros r end_doublezUnmarshaller.end_doubles% E$KK    rdoublercX|t|d|_dSr)rrrros r end_bigdecimalzUnmarshaller.end_bigdecimals% GDMM""" r bigdecimalc|jr||j}||d|_dSr)rrqrrros r end_stringzUnmarshaller.end_strings< > /;;t~..D D rstringnamecz|j}|j|dg|j|d<d|_dSr)rpoprr)r"rpmarks r end_arrayzUnmarshaller.end_arrays<{  "k$%%01 DEE rrc|j}i}|j|d}tdt |dD]}||dz|||<|g|j|d<d|_dS)Nrrr4)rr rrangerr)r"rpr!rrrs r end_structzUnmarshaller.end_struct s}{   DEE"q#e**a(( ( (A"1Q3ZDqNN"V DEE rrct}||d|jr|j}||d|_dS)Nrr)r}rqrvrrprrr"rprAs r end_base64zUnmarshaller.end_base64sW T[[))*** ? JE E rrct}|||jrt|}||dSr)rPrqrr{rr's r end_dateTimezUnmarshaller.end_dateTime sM  T   )"4((E ErzdateTime.iso8601cB|jr||dSdSr)rrros r end_valuezUnmarshaller.end_value(s0 ; " OOD ! ! ! ! ! " "rrAcd|_dS)Nparamsrros r end_paramszUnmarshaller.end_params/s  rr.cd|_dS)Nrr/ros r end_faultzUnmarshaller.end_fault3s  rrcd|jr||j}||_d|_dS)N methodName)rrqrrros r end_methodNamezUnmarshaller.end_methodName7s2 > /;;t~..D! rr4NFF)rrrrrrrrrprrrr r rrrrr"r%r(r*r,r0r2r5rrr rrsP , , , ,"""   """ ' ' '    , , ,    HHUO&HYHTNHTNHTNHTNHUO$H\$HX"HW,H\ $HX!HV "HW$HX$HX $0H  """ "HW#HX!HW""" ,H\rrc eZdZdZdZdZdS)_MultiCallMethodc"||_||_dSr)_MultiCallMethod__call_list_MultiCallMethod__name)r" call_listrs r rz_MultiCallMethod.__init__Ds$ rc@t|j|jd|SN.)r8r:r;r"rs r __getattr__z_MultiCallMethod.__getattr__Gs" 0T[[[$$2OPPPrcH|j|j|fdSr)r:rr;r"argss r __call__z_MultiCallMethod.__call__Is& d 344444rNrrrrrArErrr r8r8AsDQQQ55555rr8ceZdZ dZdZdS)MultiCallIteratorc||_dSr)results)r"rJs r rzMultiCallIterator.__init__Ps  rc|j|}t|tikrt|d|dt|tgkr|dStd)Nr0r1rz#unexpected type in multicall result)rJrr.r9)r"ritems r __getitem__zMultiCallIterator.__getitem__Ssm|A ::b ! ![)4 +>?? ? $ZZ488 # #7NBCC CrN)rrrrrMrrr rHrHLs<,DDDDDrrHc(eZdZ dZdZdZdZdS) MultiCallc"||_g|_dSr)_MultiCall__server_MultiCall__call_list)r"servers r rzMultiCall.__init__ms rc>d|jjt|fzS)Nz <%s at %#x>)r'rrlr(s r r)zMultiCall.__repr__qs 7DBBBrc,t|j|Sr)r8rRr@s r rAzMultiCall.__getattr__ts 0$777rcg}|jD]\}}|||dt|jj|S)N)r4r.)rRrrHrQsystem multicall)r"marshalled_listrrDs r rEzMultiCall.__call__ws_* K KJD$  " "4D#I#I J J J J !5!?!?!P!PQQQrN)rrrrr)rArErrr rOrO\s] CCC888RRRRRrrOFcP trdtr]|rt}tj}n|rt}t }nt }t }tdd||t}t|}n7t||}trt|}nt|}||fS)NTFrr) FastParserFastUnmarshallerr{rrrryr.rr)rr mkdatetimemkbytesrrs r getparserr`s )&)  'J(GG  'JGG"JG!$w EJJF##rcn t|trd}n|rt|tr|sd}trt|}nt ||}||}|dkrdt |z}nd}|r |d|d|df}n |r|d|d f}n|Sd |S) Nr4rz$ z z z z z z r)rIr.rJFastMarshallerrrrRr)r. methodnamemethodresponserrmrp xmlheaders r rrs,&%  F FJvu55F - 8 $ $ x , , 776??D7;c(mmK -   &(9        !  774==rc t||\}}|||||fSNr[)r`rrr)rprrpus r loadsrksY ,BS T T TDAqFF4LLLGGIII 7799aoo'' ''rc tstt}tjd|d5}||dddn #1swxYwY|S)Nwbr4)modefileobj compresslevel)gzipNotImplementedErrorrGzipFilertgetvalue)rprgzfs r gzip_encodervs "!! A D!1 = = = $ ::<<sAAA@c tsttjdt|5} |dkr|}n||dz}n#t $rt dwxYwdddn #1swxYwY|dkr"t||krt d|S)Nrbrnrorr4z invalid dataz#max gzipped payload length exceeded)rqrrrsrreadOSErrorr9r)rp max_decoderudecodeds r gzip_decoder)s "!! D'$-- 8 8 8-C -A~~((**((:>22 - - -^,, , - ---------------Q3w<<*44>??? Ns(B3A)(B)BBBBceZdZ dZdZdS)GzipDecodedResponsectstt||_tj|d|jdS)Nryrz)rqrrrr{iorsr)r"responses r rzGzipDecodedResponse.__init__GsN &% %(--//** t$@@@@@rc tj||jdS#|jwxYwr)rqrsrrr(s r rzGzipDecodedResponse.closeOsD  M   % % % GMMOOOOODGMMOOOOs <AN)rrrrrrrr rrCs:AAArrc eZdZdZdZdZdS)_Methodc"||_||_dSr _Method__send _Method__name)r"sendrs r rz_Method.__init__\s  rc@t|j|jd|Sr>)rrrr@s r rAz_Method.__getattr___s!t{t{{{DD$ABBBrc8||j|SrrrCs r rEz_Method.__call__as{{4;---rNrFrrr rrYsDCCC.....rrcpeZdZ dezZdZdZddddZddZdd Z d Z d Z d Z d Z dZdZdZdZdS) TransportzPython-xmlrpc/%sTNFr)r!cf||_||_d|_t||_g|_dSN)NN)r_use_builtin_types _connectionr_headers_extra_headers)r"rrr!s r rzTransport.__init__xs5)"3'W   rcdD]x} |||||cS#tjj$r|rY6t$r7}|s*|jt jt jt jfvrYd}~qd}~wwxYwdS)N)rr4) single_requesthttpclientRemoteDisconnectedr|errno ECONNRESET ECONNABORTEDEPIPE)r"hosthandler request_bodyverboseres r requestzTransport.requests  A **4,PPPPP;1      (8%:L(- (55555555   s A9 A9-A44A9c  |||||}|}|jdkr||_||Sn-#t $rt $r|wxYw|ddr| t||z|j|j t| )Nzcontent-lengthr) send_request getresponsestatusrparse_responser. Exceptionr getheaderr{rreasonr getheaders)r"rrrr http_connresps r rzTransport.single_requests ))$wOOI((**D{c!!& **4000"        JJLLL    >>*B / /  IIKKK 7N K "" # # s AA*Bc8t|j|jSrh)r`rrr(s r r`zTransport.getparsers(d&8+/+BDDD Drc|i}t|tr|\}}tj|\}}|rvtj|}t j|d}d | }dd|zfg}ng}|||fS)Nrr AuthorizationzBasic ) rIrJurllibparse _splituserunquote_to_bytesrrrqrr)r"rx509auth extra_headerss r get_host_infozTransport.get_host_infos dE " " JD$\,,T22 d  <0066D%d++227;;D774::<<((D (T/2MMM]D((rc|jr||jdkr |jdS||\}|_}|tj|f|_|jdS)Nrr4)rrrrrHTTPConnectionr"rchostrs r make_connectionzTransport.make_connectionsw   '(8(; ; ;#A& &+/+=+=d+C+C(t"D!;!;E!B!BB""rcX|j\}}|rd|_|dSdSr)rr)r"r connections r rzTransport.closesA+j  +D           rc||}|j|jz}|r|d|jr5t r.|d|d|dn|d||d|d|jf| ||| |||S)Nr4POSTT)skip_accept_encoding)zAccept-Encodingrq)z Content-Typeztext/xmlz User-Agent) rrrset_debuglevelaccept_gzip_encodingrq putrequestr user_agent send_headers send_content)r"rrrdebugrr!s r rzTransport.send_requests))$// -$"55  )  % %a ( ( (  $ 3 3  ! !&' ! M M M NN6 7 7 7 7  ! !&' 2 2 23444 do6777 *g... *l333rcB|D]\}}|||dSr) putheader)r"rr!keyvals r rzTransport.send_headerss8 + +HC  c * * * * + +rc&|jD|jt|kr,tr%|ddt |}|dt t|||dS)NContent-EncodingrqzContent-Length)encode_thresholdrrqrrvrR endheaders)r"rrs r rzTransport.send_content s  ! -  !C $5$5 5 5  6  !3V < < <&|44L-s3|3D3D/E/EFFFl+++++rct|dr-|dddkrt|}n|}n|}|\}} |d}|sn:|jrt dt|||R||ur| | | S)Nrrrrqr4izbody:) rUrrr`r{rprintrrr)r"rstreamrirjrps r rzTransport.parse_response1s 8[ ) ) !!"4b99VCC,X66!F~~1 ;;t$$D | +gtDzz*** FF4LLL    ! ! LLNNN  wwyyrr6)F)rrr __version__rrrrrrr`rrrrrrrrrr rrjs;$k1J  !!!!!!$    BDDD)))4###.+++ , , ,"rrc0eZdZ ddddfd ZdZxZS) SafeTransportFrNr!contextc^t|||||_dS)Nrrr!)superrr)r"rrr!rr's r rzSafeTransport.__init__Rs9 l+>> C rc,t|j|Sr)r_ServerProxy__requestr@s r rAzServerProxy.__getattr__st~t,,,rc^ |dkr|jS|dkr|jStd|d)Nrrz Attribute z not found)_ServerProxy__closerr)r"attrs r rEzServerProxy.__call__sE  7??<  [ # #n?@@@rc|Srrr(s r __enter__zServerProxy.__enter__s rc.|dSr)rrCs r __exit__zServerProxy.__exit__s r)NNFFFF) rrrrrrr)rArErrrrr rrzs*DIIN''''''>!!!$ ---AAArr__main__zhttp://localhost:8000ERROR r6)NNNF)rw)UrsysrKrdecimalr http.clientr urllib.parser xml.parsersrrrrrq ImportErrorr version_inforrr PARSE_ERROR SERVER_ERRORAPPLICATION_ERROR SYSTEM_ERRORTRANSPORT_ERRORNOT_WELLFORMED_ERRORUNSUPPORTED_ENCODINGINVALID_ENCODING_CHARINVALID_XMLRPCMETHOD_NOT_FOUNDINVALID_METHOD_PARAMSINTERNAL_ERRORrrrr,r.rr Booleanr7r;rBrNrPryr{r}rrrrrr8rHrOrbr\r]r`rrkrvrrsrrrrrrServerrrSr currentTimegetCurrentTimermultigetDatapowaddrrrr r"sr(T  KKKK DDD ### (!,,      I     E   &     E   BBBBBEBBB '" Aq 4::;1111 T%[[;2222;;;  5 5 5P3P3P3P3P3P3P3P3d 666!)!)!)!)!)!)!)!)F f  $$$$$$$$B`4`4`4`4`4`4`4`4N},},},},},},},},D 5 5 5 5 5 5 5 5DDDDDDDD R R R R R R R RJ2655.NBF@@@@V ( ( ( (,   044;$--V, . . . . . . . ."````````J#####I###VeeeeeeeeR   z [0 1 1F f //112222  gq If  E MMOOO IIaNNN IIaNNN  H E(OOOO    gq's?8AA"G;;H HH%I??J JJ