<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>JSON Rules</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Adrian Giurca</string-name>
          <email>giurca@tu-cottbus.de</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Emilian Pascalau</string-name>
          <email>pascalau@tu-cottbus.de</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Brandenburg University of Technology</institution>
          ,
          <country country="DE">Germany</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>This paper presents a JSON based rule language and its JavaScript-based rule engine towards providing Web 2.0 applications with rule-based inference capabilities. For interoperability purposes the Rule Interchange Format is used. While the rule engine is enough general, its main purpose is to execute production rules and Event-ConditionAction rules related to the web page DOM processing. This way the user's browsing experience will be enriched with the ability to modify on the fly the DOM of the current document as well as the browser user interface (Firefox).</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>Introduction</title>
      <p>for data that is going to be transmitted over network. While the rule engine
is enough general, its main purpose is to execute production rules and
EventCondition-Action rules related to the web page Document Object Model (DOM)
processing. This way the user’s browsing experience will be enriched with the
ability to modify on the fly the DOM of the current document as well as the
browser user interface (Firefox).
2</p>
    </sec>
    <sec id="sec-2">
      <title>Related Work</title>
      <p>
        While the ideas of RIAs are not new (see [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]) the rule-based RIAs proposals
are quite recent. A project was started in May 2008 by Project 6 Research 2.
However, the goals of this project are limited to XPath processing i.e. rules
conditions are similar with test from XSLT while the actions are not clearly
specified. In overall, the concepts are far away to be clear and we did not see
to much advance. Also this product is commercial and no demos are available.
There are also concerns to emulate a rule parser in Adobe Flex framework3 but
the goal seems to be a client side Drools[
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] parser.
      </p>
      <p>
        The most advanced work seems to be in [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] (May 2008) where two-layer
architecture for rule-enabled RIAs is described. This paper is a good starting
point but as a general architecture document, it does not formally provide a
Model-Driven Architecture like, platform independent model. In addition the
paper is not focused on the rule language description neither to the client-side
rule execution. This work was also related in [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ].
3
      </p>
    </sec>
    <sec id="sec-3">
      <title>The Rule Language</title>
      <p>JSON notation combined with JavaScript function calls offers large capabilities
to express various kinds of rules. Recall that we deal both with production rules
and with Event-Condition-Action (ECA) rules i.e. rules of the form
Rule ID: ON EventExpression IF C1 &amp;&amp; ... &amp;&amp; Cn DO [A1, ..., Am]
where the event part is optional and denotes an event expression matching the
triggering events of the rule; C1, ... Cn are boolean conditions using a Drools like
syntax and [A1, ... Am] is a sequence of actions.</p>
      <p>The metamodel of a JSON Rule is depicted in Figure 1.</p>
      <p>Example 1 (Production Rule).</p>
      <p>For all elements of class ’note’ having as first child a ’ul’ change the
first child background color to blue. Expressed in a logical form the
above example looks like: ∀x∃y(Element(x) ∧ x.class =0 note0 ∧ y =
x.f irstChild ∧ y.nodeN ame =0 ul0) → changeBackground(y,0 blue0)
2 http://www.p6r.com/articles/2008/05/22/an-xpath-enabled-rule-engine/
3 http://archives.devshed.com/forums/compilers-129/
writing-a-rules-parser-in-actionscript-javascript-2370024.html</p>
      <sec id="sec-3-1">
        <title>EventExpression</title>
      </sec>
      <sec id="sec-3-2">
        <title>JSONRule</title>
        <p>id : String
priority : Integer = 1
appliesTo : URL
conditions
0..*</p>
        <sec id="sec-3-2-1">
          <title>Atom</title>
          <p>1..*
actions
prr::Action
{"id":"rule101",
"appliesTo": ["http://www.example.org/JRules",</p>
          <p>"http://www.google.com/"],
"condition": "$X:Element( class==’note’,</p>
          <p>$Y:firstChild)
&amp;&amp;
($Y.nodeName == ’ul’)",
"actions":["changeBackground($Y, ’blue’)"]
}
The above example shows that a JSON rule is first of all, a JSON object. The
appliesTo property states that the rule will apply only on the specific indicated
pages (URLs).</p>
          <p>The condition uses a Drools like syntax and state that all elements with
the class attribute equals with note (i.e. $X:Element(class==’note’)) and with
the first child an unsorted list (i.e. $Y.nodeName == ’ul’) must participate in
the action.</p>
          <p>The action changeBackground($X, ’blue’) should be an available
userdefined function call. If no such function is available then no action is performed.</p>
          <p>JSON Rules are also ECA Rules i.e. they are triggered by events (see Example
4). Below we provide descriptions of the rule constituents.
3.1</p>
          <p>Condition
A rule condition is always a conjunction of atoms. Empty conditions are
interpreted as true conditions. As can be seen in the Figure 2, the language supports
three kinds of atoms: JavaScriptBooleanCondition, Description and
XPathCondition. The reader should notice that future extensions may involve other kinds
of atoms.</p>
        </sec>
      </sec>
      <sec id="sec-3-3">
        <title>JavaScriptBooleanCondition Description</title>
        <p>*
1
binding</p>
        <sec id="sec-3-3-1">
          <title>JSONTerm</title>
          <p>JavaScriptBooleanCondition This is the simplest conditional atom. Any
JavaScript boolean expression is allowed. For example window.find(’rule’)
or document.getElementById(’id’).value==10 are allowed.</p>
          <p>Description This atom is related to the syntax of Drools pattern conditional.
The metamodel of language descriptions is depicted in Figure 3.</p>
          <p>A Description is bound to a JSONTerm, has a type and has a list of
constraints. The type is one of the values described by DescriptionType enumeration.
These values correspond to the node types defined in DOM Level 2 Core
specification 4.</p>
          <p>The Description offers two types of constraints PropertyRestriction and
PropertyBinding.</p>
          <p>– A PropertyRestriction (see Figure 3) describes a set of value restrictions to
properties of the JSONTerm that are bound to it.</p>
          <p>• The string property encodes a property name of a property belonging to
the corresponding bounded JSONTerm.
• operator is relational one.
• The value is either a JSONTerm (Variable or DOM:Node), or a
RegularExpression, or a String or a Number.
– A PropertyBinding performs a variable binding of a property belonging to
the related JSONTerm. After that this variable becomes available at the rule
level (See example 1).</p>
          <p>The condition below stands for all DOM entities of type Element that are
text input elements with the value date of the form yyyy-mm-dd. Notice that
for the value we used a regular expression that checks its format. Month can be
only between 01-12. The regular value for day can not be greater than 31, and
for month 02 the value for day can not be greater than 29.
4 http://www.w3.org/TR/DOM-Level-2-Core/idl-definitions.html
type
«enumeration»</p>
          <p>DescriptionType
+DOCUMENT_TYPE
+PROCESSING_INSTRUCTION
1 +DOCUMENT
+ELEMENT
+ATTRIBUTE
+TEXT
+CDATA
+COMMENT
+FRAGMENT
+NODE_LIST
*
1</p>
          <p>operator
«enumeration»
RelationalOperator
+EQ
+LE
+LEQ
+GE
+GEQ
JSONTerm
binding</p>
          <p>*
DOM::Node
*</p>
          <p>Value</p>
          <p>Constraint
1
1
*</p>
          <p>*
constraints
PropertyBinding
property : String</p>
          <p>PropertyRestriction
property : String
javascript::Number</p>
          <p>javascript::String
javascript::RegularExpression
XPathCondition The XPathCondition (see the metamodel in Figure 4) is the
third type of conditional atom. This one compared with the other might be a
little peculiar. For a usage example of this type of conditional we are going to
use the example page below.</p>
          <p>Example 3 (An XPath Condition). Consider the following page with the view
depicted in Figure 5:
&lt;?xml version="1.0"?&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html&gt;
&lt;head&gt;</p>
          <p>&lt;title&gt;XPathCondition&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id="_div1" &gt;
&lt;table border="1"&gt;
&lt;tr&gt; &lt;td&gt;T1:row 1, cell 1&lt;/td&gt; &lt;td&gt;T1:row 1, cell 2&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;T1:row 2, cell 1&lt;/td&gt; &lt;td&gt;T1:row 2, cell 2&lt;/td&gt; &lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div id="_div2"&gt;
&lt;table border="1"&gt;
&lt;tr&gt; &lt;td&gt;T2:row 1, cell 1&lt;/td&gt; &lt;td&gt;T2:row 1, cell2 &lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt; &lt;td&gt;T2:row 2, cell 1&lt;/td&gt; &lt;td&gt;T2:row 2, cell 2&lt;/td&gt; &lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</p>
          <p>Such a conditional can be bound to a JSONTerm (Figure 3. Recall that a
JSONTerm is either a Variable or a DOM:Node.</p>
          <p>Assuming that we want to change the background for all rows in all tables
in the DOM of the current page, using the XPathCondition, the condition is:
"$X in "html//table//tr"
The variable $X has been used along with the reserved word in. The meaning is
”forall $X in the collection...” The evaluation of the xPathExpression returns a
list of nodes ( In the previous example, the evaluation of the xPathExpression
returns 4 nodes).</p>
          <p>On the other hand, if we want to change the background only for a specific
node by using an XPathCondition the condition is:
{"nodeName":"tr",
"firstChild":{"nodeName":"td",
"textContent":"T2:row1, cell 1"
}
} in "html//table//tr"
After evaluating the condition the background should be changed only for the
first row of the second table (see Figure 5).
3.2</p>
          <p>
            Actions
Our approach deals with standard actions of OMG Production Rule
Representation (PRR), [
            <xref ref-type="bibr" rid="ref9">9</xref>
            ]. The reader should notice that any user-defined JavaScript
functions can be called in the rule actions part. Below is the mapping of the
PRR standard actions to our language:
          </p>
          <p>PRR Standard Actions JSON Rules
AssignExp change properties of an element
InvokeExp any JavaScript function call
AssertExp insert a DOM node
RetractExp remove a DOM node
UpdateExp update a DOM node</p>
          <p>An invoke action is already provided in Example 1. It corresponds to a
JavaScript function-call. The function must be available otherwise the action
is ignored (not executed).</p>
          <p>An assign action is usually intended to change the properties of an element.
For example
$X.setAttribute("value", "25")
is an assign action changing the value attribute of an input element bounded
to the variable $X. If $X is not bounded to an element allowing the attribute
value then the engine will ignore such action.</p>
          <p>An assert action is related to the creation of new nodes in the DOM e.g.
is an assert action.</p>
          <p>A retract action is the inverse of the assert action i.e. deletes a node from
the DOM.</p>
          <p>An update action is usually related to the content update of a DOM node.
For example
$X.replaceChild($Y,$Z)
is an assert action.</p>
          <p>*
*
eventTarget
«enumeration»</p>
          <p>DOM::EventType
+LOAD = load
+UNLOAD = unload
+ONDBLCLK = ondblclick
+...</p>
          <p>type
0..1</p>
          <p>The JSON event expression is related to the Event interface specification in
DOM Level 2 Events5, therefore the properties of this expression have the same
meaning as in the Event specification. At the runtime these properties of this
expression are matched against the incoming DOM events and their values can
be processed in the rule conditions and actions.</p>
          <p>Example 4 (ECA Rule).
{"id":"rule102",
"appliesTo":["http://mail.yahoo.com/"],
"eventExpression": { "eventType": "click",</p>
          <p>"eventTarget": "$X"
},
"condition":" ($X.nodeName == ’a’,</p>
          <p>$X.href==’match(showMessage\?fid=Inbox)’)",
"actions":["append($X.textContent)"]
}</p>
          <p>The rule from example 4 concerns the Yahoo mail and states that when
click event is raised, if the event came from an a element, and if the href
property matches the regular expression (rudimentary check that the link is an
inbox Yahoo message link) then call append function with the message subject
as parameter.
3.4</p>
          <p>Additional parameters
In addition to its main constituents a rule provides some other parameters:
5 http://www.w3.org/TR/DOM-Level-2-Events/
– The id is required and denotes the unique identifier of a rule.
– The appliesTo property is required and holds a list of URLs on which the
rule must apply e.g. the rule from Example 1 can be applied to the pages
http://www.example.org/JRules and to http://www.google.com/.
– Priority expresses the order of a rule in a ruleset. If no value is provided for
it, default value is ”1”. Based on priorities the rule engine must execute the
rules in a down counting order (from greater values to lower values). The
execution order is not relevant for rules having the same priority.
4</p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>The Rule Engine</title>
      <p>
        The main characteristics of the rule engine are:
– Is a forward chaining rule engine using a modified RETE algorithm (see [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]
for the standard version) for production rules ;
– Uses the above rule language as well as RIF XML.
– Deals with two different types of rules: production rules and ECA Rules
– DOM events are processed as atomic events (i.e. no duration).
– Rules are stored locally or remote or both.
– The engine execute rulesets (a ruleset is the set of all rules referring to a
specific URL).
– The RETE working memory is the document DOM itself. Rule property
restrictions are matched against DOM entities (such as elements processing
instructions, attributes an so on).
      </p>
      <p>The component view of the engine is depicted in the Figure 7.</p>
      <p>EventManager</p>
      <p>InferenceEngine</p>
      <p>RulesRepository
Fig. 7. Rule Engine</p>
      <p>WorkingMemory</p>
      <p>A UML state diagram describing the functionality of the engine is depicted
in the Figure 8.</p>
      <p>When the InferenceEngine is started it loads the corresponding rules from
the RuleRepository. After the rules are loaded, the EventManager gets active
and it listens for events from the WorkingMemory. When it receives events from
the WorkingMemory, the EventManager informs the InferenceEngine about it.
The InferenceEngine computes rules to fire. If rules are found then it fires them,
and the WorkingMemory is changed. When no rules are computed then it stops.</p>
      <p>RuleRepository</p>
      <p>RulesLoaded
DeterminePossibleRulesToFire</p>
      <p>InformOfEvents</p>
      <p>Rule Loading
EventManager
Opposed to usual rule engines, that stop their activity when no rules can be
fired, this stops only when the WorkingMemory exists no more. When rules can
not be fired, but the WorkingMemory still exists, the engine gets into an idle
state, and waits to be informed about new events from the EventManager.
Is represented by the DOM of the current page. The WorkingMemory is special
because it is event based, DOM is changed through events.
Is the ”brain” of the system. Based on the facts (DOM) of the Working Memory
and based on the current page corresponding ruleset, it performs the matching
operation and executes rules.
The event manager is a combination between JavaScript and the Working
Memory - DOM of the current page. The Event Manager takes advantage of the fact
that the DOM itself is event based. All changes and in general all DOM events
are reported to the main document object. This is based on the bubbling effect
of DOM events.
Rules are stored in the repository. The repository can be local or remote. In both
cases the storing language is JSON based as described in Section 3.
5</p>
    </sec>
    <sec id="sec-5">
      <title>Conclusion and future work</title>
      <p>
        This paper describes an approach of enriching RIAs with rule-based reasoning.
JSON Rules provides the JavaScript engine with reasoning capabilities and the
users can write their own rules. The rules syntax is based on JSON notation,
therefore does not require high effort to accommodate it. Rules are simpler but
powerful, their main goal being to change the DOM of the page they apply. The
rule actions comply with the proposed OMG standard for production rules and
are enough general to achieve all kind of DOM changes as well as any kind of
side effects. The next immediate step will take into account the engine
interaction with both user defined events and XMLHTTPRequest events to increase
the power of the reaction rules to dynamically handle the page AJAX-based
interactions. On a medium term JSON Rules should deal with metadata (with
emphasis on RDF[
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]) both for embedded metadata (such as RDFa [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]) and
external metadata (such as RSS [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] and Atom[
        <xref ref-type="bibr" rid="ref13">13</xref>
        ]). In addition, sharing rules is
a feature that can improve user experience and also, might spare him the time
of writing rules by himself, in the case he can find rules for the page being
interested in. The user can share with his friend, or with everybody. Rule sharing
goes hand in hand with rule publishing.
      </p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <given-names>Ben</given-names>
            <surname>Adida</surname>
          </string-name>
          and
          <string-name>
            <given-names>Mark</given-names>
            <surname>Birbeck</surname>
          </string-name>
          . RDFa Primer:
          <article-title>Embedding Structured Data in Web Pages</article-title>
          .
          <source>W3C Working Draft 17 March</source>
          <year>2008</year>
          . http://www.w3.org/TR/ xhtml-rdfa-primer/.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <given-names>Jeremy</given-names>
            <surname>Allaire</surname>
          </string-name>
          .
          <article-title>Macromedia Flash MXA next-generation rich client</article-title>
          . http://www. adobe.com/devnet/flash/whitepapers/richclient.pdf,
          <year>March 2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <given-names>RSS</given-names>
            <surname>Advisory</surname>
          </string-name>
          <article-title>Board</article-title>
          .
          <source>RSS 2</source>
          .0 Specification. http://www.rssboard.org/ rss-specification.
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <given-names>Harold</given-names>
            <surname>Boley</surname>
          </string-name>
          and
          <string-name>
            <given-names>Michael</given-names>
            <surname>Kifer</surname>
          </string-name>
          .
          <article-title>RIF Basic Logic Dialect</article-title>
          . http://www.w3.org/ 2005/rules/wiki/BLD,
          <year>October 2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <given-names>Douglas</given-names>
            <surname>Crockford</surname>
          </string-name>
          .
          <article-title>The application/json Media Type for JavaScript Object Notation (JSON)</article-title>
          . http://tools.ietf.org/html/rfc4627,
          <year>July 2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <given-names>Charles</given-names>
            <surname>Forgy</surname>
          </string-name>
          .
          <article-title>Rete - A Fast Algorithm for the Many Pattern / Many Object Pattern Match Problem</article-title>
          .
          <source>Artificial Intelligence</source>
          ,
          <volume>19</volume>
          :
          <fpage>17</fpage>
          -
          <lpage>37</lpage>
          ,
          <year>1982</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Klyne</surname>
            <given-names>G.</given-names>
          </string-name>
          and
          <string-name>
            <surname>Caroll J.J. Resource Description</surname>
          </string-name>
          <article-title>Framework (RDF): Concepts and Abstract Syntax</article-title>
          .
          <source>W3C Recommendation 10 February</source>
          <year>2004</year>
          . http://www.w3.org/ TR/rdf-concepts/.
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <given-names>Jesse</given-names>
            <surname>James Garrett. Ajax</surname>
          </string-name>
          :
          <article-title>A new approach to web applications</article-title>
          . http://www. adaptivepath.com/ideas/essays/archives/000385.php,
          <year>February 2005</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9. OMG.
          <article-title>Production Rule Representation (PRR), Beta 1</article-title>
          .
          <source>Technical report</source>
          ,
          <year>November 2007</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <given-names>Mark</given-names>
            <surname>Proctor</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Michael</given-names>
            <surname>Neale</surname>
          </string-name>
          , Michael Frandsen, Sam Griffith Jr.,
          <string-name>
            <surname>Edson</surname>
            <given-names>Tirelli</given-names>
          </string-name>
          , Fernando Meyer, and Kris Verlaenen.
          <source>Drools 4.0</source>
          .7. http://downloads.jboss. com/drools/docs/4.0.7.19894.GA/html single/index.html.
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Kay-Uwe Schmidt</surname>
            , J¨org D¨orflinger, Tirdad Rahmani, Mehdi Sahbi, Susan Thomas,
            <given-names>and Ljiljana</given-names>
          </string-name>
          <string-name>
            <surname>Stojanovic</surname>
          </string-name>
          .
          <article-title>An User Interface Adaptation Architecture for Rich Internet Applications</article-title>
          .
          <source>In Proceedings of 5th European Semantic Web Conference</source>
          <year>2008</year>
          ,
          <article-title>ESWC 2008</article-title>
          , Tenerife, Spain, volume
          <volume>5021</volume>
          of Lecture Notes in Computer Science. Springer Verlag,
          <year>June 2008</year>
          .
          <article-title>(accepted).</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Kay-Uwe Schmidt</surname>
            and
            <given-names>Ljiljana</given-names>
          </string-name>
          <string-name>
            <surname>Stojanovic</surname>
          </string-name>
          .
          <article-title>From Business Rules to Application Rules in Rich Internet Applications</article-title>
          .
          <source>In Proceedings of Business Information Systems 11th International Conference, BIS</source>
          <year>2008</year>
          , Innsbruck, Austria, May 5-
          <issue>7</issue>
          ,
          <year>2008</year>
          , volume
          <volume>7</volume>
          <source>of Lecture Notes in Business Information Processing</source>
          , pages
          <fpage>447</fpage>
          -
          <lpage>458</lpage>
          . Springer Berlin Heidelberg,
          <year>2008</year>
          . http://dx.doi.org/10.1007/ 978-3-
          <fpage>540</fpage>
          -79396-0
          <fpage>39</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Atom</surname>
            <given-names>WG</given-names>
          </string-name>
          .
          <article-title>Atom Publishing Format and Protocol</article-title>
          . http://tools.ietf.org/wg/ atompub//.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>