Class : EnxRoom


The EnxRoom is where the real-time communication session takes place. The EnxRoom class handles the connection of client endpoint with signaling, Local stream, and Remote stream.

To initialize EnxRoom:


EnxRoom enxRoom = new EnxRoom(room-observer-interface-instance,stream-observer-interface-instance);

So, the room initialization process would require two parameters:
Parameter Description
room-observer-interface-instance EnxRoomObserver interface instance.
stream-observer-interface-instance EnxStreamObserver interface instance.

Methods

Method Name Description
connect(String token) To connect client end point application to designated room.
publish(EnxStream enxstream) To publish local stream into the room.
unpublish() To unpublish(remove) a local stream from the room.
subscribe(EnxStream stream) To subscribe a remote stream into the room.
disconnect() To disconnect client endpoint from the connected room.
postClientLogs() To post client endpoint console logs to server for analysis / trouble shooting.
startRecord() To start recording of a session in a room. Only moderator can start the recording.
stopRecord() To stop recording of a session in a room. Only moderator can stop the recording.
muteRoom() Mutes all participants in a room. Available to only moderator.
unMuteRoom() Unmutes all participants in a room. Available to only moderator.
getMaxTalkers() To get maximum number of viewable participant allowed in the room.
getTalkerCount() To get total current viewable participant in the room.
setTalkerCount(int numOfTalkers) To set viewable participant in the room.
requestFloor() To Facilitate Particpant to request floor access when the room is in Lecture Mode.
grantFloor(String clientId) To Facilitate Moderator to grant floor access to a Participant in Lecture Mode.
denyFloor(String clientId) To Facilitate Moderator to deny floor access to a Participant in Lecture Mode.
releaseFloor(String clientId) To Facilitate Moderator to release floor access from a granted Participant in Lecture Mode.
whoAmI() To know own information.
getRoomMetaData() It contains all the information about room.
getRemoteStreams() List of remote EnxStream available in the room.
isPublishing() returns true if the stream is being published. false otherwise
getDevices() To get list of connected audio devices
getSelectedDevice() returns device name of a selected device
setAudioDevice(String deviceName) To set the selected audio device by the user from our Enablex SDK. device name is obtained from getSelectedDeive()
setReceiveVideoQuality(JSONObject jsonObject ) Use this method to set video quality of receive streams at client side.
onPause() This API is used to handle pause state of application.
onResume() This API is used to handle Resume state of application.
getClientId() To get clientId.
getRoomId() To get roomID.
getClientName() To get client name.
getLocalStreamID() To get local stream ID.
getStreamByStreamId(String streamId) To get stream of respective stream Id.
getUserList() To get connected user list.
changeToAudioOnly(boolean audioOnly) Pass true to change audio video room to audio only.and false to move back to audio video.
getRole() To get role of user. It retunrs "participant" or "moderator"
getMode() To get mode of Room. It retunrs "group" or "lecture"
enableStats(boolean stats, EnxStatsObserver enxStatsObserver) In order to enable stats on room level.



Room observer

Following are the callbacks of RoomObserver:
Callbacks Description
onRoomConnected(EnxRoom enxRoom,JSONObject roomMetaData) Receive when User successfully connected to the room.
onRoomError(JSONObject jsonObject) When client end point failed to connect to room.
onPublishedStream(EnxStream enxStream) To get published stream.
onUnPublishedStream(EnxStream enxStream) To get unpublished stream.
onStreamAdded(EnxStream stream) Remote publishing stream added to the room. Developer should subscribe this stream
onRemovedStream(EnxStream enxStream) When remote participant removed from the room.
onEventError(JSONObject jsonObject) When client end failed to perform any event.
onSubscribedStream(EnxStream enxStream) To receive subscribed stream.
onUserConnected(JSONObject jsonObject) When a user is connected to a room, all other connected users are notified about the new user.
onUserDisConnected(JSONObject jsonObject) When a user is disconnected from a room, all other connected users are notified about the users exit.
onActiveTalkerList(JSONObject jsonObject) This callback will call every time when active talker list gets updated and user will get the new active list.
onRoomDisConnected(JSONObject jsonObject) Receive when User successfully disconnected from the room..
onNotifyDeviceUpdate(String audioDeviceName) This callback Method Will Notify app user for any Audio media changes
onDeviceAdded(String message) This callback Method Will notify to app user for any Audio device is added in the conference.
onDeviceRemoved(String message) This callback Method Will notify to app user for any Audio device is removed in the conference.
onCanvasStarted(JSONObject jsonObject) A Participant listens to this callback to know about a Canvas started by a user.
onCanvasStopped(JSONObject jsonObject) A Participant listens to this callback to know about that Canvas has stopped by user.


Logs observer

In order to receive the log event set logs observer. EnxRoom.setLogsObserver(current-class-instance) Callback for Log Observer
Callbacks Description
onLogUploaded(JSONObject jsonObject) Receive when log is uploaded successfully to the server.


Recording observer

In order to receive the recording events set recording observer. EnxRoom.setRecordingObserver(current-class-instance) Callbacks for Recording Observer
Callbacks Description
onStartRecordingEvent(JSONObject jsonObject) when recording starts. Available to Moderator only.
onStopRecordingEvent(JSONObject jsonObject) When recording stops. Available to Moderator only.
onRoomRecordingOn(String message) When recording is started in the room, (either implicitly or explicitly), all connected users are notified that room is being recorded.
onRoomRecordingOff(String message) When the recording is turned off (either implicitly or explicitly), all connected users are notified that recording has been stopped in the room.


Hard Mute observer

In order to receive the Hard Mute / Hard Unmute events set MuteRoom observer. EnxRoom.setMuteRoomObserver(current-class-instance) Callbacks for Hard Mute / Unmute Room Observer
Callbacks Description
onMutedRoom(JSONObject jsonObject) Receive when room has been muted. Available to Moderator only.
onUnMutedRoom(JSONObject jsonObject) Receive when room has been unmuted. Available to Moderator only.
onReceivedMuteRoom(JSONObject jsonObject) All participants receives when room has been muted by moderator.
onReceivedUnMuteRoom(JSONObject jsonObject) All participants receives when room has been unmuted by moderator.


Screen Shared observer

In order to receive the Shared/Stopped Screen events set ScrrenShare observer. EnxRoom.setScreenShareObserver(current-class-instance) Callbacks for Screen Shared/stopped Observer
Callbacks Description
onScreenSharedStarted(JSONObject jsonObject) Client endpoint will be notified about a screen share started.
onScreenSharedStopped(JSONObject jsonObject) Client endpoint will be notified about a screen share stop.


Bandwidth observer

In order to receive the available downstream (subscribers) bandwidth events set Bandwidth observer. EnxRoom.setBandwidthObserver(current-class-instance) Callbacks for Bandwidth Observer
Callbacks Description
onBandWidthUpdated(JSONObject jsonObject) in the event when a significant change in the available downstream (subscribers) bandwidth.


Lecture Mode observer

In order to receive the lecture mode events set chaircontrol observer. EnxRoom.setChairControlObserver(current-class-instance) Below are the callbacks for lecture mode observer.
Callbacks Description
onFloorRequested(JSONObject jsonObject) Partcipant receives on success of requestFloor. This is for participant only.
onFloorRequestReceived(JSONObject jsonObject) Moderator receives any Floor Request raised by partcipant. This is for Moderator only.
onProcessFloorRequested(JSONObject jsonObject) Moderator receives acknowledgement on performing actions like grantFloor, denyFloor, releaseFloor.
onGrantedFloorRequest(JSONObject jsonObject) Partcipant receives when moderator performs action grantFloor.
onDeniedFloorRequest(JSONObject jsonObject) Partcipant receives when moderator performs action denyFloor.
onReleasedFloorRequest(JSONObject jsonObject) Partcipant receives when moderator performs action releaseFloor.


Talker Count observer

In order to receive the talker events set talker observer. EnxRoom.setTalkerObserver(current-class-instance) Below are the callbacks for talker count observer.
Callbacks Description
onMaxTalkerCount(JSONObject jsonObject) Client endpoint will get maximum number of allowed Active Talkers in the connected room.
onGetTalkerCount(JSONObject jsonObject) Client endpoint receives when user request to get opted active talker streams set by them..
onSetTalkerCount(JSONObject jsonObject) Client endpoint receives when user set number of active talker.


Stats observer

Following are the callbacks for stats observer.
Callbacks Description
onAcknowledgeStats(JSONObject jsonObject) In order to receive when user enable stats.
onReceivedStats(JSONObject jsonObject) In order to receive all stats on room level.



Connect

The room initialization process would require a valid Token to be passed. The token needs to be acquired through a Server API Call. For connecting the client endpoint to the Signalling server, explicitly call the below method of EnxRoom Class as follows:

public void connect(String token) Parameter:
Parameter Description
token The token needs to be acquired through a Server API Call.
Callback
On Success: Receive Room handle and roomMetaData. public void onRoomConnected(EnxRoom enxRoom, JSONObject roomMetaData)

Parameters:

Parameter Description
enxRoom It is EnxRoom object , Where confrence will take place.
roomMetaData Where roomMetadata contains json room details.



On Error: Receive room error as a jsonobject. public void onRoomError(JSONObject jsonobject)

Local Stream

To get local stream use below method.

public EnxStream getLocalStream(JSONObject publish-stream-Info)
Parameter:
Parameter Description
publish-stream-info Publish Stream Info
Publish Stream Info
Copy{ 
"audio":true,      /* Published with Audio */ 
"video":true, 	   /* Published with Video */ 
"data":false,      /* Text-Chat Enabled */
"maxVideoBW":400,  /* maxvideo bandwidth*/
"minVideoBW":300,  /* minvideo bandwidth */
"videoSize":{ 
"minWidth": 720 
"minHeight": 480 
"maxWidth": 1280 
"maxHeight": 720 
},
"audioMuted":true, 	/* Audio muted on entry to room */
"videoMuted":true,  /* Video muted on entry to room */
"name": "mystream"  /* Name of your local stream */
} 
Return:  local-stream-handle

Publish Stream

This method publishes a locally initiated stream into the connected room. As the stream is added to the Room, all other connected users are notified with callback onStreamAdded, so that they may subscribe that stream.

To publish the stream use below method :
public void publish(EnxStream enxStream)

Callback to receive published stream as below. public void onPublishedStream(EnxStream enxStream)

UnPublish Stream

This method unpublishes a published local stream from the Room. As the stream gets unpublished, all other connected users are notified with callback onRemovedStream.

To unpublish the stream use below method :
public void unPublish()

Callback to receive published stream as below. public void onUnPublishedStream(EnxStream enxStream) where, parameter is EnxStream type object



Add Stream

Callback to receives when remote publishing stream added to the room. A developer should subscribe to this stream.

public void onStreamAdded(EnxStream stream)
where, parameter is EnxStream object



Remove Stream

Callback to receives when any remote stream leaves from the room or gets disconnected.

public void onRemovedStream(EnxStream enxStream) where, parameter is EnxStream type object



On Event Error

Callback to receives when client endpoint failed to perform any event. For example: Publish and Subscribe.

public void onEventError(JSONObject jsonObject)


Subscribe Stream

To subscribe a remote stream in a room use the method below:
public void subscribe(EnxStream stream) where, stream is EnxStream object with a valid streamId.
Note:client endpoint should be connected to a room before subscribing to a stream.

Callback to receive Subscribed stream: public void onSubscribedStream(EnxStream stream)

Render Subscribed Stream

To render scubscribed stream use below snnipet :
EnxPlayerView enxPlayerView = new EnxPlayerView(getActivity(),EnxPlayerView.ScalingType.SCALE_ASPECT_BALANCED,false,true); stream.attachRenderer(enxPlayerView);

After rendering video, add surfaceViewRender object to your view.
RelativeLayout yourView = findViewById(R.id.remoteView); yourView.addView(enxPlayerView)


Disconnect

This API is used to disconnect a Client End Point application from the connected room. Note that for re-connecting to the room, one needs to get new Token.

public void disconnect() Received when user get disconnected from the room. public onRoomDisConnected(JSONObject jsonObject) If user room disconnected then there is no need to unpublish the stream.

Where jsonObject is

{ "msg":"Room Disconnected", "result":"0" }


Notify Device Update

This callback Method Will Notify app user for any Audio media changes

public void onNotifyDeviceUpdate(String audioDeviceName)


Device Added

This callback Method Will notify to app user for any Audio device is added in the conference.

public void onDeviceAdded(String message)

Device Removed

This callback Method Will notify to app user for any Audio device is removed in the conference.

public void onDeviceRemoved(String message)

Canvas Started

Client endpoint will be notified about a canvas Started.
Callback:
public void onCanvasStarted(JSONObject jsonObject)

Where jsonObject is

{ "result":0, "name":"Shashank", "clientId":"4b9f85c1-ec1c-4955-97bd-bdbe188b976a", "streamId":21 }


Canvas Stopped

Client endpoint will be notified about a canvas stopped.
Callback:
public void onCanvasStopped(JSONObject jsonObject)

Where jsonObject is

{ "result":0, "name":"Shashank", "clientId":"4b9f85c1-ec1c-4955-97bd-bdbe188b976a", "streamId":21 }

Post Enablex SDK logs

To enable logs call the below method: EnxLogsUtil enxLogsUtil = EnxLogsUtil.getInstance(current-class-instance); enxLogsUtil.enableLogs(true); Parameter:
Parameter Description
current-class-instance Current class instance.
To post Enablex client SDK logs to server use the below method.
Note:To post client logs, first developer needs to enable the logs. public void postClientLogs()

Receive after uploading logs to the server. public void onLogUploaded(JsonObject jsonobject)

Where jsonObject is

{ "result":0, "msg":"Success" }


Room Recording Start

This APIs help to start recording during the session. And available for users with Moderator rights.

To Start the Recording use below method : public void startRecord()

Moderator Callback: public void onStartRecordingEvent(JSONObject jsonobject)

Where jsonObject is: { "result":0, "msg":"Success" }

Participant Callback: public void onRoomRecordingOn(JSONObject jsonobject)

Where jsonObject is: { "msg":"Room Recording On", "result":"0" }




Room Recording Stop

This APIs help to stop recording during the session. And available for users with Moderator rights.

To stop the Recording use below method : public void stopRecord()

Moderator Callback public void onStopRecordingEvent(JSONObject jsonobject)

Where jsonObject is: { "result":0, "msg":"Success" }

Participant Callback public void onRoomRecordingOff(JSONObject jsonobject)

Where jsonObject is: { "msg":"Room Recording Off", "result":"0" }


Hard Mute Room

These APIs help hard-mute Room at runtime. These API calls are only available to users with role "Moderator". On Room being put on hard-mute, all participants audio stream is stopped automatically. When the Room is put on hard-mute, then last known mute-state of all connected users is reset.

To mute room use below method:
public void muteRoom()


Moderator Callback:

Moderator receive when hard muted room by moderator. public void onMutedRoom(JSONObject jsonObject)

Where jsonObject: { "result" : 0, "msg" : "room muted" }

Participant Callback:


Participant receive when hard muted room by moderator. public void onReceivedMuteRoom(JSONObject jsonObject)

Where jsonObject is: { "msg":"Room is muted", "status":true }


Hard Unmute Room

These APIs help hard-unmute Room at runtime. These API calls are only available to users with role "Moderator". On Room being put off hard-mute, all participants audio stream starts automatically. When the Room is put off hard-mute, then last known mute-state of all connected users is reset.

To mute room use below method:
public void unMuteRoom()

Moderator Callback: public void onUnMutedRoom(JSONObject jsonObject)

Where jsonObject is: { result" : 0, "msg" : "room-unmuted" }

Participant Callback:
Participant receive when hard unmute used by moderator.


public void onReceivedUnMutedRoom(JSONObject jsonObject)

Where jsonObject is: { "msg":"Room is un-muted", "status":false }



To get max allowed Active Talkers

This method is available for all users during Active Talker Mode. Using this method, you can get a maximum number of allowed Active Talkers in the Callback.

public void getMaxTalkers()

Callback: public void onMaxTalkerCount(JSONObject jsonObject)

Where jsonObject is: { "maxTalkers" : 2, "result" : 0 }

To get / set total streams to receive in Active Talker

The getTalkerCount method is used to know opted streams in Active Talker.



public void getTalkerCount()

Callback: public void onGetTalkerCount(JSONObject jsonObject)

where jsonObject is: { "numTalkers" : 2, "result" : 0 }

The setTalkerCount method is used to opt total number of streams to receive at a Client End point in Active Talkers.



public void setTalkerCount(int number)

Parameters :

number to set total number of streams opted to receive in Active Talker.

Callback:




public void onSetTalkerCount(JSONObject jsonObject)

Where jsonObject is

{ "numTalkers" : 1, "result" : 0 }



Chair Control Feature

Raise Hand Control

This API is only available during Lecture Mode of a Session. Each Participant Raise hand Control can individually be asked to Join the floor using this API Call. This API calls are only available to users with role “Participant”.

To raise hand use the method below:
public void requestFloor()



Participant Callbacks: public void onFloorRequested(JSONObject jsonObject)

Where JsonObject is: { "result":"1701", "msg":"Floor Request Received" }


Moderator Callback:
public void onFloorRequestReceived(JSONObject jsonObject)

Where JsonObject is: { "clientId" : "xxx", "name" : "android" }


Grant Floor Control

This API is only available during Lecture Mode. Each Participant requested Floor Control can individually be granted access to the Floor using this API Call. These API calls are only available to users with role “Moderator”.

To grant floor request use below method:
public void grantFloor(String clientId)

Parameter:
Parameter Description
Clientid It is the Client ID for the participant whom access is being granted.
Moderator Callback:



public void onProcessFloorRequested(JSONObject jsonObject)

Where JsonObject is: { "result":"1708", "msg":"Floor Granted" }

Participant Callback: public void onGrantedFloorRequest(JSONObject jsonObject)

Where JsonObject is: { "result":1708, "msg":"Floor Granted", "clientId":"c371cd94-4ad4-4d5c-b674-5e8dd6d81d65" }


Deny Floor Control:

This API is only available during Lecture Mode of a Session. Each Participant requested Floor Control can individually be denied access to the Floor using this API Call. This API calls are only available to users with role “Moderator”.

To deny/reject floor request use below method:
public void denyFloor(String clientId)

Parameter:
Parameter Description
Clientid It is the Client ID for the participant whom access is being granted.
Moderator Callback: public void onProcessFloorRequested(JSONObject jsonObject)

Where jsonObejct is: { "msg": "Floor Denied", "result": "1709" }

Participant Callback : public void onDeniedFloorRequest(JSONObject jsonObject)

Where jsonObejct is: { "result":4117, "msg":"Floor Request Denied", "clientId":"5222fa14-58ab-4e3e-95ca-47fbf31ad15c" }


Release Floor Control:

This API is only available during Lecture Mode of a Session. Each Participant granted Floor Control can individually be asked to release the floor Control using this API Call. This API calls are only available to users with role “Moderator”.

To release floor request use below method:
public void releaseFloor(String clientId)

Parameter:
Parameter Description
Clientid It's the Client ID for the participant who is being denied access to the floor.
Moderator Callback: public void onProcessFloorRequested(JSONObject jsonObject)

Response for Floor Released: { "msg": "Floor Released", "result": "1712" }

Participant Callback: public void onReleasedFloorRequest(JSONObject jsonObject)

Where jsonObejct is: { "result":1712, "msg":"Floor Released", "clientId":"5222fa14-58ab-4e3e-95ca-47fbf31ad15c" }

Active Talker List :

Receive every time when the active talker list gets updated and client endpoint gets the new active list.

Callback: public void onActiveTalkerList(JSONObject jsonObject)

Where jsonObject is:

{ "activeList": [{"name":"testUser1","streamId":1,"clientId":"c4cfd46c-6e4d-4cd0-aea3-34fea3b46fd8","mediatype":"audiovideo"},
{"name":"testUser2","streamId":2,"clientId":"c4cfd46c-6e4d-4cd0-aea3-34fea3b46fd8","mediatype":"audio"},
{"name":"testUser3", "streamId":3," clientId":"c4cfd46c-6e4d-4cd0-aea334fea3b46fd8","mediatype":"audio"},
{"name":"testUser4","streamId":4,"clientId":"c4cfd46c-6e4d-4cd0-aea334fea3b46fd8", "mediatype":"none"},
{"name":"testUser5","streamId":5,"clientId":"c4cfd46c-6e4d-4cd0-aea3-34fea3b46fd8","mediatype":"audiovideo"},
{"name":"testUser6","streamId":6, "clientId":"c4cfd46c-6e4d-4cd0-aea3-34fea3b46fd8","mediatype":"audio"}], "active":false }



BandWidth Updated

All user receives when there is a significant change in the available downstream (subscribers) bandwidth.

Callback: public void onBandWidthUpdated(JSONObject jsonObject)

Where jsonObject is:

{ "message": "SubscriberBandWidth", "bandwidth": [ { "streamId": 1, "subscriberBw": 300000, "publisherBw": 328215 }, { "streamId": 2, "subscriberBw": 1505400, "publisherBw": 135229 } ] }


Screen Share Start

Participant receive when a screen shared started by a user.

Callback: public void onScreenSharedStarted(JSONObject jsonObject)

Where jsonObject is:

{ "clientId" : "d334a039-90af-4c5d-93ad-6f71ea20a36e", "name" : "Android", "result" : 0, "streamId" : 11 }


Screen Share Stop

Participant receives when the screen shared by a user has stopped.

Callback: public void onScreenSharedStopped(JSONObject jsonObject)

Where jsonObject is

{ "clientId" : "d334a039-90af-4c5d-93ad-6f71ea20a36e", "name" : "Android", "result" : 0, "streamId" : 11 }


whoAmI

To know own information at client endpoint.

public JSONObject whoAmI() Return: jsonobject

Get RoomMetadata

It contains all the information about room.

public JSONObject getRoomMetadata() Return: jsonobject of roommetadata

Get RemoteStreams

To get ist of remote EnxStream available in this room.

public Map < String, EnxStream > getRemoteStreams() Return: Map object

isPublishing

To check stream published or not into the room

public boolean isPublishing() Return: boolean

Get Devices

This API is used to get the list of audio devices present in User's device.

public List < String > getDevices() Return: List < String > 

Get Selected Device

This API is used to get the device selected by the user.

public String getSelectedDevice() Return: String;

Set Audio Device

This API is used to set the selected audio device by the user from our Enablex SDK.

public void setAudioDevice(String deviceName) Return: void;

Set Receive Video Quality

This API is used to set video quality of receive streams at the client side.

public void?setReceiveVideoQuality(JSONObject jsonObject ) Parameter: { "streamType":"talker/canvas", "videoQuality": "AUTO/HD/SD/LD" }

On Pause

This API is used to handle pause state of activity and fragment.

public void onPause()

On Resume

This API is used to handle Resume state of activity and fragment.

public void onResume()

Get Client ID

This API is used to get clientID.

public String getClientId()

Get Room ID

This API is used to get roomID.

public String getRoomId()

Get Client Name

This API is used to get client name.

public String getClientName()

Get Local Stream ID

This API is used to get local stream ID.

public String getLocalStreamID()

Get Stream by Stream ID

This API is used to get stream for the respective stream ID.

public EnxStream getStreamByStreamId(String streamId)

Get User List

This API is used to get connected user list.

public JSONArray getUserList()

Check Active Talker

This API is used to find whether active talker is true or false.

public boolean isRoomActiveTalker()

Change To Audio Only

This API is used to change the room in audio only.

public boolean changeToAudioOnly(boolean audioOnly)


Get Role

This API is used to check role of the user.

public String getRole()


Get Mode

This API is used to check mode of the Room.

public String getMode()



Enable Stats Events

This API is used to enable the statistics on room level from EnxRTCAndroid.

public void enableStats(boolean stats, EnxstatsObserver enxstatsobserver) Callback: Received when user enable stats from EnxRTCAndroid. public void onAcknowledgeStats(JSONObject jsonobject)
Callback: Received the statistics reports from EnxRTCAndroid. public void onReceivedStats(JSONObject jsonobject)

List of Participants:

This API is designed to return a JSON Structure containing information about user connected to the Room during a call. Some users may be publishing audio/video, some may be subscribed to others whereas some may neither be publishing nor subscribed to others.

Callback Receive when any user join to the room.


public void onUserConnected(JSONObject jsonObject)

Where JsonObject is: { "clientId": "f1a0f629-4505-4867-ab40-feb0c0e5759d", "name": "Android", "permissions": { "controlhandlers": true, "publish": true, "record": false, "stats": true, "subscribe": true }, "role": "participant", "user_ref": 2236 }




Callback receive when user leave the room. public void onUserDisConnected(JSONObject jsonObject)

Where JsonObject is: { "clientId": "f1a0f629-4505-4867-ab40-feb0c0e5759d", "name": "Android", "permissions": { "controlhandlers": true, "publish": true, "record": false, "stats": true, "subscribe": true, }, "role": "participant", "user_ref": 2236 }