About the IP Short Message Gateway
The IP Short Message Gateway (IP-SM-GW) implements transport layer interworking for SMS over IP. It is based on 3GPP TS 24.341, and implements suitable SMS interworking as part of GSMA IR.92 version 9.0
Topics
This document includes the following topics:
Topic | Explains… |
---|---|
How the IP-SM-GW fits into a network |
|
Illustrative flows for key behaviour |
|
Major functional components |
|
Versions of GSM/3GPP MAP in the IP-SM-GW |
|
The TCAP Leg Manager subsystem of the Sentinel IP-SM-GW service |
Sentinel IP-SM-GW in an LTE network
The IP-SM-GW interfaces to several network elements.
Once a UE is IMS registered, and indicates support for receipt of SMS over IP, it may send and receive SMS through the IP-SM-GW. That is, the UE may use SMS over IP when registered via PS access networks, not only when registered via LTE. The IP-SM-GW also supports mobile-initiated USSD reports over IMS.
The IP-SM-GW performs a similar role to the VMSC, but for IMS registered UEs, rather than CS registered.
In order to aid understanding of the role of the IP-SM-GW, refer to Key Flows.
Major Components
The diagram below shows the major components for the Sentinel IP-SM-GW.
The Sentinel Registrar and Sentinel IP-SM-GW are services running on the Rhino TAS platform, written using the Sentinel Framework. Third Party Registration support is provided by the Sentinel Registrar service. The core SMS flows of the IP-SM-GW are provided by the Sentinel IP-SM-GW service. The Cassandra DB appears in the diagram for each role it fulfills in the architecture (routing correlation, registration ownership tracking, and registrar data storage).
-
to correlate the IMSI and Circuit Switched Routing Information,
-
to track the most recent site a subscriber registered at in a multi-site geo-redundant setup, and
-
to store Third Party Registration information. For more information refer to Sentinel Registrar Overview and Concepts
IMSI and Circuit Switched Routing Information correlation
The Sentinel IP-SM-GW uses a Cassandra Database to store and retrieve CS Routing Information. This means that any IP-SM-GW cluster member can process the MT Forward Short Message
request regardless of the cluster member that processed the Routing Information for SM query.
This ensures that a deployment is simple from an SS7 addressing perspective, as only a single GT address is required.
Third Party Registration ownership tracking
The Sentinel IP-SM-GW uses a Cassandra Database to store and retrieve registration ownership information. This means that if IP-SM-GW is running in a multi-site geo-redundant setup, the site at which the subscriber most recently registered is tracked across all the sites. This ensures that subscribers can register at one site and re-register at a different site, with network-initiated de-registrations at sites previously registered at suppressing the AMT de-registration.
Support for GSM MAP
The Sentinel IP-SM-GW supports GSM/3GPP MAP Phases 1, 2 and 2+ for MT SMS. It uses MAP Phase 2 for Mobile Originated SMS submission into the SMSC.
Protocol support is provided through the use of OpenCloud CGIN and OCSS7 stacks. For protocol compliance statements refer to CGIN Protocol Compliance and OCSS7 Compliance Matrix.
Key Flows
This page presents illustrative flows for the major behaviours of the Sentinel IP-SM-GW product.
Flow area | Summary |
---|---|
presents illustrative flows for the Mobile Originating SMS Submission path. This path is where the UE submits an SMS over IP. |
|
presents illustrative flows for the MT SMS delivery path. |
|
presents illustrative flows for the MT Online Charging. |
|
presents illustrative flows for the Status Report path. This path is where the SMSC sends a Status Report after it has received a Delivery Report. |
|
presents illustrative flows for the Short Message Memory Available path. This path is where the UE indicates that it has memory available to receive Short Messages, having previously refused SMS for delivery indicating that it did not have sufficient memory available. |
|
presents illustrative flows for the Registration path. |
|
presents illustrative flows for the UE Reachability path. |
|
presents illustrative flows for USSD requests initiated by a UE |
MO Submission Flows
This page presents illustrative flows for the Mobile Originating SMS Submission path. This path is where the UE submits an SMS over IP.
For details related to the features involved refer to Mobile Originated Features in the Administration Guide. Also see MT Online Charging Flows for more information about online charging.
This graph illustrates the normal MO submission flow with online charging enabled. If online charging is disabled for MO submissions, no CreditControlRequest will be sent and the initial MESSAGE will be accepted immediately.
In case there was an error submitting the SMS, a refund will be requested from the OCS.
If online charging is enabled for MO submissions, but the subscriber is out of credit, the initial MESSAGE will be rejected with a 402 response. If there was a problem interacting with the OCS, for example if the CreditControlRequest timed out, a 403 will be sent as the response instead.
MT Delivery Flows
This page presents illustrative flows for the MT SMS delivery path.
About SMS delivery
The MT Delivery path has the IP-SM-GW invoked from the SMS-C. The SMS-C thinks it is signalling an MSC, but is actually signalling the IP-SM-GW.
The Sentinel IP-SM-GW attempts to deliver an SMS over the IMS network (using SIP) or the circuit-switched network (using MAP) depending on the following factors:
-
the terminating UE is IMS Registered, and
-
indicates that it supports receipt of SMS over IP during registration
-
the content of the DeliveryOrder configuration field in the Shared Configuration Profile, which determines the preference for access network when delivering an SMS.
The product supports four delivery orders:
-
PS (packet-switched/IMS) then CS (circuit-switched) - meaning that PS is first attempted, and if unsuccessful CS is attempted
-
CS then PS - meaning that CS is first attempted, and if unsuccessful PS is attempted
-
PS only - meaning that CS is not used
-
CS only - meaning that PS is not used
PS then CS is the default delivery order |
If delivery through either access is successful, the IP-SM-GW acknowledges the SMS-C. If delivery fails the IP-SM-GW sends an error response to the SMS-C. The IP-SM-GW may report the outcome of the final attempt to deliver the SMS by sending a MAP ReportSM_DeliveryStatus
to the HLR.
When using PS then CS, the IP-SM-GW will attempt to deliver by PS if the destination user is IMS registered, and indicates support for receipt of SMS over IP. Assuming these two conditions are met, it will attempt to deliver the SMS via PS, and will try CS if:
-
there was a timeout waiting for a response
-
the SIP Message request containing the RP_DATA was responded to with an error response, and that error response was not an RP-Error whose cause code matched a configured RPErrorFallbackAvoidanceCodes value
When using CS then PS, the IP-SM-GW will attempt to deliver the SMS via the CS network. It will try to use the PS network if:
-
the MAP MT Forward SM it sends towards the MSC/SGSN times out, or
-
the MSC replies with an error response, and that error response is not a
SM-DeliveryFailure
whose Delivery Failure Case is configured to stop fallback to PS Delivery (as per DeliveryFallbackAvoidanceCodes) -
the destination user is both IMS registered and indicates support for receipt of SMS over IP
For details related to the features involved refer to Mobile Terminated Features in the Administration guide. When delivering via the CS network, TCAP Application Context Negotiation may occur.
Flows for SMS delivery
In the scenarios on this page, "Bob" is the receiver of the SMS.
Routing Information for Short Message flows
When the SMS-C attempts to deliver a set of one or more Short Messages, it first queries via the Send Routing Info for Short Message
operation.
On initial registration, the IP-SM-GW informs the HLR that an IP-SM-GW is present, and sets it to be active.
PS Then CS Delivery
If the IP-SM-GW is configured for PS then CS delivery, then it is not necessary to query the HLR for the subscriber’s IMSI immediately.
If the subscriber is IMS registered, the correlation IMSI is generated and stored without CS routing information.
If the subscriber is not IMS registered, then the HLR needs to queried for the subscriber’s IMSI.
PS Only Delivery
If the IP-SM-GW is configured for PS only delivery, then it is not necessary to query the HLR for the subscriber’s IMSI.
If the subscriber is IMS registered, the correlation IMSI is generated and stored without CS routing information.
If the subscriber is not IMS registered, SMS delivery is impossible and an AbsentSubscriber error will be generated.
CS Only and CS Then PS Delivery
If the IP-SM-GW is configured for CS only or CS then PS delivery, the HLR is immediately queried for the subscriber’s IMSI.
If the HLR responds to the SRI_SM with an AbsentSubscriber user error, the correlation IMSI is generated and stored without CS routing information.
Forward Short Message flows
Now that the SMSC has a successful SRI for SM response, it can deliver Short Messages.
The first case shows the behaviour for PS then CS delivery (the default delivery order). The destination user is registered on the PS network, and receives the SMS appropriately. As a side note, this flow would also occur if the IP-SM-GW is configured for PS only delivery, or the correlation data did not include CS routing info as would follow from the AbsentSubscriber case in the Routing Information for Short Message flows above.
In the case that the IP-SM-GW is configured for PS then CS delivery, and the destination user is not IMS Registered (or is IMS registered but does not support receipt of SMS over IP), the IP-SM-GW delivers via CS. As a side note, the same flow results if the product is configured as CS only.
This flow illustrates the use of the Sh SubscribeNotificationRequest
. In this flow, the the product is configured with the default delivery order (PS then CS). The destination user is IMS registered (indicating support for SMS over IP), but the IMS delivery fails. The IP-SM-GW then attempts a CS delivery. Depending on the reason why the IMS delivery fails the IP-SM-GW may request a notification for UE reachability for IP from the HSS. For the precise cases the notification is requested, please refer to Requesting a UE Reachability for IP Notification.
This flow illustrates the product configured for CS then PS delivery, where the CS delivery indicates a suitable error code for attempting delivery via PS. The destination user is PS registered (indicating support for SMS over IP):
MT Online Charging Flows
This page presents illustrative flows for the MT Online Charging.
About MT Online Charging for SMS in the IP-SM-GW
MT Online Charging uses the Diameter Ro protocol. The IP-SM-GW acts as the Charging Trigger Function, and uses Immediate Event Charging. MT Online Charging is triggered from the MT Delivery path. In Sentinel IP-SM-GW, the use of MT Online Charging is optional, and is selected during installation.
MT Delivery can either use the CS network (MSC and/or SGSN) or the PS Network (IMS core). Delivery related charging can be enabled separately for each network. If charging is disabled for a particular network, it is assumed that the network itself will take over this responsibility.
The PS network is used for delivery for two cases:
-
An SMS being sent to the UE. In this case the IP-SM-GW sends a SIP Message request with body containing RP-DATA where the RP-User Data contains an SMS_DELIVER.
-
An SMS Status Report sent to the UE. In this case the IP-SM-GW sends a SIP Message request with body containing RP-DATA where the RP-User Data contains an SMS_STATUS_REPORT.
The Online Charging System is able to distinguish these cases according to the AVPs sent by the IP-SM-GW. Details of the precise AVPs used is documented in the IPSMGWChargingInstanceToCCR mapper.
MT Online Charging is implemented by the IPSMGW IEC Feature.
If online charging is enabled for both the PS and CS networks, and the DeliveryOrder
attribute in the UNRESOLVABLE BXREF: shared-configuration-profile[Shared Configuration Profile]
is set to PS_THEN_CS
or CS_THEN_PS
, then the charging session will carry over to the fallback session in the case of a delivery failure. This means that the IEC feature will not request a refund after the first failure, and it will not initiate a new charging session for the fallback delivery attempt. A refund will only be requested if the delivery attempts over both networks fail.
Flows for MT Online Charging
In the scenarios on this page, "Bob" is the receiver of the SMS.
All MT Online Charging related logic in the IP-SM-GW is triggered from the receipt of a MAP MT Forward Short Message
operation.
This flow shows that:
-
A PS delivery will be attempted, and therefore
-
immediate charging request occurs, and is granted successfully
-
the PS delivery fails, and therefore charging is refunded as CS charging is disabled
The product default is that if PS delivery fails, CS delivery is attempted. This is a different set of functionality than charging. For more information on delivery order please refer to MT Delivery Flows.
The next flow shows default behaviour for when the charging request is refused, as the credit limit has been reached.
The next flow shows a delivery order of CS_THEN_PS
, with charging enabled for both. Both delivery attempts fail, so a refund is initiated after the failed PS delivery.
Additional Sentinel capabilties for Online Charging
The Sentinel framework (IP-SM-GW is built on top of the Sentinel framework) allows different models for units being requested and granted than that shown in the above flow. These capabilities are often used for various "OCS failure handling" policies.
For example Sentinel can be configured such that:
-
There are pools of units that are locally granted if the OCS request times out, once the pool is expired, further reservations against the pool are refused
-
Certain classes of users are always granted credit, and the OCS is not requested
-
other combinations of local pool use with user distinctions
For more information about such capabilities please refer to Promotions.
Registration Flows
This page presents illustrative flows for the Registration path.
For details related to the features involved refer to Registrar Features in the Administration Guide.
On initial registration, the IP-SM-GW informs the HLR that an IP-SM-GW is present, and sets it to be active. IP-SM-GW also informs the HLR the user is ready to receive short messages.
On deregistration, the IP-SM-GW informs the HLR that the IP-SM-GW is not active for this user.
Short Message Memory Available Flows
This page presents illustrative flows for the Short Message Memory Available path. This path is where the UE indicates that it has memory available to receive Short Messages, having previously refused SMS for delivery indicating that it did not have sufficient memory available.
For details related to the features involved refer to Short Message Memory Available Features in the Administration Guide.
Status Report Flows
This page presents illustrative flows for the Status Report path. This path is where the SMSC sends a Status Report after it has received a Delivery Report.
The flows are essentially the same as the MT Delivery Flows. The distinction is that they are triggered by the SMSC when it receives a Delivery Report, rather than an SMS.
UE Reachability for IP Notification Flows
This page presents illustrative flows for the UE Reachability path.
Prior to this flow, an SMS delivery via IMS failed with a particular reason, and the IP-S-MGW has subscribed to receive UE Reachability for IP notifications. This path is where the HSS sends a Sh Push Notification Request indicating that the UE has attached to Packet Radio. The specific cases where the IP-SM-GW requests a UE Reachability for IP notification is described Requesting a UE Reachability for IP Notification.
For details related to the features involved refer to the Fetch IMSI and Ready For SM features.
Triggered by a Push Notification Request (PNR) from the HSS indicating the UE has attached to Packet Radio. The IPSMGW retrieves the associated IMSI and informs the HLR that the UE is Ready for SM delivery.
USSD requests initiated by a UE
This page presents illustrative flows for USSD requests initiated by a UE . The USSI features are described in the administration guide.
A balance query example
A signalling diagram for a balance query operation is shown below.
1 - The INVITE has an SDP offer as per TS 24.390 section 4.5.2. The INVITE body is as per 24.390. It is a multi-part body with both an SDP and a USSD message. An example of a USSD message is
Content-Type: application/vnd.3gpp.ussd+xml <?xml version="1.0" encoding="UTF-8"?> <ussd-data> <language>en</language> <ussd-string>*100*1#</ussd-string> </ussd-data>
2 - An iFC is used to match USSD requests. An example is shown in INVITE Request containing USSD content
3 - A 2xx to the INVITE is sent, confirming the dialog. The SDP answer reflects the offer. The response contains a Recv-Info header field set to g.3gpp.ussd
4 - Forwarded to the UE
5 - ACK
6 - Forwarded to the IPSMGW/USSIGW
7 - A MAP Process-Unstructured-SS-Request containing the USSD message is sent to the HLR addressed using the MSISDN
8 - The HLR sends it towards the Prepaid SCP
9 - The SCP responds with the balance information in a USSD message
10 - Forwarded to the IPSMGW/USSIGW
11 - The IPSMGW/USSIGW converts the USSD message in the response into an XML document. It is placed in the body of the BYE request
An example is
Content-Type: application/vnd.3gpp.ussd+xml <?xml version="1.0" encoding="UTF-8"?> <ussd-data> <language>en</language> <ussd-string> Hello, your credit is $175.50. Thanks for your query. We are happy to assist. Your operator </ussd-string> </ussd-data>
12 - Proxied to the UE
Overview of the TCAP Leg Manager
This section includes the following topics:
Topic | Explains… |
---|---|
what the TCAP leg manager is |
|
the Application Programming Interface (API) available to features using the TCAP leg manager (and TCAP legs) |
|
TCAP messages and how they relate to the TCAP leg manager and TCAP legs |
|
the statistics collected by the TCAP leg manager |
What is the TCAP Leg Manager
The TCAP leg manager is a new type of event manager that is used within the IPSMGW.
The TCAP Leg Manager
The TCAP leg manager is used within the IPSMGW to manage GSM MAP 'legs'. Each TCAP leg corresponds to a Dialog between the IPSMGW and an external network element such as an SMSC, MSC or HLR.
1 |
The IPSMGW interconnects with a number of external network elements, such as an SMSC, MSC and HLR |
---|---|
2 |
Features (such as the MAP Proxy), running within the IPSMGW, interact with these external network elements by using the TCAP Leg Manager and TCAP Legs |
3 |
The TCAP Leg Manager is responsible for managing all TCAP Legs that exist within the IPSMGW. |
4 |
The TCAP leg manager provides an API (Application Programming Interface) that Features (such as the MAP Proxy) may use to create, remove and find TCAP Legs. In this particular example, the MAP Proxy feature in interested in two TCAP legs |
5 |
Each TCAP Leg is associated with a Dialog. The Dialog represents a real protocol session between the IPSMGW and an external network element. Features use the API of the TCAP Leg to operate on the Dialog. For example if the MAP Proxy feature calls |
To learn more about the TCAP leg manager and TCAP leg APIs see Introducing the TCAP Leg Manager API |
See What is an Event Manager? to learn more about event managers. |
The TCAP leg manager may be used in future releases of Sentinel for other protocols such as INAP and CAP. |
Events Processed by the IPSMGW
The IPSMGW receives events from several sources:
Source | Received from | Examples |
---|---|---|
GSM MAP |
an external MAP network element (such as an SMSC or HLR) |
|
SIP |
an external SIP network element (such as an S-CSCF) |
SIP |
Diameter |
the Sentinel mediation layer (related to events from an external OCS) |
|
Extension |
external network elements for sessions initiated by features within Sentinel |
|
Timer |
timers that features raise using the |
|
Local |
raised internally by Sentinel, as a result of processing other events and instructions |
|
IPSMGW event-processing algorithm
The IPSMGW extends Sentinel SIP by adding the TCAP Leg Manager. The following diagram is an overview of how the IPSMGW processes events:
See: Sentinel SIP event-processing algorithm for additional detail related to SIP. |
As shown above:
1 |
The IPSMGW receives a real event, such as an Loop
Until the |
---|---|
2 |
Event managers process the received event. They:
|
3 |
If there are any |
4 |
Process each Once all |
5 |
Ask each event manager in turn to carry out any pending instructions that have accumulated while processing the event. Each event manager manages a set of instructions while features are executing. For example, if a feature calls Once all pending instructions have been processed, then see if there are any events in the |
6 |
Event processing ends once the session ends. |
Introducing the TCAP Leg Manager API
There are three aspects to the TCAP Leg Manager APIs:
-
The
TcapLegManager
interface — Feature developers use this interface to create, release and detachTcapLegs
. Feature developers also use this interface to find aTcapLeg
by name,Dialog
orActivityContextInterface
. For more information see: Managing TCAP Legs -
The
TcapLeg
interface — Feature developers use this interface to send messages on aTcapLeg
, inspect any pending messages and inspect the latest received or sent message on a leg. For more information see: Operating on a TCAP Leg -
The
TcapMessage
andTcapComponent
hierarchies — The classes and interfaces in these hierarchies are the TCAP messages that are send and received on aTcapLeg
. For more information see: TCAP Messages
TCAP Messages
The TCAP message and TCAP component hierarchies represent the TCAP messages sent and received between the IPSMGW and remote TC-Users. These objects are POJOs (Plain Old Java Objects) that may be created and updated as needed and stored in CMP fields.
TCAP Messages - The Dialog Message Hierarchy
The IPSMGW receives events from the CGIN MAP resource adaptor and builds message objects the correspond to whole TCAP messages received on the wire.
See: CGIN Connectivity Pack to learn more about SS7 interfaces in the Rhino TAS platform. |
At the top of the hierachy is the DialogTCAPMessage
interface, which has operations that you use to:
-
find out if the message is a
TC-Begin
,TC-Continue
orTC-End
-
find out if the message is a
DialogOpenRequest
,DialogOpenAccept
,DialogOpenRefuse
,DialogUserAbort
,DialogProviderAbort
or aDialogMessage
-
see if the message contains any components.
The concrete classes include:
-
DialogOpenRequestTcapMessage
— The initial message for a new dialog (always a TC-Begin). An open request includes source and destination address, a TCAP Application Context to use for the new dialog and may optionally include components. -
DialogOpenAcceptTcapMessage
— A first response on a new Dialog, which indicates the remote TC-User has accepted the new Dialog (a TC-Continue or a TC-End). An open accept may optionally include components. -
DialogOpenRefuseTcapMessage
— A first response on a new Dialog, which indicates the remote TC-User has refused the new Dialog (always a TC-End). An open refuse contains a refuse reason, (optionally) a peer abort cause and (optionally) a suggested alternative TCAP Application Context -
DialogUserAbortTcapMessage
— A message indicating the fatal ending of a Dialog (always a TC-End). -
DialogProviderAbortTcapMessage
— A message indicating the fatal ending of a Dialog related to the local TC provider (always a TC-End). -
DialogMessageTcapMessage
— Every other type of message received on a Dialog (a TC-Continue or a TC-End). This type of message may optionally include components.
The |
See Using The Leg Manager in the IP-SM-GW SDK guide to learn more about using these objects during the development of your own features. |
Storing TCAP Messages in CMP fields
The TCAP messages are POJOs (Plain Old Java Objects) that may be created and updated as needed and stored in CMP fields. Whilst these objects are all Serializable
it is far more efficient to use the DialogTcapMessageCodec
as in the following example.
package com.opencloud.sentinel.ipsmgw.myfeature;
import com.opencloud.rhino.cmp.codecs.DatatypeCodecType;
import com.opencloud.sentinel.ipsmgw.eventmanager.tcapmessage.DialogTcapMessage;
import com.opencloud.sentinel.ipsmgw.eventmanager.tcapmessage.persist.DialogTcapMessageCodec;
public interface MyFeatureCMP {
/** * Set the 'MyTcapMessage' cmp field * @param message cmp field value */
@DatatypeCodecType(DialogTcapMessageCodec.class)
void setMyTcapMessage(DialogTcapMessage message);
/** @return 'MyTcapMessage' cmp field value */
DialogTcapMessage getMyTcapMessage();
/** @return true if 'MyTcapMessage' cmp field is set */
boolean hasMyTcapMessage();
/** Clear 'MyTcapMessage' cmp field */
void resetMyTcapMessage();
}
DatatypeCodecType annotation tells Rhino to use DialogTcapMessageCodec to encode/decode DialogTcapMessage objects |
|
set operation for the MyTcapMessage CMP field |
|
get operation for the MyTcapMessage CMP field |
|
(optional) has operation for the MyTcapMessage CMP field |
|
(optional) reset operation for the MyTcapMessage CMP field |
See: Rhino TAS > CMP Field Enhancements to learn more about using CMP fields in Rhino |
TCAP Leg Manager Statistics
The TCAP Leg Manager collects a number of statistics that can be monitored and used to create Threshold based alarms.
See: Rhino TAS > Monitoring and System-Reporting Tools to learn how to monitor statistics in the IPSMGW See: Rhino TAS > Threshold Alarms to learn how to create your own threshold based alarms |
Statistic | When incremented |
---|---|
LegCreated |
A TCAP leg has been created successfully |
CreateLegFailed |
A failure happened whilst trying to create a TCAP leg |
DialogImportedAsNewLeg |
A TCAP leg has been created from an existing Dialog |
ImportDialogAsNewLegFailed |
A failure occured creating a new TCAP leg from an existing Dialog |
OtherLegExistsOnImportDialogAsNewLeg |
A new TCAP leg failed to be created from an existing Dialog because there already exists a TCAP leg related to the Dialog |
LegAlreadyExistsOnImportDialogAsNewLeg |
A new TCAP leg could not be created as there already exists a TCAP leg with the requested name |
LegReleased |
A TCAP leg was released successfully |
ReleaseLegFailed |
A TCAP leg failed to be released |
LegDetached |
A TCAP leg was detached successfully |
DetachLegFailed |
A TCAP leg failed to be detached |
EndSession |
The session was ended successfully |
AbortOnError |
The session was ended in response to an |
LegSuspended |
A TCAP leg was suspended successfully |
LegResumed |
A TCAP leg was resumed successfully |
EventOnUnknownLegNotOpenRequest |
The first event processed in the context of Dialog for which there is no TCAP leg was not a |
FailedToProcessOpenRequest |
A failure occured processing a |
UnsupportedEventReceived |
An type of event that is unknown to the TCAP leg manager was received |
UnsupportedTcapApplicationContext |
A |
FailedToProcessTcapMessage |
A message received on an existing TCAP leg failed to be processed |
FailedToSendTcapMessage |
A |