
    5iM                         S SK Jr  S SKJr  S SKrS SKJrJrJrJ	r	J
r
Jr  S SKrS SKrS SKrS SKrS SKJrJr  S SKJr  S SKJr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 J!r!   " S S5      r"g)    )	b64encode)PathN)DictOptionalListTupleUnionAny)RSAECC)SHA256)pkcs1_15eddsa)
itemgetter)	urlencode)WebsocketAPI   )get_loopc                      \ rS rSr% SrSrSrSrSrSr	Sr
S	rS
rSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSr Sr!Sr"Sr#Sr$Sr%Sr&Sr'Sr(Sr)Sr*Sr+S r,S!r-\.\/S"'   S#r0\1\/S$'   S%r2S&r3S'r4S(r5S)r6S*r7S+r8S,r9S-r:S.r;S/r<S0r=S1r>S2r?S3r@S4rAS5rBS6rCS7rDS8rES9rFS:rGS;rHS<rIS=rJS>rKS?rLS@rMSArNSBrOSCrPSDrQSErRS?rSS@rTSFrUSGrVSCrWSHrXSErYSIrZSJr[SKr\SLr]SMr^SNr_SOr`SPraSQrbSRrcSSrdSTreSUrfSVrgSWrhSXriSYrjSZrkS[rlS\rmS]rnS^roS_rpS`rqSarrSbrsScrtSdruServSfrwSgrxShrySirzSjSjSjSk\(SlSlSjSjSjSj4Sm\{\|   Sn\{\|   So\{\}\|\~4      Sp\|Sq\|Sr\Ss\St\{\\|\4      Su\{\|   Sv\{\GR                     Sw\{\|   4Sx jjrSy\}4Sz jrS{ r SSt\{\\|\4      Su\{\|   4S| jjrS}\4S~\|S\S\|Sy\|4S jjrSS~\|S\1Sy\|4S jjrSS~\|S\1Sy\|4S jjrS~\|Sy\|4S jrSS~\|S\1Sy\|4S jjrS~\|Sy\|4S jrSS~\|S\1Sy\|4S jjrSS~\|S\1Sy\|4S jjrS~\|Sy\|4S jrS\|4S jr\SS j5       r\S 5       rS\|4S jrS\|Sy\|4S jrSS\}Sy\|4S jjrS rS\}Sy\|4S jrS\|S\S\4S jrS\|S\S\4S jrS rS\|S\S\4S jrS\|S\S\4S jr\S\1Sy\14S j5       r\SS j5       r\S\}Sy\\\|\|4      4S j5       r SS\S\Sy\}4S jjrSrgj)
BaseClient   zhttps://api{}.binance.{}/apiz"https://testnet.binance.vision/apiz https://demo-api.binance.com/apizhttps://api{}.binance.{}/sapizhttps://www.binance.{}zhttps://fapi.binance.{}/fapiz&https://testnet.binancefuture.com/fapiz"https://demo-fapi.binance.com/fapiz$https://fapi.binance.{}/futures/dataz.https://testnet.binancefuture.com/futures/datazhttps://dapi.binance.{}/dapiz&https://testnet.binancefuture.com/dapiz"https://demo-dapi.binance.com/dapiz$https://dapi.binance.{}/futures/datazhttps://eapi.binance.{}/eapiz"https://testnet.binanceops.{}/eapizhttps://papi.binance.{}/papiz!wss://ws-api.binance.{}/ws-api/v3z-wss://ws-api.testnet.binance.vision/ws-api/v3z'wss://demo-ws-api.binance.com/ws-api/v3z#wss://ws-fapi.binance.{}/ws-fapi/v1z*wss://testnet.binancefuture.com/ws-fapi/v1v3v1v2v4 1234
   REQUEST_TIMEOUTi'  REQUEST_RECVWINDOWSPOTNEWPARTIALLY_FILLEDFILLEDCANCELEDPENDING_CANCELREJECTEDEXPIRED1s1m3m5m15m30m1h2h4h6h8h12h1d3d1w1MBUYSELLLIMITMARKET	STOP_LOSSSTOP_LOSS_LIMITTAKE_PROFITTAKE_PROFIT_LIMITLIMIT_MAKERSTOPSTOP_MARKETTAKE_PROFIT_MARKETGTCIOCFOKACKRESULTFULLapqflTmMMAIN_C2CMAIN_UMFUTUREMAIN_CMFUTUREMAIN_MARGINMAIN_MININGC2C_MAINC2C_UMFUTURE
C2C_MININGUMFUTURE_MAINUMFUTURE_C2CUMFUTURE_MARGINCMFUTURE_MAINMARGIN_MAINMARGIN_UMFUTUREMINING_MAINMINING_UMFUTURE
MINING_C2Cz
x-HNA2TXFJz
x-Cb7ytekJNcomFapi_key
api_secretrequests_paramstldbase_endpointtestnetdemoprivate_keyprivate_key_passloop	time_unitc                 N   X@l         U R                  R                  XT5      U l        U R                  R                  XT5      U l        U R                  R                  U5      U l        U R
                  R                  U5      U l        U R                  R                  U5      U l        U R                  R                  U5      U l        U R                  R                  U5      U l        U R                  R                  U5      U l	        U R                  R                  U5      U l
        Xl        X l        Xl        SU l        U R                  X5      U l        U R#                  5       U l        X0l        SU l        X`l        Xpl        SU l        U R0                  R                  U5      nU(       a  U R2                  nOU(       a  U R4                  nU R                  (       a  USU R                   3-  nSnU(       a5  SU;   a/  US   R7                  S5      =(       d    US   R7                  S5      n[9        XUS9U l        U R<                  R                  U5      nU(       a  U R>                  nOU(       a  U R@                  n[9        XUS9U l!        U
=(       d
    [E        5       U l#        g)	a  Binance API Client constructor

:param api_key: Api Key
:type api_key: str.
:param api_secret: Api Secret
:type api_secret: str.
:param requests_params: optional - Dictionary of requests params to use for all calls
:type requests_params: dict.
:param testnet: Use testnet environment - only available for vanilla options at the moment
:type testnet: bool
:param private_key: Path to private key, or string of file contents
:type private_key: optional - str or Path
:param private_key_pass: Password of private key
:type private_key_pass: optional - str
:param time_unit: Time unit to use for requests. Supported values: "MILLISECOND", "MICROSECOND"
:type time_unit: optional - str

FNr   z
?timeUnit=proxieshttpshttp)urlrk   https_proxy)$rk   API_URLformatMARGIN_API_URLWEBSITE_URLFUTURES_URLFUTURES_DATA_URLFUTURES_COIN_URLFUTURES_COIN_DATA_URLOPTIONS_URLOPTIONS_TESTNET_URLAPI_KEY
API_SECRET	TIME_UNIT_is_rsa_init_private_keyPRIVATE_KEY_init_sessionsession_requests_paramsresponserm   rn   timestamp_offset
WS_API_URLWS_API_TESTNET_URLWS_API_DEMO_URLgetr   ws_apiWS_FUTURES_URLWS_FUTURES_TESTNET_URLWS_FUTURES_DEMO_URL	ws_futurer   rq   )selfrh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   
ws_api_urlrx   ws_future_urls                  a/var/www/html/BTCUSD/btcusdt_trading_app/venv/lib/python3.13/site-packages/binance/base_client.py__init__BaseClient.__init__   s$   B ||**=>"1188L++2237++2237 $ 5 5 < <S A $ 5 5 < <S A%)%?%?%F%Fs%K"++2237#'#;#;#B#B3#G $" $ 6 6{ U))+ /	 !__++C0
00J--J>>Jt~~&677JyO;))488Ak_U^E_EcEcdjEkK"zT++2237 77M 44M%-kZ&HJ	    returnc                     SSSS.nU R                   (       a"  U R                   (       d   eU R                   US'   U R                  (       a"  U R                  (       d   eU R                  US'   U$ )Nzapplication/jsonzhMozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36)AcceptzContent-Typez
User-AgentzX-MBX-APIKEYzX-MBX-TIME-UNIT)r   r   )r   headerss     r   _get_headersBaseClient._get_headers   s_    (. E

 <<<<<&*llGN#>>>>!>)-G%&r   c                     [         eN)NotImplementedError)r   s    r   r   BaseClient._init_session   s    !!r   c                 (   U(       d  g [        U[        5      (       a%  [        US5       nUR                  5       nS S S 5        [	        U5      S:  a  SU l        [        R                  " XS9$ [        R                  " U5      $ ! , (       d  f       NN= f)Nrx   T)
passphrase)	
isinstancer   openreadlenr   r   
import_keyr   )r   ro   rp   rQ   s       r   r   BaseClient._init_private_key   sn    
 k4((k3'1ffh ({c!DL>>+KK~~k** ('s   B
BTpathsignedversionc                     U R                   nU R                  (       a  U R                  nOU R                  (       a  U R                  nU(       a  U R
                  OUnUS-   U-   S-   U-   $ N/)ry   rm   API_TESTNET_URLrn   API_DEMO_URLPRIVATE_API_VERSION)r   r   r   r   rw   vs         r   _create_api_uriBaseClient._create_api_uri	  sX     ll<<&&CYY##C(.D$$GSy1}s"T))r   c                     U R                   U R                  U R                  U R                  S.nU R                  S-   X2   -   S-   U-   $ )N)r            r   )MARGIN_API_VERSIONMARGIN_API_VERSION2MARGIN_API_VERSION3MARGIN_API_VERSION4r{   r   r   r   optionss       r   _create_margin_api_uri!BaseClient._create_margin_api_uri  sR    &&''''''	
 ""S(7+;;cADHHr   c                     U R                   U R                  S.nU R                  R                  U R                  5      S-   X2   -   S-   U-   $ )N)r   r   r   )PORTFOLIO_API_VERSIONPORTFOLIO_API_VERSION2PAPI_URLrz   rk   r   s       r   _create_papi_api_uriBaseClient._create_papi_api_uri  sH    00T5P5PQ}}##DHH-3g6FFLtSSr   c                 &    U R                   S-   U-   $ r   )r|   )r   r   s     r   _create_website_uriBaseClient._create_website_uri!  s    #%,,r   c                     U R                   nU R                  (       a  U R                  nOU R                  (       a  U R                  nU R
                  U R                  U R                  S.nUS-   XB   -   S-   U-   $ N)r   r   r   r   )r}   rm   FUTURES_TESTNET_URLrn   FUTURES_DEMO_URLFUTURES_API_VERSIONFUTURES_API_VERSION2FUTURES_API_VERSION3r   r   r   rw   r   s        r   _create_futures_api_uri"BaseClient._create_futures_api_uri$  sq    <<**CYY''C''((((

 Sy7++c1D88r   c                 d    U R                   nU R                  (       a  U R                  nUS-   U-   $ r   )r~   rm   FUTURES_DATA_TESTNET_URLr   r   rw   s      r   _create_futures_data_api_uri'BaseClient._create_futures_data_api_uri1  s.    ##<<//CSy4r   c                     U R                   nU R                  (       a  U R                  nOU R                  (       a  U R                  nU R
                  U R                  U R                  S.nUS-   XB   -   S-   U-   $ r   )r   rm   FUTURES_COIN_TESTNET_URLrn   FUTURES_COIN_DEMO_URLr   r   r   r   s        r   _create_futures_coin_api_url'BaseClient._create_futures_coin_api_url7  sq    ##<<//CYY,,C''((((

 Sy7++c1D88r   c                 d    U R                   nU R                  (       a  U R                  nUS-   U-   $ r   )r   rm   FUTURES_COIN_DATA_TESTNET_URL)r   r   r   rw   s       r   !_create_futures_coin_data_api_url,BaseClient._create_futures_coin_data_api_urlD  s.    ((<<44CSy4r   c                     U R                   nU R                  (       a  U R                  nUS-   U R                  -   S-   U-   $ r   )r   rm   r   OPTIONS_API_VERSIONr   s      r   _create_options_api_uri"BaseClient._create_options_api_uriJ  s>    <<**CSy4333c9D@@r   query_stringc                    U R                   (       d   e[        R                  " UR                  S5      5      n[        R                  " U R                   5      R                  U5      n[        U5      R                  5       nU$ )Nutf-8)r   r   newencoder   signr   decode)r   r   h	signatureress        r   _rsa_signatureBaseClient._rsa_signatureP  sa    JJ|**734LL!1!1277:		"))+
r   c                 *    [         R                  " XS9$ )N)safe
_urlencodequote)urir   s     r   encode_uri_componentBaseClient.encode_uri_componentX  s    //r   c                 *    [        S U  5       5      nU$ )Nc              3   ,   #    U  H
  u  pX4v   M     g 7fr    ).0keyvalues      r   	<genexpr>-BaseClient.convert_to_dict.<locals>.<genexpr>^  s     E:33,s   )dict)list_tuples
dictionarys     r   convert_to_dictBaseClient.convert_to_dict\  s    EEE
r   c                     U R                   (       d   e[        [        R                  " U R                   S5      R	                  UR                  5       5      5      R                  5       nU$ )Nrfc8032)r   r   r   r   r   r   r   )r   r   r   s      r   _ed25519_signatureBaseClient._ed25519_signaturea  sT    IId&&	2778K8K8MN

&( 	 
r   c                     U R                   (       d   S5       e[        R                  " U R                   R                  S5      UR                  S5      [        R
                  5      nUR                  5       $ )Nz)API Secret required for private endpointsr   )r   hmacr   r   hashlibsha256	hexdigest)r   r   rT   s      r   _hmac_signatureBaseClient._hmac_signaturei  sW    K KKHHOO""7+(NN

 {{}r   datac                    U R                   nU R                  (       a*  U R                  (       a  U R                  nOU R                  nSR                  U R                  U5       Vs/ s H1  oDS    SUS   S:X  a  [        R                  " US   5      OUS    3PM3     sn5      nU" U5      nU(       a  U R                  U5      $ U$ s  snf )N&r   =symbolr   )
r  r   r   r   r  join_order_paramsr   r   r  )r   r  
uri_encodesig_funcdr   r   s          r   _generate_signatureBaseClient._generate_signaturer  s    ''||..22xxkok}k}  C  lD  !E  lDfgaD6QqTXEU:+;+;AaD+A[\]^[_*`!a  lD  !E  F|$1;t((-DD !Es   &8Cc                 &   SU;   a  U$ UR                  SU R                  5        UR                  S[        [        R                  " 5       S-  U R                  -   5      5        [        [        UR                  5       5      5      n0 UESU" U5      0E$ )Nr   apiKey	timestamp  )
setdefaultr   inttimer   r  sorteditems)r   paramssignature_funcs      r   _sign_ws_paramsBaseClient._sign_ws_params}  sz    & M(DLL1+s499;+=@U@U+U'VWfV\\^,->&>+~f'=>>r   c                     U R                   nU R                  (       a*  U R                  (       a  U R                  nOU R                  n[        U5      nU" U5      $ r   )r  r   r   r   r  r   )r   r  r#  r   s       r   _generate_ws_api_signature%BaseClient._generate_ws_api_signature  sG    ''||..22 %%r   methodr0  c                    #    UR                  SU R                  5       5      nUUUS.nU(       a  U R                  X0R                  5      US'   U R                  R                  XE5      I Sh  vN $  N7fz"Send request and wait for responseid)r:  r7  r0  r0  N)popuuid22r2  r%  r   requestr   r7  r   r0  r:  payloads         r   _ws_futures_api_request"BaseClient._ws_futures_api_request  sf     ZZdkkm,

  $ 4 4V=U=U VGH^^++B8888   A*A3,A1-A3c                 v    [        5       U l        U R                  R                  U R                  XU5      5      $ r   )r   rq   run_until_completer@  r   r7  r   r0  s       r   _ws_futures_api_request_sync'BaseClient._ws_futures_api_request_sync  s2    J	yy++((@
 	
r   c                 6   #    [         R                  " U5      $ 7fr   )asynciorun)r   r7  s     r   
_make_syncBaseClient._make_sync  s     {{6""s   c                    #    UR                  SU R                  5       5      nUUUS.nU(       a  U R                  X0R                  5      US'   U R                  R                  XE5      I Sh  vN $  N7fr9  )r;  r<  r2  r5  r   r=  r>  s         r   _ws_api_requestBaseClient._ws_api_request  sk     ZZdkkm,

  $ 4 477!GH [[((5555rB  c                 v    [        5       U l        U R                  R                  U R                  XU5      5      $ )z,Send request to WS API and wait for response)r   rq   rD  rN  rE  s       r   _ws_api_request_syncBaseClient._ws_api_request_sync  s2    J	yy++  8
 	
r   c                 \    SU;   a%  SUS   ;   a  US   R                  S5      nUS   S	 U$ U $ )Nr  r   )r   )r   kwargsversion_overrides      r   _get_versionBaseClient._get_version  sA    V	VF^ ;%f~11)<vy)##r   c                 H    [        [        R                  " U S-  5      S5      $ )Nr   x)rz   randomgetrandbits)lengths    r   r<  BaseClient.uuid22  s    f((!4c::r   c                 >   [        [        S U R                  5       5      5      n Sn/ nU R                  5        H+  u  p4US:X  a  SnM  UR                  U[	        U5      45        M-     UR                  [        S5      S9  U(       a  UR                  SU S   45        U$ )zNConvert params to list with signature as last element

:param data:
:return:

c                     U S   S L$ )Nr   r  )els    r   <lambda>*BaseClient._order_params.<locals>.<lambda>  s    be4&7r   Fr   Tr   )r  )r  filterr/  appendstrsortr   )r  has_signaturer0  r  r  s        r   r!  BaseClient._order_params  s     F7FG**,JCk! $sCJ/0	 ' 	
1&MM;[(9:;r   force_paramsc                    U R                   US'   U R                  (       a  UR                  U R                  5        UR                  SS 5      nU(       a?  [	        U[
        5      (       a*  XTS'   SUS   ;   a  UR                  US   S   5        US   S	 U(       aq  [        [        R                  " 5       S-  U R                  -   5      US   S'   U R                  (       a  U R                  US   S'   U R                  US   5      US   S'   U(       a[  U R                  US   5      US'   [        US   5       VVVs/ s H  u  nu  pxUb  M  UPM     n	nnn[        U	5       H	  nUS   U	 M     U(       a.  US:X  d  U(       a!  S	R                  S
 US    5       5      US'   US	 SUR                  5       ;   a&  SUS   ;   d  SUS   ;   d	  SUS   ;   a  US   US'   US	 U$ s  snnnf )Ntimeoutr  rj   r*  r)  
recvWindowr   r   r  c              3      #    U  H5  oS    < SUS    S:X  a  [         R                  " US   5      OUS   < 3v   M7     g7f)r   r  r  r   Nr   )r  r  s     r   r	  1BaseClient._get_request_kwargs.<locals>.<genexpr>  sB      (o}gk7aHATJ$4$4T!W$=Z^_`Za$abo}s   =?r0  batchOrdersorderidlistorigclientorderidlist)r"   r   updater   r   r  r,  r-  r   r#   r%  r!  	enumeratereversedr   keys)
r   r7  r   ri  rT  r  ir  r  	null_argss
             r   _get_request_kwargsBaseClient._get_request_kwargs  s    !00y   MM$//0zz&$'JtT**!6N F6N2fVn->?@6N#45*-		d"T%:%::+F6N;' &&/3/F/Fv|,*.*B*B6&>*RF6N;' !//v?F6N *36&>)B)Boa#e)B   i(6N1% ) Vu_"xx (ouv|o}(  F8 v v{{}$!11 F8$44*fX.>>!'!1v8$/s   <GG)r   r   ry   r   r   r~   r}   r{   r   r   r   r   r|   r   r   rn   rq   r   r   rm   r   rk   r   r   r   )r   )z~()*!.')T)r   )F)__name__
__module____qualname____firstlineno__ry   r   r   r{   r|   r}   r   r   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   PUBLIC_API_VERSIONr   r   r   r   r   r   r   r   r   r   r   BASE_ENDPOINT_DEFAULTBASE_ENDPOINT_1BASE_ENDPOINT_2BASE_ENDPOINT_3BASE_ENDPOINT_4r"   float__annotations__r#   r,  SYMBOL_TYPE_SPOTORDER_STATUS_NEWORDER_STATUS_PARTIALLY_FILLEDORDER_STATUS_FILLEDORDER_STATUS_CANCELEDORDER_STATUS_PENDING_CANCELORDER_STATUS_REJECTEDORDER_STATUS_EXPIREDKLINE_INTERVAL_1SECONDKLINE_INTERVAL_1MINUTEKLINE_INTERVAL_3MINUTEKLINE_INTERVAL_5MINUTEKLINE_INTERVAL_15MINUTEKLINE_INTERVAL_30MINUTEKLINE_INTERVAL_1HOURKLINE_INTERVAL_2HOURKLINE_INTERVAL_4HOURKLINE_INTERVAL_6HOURKLINE_INTERVAL_8HOURKLINE_INTERVAL_12HOURKLINE_INTERVAL_1DAYKLINE_INTERVAL_3DAYKLINE_INTERVAL_1WEEKKLINE_INTERVAL_1MONTHSIDE_BUY	SIDE_SELLORDER_TYPE_LIMITORDER_TYPE_MARKETORDER_TYPE_STOP_LOSSORDER_TYPE_STOP_LOSS_LIMITORDER_TYPE_TAKE_PROFITORDER_TYPE_TAKE_PROFIT_LIMITORDER_TYPE_LIMIT_MAKERFUTURE_ORDER_TYPE_LIMITFUTURE_ORDER_TYPE_MARKETFUTURE_ORDER_TYPE_STOPFUTURE_ORDER_TYPE_STOP_MARKETFUTURE_ORDER_TYPE_TAKE_PROFIT$FUTURE_ORDER_TYPE_TAKE_PROFIT_MARKETFUTURE_ORDER_TYPE_LIMIT_MAKERTIME_IN_FORCE_GTCTIME_IN_FORCE_IOCTIME_IN_FORCE_FOKORDER_RESP_TYPE_ACKORDER_RESP_TYPE_RESULTORDER_RESP_TYPE_FULLAGG_ID	AGG_PRICEAGG_QUANTITYAGG_FIRST_TRADE_IDAGG_LAST_TRADE_IDAGG_TIMEAGG_BUYER_MAKESAGG_BEST_MATCHSPOT_TO_FIATSPOT_TO_USDT_FUTURESPOT_TO_COIN_FUTURESPOT_TO_MARGIN_CROSSSPOT_TO_MININGFIAT_TO_SPOTFIAT_TO_USDT_FUTUREFIAT_TO_MININGUSDT_FUTURE_TO_SPOTUSDT_FUTURE_TO_FIATUSDT_FUTURE_TO_MARGIN_CROSSCOIN_FUTURE_TO_SPOTMARGIN_CROSS_TO_SPOTMARGIN_CROSS_TO_USDT_FUTUREMINING_TO_SPOTMINING_TO_USDT_FUTUREMINING_TO_FIATSPOT_ORDER_PREFIXCONTRACT_ORDER_PREFIXr   re  r   r
   boolr	   r   rI  AbstractEventLoopr   r   r   r   r   r   r   r   r   r   r   r   r   r   staticmethodr  r  r  r  r%  r2  r5  r  r@  rF  rK  rN  rQ  rV  r<  r   r   r!  rx  __static_attributes__r  r   r   r   r      s0   ,G:O5L4N*K0KB;=O5G@B$T!0K>-H4JH?O:NIF !OOOOOU##$6!"&"2&$!!!!##! HI &!2*#6 *%'#$1!$1!+?($1!%! FILHON L))("NL(!N)("3)("3"N-!N %( "&$(48226*.48#'J'#J' SMJ' "$sCx.1	J'
 J' J' J' J' eCI./J' #3-J' w001J' C=J'Xd " +/+eCI./+ #3-+  )-=O	*	*!%	*7:	*		*I3 I IS IT Ts T3 T- - -9C 9# 9c 9     9 9s 93 9 c  C  PS  AC AC A3  0 0  s C C 	E 	E# 	E?&t & &
9C 
9 
9t 
9
3 
 
d 
#6C 6 6t 6
3 
 
d 
 c    ; ; D T%S/%:  , :?8"8268	8 8r   r   )#base64r   pathlibr   rZ  typingr   r   r   r   r	   r
   rI  r  r  r-  Crypto.PublicKeyr   r   Crypto.Hashr   Crypto.Signaturer   r   urllib.parseparser   operatorr   r   binance.ws.websocket_apir   helpersr   r   r  r   r   <module>r     sD       : :     %  , !  " 1 } }r   