Monday, October 28, 2013

Fuse Service Works v6 Beta Announced

Announcing Fuse Service Works 6.0 Beta!

Overview of FSW

JBoss Fuse Service Works (FSW), formerly named SOA-Platform, is the Red Hat middleware solution for application integration, messaging and SOA integration. It combines the technical innovations from open source communities including the core integration technologies from the FuseSource acquisition to address integration requirements.

JBoss Fuse Service Works consists of several leading open source projects from JBoss and Apache communities such as:
  • SwicthYard – business services and SCA capabilities
  • RiftSaw - service orchestration capabilities
  • Overlord - service governance and activity monitoring 
  • Drools – business rules processing
  • Apache Camel, Apache CXF and Apache ActiveMQ - core integration capabilities
The component versions are this point are:
  • Overlord Runtime Governance  - 1.0.0.Final
  • Overlord Design Time Governance  - 1.0.0.Final
  • Overlord S-RAMP  - 0.3.0.Final
  • ModeShape  - 3.5.0.Final
  • SwitchYard - 1.1.0.M3
  • Camel - 2.10.0
  • EAP - 6.1.0
  • Smooks - 1.5.1
  • Drools/jBPM - 6.0.0.CR3
Below each project is highlighted and then we have a sample application to get you started. The Home Loan FSW Application walks you through building your first FSW application.  So to get started let's first go through the components in a little detail:

Apache Camel - implementation of the popular and widely used Enterprise Integration Patterns (EIP) framework for routing, transformation that enables faster and more efficient integration solutions

Apache ActiveMQ - high performance, reliable messaging broker that supports messaging patterns such as publish-subscribe, point-to-point and store-forward, and multiple cross language clients

Apache CXF - web services framework which exposes integration assets as services and calls external services, supporting all major web services standards.

SwitchYard – lightweight service delivery framework, based on SCA (Service Component Architecture), providing full life-cycle support for developing, deploying, and managing service-oriented applications
 
Design time Governance (Overlord) – manage the life-cycle of services from design, development through deployment by defining, exposing and enforcing rules or policies
  • Built on top of the S-RAMP artifact repository
  • Supports triggering Governance Workflows based on repository changes
    • Embeds jBPM 6 to support workflow execution
    • Maps an S-RAMP query to a workflow definition
  • Includes an out-of-the-box Governance Workflow to handle Deployment Lifecycle Management
  • Implements several REST services to support Governance Workflows
    • General purpose Notification (email) Service
    • Artifact meta-data Update Service (used to add meta-data to the S-RAMP artifact being governed)
    • Deployment Service used to deploy binary artifacts into runtime EAP systems
      • Supports RHQ
      • Supports JBoss AS CLI
      • Supports direct file copying
      • Can also deploy into a Maven repository
      • Supports multiple, configurable logical deployment targets (e.g. DEV, TEST, PROD)
  • Web UI
    • Includes a Task Inbox for human tasks created by the Governance Workflows
    • Provides a UI specific to the Deployment Lifecycle Governance Workflow
      • Can drill into a deployment to see its contents
      • Shows the change history for a deployment
      • Provides a way to see which deployments are deployed to which environments
Overlord Runtime Governance (Overlord)  – capture service activity information, define and collect metrics, define alerts to optimize and meet Business/Service Level Agreements (SLA)
    • Activity Collector
      • Activity events can be reported directly to the Activity Server via REST service, OR
    • Embedded collector to intercept activities, pre-process the information to extract correlation details and business relevant properties, before batching events for distribution to the server.
      • Events can be 'validated' using pluggable event processors, which can be used to block business transactions
  • Activity Server

    • Provides a REST interface to enable events to be reported
    • Persists activity information
    • Distributes reported events to subscribed components.
  • Event Processor Network

    • Subscribes to the Activity Server, to receive reported activity events
    • Distributes activity events through a series of registered networks, that consist of event processors to validate, transform and retransmit events. Processors can be specified using Java, Drools CEP rules and MVEL.
  • Maintaining Derived Results

    • Information derived by the Event Processor Network can be presented as a set of 'active' collections
    • Components can directly access these collections, or issue queries through a REST API.
  • Web UI

    • Runtime governance information is provided through a set of gadgets.

      • Service Response Time Gadget - displays response time information per service and optionally operation.
      • Situations Gadget - table for displaying situations detected by the event processing (e.g. SLA violation)
      • Call Trace Gadget - provides a tree based visual display of the call stack associated with a business transaction
      • Service Overview - graphical representation of the services and their dependencies, showing response time and invocation details.

        Introducing the Home Loan FSW Application 1.0


        TheHome Loan FSW Application 1.0 in a nutshell takes a home loan application in Fannie Mae standard and processes it through the system to get a decision. The diagram below is a high level overview of the application.


For our sample we are a creditor service and receive loan applications from different interfaces like messaging and SOAP in a special format, “Fannie Mae 1003 Loan Application”. Each application is processed with customer data based on different sources. According to a business process, if it's an existing customer there is a manual task to be performed by a loan officer. Otherwise it is an automatic task performed by business rules. The business process is shown below which is from the IDE.




The Home Loan v1 on FSW 6.0 is using Switchyard, DTGov and Camel. We are also using Data Virtualization 6.0. In the future we will be adding RTGov in the demo. The application can be viewed through the Switchyard composite in the IDE.


The diagram below describes the pieces of the Switchyard composite.


Download the FSW and DV Enterprise Products from jboss.org at http://www.jboss.org/products. Check out additional code on www.github.com/FuseServiceWorksByExampleCheck out the Wiki for step by step instructions for setting up and running the sample application. We will by adding more to this example for the different components.

Wednesday, October 23, 2013

Using the Camel SAP NetWeaver Gateway Component in Fuse

Overview


We won't go into great detail on describing Camel other than it is the open source integration framework based on Enterprise Integration Patterns.  Apache Camel uses URIs to work directly with any kind of Transport or messaging model such as HTTP,ActiveMQJMSJBI, SCA, MINA or CXF, as well as pluggable Components and Data Format options.  One of these components is the sap-netweaver component available in Camel 2.12 which will be available in Fuse 6.1.

In this blog we show how to use the sap-netweaver component in Fuse.

Setup a SAP Developer Account


In order to run the project a SAP Developer account should be setup.  Visit the Developer Page at http://scn.sap.com/docs/DOC-31221  Also visit the Red Hat JBoss Enterprise Middleware for SAP page on SCN at http://scn.sap.com/docs/DOC-39134

Running a test of the component



Step 2 - Import the Project into JBDS
JBDS - https://www.jboss.org/products/jbds.html
Core Update http://download.jboss.org/jbosstools/updates/stable/kepler/
Integration Stack http://download.jboss.org/jbosstools/updates/development/kepler/integration-stack/

Step 3 - Update the Username and Password in the camel-context.xml

Step 4 - Right click on camel-context.xml and run as 'Local Camel Context'

Step 5 - The output will look like the below in the console:

[pache.camel.spring.Main.main()] MainSupport                    INFO  Apache Camel 2.12.0.redhat-610-SNAPSHOT starting
[pache.camel.spring.Main.main()] ileSystemXmlApplicationContext INFO  Refreshing org.springframework.context.support.FileSystemXmlApplicationContext@6fc0394c: startup date [Wed Oct 23 11:52:53 EDT 2013]; root of context hierarchy
[pache.camel.spring.Main.main()] XmlBeanDefinitionReader        INFO  Loading XML bean definitions from URL [file:/home/kpeeples/workspace/camel-spring/src/main/resources/META-INF/spring/camel-context.xml]
[pache.camel.spring.Main.main()] DefaultListableBeanFactory     INFO  Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@15222f9f: defining beans [template,consumerTemplate,camel-1:beanPostProcessor,camel-1]; root of factory hierarchy
[pache.camel.spring.Main.main()] SpringCamelContext             INFO  Apache Camel 2.12.0.redhat-610-SNAPSHOT (CamelContext: camel-1) is starting
[pache.camel.spring.Main.main()] ManagedManagementStrategy      INFO  JMX is enabled
[pache.camel.spring.Main.main()] DefaultTypeConverter           INFO  Loaded 191 type converters
[pache.camel.spring.Main.main()] SpringCamelContext             INFO  StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
[pache.camel.spring.Main.main()] FileEndpoint                   INFO  Endpoint is configured with noop=true so forcing endpoint to be idempotent as well
[pache.camel.spring.Main.main()] FileEndpoint                   INFO  Using default memory based idempotent repository with cache max size: 1000
[pache.camel.spring.Main.main()] NetWeaverProducer              INFO  Creating NetWeaverProducer using url: https://sapes1.sapdevcenter.com/sap/opu/odata/IWFND/RMTSAMPLEFLIGHT/?authUsername=P1940066098&authPassword=xxxxxx&authMethod=Basic
[pache.camel.spring.Main.main()] SpringCamelContext             INFO  Route: route1 started and consuming from: Endpoint[file://src/sap-netweaver?fileName=command.txt&noop=true]
[pache.camel.spring.Main.main()] SpringCamelContext             INFO  Total 1 routes, of which 1 is started.
[pache.camel.spring.Main.main()] SpringCamelContext             INFO  Apache Camel 2.12.0.redhat-610-SNAPSHOT (CamelContext: camel-1) started in 0.572 seconds
[ #0 - file://src/sap-netweaver] AuthChallengeProcessor         INFO  Basic authentication scheme selected
[ #0 - file://src/sap-netweaver] response                       INFO  Exchange[ExchangePattern: InOnly, BodyType: String, Body: <?xml version="1.0" encoding="utf-8"?><entry xml:base="https://sapes1.sapdevcenter.com:443/sap/opu/odata/IWFND/RMTSAMPLEFLIGHT/" xmlns="http://www.w3.org/2005/Atom" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"><id>https://sapes1.sapdevcenter.com:443/sap/opu/odata/IWFND/RMTSAMPLEFLIGHT/FlightCollection(carrid='AA',connid='0017',fldate=datetime'2013-05-01T00%3A00%3A00')</id><title type="text">FlightCollection(carrid='AA',connid='0017',fldate=datetime'2013-05-01T00%3A00%3A00')</title><updated>2013-10-23T15:58:27Z</updated><category term="RMTSAMPLEFLIGHT.Flight" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/><link href="FlightCollection(carrid='AA',connid='0017',fldate=datetime'2013-05-01T00%3A00%3A00')" rel="edit" title="Flight"/><link href="FlightCollection(carrid='AA',connid='0017',fldate=datetime'2013-05-01T00%3A00%3A00')/flightbooking" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/flightbooking" type="application/atom+xml;type=entry" title="flightbooking"/><link href="FlightCollection(carrid='AA',connid='0017',fldate=datetime'2013-05-01T00%3A00%3A00')/flightBookings" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/flightBookings" type="application/atom+xml;type=feed" title="flightBookings"/><link href="FlightCollection(carrid='AA',connid='0017',fldate=datetime'2013-05-01T00%3A00%3A00')/FlightCarrier" rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/FlightCarrier" type="application/atom+xml;type=entry" title="FlightCarrier"/><content type="application/xml"><m:properties><d:flightDetails m:type="RMTSAMPLEFLIGHT.FlightDetails"><d:countryFrom>US</d:countryFrom><d:cityFrom>new york</d:cityFrom><d:airportFrom>JFK</d:airportFrom><d:countryTo>US</d:countryTo><d:cityTo>SAN FRANCISCO</d:cityTo><d:airportTo>SFO</d:airportTo><d:flightTime>361</d:flightTime><d:departureTime>PT11H00M00S</d:departureTime><d:arrivalTime>PT14H01M00S</d:arrivalTime><d:distance>2572.0000</d:distance><d:distanceUnit>SMI</d:distanceUnit><d:flightType/><d:period>0</d:period></d:flightDetails><d:carrid>AA</d:carrid><d:connid>0017</d:connid><d:fldate>2013-05-01T00:00:00</d:fldate><d:PRICE>422.94</d:PRICE><d:CURRENCY>USD</d:CURRENCY><d:PLANETYPE>747-400</d:PLANETYPE><d:SEATSMAX>385</d:SEATSMAX><d:SEATSOCC>372</d:SEATSOCC><d:PAYMENTSUM>191604.78</d:PAYMENTSUM><d:SEATSMAX_B>31</d:SEATSMAX_B><d:SEATSOCC_B>31</d:SEATSOCC_B><d:SEATSMAX_F>21</d:SEATSMAX_F><d:SEATSOCC_F>19</d:SEATSOCC_F></m:properties></content></entry>]

Friday, October 11, 2013

SAP NW Gateway with Fuse and DV

Travel Triage v1.0

The Travel Triage Reference Implementation v1.0 shows the integration of Red Hat JBoss Data Virtualization, Red Hat JBoss Fuse, SAP NetWeaver Gateway and MySQL.  The Android application communicates with Fuse through MQTT and with Data Virtualization through REST.

The demo architecture is described in this diagram-



Section 1 - Red Hat JBoss Developer Program

The JBoss developer program allows developers to download the Enterprise Software from Red Hat to try for free without having to purchase a subscription.  The developer can create , deploy and test applications in a development environment before purchasing subscriptions for the production environment.  For this Reference Architecture you can download the same products at-

Data Virtualization 6 - http://www.jboss.org/products/datavirt.html
Fuse 6 - https://www.jboss.org/products/fuse.html
JBDS 7 - https://www.jboss.org/products/jbds.html
JBDS Core and Integration Stack - http://www.jboss.org/tools/download

Section 2 - Red Hat JBoss Fuse 6 Overview and Integration to SAP NetWeaver Gateway

JBoss Fuse is composed of several community projects - Apache ActiveMQ, Apache CXF, Apache Karaf and Apache Camel.  We will highlight Apache ActiveMQ and Apache Camel.

Apache Camel is a integration framework based on Enterprise Integration Patterns.  Camel allows you to define routing and mediation rules in a variety of domain-specific languages (DSL). Camel exposed many component implementations via Uniform Resource Identifier (URI).  One of those components are the SAP NetWeaver Gateway component.  The sap-netweaver componenet integrates with the SAP NetWeaver Gateway using HTTP transports.  In this demonstration the camel route with the Spring DSL to get a command from a file, use it with the sap-netweaver component and then use the results.

Apache ActiveMQ is the open source messageing and integration pattern server.  ActiveMQ supports a variety of Cross Language Clients and protocols.  In this demonstration we are using the MQTT protocol.  MQTT is a lightweight machine-to-machine (M@M) publish and subscribe messaging protocol.

Section 3 - Red Hat JBoss Data Virtualization 6 Overview and Integration to SAP NetWeaver Gateway

Data Virtualization allows applications to use data from multiple, heterogenous data stores.  Through abstraction and federation, the data is accessed and integrated in real-time across distributed data sources copying or moving data from its system of record.  Teiid is the community project that is the basis for Data Virtualization.

In our demonstration we are using MySQL and SAP NetWeaver Gateway as the datasources and expose them as one datasource to the application.

Section 4 - Developer Resources

Slides from SAP Workshop -http://www.slideshare.net/opensourcementor/sap-webinarbriefingsep2013final

Using MQTT with Fuse and Android - http://www.ossmentor.com/2013/10/red-hat-jboss-mq-and-iot.html
  with code - https://github.com/kpeeples/a-mq-android-mqtt

Using the Camel SAP NetWeaver Gateway with Fuse - http://www.ossmentor.com/2013/10/using-camel-sap-netweaver-gateway.html
  with code - https://github.com/kpeeples/Fuse-sap-netweaver-gateway-component

Travel Triage Code - https://github.com/kpeeples/sap-partner-outreach

Red Hat Webinar next week - Sneak Preview of the next SOA Platform

Sneak preview of the next version of Red Hat JBoss SOA Platform 

Red Hat introduces a new way to integrate your services, applications, and data. Join our webinar for a demonstration of the next version of Red Hat JBoss SOA Platform’s features and functionality.
Want to create simple and flexible services that hide the complexity of integrating with different enterprise applications? A service-oriented architecture (SOA) platform can enable faster and easier mobile, cloud, and business process management (BPM) projects in your organization.
Attend this webinar to understand the new capabilities in the upcoming version of the JBoss SOA Platform, Red Hat's middleware solution for application integration, messaging, SOA, and service governance requirements.

Overview and deep dive into the next version of JBoss SOA Platform

During the webinar, we will present an overview of the platform, then run through a quick demonstration. The demonstration will cover:
  • The structure and layout of an application on the next version of the JBoss SOA Platform.
  • How to implement service logic and configure service bindings.
  • Configuring declarative transformation.
  • Exploring unit test services.
  • Deploying the application to the platform.
We will also provide links to resources such as our in-depth home loan demo, which uses several of Red Hat’s SOA capabilities

Date: October 17, 2013 Time: 15:00 UTC | 11 a.m. (New York) / 5 p.m. (Paris) / 8:30 p.m. (Mumbai)

http://www.redhat.com/about/events-webinars/webinars/2013-10-17-sneak-preview-jboss-soa-p

Thursday, October 10, 2013

JBoss Weekly Editorial by Eric Schabell

JBoss Open Source Goodness for this week from Eric Schabell - https://community.jboss.org/blogs/weekly-editorial/2013/10/10/this-week-in-jboss-10-october-2013

Wednesday, October 9, 2013

JBoss Data Virtualization Beta v6 is available!


Introducing Red Hat JBoss Data Virtualization v6.0 Beta!



JBoss Data Virtualization is the new name for JBoss Data Services. Key new features and capabilities in JBoss Data Virtualization v6 are:
  • New Big Data and Cloud Data Integration include support for Apache Hadoop, NoSQL - JBoss Data Grid and Mongo DB (Tech Preview) sources along with OData support (SAP integration) and Salesforce.com (SaaS).
  • New Business Dashboard - quickly build reports and visualize data with the new business dashboard.
  • Enhanced Developer Productivity with new Teiid Designer 8 integrated with JBoss Developer Studio and DDL based Virtual DB definitions, import/reuse, and native queries support.
  • Simplified deployment and packaging includes JBoss Enterprise Application Platform.  DV v6 does not require SOA-P.
Get started with Data Virtualization by following our Getting Started Video Series. Through the JBoss Developer Program the Enterprise product can be download from the JBoss.org Products page at http://www.JBoss.org/products/datavirt and development use is free.


To learn more and Beta download visit: http://www.jboss.org/products/datavirt 

Tuesday, October 8, 2013

Hadoop World in NY

Join us at Hadoop World in NY October 28-31!

It is Co-Presented by Cloudera and O'Reilly - http://strataconf.com/stratany2013

A demonstration of Red Hat JBoss Data Virtualization with Hive/Hadoop will be shown at the Red Hat booth.


Red Hat JBoss A-MQ and the IoT

How to be a JBoss A-MQ and Android Rock Star in the world of the Internet of Things!

I wanted to pull together a simple example of how to leverage Red Hat JBoss A-MQ in the Internet of Things (IoT) through the use of Message Queue Telemetry Transport (MQTT) in Android.  The first part of the article will highlight the concepts and technologies used in the demonstration.  The second part will get you up and running with an example in a couple of minutes just like a rock star.  The example shows how easy it is to publish and subscribe to a topic in JBoss A-MQ from Android using the MQTT Client.

Part 1 - The concepts

What is MQTT?

MQTT is a machine-to-machine (M2M)/"Internet of Things" connectivity protocol. It was designed as an extremely lightweight publish/subscribe messaging transport. It is useful for connections with remote locations where a small code footprint is required and/or network bandwidth is at a premium. [1]
 
MQTT is now an open standard through OASIS. The first meeting of the OASIS MQTT Technical Committee was held on 26 March 2013 in Boston as a F2F (Face 2 Face) meeting. [2]  A very good overview on MQTT from Dave Locke is in the references. [3]

What is Red Hat JBoss A-MQ?


A small footprint, high performance, open source messaging platform based on Apache ActiveMQ. [8]  Under the Red Hat Developer program the JBoss A-MQ Enterprise software is available for developers to try, FOR FREE! 

What supporting projects are included in the demonstration?

The demonstration includes code from the Red Hat JBoss Fuse MQTT Client library that Hiram Chirino started.  The library supports Blocking, Future and Callback/Continuation Passing Based APIs.  The source is located in the references. [4]  I included the library in the project.  I also utilized the code from Jason Sherman for the sample Android Application. [5] [6]  In addition I utilized Eric Schabell's JBoss Rock Star template for a quick build of the demonstration.  [7]

The only updates to the activemq.xml file that are required are:
1. The transport connector for mqtt.  The standard port is 1883.
<transportConnectors>  
  <transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>  
  <transportConnector name="mqtt" uri="mqtt+nio://0.0.0.0:1883"/>  
</transportConnectors> 
2. To enable security we just use the SimpleAuthenticationPlugin.
<plugins>
   <simpleAuthenticationPlugin>
      <users>
         <authenticationUser username="system" password="manager" groups="users,admins"/>
         <authenticationUser username="user" password="password" groups="users"/>
         <authenticationUser username="guest" password="password" groups="guests"/>
      </users>
   </simpleAuthenticationPlugin>
</plugins>

The main code in the Android app is in the MQTTActivity.java file in the org.example.mqtt package.  The android app UI is in the main.xml and can be seen in the graphical layout.

Part 2 - The demo

Steps  to build and run the demo

1. Download the code from github at https://github.com/kpeeples/a-mq-android-mqtt
2. Download Red Hat JBoss A-MQ from https://www.jboss.org/products/amq.html and place in the installs directory.


3. Download the Android Bundle from http://developer.android.com/sdk/index.html and unzip.


4. Download and start JBoss Developer Studio 7 or the Fuse IDE.

5. Add the Android Developer Plugins http://rgladwell.github.com/m2e-android/updates/

6. Create a Android Virtual Device (AVD) through JBDS in the Android Virtual Device Manager in the Window menu.  If the Android Virtual Device Manager does not show on the Window menu then Click on Window > Customize perspective > Command Groups Availability tab. Check the "Android SDK and AVD Manager" option and hit the OK button.

7. Import the Android project in JBDS


8. Run the init.sh to setup A-MQ

9. Start A-MQ in the foreground by executing target/jboss-a-mq-6.0.0.redhat-024/bin/amq


10. Right click on AndroidManifest.xml and Run As Android.

11. Connect to the broker and make sure to use the IP instead of localhost and use a username/password entered from the activemq.xml

12. Enter a destination topic and a test message then click send

13. The message will sent to the topic, read from the topic and then placed in the received field.


References:

[1] http://mqtt.org/
[2] https://www.oasis-open.org/committees/tc_home.php?wg_abbrev=mqtt
[3] https://www.oasis-open.org/committees/download.php/49205/MQTT-OASIS-Webinar.pdf 
[4] https://github.com/fusesource/mqtt-client
[5] http://java.dzone.com/articles/android-mqtt-activemq
[6] https://github.com/jsherman1/android-mqtt-demo.git
[7] https://github.com/eschabell/jboss-rock-star-template
[8] https://www.jboss.org/products/amq.html


Wednesday, October 2, 2013

Red Hat Summit 2014

Submit your papers for Red Hat Summit 2014 in San Francisco, CA!

IMPORTANT DATES

  • Nov. 5, 2013: Call for proposals closes
  • January 2014: Speaker notifications sent
  • May 25, 2014: Signed release forms due, presentation slides due
  • March 25 - April 8, 2014: Presentation rehearsals
  • April 14 - 17, 2014: Red Hat Summit in San Francisco, CA
http://www.redhat.com/summit/agenda/

Tuesday, October 1, 2013

Part 1: Using Data Virtualization with Hortonworks Data Platform 2.0

Part 1: Data Virtualization with Hortonworks Data Platform 2.0 Beta

In this blog we will cover how to setup the HDP Sandbox.  Part 2 will cover how to connect with Data Virtualization.

1. Download the Hortonworks Data Platform 2.0 with Sandbox (BETA)
http://hortonworks.com/products/hdp-2/#install




2.  Import the Appliance into VMWare, VirtualBox or Hyper-V.  We are using Virtual Box.

The import should take several minutes


3. Start the Virtual Machine

NOTE: I set the network to a Bridged Network.  The IP assigned was 192.168.2.9.

4. With the browser use the beeswax UI to browse the data from Hive http://192.168.2.9:8000/beeswax/ In the query editor run 'show tables;'


Result: