mirror of
https://github.com/moparisthebest/xeps
synced 2024-11-24 02:02:16 -05:00
451 lines
22 KiB
XML
451 lines
22 KiB
XML
<?xml version='1.0' encoding='UTF-8'?>
|
|
<!DOCTYPE xep SYSTEM 'xep.dtd' [
|
|
<!ENTITY % ents SYSTEM 'xep.ent'>
|
|
%ents;
|
|
]>
|
|
<?xml-stylesheet type='text/xsl' href='xep.xsl'?>
|
|
<?xml-stylesheet type="text/css" href="xmpp.css"?>
|
|
<xep>
|
|
<header>
|
|
<title>Mediated Information eXchange (MIX): JID Hidden Channels.</title>
|
|
<abstract>This document defines an extension to Mediated Information eXchange (MIX) specified in XEP-0369. This specification extends MIX to provide a number of privacy control options and in particular JID Hidden Channels. </abstract>
|
|
&LEGALNOTICE;
|
|
<number>0404</number>
|
|
<status>Experimental</status>
|
|
<type>Standards Track</type>
|
|
<sig>Standards</sig>
|
|
<approver>Council</approver>
|
|
<dependencies>
|
|
<spec>XMPP Core</spec>
|
|
<spec>XMPP IM</spec>
|
|
<spec>XEP-0004</spec>
|
|
<spec>XEP-0030</spec>
|
|
<spec>XEP-0054</spec>
|
|
<spec>XEP-0060</spec>
|
|
<spec>XEP-0084</spec>
|
|
<spec>XEP-0128</spec>
|
|
<spec>XEP-0198</spec>
|
|
<spec>XEP-0292</spec>
|
|
<spec>XEP-0297</spec>
|
|
<spec>XEP-0313</spec>
|
|
<spec>XEP-0369</spec>
|
|
<spec>XEP-0372</spec>
|
|
<spec>XEP-0403</spec>
|
|
</dependencies>
|
|
<supersedes/>
|
|
<supersededby/>
|
|
<shortname>MIX-ANON</shortname>
|
|
&ksmithisode;
|
|
&skille;
|
|
<revision>
|
|
<version>0.1.0</version>
|
|
<date>2018-05-21</date>
|
|
<initials>sek</initials>
|
|
<remark><p>
|
|
Split out from MIX 0.10.0;
|
|
</p></remark>
|
|
</revision>
|
|
|
|
</header>
|
|
<section1 topic='Introduction' anchor='intro'>
|
|
<p>The Mediated Information eXchange (MIX) protocol framework and core capabilities are specified in &xep0369; (MIX-CORE). This specification provides mechanisms to hide participant JIDs from other participants. This is needed to address privacy concerns and to prevent JID harvesting. It also addresses privacy issues, and gives participants options to control sharing of information.
|
|
</p>
|
|
|
|
</section1>
|
|
|
|
|
|
|
|
<section1 topic='Concepts' anchor='concepts'>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<section2 topic="Private Messages" anchor="concepts-pm">
|
|
<p>
|
|
&xep0369; exposes participant JIDs to other participants, and so messages can always be sent directly. When JIDs are hidden this is no longer possible.
|
|
Private messages MAY be sent to channel participants if allowed by channel policy. Private messages are
|
|
addressed to the user's bare proxy JID determined from the participants node, and routed by the MIX to the user's bare real JID, where standard distribution rules will apply.
|
|
</p>
|
|
|
|
</section2>
|
|
|
|
<section2 topic="JID Visibility Services" anchor="proxy-jid-services">
|
|
|
|
|
|
<p>
|
|
MIX channels have three modes controlling JID visibility, defined to prevent JID harvesting:
|
|
</p>
|
|
<table caption="JID Visibility Modes">
|
|
<tr><th>Mode</th><th>Description</th></tr>
|
|
<tr><td>'JID Visible'</td><td>In these channels all participant JIDs are visible to all channel participants.</td></tr>
|
|
<tr><td>'JID Maybe Visible'</td><td>In these channels, participant JIDs are visible to all channel participants when participant preference allows.</td></tr>
|
|
<tr><td>'JID Hidden'</td><td>In these channels, no participant JIDs are visible to channel participants, but they are visible to channel administrators.</td></tr>
|
|
</table>
|
|
<p>
|
|
A channel participant MAY specify a preference for JID visibility for the channel, with one of the following values:
|
|
</p>
|
|
<table caption="JID Visibility Preference Options">
|
|
<tr><th>Preference</th><th>Description</th></tr>
|
|
<tr><td>'Prefer Visible'</td><td>The users JID will be visible if the channel is JID Visible or JID Maybe Visible channels and hidden if the channel is JID Hidden. </td></tr>
|
|
<tr><td>'Prefer Hidden'</td><td>The user's JID will be hidden if the channel is JID Maybe Visible and shown if the channel is JID Visible .</td></tr>
|
|
<tr><td>'Enforce Hidden'</td><td>The user's JID will never be shown and the user will be removed from channel if channel mode is changed to JID Visible.</td></tr>
|
|
<tr><td>'Enforce Visible'</td><td>The users JID will always be shown and the user will be removed from channel if mode is changed to 'JID Hidden'.</td></tr>
|
|
</table>
|
|
<p>
|
|
The default value is 'Prefer Hidden'.
|
|
</p>
|
|
</section2>
|
|
|
|
<section2 topic="JID Visibility Architecture" anchor="proxy-jid-architecture">
|
|
<p>
|
|
MUC hides real JIDs by using Nicks to identify room occupants. This has problems with Nick changing and with multiple active clients for the same user. MIX identifies channel participants by a proxy JID, which is an anonymized stable JID format identifier for each participant. In &xep0369;, the participants node provides a mapping from the proxy JID to the real JID. To hide JIDs, this specification makes two key changes
|
|
|
|
</p>
|
|
|
|
<ol>
|
|
<li>The requirement to include real JID in the participants list is relaxed for channels that are not "JID Visible". For a "JID Hidden" channel, real JIDs MUST NOT be included in the participants list. For a "JID Maybe Visible" channel, real JIDs will be included in the participants node according to participant preference. </li>
|
|
<li>In presence messages, the client resource is anonymized, to prevent leakage of information through the resource.</li>
|
|
</ol>
|
|
|
|
|
|
<p>
|
|
|
|
This change means that the client will not be able to determine real JID of the participant using the participant node, as it can with &xep0369;.
|
|
</p>
|
|
|
|
<p>
|
|
It is important that MUC owners and administrators are able to see the real JIDs of participant. For this reason, a MIX channel following this specification MUST hold a JID Map node, which gives a mapping between proxy JID and real JID.
|
|
</p>
|
|
|
|
|
|
</section2>
|
|
|
|
|
|
|
|
<section2 topic="Resource Hiding" anchor="proxy-jid-resource">
|
|
|
|
|
|
|
|
|
|
|
|
<p>
|
|
When JIDs are being hidden, the resource of the full JIDs stored in the presence node MUST also be anonymized using a similar mechanism.
|
|
First the bare JID in presence is a proxy JID, as defined in &xep0369;. Where the JID is not being hidden, the resource is simply the resource of the clients full JID. Where the JID is hidden, the resource is replaced with a generated value. For example, 'hag66@shakespeare.example/UUID-a1j/7533' in the channel coven might have a proxy JID of '123456#coven@mix.shakespeare.example/789'. There is no client visible mapping of proxy full JIDs maintained as this is not needed. The MIX channel will need to maintain a mapping, to support directly addressing clients, such as for client to client disco#info queries. While an full proxy JID is held in the presence node, the mapping to real JID MUST NOT be changed. When adding a client to the presence node, the server MAY add the same anonymized JID as used before by that client, or it MAY create a different anonymized JID.
|
|
</p>
|
|
</section2>
|
|
|
|
|
|
<section2 topic="JID Map Node" anchor="concepts-nodes">
|
|
<p>This specification defines a JID Map node, so that administrators can see real JIDs for JID Hidden channels.</p>
|
|
<table caption="JID Map Node">
|
|
|
|
<tr><td>JID Map</td><td>'urn:xmpp:mix:nodes:jidmap'</td><td>For storing a list of bare proxy JIDs from the participants node with a 1:1 mapping to the corresponding real JIDs.</td><td>Automatic</td><td>PubSub</td></tr>
|
|
|
|
</table>
|
|
|
|
|
|
|
|
|
|
|
|
<p>The JID Map node is used to associate a proxy bare JID to its corresponding real bare JID. It is a PubSub node with the 'node' attribute set to 'urn:xmpp:mix:nodes:jidmap'. The JID Map node MUST have one entry for each entry in the Participants node. This value is added when a user joins the channel and is removed when the user leaves the channel.
|
|
Each item is identified by proxy bare JID, mapping to the real bare JID. This node is used to give administrator access to real JIDs and participant access to real JIDs in jid-visible channels. This node MUST NOT be modified directly using pubsub.
|
|
In JID Visible channels, all participants MAY subscribe to this node. In JID Hidden and JID Maybe Visible channels, only administrators can subscribe. The JID Map node is a permanent node with one item per participant. Information is stored in a <participant/> element qualified by the 'urn:xmpp:mix:anon:0' namespace. The real JID is stored in a <jid/> child element of the <participant/> element. </p>
|
|
<example caption="Value of JID Map Node"><![CDATA[
|
|
<items node='urn:xmpp:mix:nodes:jidmap'>
|
|
<item id='123456#coven@mix.shakespeare.example'>
|
|
<participant xmlns='urn:xmpp:mix:anon:0'>
|
|
<jid>hecate@mix.shakespeare.example</jid>
|
|
</participant>
|
|
</item>
|
|
</items>
|
|
]]></example>
|
|
|
|
|
|
|
|
</section2>
|
|
</section1>
|
|
|
|
|
|
|
|
<section1 topic='Use Cases' anchor='usecases'>
|
|
|
|
|
|
|
|
<section2 topic="User Preferences and Additional Information" anchor="usecase-visibilty-pref">
|
|
<p>A channel MAY store user preferences and parameters with each user. A user JID visibility preference has the following values:
|
|
</p>
|
|
|
|
<ol>
|
|
<li>'default'. In this setting, the channel default value will be used. This value is used if another value is not explicitly set. This means JID is visible for a JID Visible channel and JID is hidden for JID Hidden and JID Maybe Visible channels.</li>
|
|
<li>'never'. If this is set, JID will never be shared and user will be removed from the channel if its mode changes to JID Visible.</li>
|
|
<li>'always'. If this is set, JID will always be shared and users will be removed from the channel if its mode changes to JID Hidden.</li>
|
|
<li>'prefer not'. If this is set, JID will only be shared if mode is JID Visible.</li>
|
|
</ol>
|
|
<p>
|
|
The user MAY specify that no Private Messages are to be sent from the channel, and allow vCard retrieval.
|
|
</p>
|
|
<p>
|
|
The user MAY specify that presence is not to be shared, which will prevent the MIX Channel from sending a presence probe for the user on channel start-up. The user will also choose to not include the MIX channel in the user's roster, so that presence will not be updated. Where the channel configuration sets 'Participants Must Provide Presence', this variable MUST be set to 'Share'.
|
|
</p>
|
|
<p>
|
|
The following table sets out the standardized user preference values. A MIX implementation MAY use other values.
|
|
</p>
|
|
<table caption="Standard User Preference Options">
|
|
<tr><th>Option</th> <th>Values</th><th>Default</th></tr>
|
|
<tr><td>'JID Visibility'</td> <td>'default', 'never', 'always', 'prefer not'</td> <td>'default'</td></tr>
|
|
<tr><td>'Private Messages'</td><td>'allow', 'block'</td> <td>'allow'</td></tr>
|
|
<tr><td>'vCard'</td><td>'allow', 'block'</td> <td>'block'</td></tr>
|
|
<tr><td>'Presence'</td><td>'share', 'not share'</td><td>'share'</td></tr>
|
|
</table>
|
|
<p>When joining a channel, the client MAY specify one or more preference options as a &xep0004; form. In the response, the server MUST specify all of the user preferences supported by the server, with default values if the user has not requested a different value. The following example shows joining a channel and setting a preference. The following example shows the message sent from the user's server to the MIX channel, which will have been preceded by a message from the user's client to the user's server.</p>
|
|
<example caption="User Joins a Channel and Specifies a preference"><![CDATA[
|
|
<iq type='set'
|
|
from='hag66@shakespeare.example'
|
|
to='coven@mix.shakespeare.example'
|
|
id='E6E10350-76CF-40C6-B91B-1EA08C332FC7'>
|
|
<join xmlns='urn:xmpp:mix:anon:0'>
|
|
<subscribe node='urn:xmpp:mix:nodes:messages'/>
|
|
<subscribe node='urn:xmpp:mix:nodes:presence'/>
|
|
<x xmlns='jabber:x:data' type='submit'>
|
|
<field var='FORM_TYPE' type='hidden'>
|
|
<value>urn:xmpp:mix:anon:0</value>
|
|
</field>
|
|
<field var='JID Visibility'>
|
|
<value>never</value>
|
|
</field>
|
|
</x>
|
|
</join>
|
|
</iq>
|
|
]]></example>
|
|
<p>The following example shows the result of a successful join, which also reports all the user preferences. This example shows the message coming from the MIX channel to the user's server, which will be sent on to the user.</p>
|
|
<example caption="Channel Successfully Processes Join and returns the preferences set"><![CDATA[
|
|
<iq type='result'
|
|
from='coven@mix.shakespeare.example'
|
|
to='hag66@shakespeare.example'
|
|
id='E6E10350-76CF-40C6-B91B-1EA08C332FC7'>
|
|
<join xmlns='urn:xmpp:mix:anon:0' jid='hag66@shakespeare.example'>
|
|
<subscribe node='urn:xmpp:mix:nodes:messages'/>
|
|
<subscribe node='urn:xmpp:mix:nodes:presence'/>
|
|
<x xmlns='jabber:x:data' type='result'>
|
|
<field var='FORM_TYPE' type='hidden'>
|
|
<value>urn:xmpp:mix:anon:0</value>
|
|
</field>
|
|
<field var='JID Visibility'>
|
|
<value>never</value>
|
|
</field>
|
|
<field var='Private Messages'>
|
|
<value>allow</value>
|
|
</field>
|
|
<field var='vCard'>
|
|
<value>block</value>
|
|
</field>
|
|
</x>
|
|
</join>
|
|
</iq>
|
|
]]></example>
|
|
<p>The client MAY also query the channel in order to find out which user preferences are supported and the options available. This will allow users to set options not specified in the standard, by providing a form template in the result. The request is encoded as a <user-preference/> child element of <iq/>. <user-preference/> is qualified by the 'urn:xmpp:mix:anon:0' namespace. The result is encoded as a form child element in the <user-preference/> element.</p>
|
|
<example caption="User Requests and Recieves Preferences Template Form"><![CDATA[
|
|
<iq type='get'
|
|
from='hag66@shakespeare.example/UUID-a1j/7533'
|
|
to='coven@mix.shakespeare.example'
|
|
id='E6E10350-76CF-40C6-B91B-1EA08C332FC7'>
|
|
<user-preference xmlns='urn:xmpp:mix:anon:0'/>
|
|
</iq>
|
|
|
|
<iq type='result'
|
|
from='coven@mix.shakespeare.example'
|
|
to='hag66@shakespeare.example/UUID-a1j/7533'
|
|
id='E6E10350-76CF-40C6-B91B-1EA08C332FC7'>
|
|
<user-preference xmlns='urn:xmpp:mix:anon:0'>
|
|
<x xmlns='jabber:x:data' type='form'>
|
|
<field var='FORM_TYPE' type='hidden'>
|
|
<value>urn:xmpp:mix:anon:0</value>
|
|
</field>
|
|
<field type='list-single' label='Preference for JID Visibility
|
|
var='JID Visibility'>
|
|
<option label='JID Never Shown'><value>Never</value></option>
|
|
<option label='Default Behaviour'
|
|
<value>default</value></option>
|
|
<option label='Try not to show JID'>
|
|
<value>prefer not</value></option>
|
|
</field>
|
|
<field type='list-single' label='Example Custom Preference'
|
|
var='Custom Preference'>
|
|
<option label='One Option'><value>a</value></option>
|
|
<option label='Another Option'><value>b</value></option>
|
|
</field>
|
|
</x>
|
|
</user-preference>
|
|
</iq>
|
|
]]></example>
|
|
<p>
|
|
A user MAY modify preferences using the corresponding set operation. The set MAY specify values for some or all attributes. All attributes are returned in the result.
|
|
</p>
|
|
<example caption="User Updates Preferences"><![CDATA[
|
|
<iq type='set'
|
|
from='hag66@shakespeare.example/UUID-a1j/7533'
|
|
to='coven@mix.shakespeare.example'
|
|
id='E6E10350-76CF-40C6-B91B-1EA08C332FC7'>
|
|
<user-preference xmlns='urn:xmpp:mix:anon:0'/>
|
|
<x xmlns='jabber:x:data' type='submit'>
|
|
<field var='FORM_TYPE' type='hidden'>
|
|
<value>urn:xmpp:mix:anon:0</value>
|
|
</field>
|
|
<field var='JID Visibility'>
|
|
<value>never</value>
|
|
</field>
|
|
<field var='Private Messages'>
|
|
<value>allow</value>
|
|
</field>
|
|
<field var='vCard'>
|
|
<value>block</value>
|
|
</field>
|
|
</x>
|
|
</iq>
|
|
|
|
<iq type='result'
|
|
from='coven@mix.shakespeare.example'
|
|
to='hag66@shakespeare.example/UUID-a1j/7533'
|
|
id='E6E10350-76CF-40C6-B91B-1EA08C332FC7'>
|
|
<user-preference xmlns='urn:xmpp:mix:anon:0'>
|
|
<x xmlns='jabber:x:data' type='result'>
|
|
<field var='FORM_TYPE' type='hidden'>
|
|
<value>urn:xmpp:mix:anon:0</value>
|
|
</field>
|
|
<field var='JID Visibility'>
|
|
<value>never</value>
|
|
</field>
|
|
<field var='Private Messages'>
|
|
<value>allow</value>
|
|
</field>
|
|
<field var='vCard'>
|
|
<value>block</value>
|
|
</field>
|
|
</x>
|
|
</user-preference>
|
|
</iq>
|
|
]]></example>
|
|
</section2>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<section2 topic='Sending Private Messages' anchor='usecase-user-private-messages'>
|
|
|
|
<p>
|
|
Private Messages are used to provide communication with another channel participant through the MIX channel, where the initiating user does not the real JID of the channel participant. A channel MAY support use of Private Messages. Private messages are standard XMPP messages and MUST NOT be groupchat. A message goes through a number of stages with different addressing. This is set out in the following table.
|
|
</p>
|
|
<table caption="Setting From and To when sending Private Messages">
|
|
<tr><th>Message</th><th>From</th><th>To</th></tr>
|
|
<tr><td>First Message from Client to MIX Channel</td><td>Full JID of initiator's client</td><td>Proxy bare JID of responder</td></tr>
|
|
<tr><td>First Message from MIX Channel to responder's server</td><td>Proxy full JID of initiator's client</td><td>Bare JID of responder</td></tr>
|
|
<tr><td>First Message from responder's server to one or more of the responder's clients</td><td>Proxy full JID of initiator</td><td>Full JID of responder's client</td></tr>
|
|
<tr><td>Messages from responder's client to MIX Channel</td><td>Full JID of responder's client</td><td>Proxy full JID of initiator's client</td></tr>
|
|
<tr><td>Messages from MIX channel to initiator's client</td><td>Proxy full JID of responder's client</td><td>Full JID of initiator's client</td></tr>
|
|
<tr><td>Messages from initiator's client to MIX Channel</td><td>Full JID of initiator's client</td><td>Proxy full JID of responder's client</td></tr>
|
|
<tr><td>Message from MIX Channel to responder's client</td><td>Proxy full JID of initiator's client</td><td>Full JID of responder's client</td></tr>
|
|
</table>
|
|
<p>Private Messages MAY be archived using MAM by the XMPP servers associated with initiator and responder. Private Messages MUST NOT be archived by the MIX channel.</p>
|
|
</section2>
|
|
|
|
|
|
|
|
<section2 topic="Requesting vCard" anchor="usecase-vcard">
|
|
<p>A client MAY request the vCard of a channel participant where the participant's real JID is not known, by sending a request through the channel. The MIX channel MAY pass this request on or MAY block it. vCard requests MAY use &xep0054; (vcard-temp) or &xep0292; (vCard4 over XMPP). The MIX channel does not process the vCard requests, but simply relays them on to real bare JID of the target. A MIX service MAY choose to relay one or both protocols. Where a MIX service relays one or both of these protocols, each protocol relayed MUST be advertised as a feature of the MIX service. In the following example, using vcard-temp, the requesting client sends a message to the bare proxy JID of the channel participant for which the vCard is desired.</p>
|
|
<example caption="Client directly requests vCard through channel" ><![CDATA[
|
|
<iq from='hag66@shakespeare.example/UUID-c8y/1573'
|
|
id='lx09df27'
|
|
to='989898#coven@mix.shakespeare.example'
|
|
type='get'>
|
|
<vCard xmlns='vcard-temp'/>
|
|
</iq>
|
|
]]></example>
|
|
<p>The MIX channel MAY pass on the vCard request or MAY reject with an error, dependent on channel policy. The MIX service will then address the vCard request to the user's server (using bare JID) using a full proxy JID to hide the requester. </p>
|
|
<example caption="Channel passes on vCard request to the User's Server" ><![CDATA[
|
|
<iq from='123456#coven@mix.shakespeare.example/6789'
|
|
id='lx09df27'
|
|
to='peter@shakespeare.example'
|
|
type='get'>
|
|
<vCard xmlns='vcard-temp'/>
|
|
</iq>
|
|
]]></example>
|
|
<p>
|
|
The user's server, on behalf of the user, MAY send a response or reject with an error. The user's server will send the vCard back to the channel.
|
|
</p>
|
|
<example caption="User's Server sends vCard Response via MIX channel" ><![CDATA[
|
|
<iq from='peter@shakespeare.example'
|
|
id='lx09df27'
|
|
to='123456#coven@mix.shakespeare.example/6789'
|
|
type='result'>
|
|
<vCard xmlns='vcard-temp'>
|
|
<FN>Peter Saint-Andre</FN>
|
|
<N>
|
|
<FAMILY>Saint-Andre</FAMILY>
|
|
<GIVEN>Peter</GIVEN>
|
|
<MIDDLE/>
|
|
</N>
|
|
<NICKNAME>stpeter</NICKNAME>
|
|
<URL>http://www.xmpp.org/xsf/people/stpeter.shtml</URL>
|
|
</vCard>
|
|
<query xmlns='http://jabber.org/protocol/disco#info'>
|
|
</iq>
|
|
]]></example>
|
|
<p>
|
|
The MIX channel will then send the vCard response to the requesting client on behalf of the client sending the response.
|
|
</p>
|
|
<example caption="MIX Channel sends vCard responst to Client" ><![CDATA[
|
|
<iq from='989898#coven@mix.shakespeare.example'
|
|
id='lx09df27'
|
|
to='hag66@shakespeare.example/UUID-c8y/1573'
|
|
type='result'>
|
|
<vCard xmlns='vcard-temp'>
|
|
<FN>Peter Saint-Andre</FN>
|
|
<N>
|
|
<FAMILY>Saint-Andre</FAMILY>
|
|
<GIVEN>Peter</GIVEN>
|
|
<MIDDLE/>
|
|
</N>
|
|
<NICKNAME>stpeter</NICKNAME>
|
|
<URL>http://www.xmpp.org/xsf/people/stpeter.shtml</URL>
|
|
</vCard>
|
|
</iq>
|
|
]]></example>
|
|
</section2>
|
|
|
|
</section1>
|
|
|
|
<section1 topic='Internationalization Considerations' anchor='i18n'>
|
|
<p>See considerations in &xep0369;.
|
|
</p>
|
|
|
|
</section1>
|
|
|
|
<section1 topic='Security Considerations' anchor='security'>
|
|
<p>See considerations in &xep0369;.</p>
|
|
|
|
|
|
|
|
</section1>
|
|
|
|
<section1 topic='IANA Considerations' anchor='iana'>
|
|
<p>None.</p>
|
|
</section1>
|
|
|
|
<section1 topic='XMPP Registrar Considerations' anchor='registrar'>
|
|
<p>The urn:xmpp:mix namespace needs to be registered.</p>
|
|
</section1>
|
|
|
|
<section1 topic='XML Schema' anchor='schema'>
|
|
<p>To be supplied when MIX progresses to proposed standard.</p>
|
|
</section1>
|
|
|
|
<section1 topic='Acknowledgements' anchor='ack'>
|
|
<p>See &xep0369; for a list of contributors to the MIX Family of specifications.</p>
|
|
</section1>
|
|
|
|
</xep>
|