+
    ~j^                    L   ^ RI Ht ^ RIt^ RIt^ RIt^ RIt^ RIHtHt ^ RI	H
t
HtHtHtHtHt ^ RIt^RIHt ^RIHtHt ^RIHt ^RIHt ^R	IHt ^R
IHt ^RIH t  ^RI!H"t"H#t# ^RI$H%t% ^RI&H't' ^RI(H)t) ^RI*H+t+H,t, ^RI-H.t.H/t/H0t0 ^RI1H2t2H3t3 ^RI4H5t5H6t6 ^RI7H8t8 ^RI9H:t:H;t;H<t<H=t= ^RI>H?t? ]R%,          t@] ! R R4      4       tA] ! R R4      4       tB] ! R R4      4       tC] ! R R4      4       tD] ! R R 4      4       tE ! R! R"]F4      tG ! R# R$]]@,          4      tHR# )&    )annotationsN)	dataclassfield)CallableDictLiteralOptionalcastMapping)EventEmitter)	FfiClient	FfiHandle)ffi_pb2)participant_pb2)room_pb2)	stats_pb2)DisconnectReason)ConnectionStateSimulateScenarioKind)	TrackKind)RpcMethodInvocationEvent)BroadcastQueue)E2EEManagerE2EEOptions)LocalParticipantParticipantRemoteParticipant)RemoteAudioTrackRemoteVideoTrack)RemoteTrackPublicationTrackPublication)TranscriptionSegment)TextStreamReaderByteStreamReaderTextStreamHandlerByteStreamHandler)RemoteDataTrackc                      ] tR t^Yt$ ]P
                  P                  tR]R&    ]P                  P                  tR]R&    ]! ]R7      tR]R&   RtR	# )
RtcConfigurationz%proto_room.IceTransportType.ValueTypeice_transport_typez-proto_room.ContinualGatheringPolicy.ValueTypecontinual_gathering_policy)default_factoryzlist[proto_room.IceServer]ice_servers N)__name__
__module____qualname____firstlineno__
proto_roomIceTransportTypeTRANSPORT_ALLr*   __annotations__ContinualGatheringPolicyGATHER_CONTINUALLYr+   r   listr-   __static_attributes__r.       e/Users/mitch_tango/dev/rabbit-r1-livekit/agent/.venv/lib/python3.14/site-packages/livekit/rtc/room.pyr)   r)   Y   s\     	##11 =  S++>>  M  <.3D.IK+Ir;   r)   c                      ] tR t^ht$ RtR]R&    RtR]R&   RtR]R&    RtR]R	&    Rt	R
]R&    Rt
R]R&    RtR]R&   RtR# )RoomOptionsTboolauto_subscribeFdynacastNzE2EEOptions | Nonee2ee
encryptionzRtcConfiguration | None
rtc_configzfloat | Noneconnect_timeoutzbool | Nonesingle_peer_connectionr.   )r/   r0   r1   r2   r@   r6   rA   rB   rC   rD   rE   rF   r:   r.   r;   r<   r>   r>   h   s^    NDCHd#D
#4%)J"),*.J'.'$(O\(b*.K.kr;   r>   c                  J    ] tR t^yt$ R]R&    R]R&    R]R&    RtR]R	&   R
tR# )
DataPacketbytesdataz#proto_room.DataPacketKind.ValueTypekindRemoteParticipant | NoneparticipantNz
str | Nonetopicr.   )r/   r0   r1   r2   r6   rN   r:   r.   r;   r<   rH   rH   y   s)    
K)
--:))HE:0r;   rH   c                  >    ] tR t^t$ R]R&    R]R&    RtR]R&   RtR# )	SipDTMFintcodestrdigitNrL   rM   r.   )r/   r0   r1   r2   r6   rM   r:   r.   r;   r<   rP   rP      s     
I/J,0K)0Nr;   rP   c                  ,    ] tR t^t$ R]R&   R]R&   RtR# )RtcStatszlist[proto_stats.RtcStats]publisher_statssubscriber_statsr.   N)r/   r0   r1   r2   r6   r:   r.   r;   r<   rV   rV      s    //00r;   rV   c                  "    ] tR t^tR R ltRtR# )ConnectErrorc                   V ^8  d   QhRR/# )   messagerS   r.   )formats   "r<   __annotate__ConnectError.__annotate__   s       r;   c                	    Wn         R # Nr]   )selfr]   s   &&r<   __init__ConnectError.__init__   s    r;   rc   N)r/   r0   r1   r2   re   r:   r.   r;   r<   rZ   rZ      s     r;   rZ   c                    a  ] tR t^tRMR V 3R llltR R lt]R R l4       t]R R l4       t]R	 R
 l4       t	]R R l4       t
]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       tR R  ltRMR! V 3R" lllt]! 4       3R# R$ lltR% R& ltR' R( ltR) R* ltR+ R, ltR- R. ltR/ R0 ltR1]P>                  /R2 R3 llt R4 R5 lt!R6 R7 lt"R8 R9 lt#R: R; lt$R< R= lt%R> R? lt&R@ RA lt'RB RC lt(RD RE lt)RF RG lt*RH RI lt+RJ RK lt,RLt-V ;t.# )NRoomc                    V ^8  d   QhRRRR/# )r\   loopz#Optional[asyncio.AbstractEventLoop]returnNoner.   )r^   s   "r<   r_   Room.__annotate__   s     , ,1, 
,r;   c                  < \         SV `  4        RV n        T;'       g    \        P                  ! 4       V n        \        \        P                  ,          ! 4       V n	        \        P                  ! 4       V n        \        4       V n        \        4       V n        / V n        \"        P$                  V n        \        P(                  \*        ,          ! 4       V n        RV n        / V n        / V n        / V n        / V n        RV n        RV n        R# )zInitializes a new Room instance.

Parameters:
    loop (Optional[asyncio.AbstractEventLoop]): The event loop to use. If not provided, the default event loop is used.
N)superre   _ffi_handleasyncioget_event_loop_loopr   	proto_ffiFfiEvent_room_queuer3   RoomInfo_infoset_rpc_invocation_tasks_data_stream_tasks_remote_participantsr   CONN_DISCONNECTED_connection_stateFuturerS   _first_sid_future_local_participant_text_stream_readers_byte_stream_readers_text_stream_handlers_byte_stream_handlers_token_server_url)rd   rj   	__class__s   &&r<   re   Room.__init__   s     	0455W335
))*<*<=?((*
8;"58UBD!!0!B!B!(!4!6;?AC!AC!CE"CE""&'+r;   c                   V ^8  d   QhRR/# r\   rk   rl   r.   )r^   s   "r<   r_   rm      s     B B Br;   c                	    V P                   e6   \        P                  P                  P	                  V P
                  4       R # R # rb   )rp   r   instancequeueunsubscribe
_ffi_queuerd   s   &r<   __del__Room.__del__   s1    '$$00A (r;   c                   V ^8  d   QhRR/# r\   rk   rS   r.   )r^   s   "r<   r_   rm      s     	, 	,3 	,r;   c                   "   V P                   P                  '       d   V P                   P                  # V P                  G Rj  xL
 #  L5i)zjAsynchronously retrieves the session ID (SID) of the room.

Returns:
    str: The session ID of the room.
N)rx   sidr   r   s   &r<   r   Room.sid   s4      ::>>>::>>!+++++s   AAA	Ac                   V ^8  d   QhRR/# )r\   rk   r   r.   )r^   s   "r<   r_   rm      s     	' 	'#3 	'r;   c                L    V P                   f   \        R4      hV P                   # )zkGets the local participant in the room.

Returns:
    LocalParticipant: The local participant in the room.
z1cannot access local participant before connecting)r   	Exceptionr   s   &r<   local_participantRoom.local_participant   s(     ""*OPP&&&r;   c                   V ^8  d   QhRR/# )r\   rk   zConnectionState.ValueTyper.   )r^   s   "r<   r_   rm      s     & &"; &r;   c                    V P                   # )zhGets the connection state of the room.

Returns:
    ConnectionState: The connection state of the room.
)r~   r   s   &r<   connection_stateRoom.connection_state   s     %%%r;   c                   V ^8  d   QhRR/# )r\   rk   zMapping[str, RemoteParticipant]r.   )r^   s   "r<   r_   rm      s     ) )%D )r;   c                    V P                   # )zGets the remote participants in the room.

Returns:
    dict[str, RemoteParticipant]: A dictionary of remote participants indexed by their
    identity.
)r|   r   s   &r<   remote_participantsRoom.remote_participants   s     (((r;   c                   V ^8  d   QhRR/# r   r.   )r^   s   "r<   r_   rm      s      c r;   c                .    V P                   P                  # )zDGets the name of the room.

Returns:
    str: The name of the room.
)rx   namer   s   &r<   r   	Room.name   s     zzr;   c                   V ^8  d   QhRR/# r   r.   )r^   s   "r<   r_   rm      s     # ## #r;   c                .    V P                   P                  # )zYGets the metadata associated with the room.

Returns:
    str: The metadata of the room.
)rx   metadatar   s   &r<   r   Room.metadata   s     zz"""r;   c                   V ^8  d   QhRR/# )r\   rk   r   r.   )r^   s   "r<   r_   rm      s     " "k "r;   c                    V P                   # )zrGets the end-to-end encryption (E2EE) manager for the room.

Returns:
    E2EEManager: The E2EE manager instance.
)_e2ee_managerr   s   &r<   e2ee_managerRoom.e2ee_manager   s     !!!r;   c                   V ^8  d   QhRR/# r\   rk   rQ   r.   )r^   s   "r<   r_   rm     s     + +# +r;   c                .    V P                   P                  # )zGets the number of participants in the room.
This value is updated periodically, and is eventually consistent.

Returns:
    int: The number of participants in the room.
)rx   num_participantsr   s   &r<   r   Room.num_participants  s     zz***r;   c                   V ^8  d   QhRR/# r   r.   )r^   s   "r<   r_   rm     s     ) ) )r;   c                .    V P                   P                  # )zGets the number of publishers in the room.
This value is updated periodically, and is eventually consistent.

Returns:
    int: The number of publishers in the room.
)rx   num_publishersr   s   &r<   r   Room.num_publishers  s     zz(((r;   c                   V ^8  d   QhRR/# )r\   rk   zdatetime.datetimer.   )r^   s   "r<   r_   rm     s     
 
0 
r;   c                    \         P                   P                  V P                  P                  R,          \         P                  P
                  4      # )z`Time when the room was created.

Returns:
    datetime.datetime: The creation time of the room.
  )datetimefromtimestamprx   creation_timetimezoneutcr   s   &r<   r   Room.creation_time  s=       ..JJ$$t+X->->-B-B
 	
r;   c                   V ^8  d   QhRR/# r\   rk   r?   r.   )r^   s   "r<   r_   rm   $  s     + +d +r;   c                .    V P                   P                  # )ziWhether the room is actively recording.

Returns:
    bool: True if actively recording, False otherwise.
)rx   active_recordingr   s   &r<   is_recordingRoom.is_recording#  s     zz***r;   c                   V ^8  d   QhRR/# r\   rk   floatr.   )r^   s   "r<   r_   rm   -  s     3 35 3r;   c                @    \        V P                  P                  4      # )zAmount of time to hold the room open after the last standard participant leaves.

Returns:
    float: The departure timeout of the room.
)r   rx   departure_timeoutr   s   &r<   r   Room.departure_timeout,  s     TZZ1122r;   c                   V ^8  d   QhRR/# r   r.   )r^   s   "r<   r_   rm   6  s     / /u /r;   c                @    \        V P                  P                  4      # )zrAmount of time to keep the room open if no participants join.

Returns:
    float: The empty timeout of the room.
)r   rx   empty_timeoutr   s   &r<   r   Room.empty_timeout5  s     TZZ--..r;   c                   V ^8  d   QhRR/# r   r.   )r^   s   "r<   r_   rm   >  s     	
 	
T 	
r;   c                h    V P                   RJ;'       d    V P                  \        P                  8g  # )zcChecks if the room is currently connected.

Returns:
    bool: True if connected, False otherwise.
N)rp   r~   r   r}   r   s   &r<   isconnectedRoom.isconnected>  s7     D( L L&&/*K*KK	
r;   c               $    V ^8  d   QhRRRRRR/# )r\   event
EventTypescallbackzOptional[Callable]rk   r   r.   )r^   s   "r<   r_   rm   I  s'     [+ [+
 [+.@ [+H [+r;   c                "   < \         SV `  W4      # )a  Registers an event handler for a specific event type.

Parameters:
    event (EventTypes): The name of the event to listen for.
    callback (Callable): The function to call when the event occurs.

Returns:
    Callable: The registered callback function.

Available events:
    - **"participant_connected"**: Called when a new participant joins the room.
        - Arguments: `participant` (RemoteParticipant)
    - **"participant_disconnected"**: Called when a participant leaves the room.
        - Arguments: `participant` (RemoteParticipant)
    - **"participant_active"**: Called when a remote participant becomes active and is ready to receive data messages.
        - Arguments: `participant` (RemoteParticipant)
    - **"local_track_published"**: Called when a local track is published.
        - Arguments: `publication` (LocalTrackPublication), `track` (Track)
    - **"local_track_unpublished"**: Called when a local track is unpublished.
        - Arguments: `publication` (LocalTrackPublication)
    - **"local_track_republished"**: Called when the SDK auto-republished a local
        track during a full reconnect. The publication object is updated in place
        with the new server-assigned SIDs (its previous SID is passed alongside so
        callers can reconcile any external state keyed by the old SID).
        - Arguments: `publication` (LocalTrackPublication), `previous_sid` (str)
    - **"local_track_subscribed"**: Called when a local track is subscribed.
        - Arguments: `track` (Track)
    - **"track_published"**: Called when a remote participant publishes a track.
        - Arguments: `publication` (RemoteTrackPublication), `participant` (RemoteParticipant)
    - **"track_unpublished"**: Called when a remote participant unpublishes a track.
        - Arguments: `publication` (RemoteTrackPublication), `participant` (RemoteParticipant)
    - **"track_subscribed"**: Called when a track is subscribed.
        - Arguments: `track` (Track), `publication` (RemoteTrackPublication), `participant` (RemoteParticipant)
    - **"track_unsubscribed"**: Called when a track is unsubscribed.
        - Arguments: `track` (Track), `publication` (RemoteTrackPublication), `participant` (RemoteParticipant)
    - **"track_subscription_failed"**: Called when a track subscription fails.
        - Arguments: `participant` (RemoteParticipant), `track_sid` (str), `error` (str)
    - **"track_muted"**: Called when a track is muted.
        - Arguments: `participant` (Participant), `publication` (TrackPublication)
    - **"track_unmuted"**: Called when a track is unmuted.
        - Arguments: `participant` (Participant), `publication` (TrackPublication)
    - **"active_speakers_changed"**: Called when the list of active speakers changes.
        - Arguments: `speakers` (list[Participant])
    - **"room_metadata_changed"**: Called when the room's metadata is updated.
        - Arguments: `old_metadata` (str), `new_metadata` (str)
    - **"participant_metadata_changed"**: Called when a participant's metadata is updated.
        - Arguments: `participant` (Participant), `old_metadata` (str), `new_metadata` (str)
    - **"participant_name_changed"**: Called when a participant's name is changed.
        - Arguments: `participant` (Participant), `old_name` (str), `new_name` (str)
    - **"participant_attributes_changed"**: Called when a participant's attributes change.
        - Arguments: `changed_attributes` (dict), `participant` (Participant)
    - **"participant_encryption_status_changed"**: Called when a participant's encryption status changes.
        - Arguments `is_encrypted` (bool), `participant` (Participant)
    - **"connection_quality_changed"**: Called when a participant's connection quality changes.
        - Arguments: `participant` (Participant), `quality` (ConnectionQuality)
    - **"transcription_received"**: Called when a transcription is received.
        - Arguments: `segments` (list[TranscriptionSegment]), `participant` (Participant), `publication` (TrackPublication)
    - **"data_received"**: Called when data is received.
        - Arguments: `data_packet` (DataPacket)
    - **"sip_dtmf_received"**: Called when a SIP DTMF signal is received.
        - Arguments: `sip_dtmf` (SipDTMF)
    - **"e2ee_state_changed"**: Called when a participant's E2EE state changes.
        - Arguments: `participant` (Participant), `state` (EncryptionState)
    - **"connection_state_changed"**: Called when the room's connection state changes.
        - Arguments: `connection_state` (ConnectionState)
    - **"connected"**: Called when the room is successfully connected.
        - Arguments: None
    - **"disconnected"**: Called when the room is disconnected.
        - Arguments: `reason` (DisconnectReason)
    - **"reconnecting"**: Called when the room is attempting to reconnect.
        - Arguments: None
    - **"reconnected"**: Called when the room has successfully reconnected.
        - Arguments: None
    - **"room_updated"**: Called when any information about the room is updated.
        - Arguments: None
    - **"moved"**: Called when the participant has been moved to another room.
        - Arguments: None
    - **"data_track_published"**: Called when a remote participant publishes a data track.
        - Arguments: `track` (RemoteDataTrack)
    - **"data_track_unpublished"**: Called when a remote participant unpublishes a data track.
        - Arguments: `sid` (str)

Example:
    ```python
    def on_participant_connected(participant):
        print(f"Participant connected: {participant.identity}")

    room.on("participant_connected", on_participant_connected)
    ```
)ro   on)rd   r   r   r   s   &&&r<   r   Room.onI  s    v wz%**r;   c               (    V ^8  d   QhRRRRRRRR/# )r\   urlrS   tokenoptionsr>   rk   rl   r.   )r^   s   "r<   r_   rm     s5     FA FA FAS FA; FA[_ FAr;   c                p  a"   Wn         W n        \        P                  ! 4       pWP                  n        W$P                  n        VP                  VP                  P                  n        VP                  VP                  P                  n	        VP                  e6   \        VP                  R,          4      VP                  P                  n        VP                  e&   VP                  VP                  P                  n        VP                  '       Ed%   \        P                   ! R\"        ^R7       VP                  P$                  VP                  P                  P                  n        VP                  P&                  P(                  VP                  P                  P                  P&                  n        VP                  P&                  P*                  VP                  P                  P                  P&                  n        VP                  P&                  P,                  VP                  P                  P                  P&                  n        VP                  P&                  P.                  VP                  P                  P                  P&                  n        VP                  P&                  P0                  VP                  P                  P                  P&                  n        VP                  P&                  P2                  VP                  P                  P                  P&                  n        VP4                  '       Ed   VP4                  P$                  VP                  P                  P4                  n        VP4                  P&                  P(                  VP                  P                  P4                  P&                  n        VP4                  P&                  P*                  VP                  P                  P4                  P&                  n        VP4                  P&                  P,                  VP                  P                  P4                  P&                  n        VP4                  P&                  P.                  VP                  P                  P4                  P&                  n        VP4                  P&                  P0                  VP                  P                  P4                  P&                  n        VP4                  P&                  P2                  VP                  P                  P4                  P&                  n        VP6                  '       d   VP6                  P8                  VP                  P                  P6                  n        VP6                  P:                  VP                  P                  P6                  n        VP                  P                  P6                  P<                  P?                  VP6                  P<                  4       \@        PB                  PD                  PG                  V PH                  4      V n%        \@        PB                  PD                  PG                  4       p \@        PB                  PM                  V4      oVPO                  V3R l4      G Rj  xL
 p\@        PB                  PD                  PQ                  V4       VP                  PR                  '       dS   \@        PB                  PD                  PQ                  V PJ                  4       \U        VP                  PR                  4      h\W        VP                  PX                  PZ                  P\                  P^                  4      V n0        \c        V P`                  P\                  VP4                  ;'       g    VP                  4      V n2        VP                  PX                  PZ                  Pf                  V n4        \j        Pl                  V n7        \q        V Pr                  VP                  PX                  Pt                  4      V n;        VP                  PX                  Px                   FT  pV P{                  VP|                  4      pVP~                   F&  p	\        V	4      p
WP                  V
P                  &   K(  	  KV  	  V PH                  P                  V P                  4       4      V nE        R#  ELF  \@        PB                  PD                  PQ                  T4       i ; i5i)a  Connects to a LiveKit room using the specified URL and token.

Parameters:
    url (str): The WebSocket URL of the LiveKit server to connect to.
    token (str): The access token for authentication and authorization.
    options (RoomOptions, optional): Additional options for the room connection.

Raises:
    ConnectError: If the connection fails.

Example:
    ```python
    room = Room()

    # Listen for events before connecting to the room
    @room.on("participant_connected")
    def on_participant_connected(participant):
        print(f"Participant connected: {participant.identity}")

    await room.connect("ws://localhost:7880", "your_token")
    ```
Nr   z:options.e2ee is deprecated, use options.encryption instead)
stacklevelc                ^   < V P                   P                  SP                   P                  8H  # rb   )connectasync_ideresps   &r<   <lambda>Room.connect.<locals>.<lambda>  s    !)),,0E0EEr;   )Fr   r   rt   
FfiRequestr   r   r   r@   r   rA   rE   rQ   connect_timeout_msrF   rB   warningswarnDeprecationWarningencryption_typekey_provider_options
shared_keyratchet_saltfailure_toleranceratchet_window_sizekey_ring_sizekey_derivation_functionrC   rD   r*   r+   r-   extendr   r   r   	subscribers   r   requestwait_forr   errorrZ   r   resultroomhandleidrp   r   r   inforx   r   CONN_CONNECTEDr~   r   rv   r   r   participants_create_remote_participantrM   publicationsr    _track_publicationsr   create_task_listen_task_task)rd   r   r   r   reqr   cbptrpowned_publication_infopublicationr   s   &&&&       @r<   r   Room.connect  sG    . ""$! .5-C-C*'.'7'7$"".589P9PSW9W5XCKK2))59@9W9WCKK6<<<MML" 8?||7S7SCKK$$411<< KK$$99D 11>> KK$$99F 11CC KK$$99K 11EE KK$$99M 11?? KK$$99G 11II KK$$99Q =D=O=O=_=_CKK**:""77BB KK**??J ""77DD KK**??L ""77II KK**??Q ""77KK KK**??S ""77EE KK**??M ""77OO KK**??W ""55 KK**= ""== KK**E KK**66==g>P>P>\>\] $,,22<<TZZH""((224	8%%--c2D+0>>E, &B $$007::$$00Arzz//00$RZZ%6%6%;%;%B%B%E%EF(##W%7%7%G%G7<<
 ZZ&&++00
!0!?!?"2bjj//AA#
 **##00B00@B +-//&45KL:E&&{7 +:	 1 ZZ++D,=,=,?@
A& $$007sT   Dd6H6d6Hd6(Dd67d ?d d Ad6	C d6
D;d6d +d33d6c                   V ^8  d   QhRR/# )r\   rk   rV   r.   )r^   s   "r<   r_   rm   .  s     \ \X \r;   c                	p  a"   V P                  4       '       g   \        R 4      h\        P                  ! 4       pV P                  P
                  VP                  n        \        P                  P                  P                  4       p \        P                  P                  V4      oVP                  V3R l4      G Rj  xL
 p\        P                  P                  P                  V4       VP                  P                  '       d    \        VP                  P                  4      h\!        VP                  P"                  P$                  4      p\!        VP                  P"                  P&                  4      p\)        WER7      #  L  \        P                  P                  P                  T4       i ; i5i)zthe room isn't connectedc                ^   < V P                   P                  SP                   P                  8H  # rb   )get_session_statsr   r   s   &r<   r   $Room.get_rtc_stats.<locals>.<lambda>9  "    !--66$:P:P:Y:YYr;   N)rW   rX   )r   RuntimeErrorrt   r   rp   r  r  room_handler   r   r   r   r   r   r   r   r9   r   rW   rX   rV   )rd   r  r   r  rW   rX   r   s   &     @r<   get_rtc_statsRoom.get_rtc_stats.  s?    !!9::""$,0,<,<,C,C)""((224	8%%--c2D+0>>Y, &B $$007%%%r3399::r33::JJK 4 4 ; ; L LM[[& $$007s8   BF67F ?F F AF6	A=F6F +F33F6c                    V ^8  d   QhRRRR/# )r\   rN   rS   handlerr&   r.   )r^   s   "r<   r_   rm   F       W W# W@Q Wr;   c                	    V P                   P                  V4      pVf   W P                   V&   R # \        RV,          4      h)Nz.byte stream handler for topic '%s' already set)r   get
ValueErrorrd   rN   r  existing_handlers   &&& r<   register_byte_stream_handler!Room.register_byte_stream_handlerF  ?    5599%@#07&&u-MPUUVVr;   c                   V ^8  d   QhRR/# r\   rN   rS   r.   )r^   s   "r<   r_   rm   M       2 2C 2r;   c                	    V P                   P                  V4      '       d   V P                   P                  V4       R # R # rb   )r   r"  poprd   rN   s   &&r<   unregister_byte_stream_handler#Room.unregister_byte_stream_handlerM  2    %%))%00&&**51 1r;   c                    V ^8  d   QhRRRR/# )r\   rN   rS   r  r%   r.   )r^   s   "r<   r_   rm   Q  r   r;   c                	    V P                   P                  V4      pVf   W P                   V&   R # \        RV,          4      h)Nz.text stream handler for topic '%s' already set)r   r"  r#  r$  s   &&& r<   register_text_stream_handler!Room.register_text_stream_handlerQ  r(  r;   c                   V ^8  d   QhRR/# r*  r.   )r^   s   "r<   r_   rm   X  r+  r;   c                	    V P                   P                  V4      '       d   V P                   P                  V4       R # R # rb   )r   r"  r-  r.  s   &&r<   unregister_text_stream_handler#Room.unregister_text_stream_handlerX  r1  r;   c                    V ^8  d   QhRRRR/# )r\   scenariozSimulateScenarioKind.ValueTyperk   rl   r.   )r^   s   "r<   r_   rm   \  s      Z Z0N ZSW Zr;   c                @  a"   V P                  4       '       d   V P                  f   \        R4      h\        P                  ! 4       pV P                  P
                  VP                  n        WP                  n        \        P                  P                  P                  4       p \        P                  P                  V4      oVP                  V3R l4      G Rj  xL
 p\        P                  P                  P                  V4       VP                  P!                  R4      '       dA   VP                  P"                  '       d#   \        RVP                  P"                   24      hR# R#  L  \        P                  P                  P                  T4       i ; i5i)a  Trigger a reconnection / chaos scenario for testing.

See `SimulateScenarioKind` for the available variants. Most useful
in tests to deterministically force a Resume (signal-only reconnect
that preserves the PeerConnection and existing publications) or a
full reconnect (the SDK rebuilds the RtcSession and re-publishes
existing local tracks).

Raises a `RuntimeError` if the SDK reports a failure.
Nz+simulate_scenario requires a connected roomc                ^   < V P                   P                  SP                   P                  8H  # rb   )simulate_scenarior   r   s   &r<   r   (Room.simulate_scenario.<locals>.<lambda>q  r  r;   r   zsimulate_scenario failed: )r   rp   r  rt   r   r  r>  r  r;  r   r   r   r   r   r   r   HasFieldr   )rd   r;  r  r   r  r   s   &&   @r<   r>  Room.simulate_scenario\  s<     !!T%5%5%=LMM""$,0,<,<,C,C))1&""((224	8%%--c2D~~Y B $$007((11b6J6J6P6P6P!;B<P<P<V<V;WXYY 7Q1 $$007s=   B"F&7E0 E.E0 "A	F,F&F.E0 0+FFreasonc                    V ^8  d   QhRRRR/# )r\   rB  zDisconnectReason.ValueTyperk   rl   r.   )r^   s   "r<   r_   rm   y  s     . .3.	.r;   c               J  a"   V P                  4       '       g   R# V P                  4       G Rj  xL
  V P                  4       G Rj  xL
  \        P                  ! 4       pV P
                  P                  VP                  n        WP                  n	        \        P                  P                  P                  4       p \        P                  P                  V4      oVP                  V3R l4      G Rj  xL
  \        P                  P                  P!                  V4       V P"                  G Rj  xL
  \        P                  P                  P!                  V P$                  4       V P&                  \(        P*                  8w  d`   WP,                  P.                  n        \(        P*                  V n        V P3                  RV P&                  4       V P3                  RV4       R# R#  EL EL L  \        P                  P                  P!                  T4       i ; i L5i)zDisconnects from the room.Nc                ^   < V P                   P                  SP                   P                  8H  # rb   )
disconnectr   r   s   &r<   r   !Room.disconnect.<locals>.<lambda>  s    1<<+@+@DOOD\D\+\r;   connection_state_changeddisconnected)r   _drain_rpc_invocation_tasks_drain_data_stream_tasksrt   r   rp   r  rF  r  rB  r   r   r   r   r   r   r   r  r   r~   r   r}   r   rx   disconnect_reasonemit)rd   rB  r  r   r   s   &$  @r<   rF  Room.disconnecty  s     !!..000++---""$%)%5%5%<%<" &""((224	8%%--c2D..!\]]]$$007jj  ,,T__= !!_%F%FF=C""((:%4%F%FD"II0$2H2HIIInf-	 G% 	1- ^$$007sY   ,H#G+H#G.A6H#?7G3 6G17G3 ;8H#3H!4B8H#.H#1G3 3+HH#c                   V ^8  d   QhRR/# r   r.   )r^   s   "r<   r_   rm     s     . .D .r;   c                	  "    V P                   P                  4       G Rj  xL
 pVP                  R4      R8X  d   V P                  VP                  4       MmVP
                  P                  V P                  P                  8X  d?   VP
                  P                  R4      '       d   M\ V P                  VP
                  4       V P                  P                  V4       V P                  P!                  4       G Rj  xL
  EK  V P#                  4       G Rj  xL
  V P%                  4       G Rj  xL
  R#  EL  \         d?    \        P                  ! RTP
                  P                  R4      TP
                  4        Li ; i L Lo LY5i)TNr]   rpc_method_invocationeosz&error running user callback for %s: %s)r   r"  
WhichOneof_on_rpc_method_invocationrQ  
room_eventr  rp   r  r@  _on_room_eventr   logging	exceptionrv   
put_nowaitjoinrJ  rK  )rd   r   s   & r<   r  Room._listen_task  s=    //--//E	*.EE..u/J/JK!!--1A1A1H1HH##,,U33''(8(89 ''.""''))) ..000++---/ 0 ! %%@((33I>(( * 	1-sk   FD7BF(F*D: 8F=F>FFF0F
1F:AF FFFF
Fc                   V ^8  d   QhRR/# )r\   rpc_invocationr   r.   )r^   s   "r<   r_   rm     s     G G8P Gr;   c                	    V P                   f   R # VP                  V P                   P                  P                  8X  d   V P                  P                  V P                   P                  VP                  VP                  VP                  VP                  VP                  VP                  R,          4      4      pV P                  P                  V4       VP                  V P                  P                   4       R # R # )Ng     @@)r   local_participant_handlerp   r  rs   r
  _handle_rpc_method_invocationinvocation_idmethod
request_idcaller_identitypayloadresponse_timeout_msrz   addadd_done_callbackdiscard)rd   r]  tasks   && r<   rT  Room._on_rpc_method_invocation  s    ""*22d6M6M6Y6Y6`6``::))''EE"00"))"--"22"**"66?	D &&**40""4#=#=#E#EF ar;   c                   V ^8  d   QhRR/# )r\   r   zproto_room.RoomEventr.   )r^   s   "r<   r_   rm     s     nR nR$8 nRr;   c                	V$   VP                  R 4      pVR8X  d:   V P                  VP                  P                  4      pV P	                  RV4       R# VR8X  dk   VP
                  P                  pV P                  P                  V4      pVP
                  P                  VP                  n	        V P	                  RV4       R# VR8X  dc   V P                  VP                  P                  4      pV'       d4   \        P                  VP                  n        V P	                  RV4       R# R# VR8X  dT   VP                   P"                  pV P$                  P&                  V,          pVP(                  pV P	                  RWx4       R# VR8X  dH   VP*                  P,                  pV P$                  P&                  V,          pV P	                  RV4       R# VR8X  d   VP.                  P0                  p	V P$                  P2                  P5                  V	4      p
V
ei   V P$                  P2                  V	 VP.                  P                  V
n
        WP$                  P2                  V
P6                  &   V P	                  RW4       R# R# VR8X  dm   VP8                  P"                  pV P$                  P&                  V,          pVP:                  P=                  R4       V P	                  RVP(                  4       R# VR	8X  ds   V P                  VP>                  P                  ,          p\A        VP>                  PB                  4      pWP2                  VP6                  &   V P	                  R	W4       R# VR
8X  dk   V P                  VPD                  P                  ,          pVP2                  P                  VPD                  P,                  4      pV P	                  R
W4       R# VR8X  d   VPF                  P(                  pVP                  pV P                  VPF                  P                  ,          pVP&                  VP6                  ,          pRVn$        VPJ                  \L        PN                  8X  d'   \Q        V4      pWn)        V P	                  RWV4       R# VPJ                  \L        PT                  8X  d'   \W        V4      pWn)        V P	                  RWV4       R# R# VR8X  d   VPX                  P                  pV P                  V,          pVP&                  VPX                  P"                  ,          pVP(                  pRVn)        RVn$        V P	                  RVW4       R# VR8X  dj   VPZ                  P                  pV P                  V,          pVPZ                  P\                  pV P	                  RVVPZ                  P"                  V4       R# VR8X  d   VP^                  P                  pV Pa                  V4      p\c        V\d        4      '       g   Q hVP&                  VP^                  P"                  ,          pRVP                  n3        VP(                  '       d   RVP(                  P                  n3        V P	                  RVV4       R# VR8X  d   VPh                  P                  pV Pa                  V4      p\c        V\d        4      '       g   Q hVP&                  VPh                  P"                  ,          pRVP                  n3        VP(                  '       d   RVP(                  P                  n3        V P	                  RVV4       R# VR8X  dn   . pVPj                  Pl                   F=  pV Pa                  V4      p\c        V\d        4      '       g   Q hVPo                  V4       K?  	  V P	                  RV4       R# VR8X  dQ   V Pp                  pVPr                  Pp                  V P                  n8        V P	                  RVV Pp                  4       R# VR8X  ds   V P                  P6                  '       g0   V Pt                  P=                  VPv                  P6                  4       VPv                  P6                  V P                  n        R# VR8X  d   VPx                  P                  pV Pa                  V4      p\c        V\d        4      '       g   Q hVPp                  pVPx                  Pp                  VP                  n8        V P	                  RVVVPp                  4       R# VR8X  d   VPz                  P                  pV Pa                  V4      p\c        V\d        4      '       g   Q hVP|                  pVPz                  P|                  VP                  n>        V P	                  RVVVP|                  4       R# VR8X  d   VP~                  P                  pVP~                  P                  p\        R VP~                  P                   4       4      pV Pa                  V4      p\c        V\d        4      '       g   Q hVP                  P                  P                  4        VP                  P                  P                  R V 4       4       V P	                  RVV4       R# VR8X  dQ   VP                  P                  pV Pa                  V4      pV P	                  RVVP                  P                  4       R# VR8X  d   VP                  P                  pV Pa                  V4      p\c        V\d        4      '       g   Q hVP                  P                  P                  VP                  P                  4       V P	                  RVVP                  4       R# VR8X  dQ   VP                  P                  pV Pa                  V4      pV P	                  RVVP                  P                  4       R# VR8X  d   VP                  pVP                   Uu. uFP  p\        VP                  VP                  VP                  VP                  VP                  VP                  R7      NKR  	  ppV Pa                  VP                  4      pRpV'       d&   VP&                  P5                  VP"                  4      pV P	                  RVVV4       R# VR8X  Ed   VP                  pVP                  R 4      pVR!8X  Ed!   VP                  P                  p V P                  p!\        P                  ! V!P                  \        P                  ! \        P                  V!P                  ,          4      4      P                  p"\        V"4      p#\        V P                  P                  4      P                  4        \        \        V P                  VP                  4      4      pV P	                  R"\        V#VPJ                  VVP                  P                  R#7      4       R# VR$8X  dr   \        \        V P                  VP                  4      4      pV P	                  R%\        VP                  P                  VP                  P                  VR&7      4       R# R# VR'8X  dQ   VP                  P                  pVP                  P                  p$V P	                  R'V Pa                  V4      V$4       R# VR(8X  d2   VP                  P                  p%V%V nm        V P	                  R(V%4       R# VR)8X  d)   V P	                  R)VP                  P                  4       R# VR*8X  d   V P	                  R*4       R# VR+8X  d   V P	                  R+4       R# VR,8X  d=   V P                  VP                  P                  VP                  P                  4       R# VR-8X  d|   \        P                  ! V P                  VP                  P                  4      4      p&V P                  P                  V&4       V&P                  V P                  P                  4       R# VR.8X  d|   \        P                  ! V P                  VP                  P                  4      4      p&V P                  P                  V&4       V&P                  V P                  P                  4       R# VR/8X  d%   VP                  V n
        V P	                  R/4       R# VR08X  d&   VEP                   V n
        V P	                  R04       R# VR18X  dO   VEP                  EP                   F0  p'V Pa                  V'EP                  4      pV'       g   K)  V'Vn
        K2  	  R# VR28X  d1   VEP                  EP
                  V n        V P	                  R24       R# VR38X  d6   E\        VEP                  P(                  4      p(V P	                  R3V(4       R# VR48X  d*   V P	                  R4VEP                  P6                  4       R# R# u upi )5r]   participant_connectedparticipant_disconnectedparticipant_activelocal_track_publishedlocal_track_unpublishedlocal_track_republishedNlocal_track_subscribedtrack_publishedtrack_unpublishedtrack_subscribedTtrack_unsubscribedFtrack_subscription_failedtrack_mutedtrack_unmutedactive_speakers_changedroom_metadata_changedroom_sid_changedparticipant_metadata_changedparticipant_name_changedparticipant_attributes_changedc              3  R   "   T F  pVP                   VP                  3x  K  	  R # 5irb   keyvalue.0entrys   & r<   	<genexpr>&Room._on_room_event.<locals>.<genexpr>\  s$      &TE EKK(Ts   %'c              3  P   "   T F  qP                   VP                  3x  K  	  R # 5irb   r  r  s   & r<   r  r  c  s     /aV`UEKK0HV`s   $&%participant_encryption_status_changedparticipant_permissions_changedconnection_quality_changedtranscription_received)r  textfinal
start_timeend_timelanguagedata_packet_receivedr  userdata_received)rJ   rK   rM   rN   sip_dtmfsip_dtmf_received)rR   rT   rM   e2ee_state_changedrH  rI  reconnectingreconnectedstream_header_receivedstream_chunk_receivedstream_trailer_receivedroom_updatedmovedparticipants_updatedtoken_refresheddata_track_publisheddata_track_unpublished)rS  r  rn  r  rM  ro  participant_identityr|   r-  rL  rx   _retrieve_remote_participantrp  proto_participantPARTICIPANT_STATE_ACTIVEstaterq  	track_sidr   track_publicationstrackrr  publication_sidrs  previous_sidr	  r"  r   rt  _first_subscription
set_resultru  r    r  rv  rw  _subscribedrK   r   
KIND_VIDEOr   _track
KIND_AUDIOr   rx  ry  r   rz  _retrieve_participant
isinstancer   mutedr{  r|  participant_identitiesappendr   r}  r   r~  r  r  r   r  
attributesdictchanged_attributesclearupdater  is_encryptedparticipant_permission_changed
permissionCopyFrompermissionsr  qualityr  segmentsr"   r  r  r  r  r  r  r  r  rJ   ctypesr
   data_ptrPOINTERc_bytedata_lencontentsrI   r   r  disposer   rH   rN   rP   r  rR   rT   r  rH  r~   rI  rB  _handle_stream_headerr  headerrq   r
  _handle_stream_chunkr  chunkr{   rg  rh  ri  _handle_stream_trailerr  trailerr  r  r  r  identityr  r   r   r'   r  r  ))rd   r   whichrparticipantr  r  r   lpublicationltrackr  republishedrpublicationowned_track_info
track_inforemote_video_trackremote_audio_trackrtrackr   rM   r  speakersold_metadataold_namer  r  transcriptionsr  partpubpacket	which_valowned_buffer_infobuffer_infonative_datarJ   
e2ee_stater   rj  r  remote_data_tracks)   &&                                       r<   rV  Room._on_room_event  s     +++::5;V;V;[;[\LII-|<0055JJH4488BL383Q3Q3c3cL0II0,?**2253K3K3`3`aB!2!K!K		.3  ----77C11DDSIL!''FII-|D////??C11DDSILII/>// !88EEL00DDHHVK&**>>|L$)$A$A$F$F!NY&&::;??K		3[O	 '
 ....88C11DDSIL,,77=II.0B0BC''44U5J5J5_5_`L1%2G2G2S2STLAM,,\-=-=>II'D))44U5L5L5a5abL';;??''77L II)<F(($55;;)..J44U5K5K5`5`aL':::>>JL'+L$)"6"66%56F%G"&8#		,.@P\]I$8$88%56F%G"&8#		,.@P\] 9 **//DDH44X>L'::5;S;S;];]^L!''F"&L',L$II*FLO1166KKH44X>L3399EII+//99	 m#((==H44X>Kk;7777%889J9J9T9TUK&*K#   04!!''-IIm[+>o%**??H44X>Kk;7777%889L9L9V9VWK&+K#   05!!''-IIo{K@//*,H!99PP"88B!+{;;;;, Q
 II/:--==L"'"="="F"FDJJII-|T]]K((::>>>&&11%2H2H2L2LM"3377DJJN4499NNH44X>Kk;7777&//L).)K)K)T)TK&II.$$	 0055JJH44X>Kk;7777"''H%*%C%C%H%HK"II0+xIYIYZ66;;PPH==HHJ!% &"AATT& " 44X>Kk;7777((..0((///aV`/aaII0"
 ==BBWWH44X>KII7;;HH
 77;;PPH44X>Kk;7777((11%2V2V2a2abII1''
 2277LLH44X>KII,0088
 ..!88M '//
 0A %tt'' ||ZZZZ 0  
 --m.P.PQD+/C--11-2I2IJII.$D,,//F))'2IF"$*KK$4$4!/44$kk((NN6==;3G3G#GH ( 
 [)+22556>>@#%55f6Q6QR  		#!#[[$0$kk//	 j(#%55f6Q6QR  		'#__11$oo33$0 ) **//DDH1177JII*D,F,Fx,PR\]00$==CC%5D"II02BCn$IIne&8&8&?&?@n$IIn%m#IIm$..&&,,33,,AA --&&t'@'@A\A\AbAb'cdD##''-""4#:#:#B#BC//&&++E,I,I,Q,QRD ##''-""4#:#:#B#BCn$++DJIIn%gDJIIg,,22??"88G;(,K% @
 ''//55DKII'(,, /0J0J0P0P QII,.?@..II.0L0L0P0PQ /[
s   AAH&c                    V ^8  d   QhRRRR/# )r\   r  zproto_room.DataStream.Headerr  rS   r.   )r^   s   "r<   r_   rm     s      2JMr;   c                	V   VP                  R 4      pVR8X  dz   V P                  P                  VP                  4      pVf$   \        P
                  ! RVP                  4       R# \        V4      pWPP                  VP                  &   V! WR4       R# VR8X  dz   V P                  P                  VP                  4      pVf$   \        P
                  ! RVP                  4       R# \        V4      pWpP                  VP                  &   V! Wr4       R# \        P                  ! RV4       R# )content_headertext_headerNz:ignoring text stream with topic '%s', no callback attachedbyte_headerz:ignoring byte stream with topic '%s', no callback attachedz received unknown header type, %s)rS  r   r"  rN   rW  r  r#   r   	stream_idr   r$   r   warning)rd   r  r  stream_typetext_stream_handlertext_readerbyte_stream_handlerbyte_readers   &&&     r<   r  Room._handle_stream_header  s	    ''(89-'"&"<"<"@"@"N"*PLL *62K:E%%f&6&67B 	 M)"&"<"<"@"@"N"*PLL *62K:E%%f&6&67B 	 OO>Lr;   c                   V ^8  d   QhRR/# )r\   r  zproto_room.DataStream.Chunkr.   )r^   s   "r<   r_   rm     s     6 60K 6r;   c                	6  "   V P                   P                  VP                  4      pV P                  P                  VP                  4      pV'       d   VP	                  V4      G R j  xL
  R # V'       d   VP	                  V4      G R j  xL
  R # R #  L+ L
5irb   )r   r"  r  r   _on_chunk_update)rd   r  r  file_readers   &&  r<   r  Room._handle_stream_chunk  st     //33EOOD//33EOOD..u555..u555  65s*   A'B)B*B8BB	BBc                   V ^8  d   QhRR/# )r\   r  zproto_room.DataStream.Trailerr.   )r^   s   "r<   r_   rm     s     	= 	=4Q 	=r;   c                	  "   V P                   P                  VP                  4      pV P                  P                  VP                  4      pV'       dA   VP	                  V4      G R j  xL
  V P                   P                  VP                  4       R # V'       dA   VP	                  V4      G R j  xL
  V P                  P                  VP                  4       R # R #  Lu L/5irb   )r   r"  r  r   _on_stream_closer-  )rd   r  r  r  s   &&  r<   r  Room._handle_stream_trailer  s     //33G4E4EF//33G4E4EF..w777%%))'*;*;<..w777%%))'*;*;<  8 8s*   A'C#)C*2C#C#1C!2.C#!C#c                   V ^8  d   QhRR/# r   r.   )r^   s   "r<   r_   rm   *  s     V V4 Vr;   c                	   "   V P                   '       dN   V P                    F  pVP                  4        K  	  \        P                  ! V P                   R R/ G Rj  xL
  R# R#  L5ireturn_exceptionsTN)rz   cancelrq   gatherrd   rj  s   & r<   rJ   Room._drain_rpc_invocation_tasks*  sS     %%%22 3..$"<"<UPTUUU & V   AA&A$	A&c                   V ^8  d   QhRR/# r   r.   )r^   s   "r<   r_   rm   0  s     S S Sr;   c                	   "   V P                   '       dN   V P                    F  pVP                  4        K  	  \        P                  ! V P                   R R/ G Rj  xL
  R# R#  L5ir  )r{   r	  rq   r
  r  s   & r<   rK  Room._drain_data_stream_tasks0  sR     """// 0..$"9"9RTRRR # Sr  c                    V ^8  d   QhRRRR/# )r\   r  rS   rk   zOptional[RemoteParticipant]r.   )r^   s   "r<   r_   rm   6  s     = =S ==X =r;   c                :    V P                   P                  VR4      # )z)Retrieve a remote participant by identityN)r|   r"  rd   r  s   &&r<   r  !Room._retrieve_remote_participant6  s    ((,,Xt<<r;   c                    V ^8  d   QhRRRR/# )r\   r  rS   rk   zOptional[Participant]r.   )r^   s   "r<   r_   rm   :  s     ; ;c ;6K ;r;   c                    V'       d'   WP                   P                  8X  d   V P                   # V P                  V4      # )z2Retrieve a local or remote participant by identity)r   r  r  r  s   &&r<   r  Room._retrieve_participant:  s3    $:$:$C$CC)))00::r;   c                    V ^8  d   QhRRRR/# )r\   
owned_infoz"proto_participant.OwnedParticipantrk   r   r.   )r^   s   "r<   r_   rm   A  s      <	r;   c                	    VP                   P                  V P                  9   d   \        R 4      h\	        V4      pW P                  VP                  &   V# )zparticipant already exists)r  r  r|   r   r   )rd   r  rM   s   && r<   r  Room._create_remote_participantA  sL     ??##t'@'@@899'
3:E!!+"6"67r;   c                   V ^8  d   QhRR/# r   r.   )r^   s   "r<   r_   rm   K  s     S S# Sr;   c           
     	    R pV P                   P                  4       '       d   V P                   P                  4       pRV RV P                   RV P                   R\
        P                  ! V P                  4       R2	# )unknownzrtc.Room(sid=z, name=z, metadata=z, connection_state=))r   doner   r   r   r   Namer~   )rd   r   s   & r<   __repr__Room.__repr__K  s    !!&&((((//1Cse7499+[Obcrcwcwx|  yO  yO  dP  cQ  QR  S  	Sr;   )r   r   r~   r{   r   rp   r   r   rx   r   rs   r|   rv   rz   r   r  r   r   r   rb   )/r/   r0   r1   r2   re   r   propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r>   r   r  r&  r/  r4  r8  r>  r   CLIENT_INITIATEDrF  r  rT  rV  r  r  r  rJ  rK  r  r  r  r"  r:   __classcell__)r   s   @r<   rh   rh      s   , ,>B 	, 	, 	' 	' & & ) )   # # " " + + ) ) 
 
 + + 3 3 / /	
[+ [+z JU FAP\0W2W2Z:.6F6W6W.>.8G$nR`	@6	=VS=;S Sr;   rh   )$rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r  r  r  r  r  r  r  r  r  r  rH  	connectedrI  r  r  r  r  r  r  r  )I
__future__r   r   rq   r  rW  dataclassesr   r   typingr   r   r   r	   r
   r   r   event_emitterr   _ffi_clientr   r   _protor   rt   r   r  r   r3   r   proto_stats_proto.participant_pb2r   _proto.room_pb2r   r   _proto.track_pb2r   _proto.rpc_pb2r   _utilsr   rB   r   r   rM   r   r   r   r  r   r   track_publicationr    r!   r  r"   data_streamr#   r$   r%   r&   
data_trackr'   r   r)   r>   rH   rP   rV   r   rZ   rh   r.   r;   r<   <module>r7     s   #     ( C C  ' - ( 8 * , 4 B ' 4 " * I I 5 G /  ( #%
P    l l l  1 1 1 O O O 1 1 1
9 
vS<
# vSr;   