<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Uzume+Grigorovich</id>
	<title>Second Life Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Uzume+Grigorovich"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Uzume_Grigorovich"/>
	<updated>2026-07-25T11:34:18Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Webmap_API_Advanced_Examples&amp;diff=1171189</id>
		<title>Webmap API Advanced Examples</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Webmap_API_Advanced_Examples&amp;diff=1171189"/>
		<updated>2012-07-29T09:13:52Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: dbl redir&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Linden Lab Official:Map API Advanced Examples]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Webmap_API&amp;diff=1171188</id>
		<title>Webmap API</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Webmap_API&amp;diff=1171188"/>
		<updated>2012-07-29T09:12:58Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: dbl redir&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Linden Lab Official:Map API]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=MapAPI&amp;diff=1171187</id>
		<title>MapAPI</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=MapAPI&amp;diff=1171187"/>
		<updated>2012-07-29T09:12:46Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: dbl redir&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Linden Lab Official:Map API]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Relay/Other_Implementations/Felis_Darwin%27s_Amethyst_Plugin&amp;diff=1171185</id>
		<title>LSL Protocol/Restrained Love Relay/Other Implementations/Felis Darwin&#039;s Amethyst Plugin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Relay/Other_Implementations/Felis_Darwin%27s_Amethyst_Plugin&amp;diff=1171185"/>
		<updated>2012-07-29T08:26:41Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: cat sort&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an Amethyst Plugin implementation of the Restrained Life Relay, meant for use in Amethyst collars.  &#039;&#039;&#039;At the moment this plugin may nullify commands issued by the standard Amethyst RLV Plugin.&#039;&#039;&#039; However, it will instruct the Amethyst RLV plugin to re-issue its restrictions once the relay is no longer active. (Collar v6.7 and above)&lt;br /&gt;
&lt;br /&gt;
This version adds a few important things to the Reference Implementation, like periodically pinging the restraining object (optional) and fixing a loophole in the &amp;quot;ask&amp;quot; mode that could allow items to restrict you even if you hadn&#039;t approved them yet.  It also adds some nice features for Owners set on the collar, such as automatic exceptions to certain restrictions (IM and TP) and the ability to &amp;quot;lock&amp;quot; the plugin&#039;s mode so that the wearer cannot turn it off.  It currently complies with Marine&#039;s v1.100 spec.&lt;br /&gt;
&lt;br /&gt;
Finally, this implementation does &#039;&#039;not&#039;&#039; include support for multiple control objects, due to the overhead necessary for the plugin to interact with the Amethyst collar system.  If you absolutely need this functionality I recommend using one of the many free Relay HUDs.&lt;br /&gt;
&lt;br /&gt;
== Current Changelog ==&lt;br /&gt;
Current version: v0.6&lt;br /&gt;
&lt;br /&gt;
===v0.6===&lt;br /&gt;
&lt;br /&gt;
:- Included support in the owner exceptions for the new &amp;quot;secure&amp;quot; IM and teleport restrictions.  When the relay sees these commands it will add IM or teleport restrictions, allowing the owner to receive IMs from the wearer or teleport them to safety, respectively.&lt;br /&gt;
&lt;br /&gt;
:- Cleaned up the Implementation Version text to be compatible with the new 1.100 spec.&lt;br /&gt;
 &lt;br /&gt;
:- Changed the release routine so it releases restrictions in reverse order, per the new spec.&lt;br /&gt;
 &lt;br /&gt;
:- If the user is seated when they receive an &amp;quot;@unsit&amp;quot; restriction it will assume the issuing object is the sit target, until told otherwise, per the new spec.&lt;br /&gt;
 &lt;br /&gt;
:- Relay will now silently reject malformed commands which lack a variable (e.g. &amp;quot;@version&amp;quot; instead of &amp;quot;!version&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
:- Changed the &amp;quot;control attempt denied&amp;quot; dialog so it specifies what device the recipient was using.&lt;br /&gt;
&lt;br /&gt;
:- Removed a few unused variables and irrelevant comments that were lying about.&lt;br /&gt;
 &lt;br /&gt;
:- A few other script cleanups that should add a little more working memory to the relay.&lt;br /&gt;
&lt;br /&gt;
===v0.5===&lt;br /&gt;
&lt;br /&gt;
:- Added an &amp;quot;Owner + Whitelist&amp;quot; mode, which automatically allows all commands issued from devices owned by the collar&#039;s Owner(s) or those on the Whitelist, while automatically denying all other commands.&lt;br /&gt;
&lt;br /&gt;
===v0.4===&lt;br /&gt;
   &lt;br /&gt;
:- Implemented changes to bring the relay up to 1040 spec:&lt;br /&gt;
 &lt;br /&gt;
::+ Added a more complete fix to an exploit allowing devices to force the user to speak on the public channel&lt;br /&gt;
::+ Made sure the distance check fails when the controlling object has been de-rezzed/removed&lt;br /&gt;
::+ Stopped groupless objects from immediately passing the trustworthy check on groupless land&lt;br /&gt;
::+ Added support for the &amp;quot;!who&amp;quot; meta-command (tells you who is in control of the device), and updated the user dialog messages accordingly&lt;br /&gt;
::+ Added support fo the &amp;quot;!handover&amp;quot; meta-command (allows devices to &amp;quot;hand over&amp;quot; controlled residents)&lt;br /&gt;
&lt;br /&gt;
:- Rewrote the rememberForceSit command to use less resources.&lt;br /&gt;
 &lt;br /&gt;
:- Removed the &amp;quot;!mode&amp;quot; meta-command I had proposed because 1) nobody used it, and 2) there were compilation errors (due to too many else/ifs) otherwise&lt;br /&gt;
 &lt;br /&gt;
:- Went through the script and combined a number of if statements so as to reduce memory usage and overhead&lt;br /&gt;
 &lt;br /&gt;
:- Removed a number of global variables and replaced them with the values they previously held. Examples are the command prefix variables (PREFIX_RL_COMMAND, etc.) and the mode variables (MODE_OFF, MODE_ASK, MODE_AUTO).  This has reduced memory usage a bit, and has allowed me to cram in more features.&lt;br /&gt;
&lt;br /&gt;
:- Objects owned by your owners (primary or secondary) are now automatically considered &amp;quot;trustworthy&amp;quot;, thus bypassing the annoying &amp;quot;this object is not owned by the parcel owner blah blah&amp;quot; security message.&lt;br /&gt;
&lt;br /&gt;
:- Added in a whitelist/blacklist feature.  When you are presented with a prompt to approve a control request from an object you will notice two additional buttons, &amp;quot;Always&amp;quot; and &amp;quot;Never&amp;quot;.  This will add the CONTROLLER of the object (who is pushing the buttons, so to speak) to the white/blacklist if that information is known. (It will mention &amp;quot;so and so using X&amp;quot; if this is the case)  If the controller ISN&#039;T known then clicking either of these buttons will add the OWNER of the object to the white/blacklist.&lt;br /&gt;
&lt;br /&gt;
:- Removed the as-yet unused &amp;quot;deny restrictions&amp;quot; list to make room for the above feature.  If I figure out a way to fit it in while keeping the script compilable I&#039;ll do it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===v0.3===&lt;br /&gt;
    &lt;br /&gt;
:- Upgraded implementation version to 1.021. (Was already compliant in v0.2, but the version reply is now updated)&lt;br /&gt;
     &lt;br /&gt;
:- Modified the &amp;quot;Send IM&amp;quot; exception so that it is now generalized and will work for any specified restriction.  Currently it has been expanded to include the &amp;quot;Teleport Request&amp;quot;/tplure restriction.&lt;br /&gt;
&lt;br /&gt;
:- Added in a means of disallowing certain restrictions, beyond just the &amp;quot;stripping&amp;quot; deny mode.  The list (denyRestrictions) takes strings, and checks each restriction to see if it contains that string.  If it does, the restriction is denied.  (e.g. the entry &amp;quot;tp&amp;quot; would prohibit all tp-related restrictions like accepttp, tploc, tplure, sittp, etc.) Adding &amp;quot;=force&amp;quot; to the end of an entry will limit it to only work on &amp;quot;force&amp;quot; commands, e.g. &amp;quot;detach:skirt=force&amp;quot; or even &amp;quot;detach=force&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
:- Removed the &amp;quot;stripping&amp;quot; deny mode, as the above method will handle the same thing.&lt;br /&gt;
    &lt;br /&gt;
:- Got rid of the separate list for restriction exceptions, originally added as a means of saving available memory.  The code will now simply ignore exceptions if it runs to low on memory (and will notify the wearer of this).&lt;br /&gt;
&lt;br /&gt;
:- Added a means to turn off the &amp;quot;ping&amp;quot; requirement&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===v0.2 and v0.1===&lt;br /&gt;
&lt;br /&gt;
No proper changelog exists.  v0.2 was the first version to implement the now-optional &amp;quot;periodic ping&amp;quot; requirement, requiring furniture to respond to ping requests in order to keep the relay active.&lt;br /&gt;
&lt;br /&gt;
== Current Source Code ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
//== RestrainedLife Viewer Relay Script&lt;br /&gt;
//==  by Felis Darwin&lt;br /&gt;
//== Based on Reference Implementation by Marine Kelley&lt;br /&gt;
&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
&lt;br /&gt;
// ---------------------------------------------------&lt;br /&gt;
//              Amethyst Plugin Variables&lt;br /&gt;
// ---------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
key nullkey = NULL_KEY;&lt;br /&gt;
string nullstr = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
integer secaccess=0; //== Do secondary owners have access to the RL functions?&lt;br /&gt;
&lt;br /&gt;
// Internal variables&lt;br /&gt;
key ownerkey = nullkey;&lt;br /&gt;
list secowners = [];&lt;br /&gt;
&lt;br /&gt;
key setby = nullkey; //== Who set the RLV Relay status?&lt;br /&gt;
&lt;br /&gt;
integer lockstatus; //== Has the collar been locked by the RLV plugin?&lt;br /&gt;
&lt;br /&gt;
string ownerexcept = &amp;quot;@sendim @sendim_sec @tplure @tplure_sec&amp;quot;; //== List of restrictions owner (not wearer) will always be exempt from&lt;br /&gt;
&lt;br /&gt;
// ---------------------------------------------------&lt;br /&gt;
//                     Constants&lt;br /&gt;
// ---------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
integer RLVRS_PROTOCOL_VERSION = 1100; // version of the protocol, stated on the specification page&lt;br /&gt;
string RLVRS_IMPL_VERSION = &amp;quot;Felis Darwin&#039;s implementation (Amethyst Plugin version)&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
integer MAX_TIME_AUTOACCEPT_AFTER_FORCESIT = 60; // seconds&lt;br /&gt;
 &lt;br /&gt;
integer PERMISSION_DIALOG_TIMEOUT = 30;&lt;br /&gt;
 &lt;br /&gt;
integer LOGIN_DELAY_WAIT_FOR_PONG = 20;&lt;br /&gt;
&lt;br /&gt;
integer PING_INTERVAL = 60; //== Time between pings, and time waiting for force-sit&lt;br /&gt;
 &lt;br /&gt;
// ---------------------------------------------------&lt;br /&gt;
//                      Variables&lt;br /&gt;
// ---------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
integer nMode;&lt;br /&gt;
 &lt;br /&gt;
list lRestrictions; // restrictions currently applied (without the &amp;quot;=n&amp;quot; part)&lt;br /&gt;
key kSource;        // UUID of the object I&#039;m commanded by, always equal to nullkey if lRestrictions is empty, always set if not&lt;br /&gt;
key kController;    // UUID of the person controlling the object, if passed to us by the !who command&lt;br /&gt;
&lt;br /&gt;
list WhiteBlack = []; //== A combined white/black list of residents.  Whitelisting exempts them from ask mode.  Blacklisting prevents their objects from even interacting with you.&lt;br /&gt;
 &lt;br /&gt;
string sPendingName; // name of initiator of pending request (first request of a session in mode 1)&lt;br /&gt;
key sPendingId;      // UUID of initiator of pending request (first request of a session in mode 1)&lt;br /&gt;
string sPendingMessage; // message of pending request (first request of a session in mode 1)&lt;br /&gt;
integer sPendingTime;&lt;br /&gt;
   &lt;br /&gt;
// used on login&lt;br /&gt;
integer timerTickCounter; // count the number of time events on login (forceSit has to be delayed a bit)&lt;br /&gt;
integer loginWaitingForPong;&lt;br /&gt;
integer loginPendingForceSit;&lt;br /&gt;
&lt;br /&gt;
integer noping = 0;&lt;br /&gt;
 &lt;br /&gt;
key     lastForceSitDestination = nullkey;&lt;br /&gt;
integer lastForceSitTime;&lt;br /&gt;
&lt;br /&gt;
integer stop = 0; //== Allows the relay to stop mid-command execution if directed to by another command&lt;br /&gt;
&lt;br /&gt;
// ---------------------------------------------------&lt;br /&gt;
//               Low Level Communication&lt;br /&gt;
// ---------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
debug(string x)&lt;br /&gt;
{&lt;br /&gt;
    if (DEBUG)&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(&amp;quot;DEBUG: &amp;quot; + x);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// acknowledge or reject&lt;br /&gt;
ack(string cmd_id, key id, string cmd, string ack)&lt;br /&gt;
{&lt;br /&gt;
    if(id != nullkey)&lt;br /&gt;
        llShout(-1812221819, cmd_id + &amp;quot;,&amp;quot; + (string)id + &amp;quot;,&amp;quot; + cmd + &amp;quot;,&amp;quot; + ack);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
// get current mode as string&lt;br /&gt;
string getModeDescription()&lt;br /&gt;
{&lt;br /&gt;
    if (nMode == 0) return &amp;quot;RLV Relay is OFF&amp;quot;; &lt;br /&gt;
    if (nMode == 1) return &amp;quot;RLV Relay is ON (permission needed)&amp;quot;;&lt;br /&gt;
    if (nMode == 2) return &amp;quot;RLV Relay is ON (auto-accept)&amp;quot;; &lt;br /&gt;
    return &amp;quot;RLV Relay is ON (owners + whitelist only)&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// ---------------------------------------------------&lt;br /&gt;
//               Permission Handling&lt;br /&gt;
// ---------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
// are we already under command by this object?&lt;br /&gt;
integer isObjectKnow(key id)&lt;br /&gt;
{&lt;br /&gt;
    // are we not under command by any object but were we forced to sit on this object recently?&lt;br /&gt;
    if (id != nullkey &amp;amp;&amp;amp; (kSource == id || ((kSource == nullkey) &amp;amp;&amp;amp; (id == lastForceSitDestination) &amp;amp;&amp;amp; (lastForceSitTime + MAX_TIME_AUTOACCEPT_AFTER_FORCESIT &amp;gt; llGetUnixTime()))))&lt;br /&gt;
    {&lt;br /&gt;
        return TRUE;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    return FALSE;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
// check whether the object is in llSay distance.&lt;br /&gt;
// The specification requires llSay instead of llShout or llRegionSay&lt;br /&gt;
// to be used to limit the range. But this has to be checked here again&lt;br /&gt;
// because the objects are not trustworthy.&lt;br /&gt;
integer isObjectNear(key id)&lt;br /&gt;
{&lt;br /&gt;
    vector myPosition = llGetRootPosition();&lt;br /&gt;
    list temp = llGetObjectDetails(id, ([OBJECT_POS]));&lt;br /&gt;
    vector objPosition = llList2Vector(temp,0);&lt;br /&gt;
    if(temp == []) objPosition = &amp;lt;1000.0, 1000.0, -1000.0&amp;gt;;&lt;br /&gt;
    float distance = llVecDist(objPosition, myPosition);&lt;br /&gt;
    return distance &amp;lt;= 100;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// do a basic check on the identity of the object trying to issue a command&lt;br /&gt;
integer isObjectIdentityTrustworthy(key id)&lt;br /&gt;
{&lt;br /&gt;
    key parcel_owner=llList2Key (llGetParcelDetails (llGetPos (), [PARCEL_DETAILS_OWNER]), 0);&lt;br /&gt;
    key parcel_group=llList2Key (llGetParcelDetails (llGetPos (), [PARCEL_DETAILS_GROUP]), 0);&lt;br /&gt;
    key object_owner=llGetOwnerKey(id);&lt;br /&gt;
    key object_group=llList2Key (llGetObjectDetails (id, [OBJECT_GROUP]), 0);&lt;br /&gt;
 &lt;br /&gt;
    debug(&amp;quot;owner= &amp;quot; + (string) parcel_owner + &amp;quot; / &amp;quot; + (string) object_owner);&lt;br /&gt;
    debug(&amp;quot;group= &amp;quot; + (string) parcel_group + &amp;quot; / &amp;quot; + (string) object_group);&lt;br /&gt;
 &lt;br /&gt;
    if (object_owner==llGetOwner ()        // IF I am the owner of the object&lt;br /&gt;
      || object_owner==parcel_owner        // OR its owner is the same as the parcel I&#039;m on&lt;br /&gt;
      || (object_owner==ownerkey &amp;amp;&amp;amp; ownerkey != nullkey) //== Is this my owner&#039;s stuff?&lt;br /&gt;
      || ~llListFindList(secowners, [object_owner]) //== ...or my owners&#039; stuff?&lt;br /&gt;
      || (object_group==parcel_group &amp;amp;&amp;amp; object_group != nullkey)       // OR its group is the same as the parcel I&#039;m on&lt;br /&gt;
    )&lt;br /&gt;
    {&lt;br /&gt;
        return TRUE;&lt;br /&gt;
    }&lt;br /&gt;
    return FALSE;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
// Is this a simple request for information or a meta command like !release?&lt;br /&gt;
integer isSimpleRequest(list list_of_commands) &lt;br /&gt;
{&lt;br /&gt;
    integer len = llGetListLength(list_of_commands);&lt;br /&gt;
    integer i;&lt;br /&gt;
 &lt;br /&gt;
    debug(&amp;quot;Checking simplicity of commands...&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    // now check every single atomic command&lt;br /&gt;
    for (i=0; i &amp;lt; len; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        string command = llList2String(list_of_commands, i);&lt;br /&gt;
        if (!isSimpleAtomicCommand(command))&lt;br /&gt;
        {&lt;br /&gt;
           debug(&amp;quot;Command &amp;quot;+ command +&amp;quot; fails simplicity check.&amp;quot;);&lt;br /&gt;
           return FALSE;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // all atomic commands passed the test&lt;br /&gt;
    return TRUE;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// is this a simple atmar command&lt;br /&gt;
// (a command which only queries some information or releases restrictions)&lt;br /&gt;
// (e. g.: cmd ends with &amp;quot;=&amp;quot; and a number (@version, @getoutfit, @getattach) or is a !-meta-command)&lt;br /&gt;
integer isSimpleAtomicCommand(string cmd)&lt;br /&gt;
{    &lt;br /&gt;
    // check right hand side of the &amp;quot;=&amp;quot; - sign&lt;br /&gt;
    integer index = llSubStringIndex (cmd, &amp;quot;=&amp;quot;);&lt;br /&gt;
    // check for a number after the &amp;quot;=&amp;quot;&lt;br /&gt;
    string param = llGetSubString (cmd, index + 1, -1);&lt;br /&gt;
    if ((((((integer)param!=0 || param==&amp;quot;0&amp;quot;) &amp;amp;&amp;amp; llSubStringIndex(param, &amp;quot;n&amp;quot;) &amp;lt;= -1 &amp;amp;&amp;amp; llSubStringIndex(param, &amp;quot;add&amp;quot;)&amp;lt;= -1) || param == &amp;quot;y&amp;quot; || param == &amp;quot;rem&amp;quot;) || index == -1) || llSubStringIndex(cmd, &amp;quot;!&amp;quot;) == 0 || cmd == &amp;quot;@clear&amp;quot;) // is it an integer (channel number) or empty?&lt;br /&gt;
    {&lt;br /&gt;
        return TRUE;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // this one is not &amp;quot;simple&amp;quot;.&lt;br /&gt;
    return FALSE;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// If we already have commands from this object pending&lt;br /&gt;
// because of a permission request dialog, just add the&lt;br /&gt;
// new commands at the end.&lt;br /&gt;
// Note: We use a timeout here because the player may&lt;br /&gt;
// have &amp;quot;ignored&amp;quot; the dialog.&lt;br /&gt;
integer tryToGluePendingCommands(key id, string commands)&lt;br /&gt;
{&lt;br /&gt;
    if (kSource == nullkey &amp;amp;&amp;amp; (sPendingId == id) &amp;amp;&amp;amp; (sPendingTime + PERMISSION_DIALOG_TIMEOUT &amp;gt; llGetUnixTime()) &amp;amp;&amp;amp; llGetFreeMemory() &amp;gt; 500)&lt;br /&gt;
    {&lt;br /&gt;
        debug(&amp;quot;Gluing &amp;quot; + sPendingMessage + &amp;quot; with &amp;quot; + commands);&lt;br /&gt;
        sPendingMessage = (sPendingMessage=nullstr) + sPendingMessage + &amp;quot;|&amp;quot; + commands;&lt;br /&gt;
        return TRUE;&lt;br /&gt;
    }&lt;br /&gt;
    return FALSE;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// verifies the permission. This includes mode &lt;br /&gt;
// (off, permission, auto) of the relay and the&lt;br /&gt;
// identity of the object (owned by parcel people).&lt;br /&gt;
integer verifyPermission(key id, string name, string message)&lt;br /&gt;
{&lt;br /&gt;
    debug(&amp;quot;Verifying permission for command &amp;quot;+ message);&lt;br /&gt;
    &lt;br /&gt;
    // extract the commands-part&lt;br /&gt;
    list tokens = llParseString2List (message, [&amp;quot;,&amp;quot;], []);&lt;br /&gt;
    if (llGetListLength (tokens) &amp;lt; 3 || nMode == 0 || ~llListFindList(WhiteBlack, [&amp;quot;-&amp;quot;+(string)llGetOwnerKey(id)]) || ~llListFindList(WhiteBlack, [&amp;quot;-&amp;quot;+(string)kController]) || (nMode == 3 &amp;amp;&amp;amp; llGetOwnerKey(id) != ownerkey &amp;amp;&amp;amp; !~llListFindList(secowners, [llGetOwnerKey(id)]) &amp;amp;&amp;amp; !~llListFindList(WhiteBlack,[llGetOwnerKey(id)])))&lt;br /&gt;
    {&lt;br /&gt;
        kController = nullkey;&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
    string commands = llList2String(tokens, 2);&lt;br /&gt;
    list list_of_commands = llParseString2List(commands, [&amp;quot;|&amp;quot;], []);&lt;br /&gt;
 &lt;br /&gt;
    // accept harmless commands silently&lt;br /&gt;
    if (isSimpleRequest(list_of_commands) || ~llListFindList(WhiteBlack, [llGetOwnerKey(id)]))&lt;br /&gt;
    {&lt;br /&gt;
        debug(&amp;quot;simple command or Owner in Whitelist, executing.&amp;quot;);&lt;br /&gt;
        return TRUE;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // if we are already having a pending permission-dialog request for THIS object,&lt;br /&gt;
    // just add the new commands at the end of the pending command list.&lt;br /&gt;
    if (tryToGluePendingCommands(id, commands))&lt;br /&gt;
    {&lt;br /&gt;
        debug(&amp;quot;Appending to store of commands pending approval.&amp;quot;);&lt;br /&gt;
        return FALSE; //== Glue the commands and process them later&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // check whether this object belongs here&lt;br /&gt;
    integer trustworthy = isObjectIdentityTrustworthy(id);&lt;br /&gt;
    string warning = nullstr;&lt;br /&gt;
    if (!trustworthy)&lt;br /&gt;
    {&lt;br /&gt;
        warning = &amp;quot;\n\nWARNING: This object is not owned by the people owning this parcel. Unless you know the owner, you should deny this request.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // ask in permission-request-mode and/OR in case the object identity is suspisous.&lt;br /&gt;
    if ((nMode == 1 || !trustworthy))&lt;br /&gt;
    {&lt;br /&gt;
        sPendingId=id;&lt;br /&gt;
        sPendingName=name;&lt;br /&gt;
        sPendingMessage=message;&lt;br /&gt;
        sPendingTime = llGetUnixTime();&lt;br /&gt;
        &lt;br /&gt;
        list opts = [&amp;quot;Yes&amp;quot;, &amp;quot;No&amp;quot;];&lt;br /&gt;
        &lt;br /&gt;
        llSetTimerEvent(2.0);&lt;br /&gt;
                &lt;br /&gt;
        if(llKey2Name(llGetOwnerKey(id)) != nullstr)&lt;br /&gt;
        {&lt;br /&gt;
            name += &amp;quot; (owned by &amp;quot;+llKey2Name(llGetOwnerKey(id))+&amp;quot;)&amp;quot;;&lt;br /&gt;
            opts += [&amp;quot;Never&amp;quot;, &amp;quot;Always&amp;quot;];&lt;br /&gt;
        }&lt;br /&gt;
            &lt;br /&gt;
        if(llKey2Name(kController) != nullstr)&lt;br /&gt;
        {&lt;br /&gt;
            name = llKey2Name(kController) +&amp;quot;, using &amp;quot;+ name +&amp;quot;,&amp;quot;;&lt;br /&gt;
            opts += [&amp;quot;Never&amp;quot;];&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        llDialog (llGetOwner(), name + &amp;quot; would like control your viewer.&amp;quot; + warning + &amp;quot;\n\nDo you accept ?&amp;quot;, llList2List(opts,0,3), -1812220409);&lt;br /&gt;
        debug(&amp;quot;Asking for permission&amp;quot;);&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
    return TRUE;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
// ---------------------------------------------------&lt;br /&gt;
//               Executing of commands&lt;br /&gt;
// ---------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
// execute a non-parsed message&lt;br /&gt;
// this command could be denied here for policy reasons, (if it were implemenetd)&lt;br /&gt;
// but this time there will be an acknowledgement&lt;br /&gt;
execute(string name, key id, string message)&lt;br /&gt;
{&lt;br /&gt;
    stop = 0;&lt;br /&gt;
    &lt;br /&gt;
    list tokens=llParseString2List (message, [&amp;quot;,&amp;quot;], []);&lt;br /&gt;
    if (llGetListLength (tokens)==3) // this is a normal command&lt;br /&gt;
    {&lt;br /&gt;
        string cmd_id=llList2String (tokens, 0); // CheckAttach&lt;br /&gt;
        key target=llList2Key (tokens, 1); // UUID&lt;br /&gt;
        if (target==llGetOwner ()) // talking to me ?&lt;br /&gt;
        {&lt;br /&gt;
            list list_of_commands=llParseString2List (llList2String (tokens, 2), [&amp;quot;|&amp;quot;], []);&lt;br /&gt;
            integer len=llGetListLength (list_of_commands);&lt;br /&gt;
            integer i;&lt;br /&gt;
            string command;&lt;br /&gt;
            string prefix;&lt;br /&gt;
            for (i=0; i&amp;lt;len; ++i) // execute every command one by one&lt;br /&gt;
            {&lt;br /&gt;
                if(stop) return;&lt;br /&gt;
                &lt;br /&gt;
                // a command is a RL command if it starts with &#039;@&#039; or a metacommand if it starts with &#039;!&#039;&lt;br /&gt;
                command=llList2String (list_of_commands, i);&lt;br /&gt;
                prefix=llGetSubString (command, 0, 0);&lt;br /&gt;
                &lt;br /&gt;
                if(command == &amp;quot;@clear&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    releaseRestrictions();&lt;br /&gt;
                    ack(cmd_id, id, command, &amp;quot;ok&amp;quot;);   &lt;br /&gt;
                }&lt;br /&gt;
                else if (prefix==&amp;quot;@&amp;quot;) // this is a RL command&lt;br /&gt;
                {&lt;br /&gt;
                    executeRLVCommand(cmd_id, id, command);&lt;br /&gt;
                }&lt;br /&gt;
                else if (prefix==&amp;quot;!&amp;quot;) // this is a metacommand, aimed at the relay itself&lt;br /&gt;
                {&lt;br /&gt;
                    executeMetaCommand(cmd_id, id, command);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// executes a command for the restrained life viewer &lt;br /&gt;
// with some additinal magic like book keeping&lt;br /&gt;
executeRLVCommand(string cmd_id, string id, string command)&lt;br /&gt;
{&lt;br /&gt;
    // we need to know whether whether is a rule or a simple command&lt;br /&gt;
    list tokens_command=llParseString2List (command, [&amp;quot;=&amp;quot;], []);&lt;br /&gt;
    string behav=llList2String (tokens_command, 0); // @getattach:skull&lt;br /&gt;
    string param=llList2String (tokens_command, 1); // 2222&lt;br /&gt;
    integer ind=llListFindList (lRestrictions, [behav]);&lt;br /&gt;
 &lt;br /&gt;
    debug(&amp;quot;behav = &amp;quot;+ behav +&amp;quot;; param=&amp;quot; + param);&lt;br /&gt;
    &lt;br /&gt;
    //== Stop the public chat exploits, and disregard commands issued with no variable (clear is handled elsewhere)&lt;br /&gt;
    if(param == nullstr || (~llSubStringIndex(behav, &amp;quot;@get&amp;quot;) || ~llSubStringIndex(behav, &amp;quot;@findfolder&amp;quot;) || ~llSubStringIndex(behav, &amp;quot;@version&amp;quot;)) &amp;amp;&amp;amp; ((integer)param &amp;lt;= 0))&lt;br /&gt;
    {&lt;br /&gt;
        ack(cmd_id, id, command, &amp;quot;ko&amp;quot;);&lt;br /&gt;
        return;   &lt;br /&gt;
    } &lt;br /&gt;
    if (param==&amp;quot;n&amp;quot; || param==&amp;quot;add&amp;quot;) // add to lRestrictions&lt;br /&gt;
    {&lt;br /&gt;
        if (ind&amp;lt;0)&lt;br /&gt;
        {&lt;br /&gt;
            if(~llSubStringIndex(behav, &amp;quot;:&amp;quot;) &amp;amp;&amp;amp; llGetFreeMemory() &amp;lt;= 1024)&lt;br /&gt;
            {&lt;br /&gt;
                llOwnerSay(&amp;quot;Relay is running dangerously low on memory; some restrictions will not be processed.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                lRestrictions = (lRestrictions=[]) + lRestrictions + [behav];&lt;br /&gt;
                &lt;br /&gt;
            if(~llSubStringIndex(ownerexcept,behav)) //== Handle owner exceptions&lt;br /&gt;
            {&lt;br /&gt;
                //== Trim off the _sec part so exceptions can be passed&lt;br /&gt;
                if(~llSubStringIndex(behav, &amp;quot;_sec&amp;quot;))&lt;br /&gt;
                    behav = llGetSubString(behav, 0, -5);&lt;br /&gt;
                &lt;br /&gt;
                if(ownerkey != nullkey)&lt;br /&gt;
                    llOwnerSay(&amp;quot;@&amp;quot;+behav+&amp;quot;:&amp;quot;+(string)ownerkey+&amp;quot;=add&amp;quot;);&lt;br /&gt;
                if(secaccess || ownerkey == nullkey)&lt;br /&gt;
                {&lt;br /&gt;
                    integer i;&lt;br /&gt;
                    for(i = 0; i &amp;lt; llGetListLength(secowners); i++)&lt;br /&gt;
                        llOwnerSay(&amp;quot;@&amp;quot;+behav+&amp;quot;:&amp;quot;+llList2String(secowners,i)+&amp;quot;=add&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(kSource == nullkey)&lt;br /&gt;
        {&lt;br /&gt;
            llSetTimerEvent(2.0);&lt;br /&gt;
            if(!lockstatus)&lt;br /&gt;
                llOwnerSay(&amp;quot;@detach=n&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
                &lt;br /&gt;
        kSource=id; // we know that kSource is either nullkey or id already&lt;br /&gt;
    }&lt;br /&gt;
    else if (param==&amp;quot;y&amp;quot; || param==&amp;quot;rem&amp;quot;) // remove from lRestrictions&lt;br /&gt;
    {&lt;br /&gt;
        if (ind&amp;gt;-1)&lt;br /&gt;
                lRestrictions=llDeleteSubList ((lRestrictions=[]) + lRestrictions, ind, ind);&lt;br /&gt;
                &lt;br /&gt;
        //== Unlisted Owner Exceptions are NEVER removed, for safety&lt;br /&gt;
        //==  Nor is the public chat exploit fixer&lt;br /&gt;
        &lt;br /&gt;
        //== NOTE TO SELF: Find a memory-efficient way to add this protection for secowners&lt;br /&gt;
        else if(~llSubStringIndex(behav, ownerkey) || behav == &amp;quot;@a-relay&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            ack(cmd_id, id, command, &amp;quot;ko&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (llGetListLength (lRestrictions) == 0 &amp;amp;&amp;amp; !lockstatus)&lt;br /&gt;
            llOwnerSay(&amp;quot;@detach=y&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    rememberForceSit(command);&lt;br /&gt;
    if(llGetListLength(lRestrictions) == 1)&lt;br /&gt;
        llOwnerSay(&amp;quot;@a-relay=n&amp;quot;);&lt;br /&gt;
    llOwnerSay(command); // execute command&lt;br /&gt;
    ack(cmd_id, id, command, &amp;quot;ok&amp;quot;); // acknowledge&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
// remembers the time and object if this command is a force sit&lt;br /&gt;
//== Changed to work a little differently&lt;br /&gt;
rememberForceSit(string command)&lt;br /&gt;
{&lt;br /&gt;
    command = llStringTrim(command, STRING_TRIM);&lt;br /&gt;
    string param = llGetSubString(command, -6, -1);&lt;br /&gt;
&lt;br /&gt;
    if (param != &amp;quot;=force&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        //== If we&#039;re seated on the kSource and it&#039;s restricting us, it&#039;s probably the sit target&lt;br /&gt;
        if(lastForceSitDestination == nullkey &amp;amp;&amp;amp; (command == &amp;quot;@unsit=n&amp;quot; || command == &amp;quot;@unsit=add&amp;quot;) &amp;amp;&amp;amp; llGetAgentInfo(llGetOwner()) &amp;amp; AGENT_SITTING)&lt;br /&gt;
            lastForceSitDestination = kSource;&lt;br /&gt;
            &lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    string behav = llGetSubString(command, 0, 4);&lt;br /&gt;
    param = llGetSubString(command, 5, 40);&lt;br /&gt;
&lt;br /&gt;
    debug(&amp;quot;&#039;force&#039;-command:&amp;quot; + behav + &amp;quot;/&amp;quot; + param);&lt;br /&gt;
&lt;br /&gt;
    //== If this somehow isn&#039;t a sit command (or there&#039;s no valid target) then return&lt;br /&gt;
    if(behav != &amp;quot;@sit:&amp;quot; || llStringLength(param) != 36)&lt;br /&gt;
        return;&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    lastForceSitDestination = (key) param;&lt;br /&gt;
    lastForceSitTime = llGetUnixTime();&lt;br /&gt;
    debug(&amp;quot;remembered force sit&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// executes a meta command which is handled by the relay itself&lt;br /&gt;
executeMetaCommand(string cmd_id, string id, string command)&lt;br /&gt;
{&lt;br /&gt;
    if (command==&amp;quot;!version&amp;quot;) // checking relay version&lt;br /&gt;
    {&lt;br /&gt;
        ack(cmd_id, id, command, (string)RLVRS_PROTOCOL_VERSION);&lt;br /&gt;
    }&lt;br /&gt;
    else if (command == &amp;quot;!implversion&amp;quot;) // checking relay version&lt;br /&gt;
    {&lt;br /&gt;
        ack(cmd_id, id, command, RLVRS_IMPL_VERSION);&lt;br /&gt;
    }&lt;br /&gt;
    else if (command==&amp;quot;!release&amp;quot;) // release all the restrictions (end session)&lt;br /&gt;
    {&lt;br /&gt;
        ack(cmd_id, id, command, &amp;quot;ok&amp;quot;);&lt;br /&gt;
        kSource = nullkey; //== So only one release message is sent&lt;br /&gt;
        releaseRestrictions();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //== Depreciated but still supported here because it&#039;s easy&lt;br /&gt;
    if (llGetSubString(command,0,4) == &amp;quot;!who/&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        kController = (key)llGetSubString(command, 5, -1);&lt;br /&gt;
    }&lt;br /&gt;
    if (llGetSubString(command,0,9) == &amp;quot;!handover/&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        list tokens = llParseString2List(command, [&amp;quot;/&amp;quot;], []);&lt;br /&gt;
        if(!llList2Integer(tokens, 2))&lt;br /&gt;
            releaseRestrictions();&lt;br /&gt;
        kSource = llList2Key(tokens,1);&lt;br /&gt;
        pingWorldObjectIfUnderRestrictions();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// lift all the restrictions (called by !release and by turning the relay off)&lt;br /&gt;
releaseRestrictions ()&lt;br /&gt;
{&lt;br /&gt;
    ack(&amp;quot;Relay Release Notification&amp;quot;, kSource, &amp;quot;!release&amp;quot;, &amp;quot;ok&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    kSource=nullkey;&lt;br /&gt;
    if(!lockstatus)&lt;br /&gt;
        llOwnerSay(&amp;quot;@detach=y&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    //== Do this in reverse order because 1) it saves memory, and 2) the spec says so&lt;br /&gt;
    integer len;&lt;br /&gt;
    for (len = (llGetListLength(lRestrictions) - 1); len &amp;gt;= 0; len--)&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(llList2String (lRestrictions, len)+&amp;quot;=y&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        if(~llSubStringIndex(ownerexcept,llList2String(lRestrictions,len)))&lt;br /&gt;
            llOwnerSay(&amp;quot;@clear=&amp;quot;+llGetSubString(llList2String(lRestrictions, len),1,-1));&lt;br /&gt;
    }&lt;br /&gt;
    lRestrictions = [];&lt;br /&gt;
&lt;br /&gt;
    loginPendingForceSit = FALSE;&lt;br /&gt;
    lastForceSitDestination = nullkey;&lt;br /&gt;
    loginWaitingForPong = FALSE;&lt;br /&gt;
    llSetTimerEvent(0.0);&lt;br /&gt;
    ack(&amp;quot;Relay Release Notification&amp;quot;, sPendingId, &amp;quot;!release&amp;quot;, &amp;quot;ok&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    llMessageLinked(LINK_SET, 356, nullstr, nullkey);&lt;br /&gt;
&lt;br /&gt;
    if(kController != nullkey &amp;amp;&amp;amp; sPendingId != nullkey)&lt;br /&gt;
        llDialog(kController, llKey2Name(llGetOwner()) +&amp;quot; has not accepted your attempt to control their viewer via &amp;quot; + sPendingName +&amp;quot;.&amp;quot;, [], 99);&lt;br /&gt;
&lt;br /&gt;
    sPendingId = nullkey;&lt;br /&gt;
    sPendingName = nullstr;&lt;br /&gt;
    sPendingMessage = nullstr;&lt;br /&gt;
    kController = nullkey;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
// ---------------------------------------------------&lt;br /&gt;
//            initialisation and login handling&lt;br /&gt;
// ---------------------------------------------------&lt;br /&gt;
 &lt;br /&gt;
init() {&lt;br /&gt;
    debug(&amp;quot;RLV Plugin Free Memory at &amp;quot;+ (string)llGetFreeMemory());&lt;br /&gt;
    nMode=1;&lt;br /&gt;
    kSource=nullkey;&lt;br /&gt;
    lRestrictions=[];&lt;br /&gt;
    sPendingId=nullkey;&lt;br /&gt;
    sPendingName=nullstr;&lt;br /&gt;
    sPendingMessage=nullstr;&lt;br /&gt;
    llListen (-1812221819, nullstr, nullstr, nullstr);&lt;br /&gt;
    llListen (-1812220409, nullstr, llGetOwner(), nullstr);&lt;br /&gt;
    llOwnerSay (getModeDescription());&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// sends the known restrictions (again) to the RL-viewer&lt;br /&gt;
// (call this functions on login)&lt;br /&gt;
reinforceKnownRestrictions()&lt;br /&gt;
{&lt;br /&gt;
    integer i;&lt;br /&gt;
    integer len=llGetListLength(lRestrictions);&lt;br /&gt;
    string restr;&lt;br /&gt;
    &lt;br /&gt;
    if(len &amp;gt; 0)&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(&amp;quot;@a-relay=n&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;@detach=n&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    debug(&amp;quot;kSource=&amp;quot; + (string) kSource);&lt;br /&gt;
    for (i=0; i&amp;lt;len; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        restr=llList2String(lRestrictions, i);&lt;br /&gt;
        debug(&amp;quot;restr=&amp;quot; + restr);&lt;br /&gt;
        llOwnerSay(restr+&amp;quot;=n&amp;quot;);&lt;br /&gt;
        if (restr==&amp;quot;@unsit&amp;quot; &amp;amp;&amp;amp; lastForceSitDestination != nullkey)&lt;br /&gt;
        {&lt;br /&gt;
            loginPendingForceSit = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// send a ping request and start a timer&lt;br /&gt;
pingWorldObjectIfUnderRestrictions()&lt;br /&gt;
{&lt;br /&gt;
    loginWaitingForPong = FALSE;&lt;br /&gt;
    if (kSource != nullkey)&lt;br /&gt;
    {&lt;br /&gt;
        ack(&amp;quot;ping&amp;quot;, kSource, &amp;quot;ping&amp;quot;, &amp;quot;ping&amp;quot;);&lt;br /&gt;
        timerTickCounter = 0;&lt;br /&gt;
        llSetTimerEvent(1.0);&lt;br /&gt;
        loginWaitingForPong = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Handle commands&lt;br /&gt;
HandleCommand(string message, key id)&lt;br /&gt;
{&lt;br /&gt;
    list templist = llParseString2List(llToLower(message), [&amp;quot; &amp;quot;], []);&lt;br /&gt;
    string cmd = llList2String(templist, 0);&lt;br /&gt;
&lt;br /&gt;
    if(cmd == &amp;quot;relay&amp;quot; &amp;amp;&amp;amp; (id == ownerkey || (llListFindList(secowners, [id]) &amp;gt; -1 &amp;amp;&amp;amp; (ownerkey == nullkey || secaccess)) || (id == llGetOwner() &amp;amp;&amp;amp; (setby == nullkey || setby == llGetOwner() || (setby != ownerkey &amp;amp;&amp;amp; llListFindList(secowners, [setby]) &amp;lt;= -1)))))&lt;br /&gt;
    {&lt;br /&gt;
        integer change = 0;&lt;br /&gt;
        &lt;br /&gt;
        string second = llList2String(templist, 1);&lt;br /&gt;
        string third = llList2String(templist, 2);&lt;br /&gt;
        &lt;br /&gt;
        if(kSource != nullkey &amp;amp;&amp;amp; id == llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;You cannot change relay modes while the relay is locked.&amp;quot;);&lt;br /&gt;
            return;   &lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(id == ownerkey &amp;amp;&amp;amp; (second == &amp;quot;secondaries&amp;quot; || second == &amp;quot;sec&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            if(third == &amp;quot;on&amp;quot; || third == &amp;quot;auto&amp;quot; || (third == nullstr &amp;amp;&amp;amp; !secaccess))&lt;br /&gt;
            {&lt;br /&gt;
                secaccess = 1;&lt;br /&gt;
                llWhisper(0, &amp;quot;Secondary owners can now adjust Restrained Life Relay settings.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                secaccess = 0;&lt;br /&gt;
                llWhisper(0, &amp;quot;Secondary owners cannot adjust Restrained Life Relay settings.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if((secaccess || id == ownerkey || (id == llGetOwner() &amp;amp;&amp;amp; kSource == nullkey)) &amp;amp;&amp;amp; second == &amp;quot;ping&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            if(third == &amp;quot;off&amp;quot; || (third == nullstr &amp;amp;&amp;amp; !noping))&lt;br /&gt;
            {&lt;br /&gt;
                noping = 1;&lt;br /&gt;
                llWhisper(0,&amp;quot;Restrained Life Relay no longer requires regular object communication.  CAUTION: Relay will NOT detect if the control object has crashed or been removed, and in that instance will continue to enforce the last known restrictions until the wearer logs off.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                noping = 0;&lt;br /&gt;
                llWhisper(0,&amp;quot;Restrained Life Relay now requires regular object communication.&amp;quot;); &lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(second == &amp;quot;on&amp;quot; || second == &amp;quot;auto&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            nMode = 2;&lt;br /&gt;
            change = 1;&lt;br /&gt;
        }&lt;br /&gt;
        if(second == &amp;quot;off&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            nMode = 0;&lt;br /&gt;
            change = 1;   &lt;br /&gt;
        }&lt;br /&gt;
        if(second == &amp;quot;ask&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            nMode = 1;&lt;br /&gt;
            change = 1;   &lt;br /&gt;
        }&lt;br /&gt;
        if(second == &amp;quot;owner&amp;quot; || second == &amp;quot;wl&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            nMode = 3;&lt;br /&gt;
            change = 1;   &lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(second == nullstr || second == &amp;quot;mode&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            nMode++;&lt;br /&gt;
            if(nMode &amp;gt; 3) nMode = 0;&lt;br /&gt;
            change = 1;  &lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(second == &amp;quot;wbclear&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            WhiteBlack = [];&lt;br /&gt;
            llWhisper(0,&amp;quot;Relay Whitelist and Blacklist cleared.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(change)&lt;br /&gt;
        {&lt;br /&gt;
            setby = nullkey;&lt;br /&gt;
            if (nMode == 0)&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(0.0);&lt;br /&gt;
                releaseRestrictions();&lt;br /&gt;
                setby = nullkey;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent((float)PING_INTERVAL);&lt;br /&gt;
                if(nMode &amp;gt;= 2) setby = id;&lt;br /&gt;
            }&lt;br /&gt;
            if(id == llGetOwner())&lt;br /&gt;
                llOwnerSay(getModeDescription());   &lt;br /&gt;
            else&lt;br /&gt;
                llSay(0, getModeDescription());&lt;br /&gt;
                &lt;br /&gt;
            llMessageLinked(LINK_THIS, 63, nullstr, nullstr);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else if(cmd == &amp;quot;relay&amp;quot; &amp;amp;&amp;amp; id == llGetOwner())&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(&amp;quot;Sorry, only your owner can deactivate the relay once they enable it.&amp;quot;);   &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // Request owner list from the collar&lt;br /&gt;
        llMessageLinked(LINK_THIS, 47, nullstr, nullstr);&lt;br /&gt;
        // Reset the plugin list&lt;br /&gt;
        llMessageLinked(LINK_THIS, 62, nullstr, nullstr);&lt;br /&gt;
        init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Handle messages from the collar script&lt;br /&gt;
    link_message(integer sender, integer num, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if(num == 47)&lt;br /&gt;
        {&lt;br /&gt;
            list templist = llParseString2List(str, [&amp;quot;,&amp;quot;], []);&lt;br /&gt;
            integer x;&lt;br /&gt;
            integer count = llGetListLength(templist);&lt;br /&gt;
            &lt;br /&gt;
            // Handle owner list reply&lt;br /&gt;
            ownerkey = id;&lt;br /&gt;
            secowners = [];&lt;br /&gt;
            for(x=0;x&amp;lt;count;x++)&lt;br /&gt;
            {&lt;br /&gt;
                secowners = secowners + [ (key)llList2String(templist, x) ];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // Prefixless commands&lt;br /&gt;
        else if(num == 48 || num == 828)&lt;br /&gt;
        {&lt;br /&gt;
            if(llSubStringIndex(id,&amp;quot;|&amp;quot;) != -1) //== Strip out the combo info from the 828 reply&lt;br /&gt;
                id = (key)(llGetSubString(id,0,35));   &lt;br /&gt;
            // Handle Commands on the public or alternate channel&lt;br /&gt;
            HandleCommand(str, id);&lt;br /&gt;
        }&lt;br /&gt;
        else if(num == 33 &amp;amp;&amp;amp; id != nullkey)&lt;br /&gt;
        {&lt;br /&gt;
            // Collar script is giving us an owner&lt;br /&gt;
            ownerkey = id;&lt;br /&gt;
        }&lt;br /&gt;
        else if(num == 34 &amp;amp;&amp;amp; id != nullkey)&lt;br /&gt;
        {&lt;br /&gt;
            // Collar script is giving us a secondary owner&lt;br /&gt;
            secowners = secowners + [ id ];&lt;br /&gt;
        }&lt;br /&gt;
        else if(num == 35)&lt;br /&gt;
        {&lt;br /&gt;
            // Collar script is clearing owners&lt;br /&gt;
            ownerkey = nullkey;&lt;br /&gt;
            secowners = [];&lt;br /&gt;
        }&lt;br /&gt;
        else if(num == 36)&lt;br /&gt;
        {&lt;br /&gt;
            // Collar script is clearing secondary owners&lt;br /&gt;
            secowners = [];&lt;br /&gt;
        }&lt;br /&gt;
        // Handle plugin update&lt;br /&gt;
        else if(num == 62)&lt;br /&gt;
        {&lt;br /&gt;
            string buttons = &amp;quot;Relay Mode&amp;quot;;&lt;br /&gt;
            &lt;br /&gt;
            if(str == nullstr &amp;amp;&amp;amp; (id == nullstr || id == nullkey))&lt;br /&gt;
            {&lt;br /&gt;
                // Add for owner and owners (key)&lt;br /&gt;
                llMessageLinked(LINK_SET, 62, &amp;quot;Relay Sec&amp;quot;, buttons);&lt;br /&gt;
                // Add for sub and unowned sub (key)&lt;br /&gt;
                llMessageLinked(LINK_SET, 63, buttons, nullstr);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else if(num == 65)&lt;br /&gt;
        {&lt;br /&gt;
            lockstatus = (integer)str;  &lt;br /&gt;
        }&lt;br /&gt;
        else if(num == 66) //== Safeword, unlock&lt;br /&gt;
        {&lt;br /&gt;
            releaseRestrictions();&lt;br /&gt;
            setby = nullkey;&lt;br /&gt;
            nMode = 0;&lt;br /&gt;
            llOwnerSay(getModeDescription());&lt;br /&gt;
        }&lt;br /&gt;
        else if(num == 355)&lt;br /&gt;
            reinforceKnownRestrictions();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    attach(key id)&lt;br /&gt;
    {&lt;br /&gt;
        if(id == nullkey)&lt;br /&gt;
            llOwnerSay(&amp;quot;@clear&amp;quot;);   &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        // relogging, we must refresh the viewer and ping the object if any&lt;br /&gt;
        // if mode is not OFF, fire all the stored restrictions&lt;br /&gt;
        if (nMode)&lt;br /&gt;
        {&lt;br /&gt;
            reinforceKnownRestrictions();&lt;br /&gt;
            pingWorldObjectIfUnderRestrictions();&lt;br /&gt;
        }&lt;br /&gt;
        // remind the current mode to the user&lt;br /&gt;
        llOwnerSay(getModeDescription());&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        timerTickCounter++;   &lt;br /&gt;
        &lt;br /&gt;
        debug(&amp;quot;timer (&amp;quot; + (string) timerTickCounter + &amp;quot;): waiting for pong: &amp;quot; + (string) loginWaitingForPong + &amp;quot; pendingForceSit: &amp;quot; + (string) loginPendingForceSit);&lt;br /&gt;
        if (loginWaitingForPong &amp;amp;&amp;amp; (timerTickCounter &amp;gt;= LOGIN_DELAY_WAIT_FOR_PONG))&lt;br /&gt;
        {&lt;br /&gt;
            llWhisper(0, &amp;quot;Lucky Day: &amp;quot; + llKey2Name(llGetOwner()) + &amp;quot; is freed because the device is not available or is not responding to pings.&amp;quot;);&lt;br /&gt;
            loginWaitingForPong = FALSE;&lt;br /&gt;
            loginPendingForceSit = FALSE;&lt;br /&gt;
            releaseRestrictions();&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        if (loginPendingForceSit)&lt;br /&gt;
        {&lt;br /&gt;
            integer agentInfo = llGetAgentInfo(llGetOwner());&lt;br /&gt;
            if (agentInfo &amp;amp; AGENT_SITTING)&lt;br /&gt;
            {&lt;br /&gt;
                loginPendingForceSit = FALSE;&lt;br /&gt;
                debug(&amp;quot;is sitting now&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            else if (timerTickCounter &amp;gt;= PING_INTERVAL) //== Force Sit check&lt;br /&gt;
            {&lt;br /&gt;
                llWhisper(0, &amp;quot;Lucky Day: &amp;quot; + llKey2Name(llGetOwner()) + &amp;quot; is freed because sitting down again was not possible.&amp;quot;);&lt;br /&gt;
                loginPendingForceSit = FALSE;&lt;br /&gt;
                releaseRestrictions();&lt;br /&gt;
            }&lt;br /&gt;
            else if(!loginWaitingForPong)&lt;br /&gt;
            {&lt;br /&gt;
                 llOwnerSay (&amp;quot;@sittp=y,sit:&amp;quot;+(string)lastForceSitDestination+&amp;quot;=force&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if(sPendingId != nullkey &amp;amp;&amp;amp; sPendingTime + PERMISSION_DIALOG_TIMEOUT &amp;lt;= llGetUnixTime())&lt;br /&gt;
        {&lt;br /&gt;
            llDialog(llGetOwner(),&amp;quot;Request to control your viewer by &amp;quot;+ sPendingName +&amp;quot; automatically denied due to timeout.&amp;quot;, [&amp;quot;OK&amp;quot;], -1812220409);&lt;br /&gt;
            sPendingId = nullkey;&lt;br /&gt;
            sPendingName = nullstr;&lt;br /&gt;
            sPendingMessage = nullstr;&lt;br /&gt;
        }  &lt;br /&gt;
 &lt;br /&gt;
        if(timerTickCounter == 0 &amp;amp;&amp;amp; !noping)&lt;br /&gt;
            pingWorldObjectIfUnderRestrictions(); &lt;br /&gt;
 &lt;br /&gt;
        if (!loginPendingForceSit &amp;amp;&amp;amp; !loginWaitingForPong &amp;amp;&amp;amp; sPendingId == nullkey)&lt;br /&gt;
        {&lt;br /&gt;
            timerTickCounter = -1;&lt;br /&gt;
            if(!noping)&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent((float)PING_INTERVAL);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            llSetTimerEvent(0.0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if (channel==-1812221819)&lt;br /&gt;
        {&lt;br /&gt;
            debug(&amp;quot;LISTEN: &amp;quot; + message);&lt;br /&gt;
            &lt;br /&gt;
            //=== ALWAYS accept a lone &amp;quot;!release&amp;quot; command, no matter the distance&lt;br /&gt;
            list tokens = llCSV2List(message);&lt;br /&gt;
            if (!(llGetListLength(tokens) == 3 &amp;amp;&amp;amp; llList2String(tokens, 1) == llGetOwner()) || (!isObjectNear(id) &amp;amp;&amp;amp; llGetSubString(message, -9, -1) != &amp;quot;,!release&amp;quot;))&lt;br /&gt;
            {&lt;br /&gt;
               return;&lt;br /&gt;
            }&lt;br /&gt;
            tokens = [];&lt;br /&gt;
 &lt;br /&gt;
            if (nMode== 0)&lt;br /&gt;
            {&lt;br /&gt;
                debug(&amp;quot;deactivated - ignoring commands&amp;quot;);&lt;br /&gt;
                return; // mode is 0 (off) =&amp;gt; reject&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            debug(&amp;quot;Got message (active world object &amp;quot; + (string) kSource + &amp;quot;): name=&amp;quot; + name+ &amp;quot;; id=&amp;quot; + (string) id + &amp;quot;; message=&amp;quot; + message);&lt;br /&gt;
 &lt;br /&gt;
            if (kSource != nullkey &amp;amp;&amp;amp; kSource != id)&lt;br /&gt;
            {&lt;br /&gt;
                debug(&amp;quot;already used by another object =&amp;gt; reject&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            if(!loginPendingForceSit &amp;amp;&amp;amp; sPendingId == nullkey)&lt;br /&gt;
            {&lt;br /&gt;
                llSetTimerEvent(0.0);&lt;br /&gt;
                llSetTimerEvent((float)PING_INTERVAL);&lt;br /&gt;
            }&lt;br /&gt;
 &lt;br /&gt;
            loginWaitingForPong = FALSE; // whatever the message, it is for me =&amp;gt; it satisfies the ping request&lt;br /&gt;
//            timerTickCounter = -1;&lt;br /&gt;
 &lt;br /&gt;
            if (!isObjectKnow(id))&lt;br /&gt;
                if(!verifyPermission(id, name, message))&lt;br /&gt;
                    return;&lt;br /&gt;
 &lt;br /&gt;
            debug(&amp;quot;Executing: &amp;quot; + (string) kSource);&lt;br /&gt;
            execute(name, id, message);&lt;br /&gt;
        }&lt;br /&gt;
        else if (channel==-1812220409 &amp;amp;&amp;amp; id == llGetOwner())&lt;br /&gt;
        {&lt;br /&gt;
            if (sPendingId!=nullkey)&lt;br /&gt;
            {                &lt;br /&gt;
                if (message==&amp;quot;Yes&amp;quot; || message == &amp;quot;Always&amp;quot;) // pending request authorized =&amp;gt; process it&lt;br /&gt;
                {&lt;br /&gt;
                    //== Process Whitelist entry&lt;br /&gt;
                    if(message == &amp;quot;Always&amp;quot;) WhiteBlack += [llGetOwnerKey(sPendingId)];&lt;br /&gt;
                    debug(&amp;quot;Got approval of restrictions from wearer&amp;quot;);&lt;br /&gt;
                    execute(sPendingName, sPendingId, sPendingMessage);&lt;br /&gt;
                }&lt;br /&gt;
                else if(kSource == sPendingId)&lt;br /&gt;
                    releaseRestrictions();&lt;br /&gt;
                &lt;br /&gt;
                //== Process Blacklist entry&lt;br /&gt;
                if(kController == nullkey) kController = llGetOwnerKey(sPendingId);&lt;br /&gt;
                if(message == &amp;quot;Never&amp;quot;) WhiteBlack += [&amp;quot;-&amp;quot;+(string)llGetOwnerKey(kController)];&lt;br /&gt;
 &lt;br /&gt;
                // clear pending request&lt;br /&gt;
                sPendingName=nullstr;&lt;br /&gt;
                sPendingId=nullkey;&lt;br /&gt;
                sPendingMessage=nullstr;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if (change &amp;amp; CHANGED_OWNER) &lt;br /&gt;
        {&lt;br /&gt;
             llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:RestrainedLove|{{SUBPAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Relay/Specification&amp;diff=1171184</id>
		<title>LSL Protocol/Restrained Love Relay/Specification</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Relay/Specification&amp;diff=1171184"/>
		<updated>2012-07-29T08:23:27Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: cleanup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Restrained Love Relay Specs TOC}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VERSION 1.100&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Written and maintained by {{User|Marine Kelley}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Audience==&lt;br /&gt;
&lt;br /&gt;
This document is meant for people who want to create or modify &#039;&#039;&#039;in-world objects&#039;&#039;&#039; to use the features of someone else&#039;s [http://realrestraint.blogspot.com RestrainedLove viewer], typically &#039;&#039;&#039;cages&#039;&#039;&#039; and &#039;&#039;&#039;pieces of furniture&#039;&#039;&#039;, which per definition are usually not owned by that person.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
The [http://realrestraint.blogspot.com RestrainedLove viewer] only executes commands issued through [[llOwnerSay]] () messages. Therefore, in order to issue commands to someone using the viewer who does not own the object, that person must wear an attachment that &#039;&#039;&#039;relays&#039;&#039;&#039; commands after some &#039;&#039;&#039;security checks&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Why this spec ?==&lt;br /&gt;
&lt;br /&gt;
Many cages and furniture creators are interested in using its features such as sit, outfit, tp etc. These objects can be found in public places, or owned by friends... but as they are usually not owned by the user, the relay has to implement some basic security in order to avoid [[griefing]]. On top of it, the user does not want to be forced to switch to another relay when going to the next piece of furniture.&lt;br /&gt;
&lt;br /&gt;
This is the purpose of this specification: To lay common rules so all the relays implementing it are compatible with all the furniture implementing it too. Without such a specification, one cage/furniture would talk to the relay specifically made to operate with it and that&#039;s all, eventually making the creator stay behind because people rather use standard objects than proprietary closed ones.&lt;br /&gt;
&lt;br /&gt;
==Basic principle==&lt;br /&gt;
&lt;br /&gt;
Here is a sample use case:&lt;br /&gt;
&lt;br /&gt;
# User is wearing a Relay&lt;br /&gt;
# User enters a cage in a public area&lt;br /&gt;
# Cage sends a chat message on a known private channel (for instance &amp;quot;@tploc=n&amp;quot;)&lt;br /&gt;
# Relay receives the message, decides to repeat the command to the user and blocks their ability to teleport from the map with an [[llOwnerSay]] (&amp;quot;@tploc=n&amp;quot;);&lt;br /&gt;
# User is allowed to get out after some time, the cage issues a &amp;quot;!release&amp;quot; command&lt;br /&gt;
&lt;br /&gt;
Without the relay, the cage could never prevent the user from teleporting since it doesn&#039;t belong to them.&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
&lt;br /&gt;
Here are the informal requirements for a relay (formal requirements below).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Security===&lt;br /&gt;
Any object sending commands over the channel the relay listens to is likely to harm the user if there is no security implemented in the former. For instance, one could [[rez]] an object that sends a &amp;quot;@remoutfit=force&amp;quot; command over the chat channel to force an avatar to get naked in front of everyone without a warning. Of course nobody wants that, so basic security is needed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===User-friendliness===&lt;br /&gt;
Security often implies control (access lists, switch, permissions...) so the user must be given some basic control over what kind of objects are allowed to issue commands.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Versatility===&lt;br /&gt;
Some users will prefer wearing a dedicated attachment that they can unwear any time they want, others will be required to have the relay locked on them so they cannot detach them, others will want the script only... It is important to keep those differences in mind when deciding about the permissions of the relay. However, it is the user&#039;s responsibility to choose the relay that suits their needs best.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Licensing===&lt;br /&gt;
According to the level of complexity and support of the relay, the creator is allowed to either provide it for free (open/close source) or to sell it, as long as it implements all the formal requirements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Common questions==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===How hard is it to implement such a specification?===&lt;br /&gt;
That depends on what you do. Furniture/cage makers will find it very easy for it only comes down to sending commands over a chat channel and getting feedback. Relay makers will find it harder but then again, that depends on the level of security and user-friendliness they wish to offer. But make no mistake, the relay is what does almost all the job (along with the viewer), because there will be many more kinds of furniture and cages than relays around.&lt;br /&gt;
&lt;br /&gt;
===Why do other people need to write such a relay?===&lt;br /&gt;
Couldn&#039;t you write it yourself and publish it?&lt;br /&gt;
&lt;br /&gt;
Of course I could, and there is even a working code for a basic relay at [[LSL Protocol/Restrained Love Relay/Reference Implementation|Reference Implementation]]. However:&lt;br /&gt;
* The protocol is likely to improve because nobody sees the future&lt;br /&gt;
* One object only would not suit everyone&#039;s needs&lt;br /&gt;
* It would have to implement perfect security and perfect user-friendliness, in all cases&lt;br /&gt;
* It would of course have to be perfectly scripted, without any bug whatsoever&lt;br /&gt;
&lt;br /&gt;
The security and user-friendliness are the key parts here. Some users will prefer to be safe from [[griefing]], others will prefer a good user interface, others will like a lot of features, others will want to move the script elsewhere... Everyone has their own tastes so there can be no one-size-fits-all relay.&lt;br /&gt;
&lt;br /&gt;
==Protocol==&lt;br /&gt;
&lt;br /&gt;
In-world objects send chat message over a channel (common to every relay and furniture), that the relay(s) acknowledges or not. If the message is a correct command and passes whatever security checks the relay implements, the latter repeats it as an [[llOwnerSay]] ().&lt;br /&gt;
&lt;br /&gt;
When the session ends, possibly after several relogs, the object clears all the restrictions it has put the user under.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
&lt;br /&gt;
Here is a basic example of messages exchanged between an avatar (id &amp;quot;9213...&amp;quot;) and a world object (id &amp;quot;7adf...&amp;quot;) :&lt;br /&gt;
&lt;br /&gt;
 Object : CmdTest,9213f69a-ed7d-4a70-907a-7dba88c8831a,@tploc=n&lt;br /&gt;
 Relay executes llOwnerSay (&amp;quot;@tploc=n&amp;quot;);&lt;br /&gt;
 Relay  : CmdTest,7adf6218-ab26-8566-8387-660133840794,@tploc=n,ok&lt;br /&gt;
&lt;br /&gt;
 Object : BunchoCommands,9213f69a-ed7d-4a70-907a-7dba88c8831a,@tploc=n|@tplm=n|@tplure=n|@remoutfit:shoes=force&lt;br /&gt;
 Relay executes llOwnerSay (&amp;quot;@tploc=n&amp;quot;);&lt;br /&gt;
 Relay executes llOwnerSay (&amp;quot;@tplm=n&amp;quot;);&lt;br /&gt;
 Relay executes llOwnerSay (&amp;quot;@tplure=n&amp;quot;);&lt;br /&gt;
 Relay  : BunchoCommands,7adf6218-ab26-8566-8387-660133840794,@tploc=n,ok&lt;br /&gt;
 Relay  : BunchoCommands,7adf6218-ab26-8566-8387-660133840794,@tplm=n,ok&lt;br /&gt;
 Relay  : BunchoCommands,7adf6218-ab26-8566-8387-660133840794,@tplure=n,ok&lt;br /&gt;
 Relay  : BunchoCommands,7adf6218-ab26-8566-8387-660133840794,@remoutfit:shoes=force,ok&lt;br /&gt;
&lt;br /&gt;
 After a relog :&lt;br /&gt;
 Relay  : ping,7adf6218-ab26-8566-8387-660133840794,ping,ping&lt;br /&gt;
 Object : ping,9213f69a-ed7d-4a70-907a-7dba88c8831a,!pong   (UUID found with llGetOwnerKey(id), where id is the sender-parameter of the listen-event)&lt;br /&gt;
&lt;br /&gt;
==Formal requirements==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Common requirements to the Relay and the in-world object===&lt;br /&gt;
&lt;br /&gt;
* The chat channel used by both the Relay and the in-world object is &#039;&#039;&#039;-1812221819&#039;&#039;&#039;. That&#039;s &amp;quot;RLVRS&amp;quot; (&amp;quot;RestrainedLove Viewer Relay Script&amp;quot;) translated from alphabet to numbers.&lt;br /&gt;
&lt;br /&gt;
* Messages on the channel are described here in a pseudo [http://en.wikipedia.org/wiki/Backus-Naur_form Backus-Naur Form] :&lt;br /&gt;
&lt;br /&gt;
** &#039;&#039;&#039;&#039;&#039;Messages from in-world object to Relay (3 tokens) :&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;message&#039;&#039;            ::= &amp;amp;lt;cmd_name&amp;amp;gt;&#039;&#039;&#039;,&#039;&#039;&#039;&amp;amp;lt;user_uuid&amp;amp;gt;&#039;&#039;&#039;,&#039;&#039;&#039;&amp;amp;lt;list_of_commands&amp;amp;gt;&lt;br /&gt;
*** &#039;&#039;list_of_commands&#039;&#039;   ::= &amp;amp;lt;command&amp;amp;gt;[&#039;&#039;&#039;|&#039;&#039;&#039;&amp;amp;lt;list_of_commands&amp;amp;gt;]  (list_of_commands is *lowercase*)&lt;br /&gt;
*** &#039;&#039;command&#039;&#039;            ::= &amp;amp;lt;rl_command&amp;amp;gt; or &amp;amp;lt;meta-command&amp;gt;&lt;br /&gt;
*** &#039;&#039;rl_command&#039;&#039;         ::= &#039;&#039;&#039;@&#039;&#039;&#039;behav[&#039;&#039;&#039;:&#039;&#039;&#039;option][&#039;&#039;&#039;=&#039;&#039;&#039;param]&lt;br /&gt;
*** &#039;&#039;meta-command&#039;&#039;        ::= &#039;&#039;&#039;!version&#039;&#039;&#039; or &#039;&#039;&#039;!release&#039;&#039;&#039; or &#039;&#039;&#039;!pong&#039;&#039;&#039; or &#039;&#039;&#039;!implversion&#039;&#039;&#039; or &#039;&#039;&#039;!handover/&#039;&#039;&#039;&amp;amp;lt;hand-over parameter&amp;amp;gt; or &#039;&#039;&#039;!who/&#039;&#039;&#039;&amp;amp;lt;who parameter&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
** &#039;&#039;&#039;&#039;&#039;Messages from Relay to in-world object (4 tokens) :&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;message&#039;&#039;            ::= &amp;amp;lt;cmd_name&amp;amp;gt;&#039;&#039;&#039;,&#039;&#039;&#039;&amp;amp;lt;object_uuid&amp;amp;gt;&#039;&#039;&#039;,&#039;&#039;&#039;&amp;amp;lt;command&amp;amp;gt;&#039;&#039;&#039;,&#039;&#039;&#039;&amp;amp;lt;reply&amp;amp;gt;    (cmd_name is equal to the one in the incoming message)&lt;br /&gt;
*** &#039;&#039;reply&#039;&#039;              ::= &#039;&#039;&#039;ok&#039;&#039;&#039; or &#039;&#039;&#039;ko&#039;&#039;&#039; or &#039;&#039;&#039;ping&#039;&#039;&#039; or &amp;amp;lt;protocol_version&amp;amp;gt; or &amp;amp;lt;implementation_version&amp;amp;gt;&lt;br /&gt;
*** &#039;&#039;protocol_version&#039;&#039;   ::= integer  (it is the version of the &#039;&#039;specification&#039;&#039;, not of the script)&lt;br /&gt;
&lt;br /&gt;
* The effect of the &amp;quot;!release&amp;quot; meta-command is to wipe out all the restrictions issued by the object which sends it.&lt;br /&gt;
* The effect of the &amp;quot;!version&amp;quot; meta-command is to send the version of the protocol the Relay implements. See below.&lt;br /&gt;
* The effect of the &amp;quot;ping&amp;quot; message from the Relay to the object is to check the latter is still available. If not, release the user to avoid having orphaned rules.&lt;br /&gt;
* Notice that acknowledgments do not apply to the list of commands but to one command only. Therefore a list of N commands gives N acknowledgment messages in return (at most).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;In plain English :&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;cmd_name&amp;gt; is the name of the command, decided by the object. It will be used to find out which command has been acknowledged, therefore it must be repeated &#039;&#039;&#039;exactly&#039;&#039;&#039; by the Relay (without changing its case). An exception to the freedom of choice of the &amp;lt;cmd_name&amp;gt; token is the &amp;quot;ping&amp;quot; reserved name, see below.&lt;br /&gt;
* &amp;lt;user_uuid&amp;gt; is the [[UUID]] of the &#039;&#039;&#039;avatar&#039;&#039;&#039; owning the Relay.&lt;br /&gt;
* &amp;lt;object_uuid&amp;gt; is the [[UUID]] of the &#039;&#039;&#039;in-world object&#039;&#039;&#039;. Notice that we never need the [[UUID]] of the Relay as it&#039;s usually an attachment, prone to change its id after each relog.&lt;br /&gt;
* &amp;lt;list_of_commands&amp;gt; is a list of RL commands separated by pipes (&#039;|&#039;). It can be a single command (meaning no pipe present).&lt;br /&gt;
* &amp;lt;command&amp;gt; is either a regular RL command (@behav:option=param) or a meta-command, aimed at the Relay itself (!version, !release and !pong)&lt;br /&gt;
* Commands are separated by pipes (&#039;|&#039;) here, but if they must be sent in the same [[llOwnerSay]] to the viewer they must be separated by commas (&#039;,&#039;) and with only one &#039;&#039;&#039;&#039;@&#039;&#039;&#039;&#039; sign at the beginning of the whole message. This is on purpose, to force the Relay to parse them and check them one by one, as well as facilitate the parsing of the whole message coming from the in-world object.&lt;br /&gt;
* Everyone listening on the relay channel must have enough script memory available to handle a complete chat message which is limited to 1,000 character (2,000 bytes + processing).&lt;br /&gt;
&lt;br /&gt;
====&amp;quot;!release&amp;quot; meta-command====&lt;br /&gt;
* This meta-command is meant to make the Relay clear all the restrictions linked to the object issuing it. It is better to use it than to issue &amp;quot;counter-commands&amp;quot; to lift every restriction one by one without forgetting any.&lt;br /&gt;
* If the relay cancels an active session (for example because of a safe-word being called), it has to send a !release,ok message.&lt;br /&gt;
&lt;br /&gt;
====&amp;quot;!version&amp;quot; meta-command====&lt;br /&gt;
* When receiving this meta-command, the Relay must send a special acknowledgment that contains the version of the &#039;&#039;protocol&#039;&#039; it implements, on &#039;&#039;&#039;4 digits&#039;&#039;&#039;. This number must be an integer, equal to the version of this specification, written just after the title on this very page, times 1000. For instance, &amp;quot;1.120&amp;quot; would translate to &amp;quot;1120&amp;quot;. It makes it easier to compare versions without fear of losing information with a float cast to a string and back to a float.&lt;br /&gt;
* Do not mistake the version of the &#039;&#039;protocol&#039;&#039; with the version (@version) of the &#039;&#039;viewer&#039;&#039; or the version of the &#039;&#039;scripts&#039;&#039; (!implversion).&lt;br /&gt;
&lt;br /&gt;
====&amp;quot;ping&amp;quot; relay message and &amp;quot;!pong&amp;quot; object meta-command====&lt;br /&gt;
* When logging on, the relay will reapply all the stored restrictions but it only makes sense if the in-world object is still around and available for use. It could have been reset, crashed, or used by someone else while the primary user was offline. To let the relay apply the restrictions would therefore make no sense. That&#039;s why the relay has to ask the object if it&#039;s still around and available, and if no appropriate answer is received in a timely fashion then it must lift all the restrictions issued by it before, in order to start fresh again. Notice that &amp;quot;ping&amp;quot; is a simple word (to stay consistent with &amp;quot;ok&amp;quot; and &amp;quot;ko&amp;quot;) while &amp;quot;!pong&amp;quot; is a meta-command.&lt;br /&gt;
&lt;br /&gt;
The relay message must be &amp;quot;ping,&amp;amp;lt;object_uuid&amp;amp;gt;,ping,ping&amp;quot; and the object message must be &amp;quot;ping,&amp;amp;lt;user_uuid&amp;amp;gt;,!pong&amp;quot;. This allows the object to keep a listener open with a static filter, to reduce lag. &amp;amp;lt;user_uuid&amp;amp;gt; can be retrieved by a [[llGetOwnerKey]]() call.&lt;br /&gt;
&lt;br /&gt;
===Other meta-commands===&lt;br /&gt;
The following meta-commands are deemed &amp;quot;optional&amp;quot; and relays do not have to implement them to be considered RLV compliant. They are mostly tied to the specific implementation of a particular relay that a particular furniture needs to interrogate. Furniture must not rely on the implementation of any of these commands to work.&lt;br /&gt;
&lt;br /&gt;
=====&amp;quot;!implversion&amp;quot; meta-command=====&lt;br /&gt;
* The relay &#039;&#039;implementation&#039;&#039; should identify itself with a string.&lt;br /&gt;
* The is just like !version with the exception that !implversion is not about the &#039;&#039;protocol&#039;&#039; but about the implementation of it and may contain a string&lt;br /&gt;
* This version string is not intended for automatic checks but to help debugging problems&lt;br /&gt;
* Think of this as the signature of that particular relay&lt;br /&gt;
* The string must not contain any &amp;quot;,&amp;quot; or &amp;quot;!&amp;quot; characters&lt;br /&gt;
&lt;br /&gt;
===Deprecated meta-commands===&lt;br /&gt;
The following meta-commands used to belong to the specification without much discussion and without permission. They are mentioned here for reference but never meant to be part of the specification. They might be reinstated one day if they prove themselves useful, but at the time of this writing it would make no sense to consider a relay to be out of spec if it didn&#039;t implement those meta-commands.&lt;br /&gt;
&lt;br /&gt;
=====&amp;quot;!who&amp;quot; meta-command=====&lt;br /&gt;
* Syntax: !who/&amp;amp;lt;UUID&amp;amp;gt;&lt;br /&gt;
* This is an information message from the world telling the relay which avatar is controlling it.&lt;br /&gt;
* Traps that are automatically triggered by the victim should use the UUID of the victim instead of the person who has setup the trap, perhaps hours ago&lt;br /&gt;
* 00000000-0000-0000-0000-000000000000 (NULL_KEY) is valid, meaning an unknown avatar&lt;br /&gt;
* Note: The content of this message is obviously only as trustworthy as the world object is&lt;br /&gt;
&#039;&#039;Note from Marine : This meta-command may be designed to check the avatar operating the object to make griefing harder... but if this command is only as trustworthy as the object is, I don&#039;t see that as an improvement security-wise. Otherwise the idea has merit.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=====&amp;quot;!handover&amp;quot; meta-command=====&lt;br /&gt;
* Syntax: !handover/&amp;amp;lt;key&amp;amp;gt;/&amp;amp;lt;type&amp;amp;gt;&lt;br /&gt;
* Allows one world object to tell the relay it should accept commands from another world object instead without asking for permissions again. (For example a kidnapper object may do a force tpto to another sim where an other world object is waiting for the victim.&lt;br /&gt;
** (key) is the id of the target object &lt;br /&gt;
** (type) : 0 lift all restrictions of the source object, 1 keep them, it is the responsibility of the target object to keep them in mind &lt;br /&gt;
* The relay must ignore further &amp;quot;/&amp;quot;-parameters for future extension of the command. &lt;br /&gt;
* The relay must ignore any following commands on the same chat line&lt;br /&gt;
* The source object should send !handover/(key)/(type)|!release, so that relays that don&#039;t support !handover will release the restrictions and the next object can start normally.&lt;br /&gt;
* The relay must ensure with the !ping mechanism that the target object is available.&lt;br /&gt;
* The target object, however, might not be able to see the ping: For example because of a slow intersim teleport. In this case the target object must send a !pong on arrival of the victim anyway. &lt;br /&gt;
&#039;&#039;Note from Marine : This meta-command is particularly interesting, and is likely to go to the Other Meta-commands section in the future, or even in the main spec. It needs to be designed thoroughly first, though. I don&#039;t think it needs to be so complex, but it sure needs some checking.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Relay requirements===&lt;br /&gt;
* Send the exact @behav:option=param part in an [[llOwnerSay]] ()&lt;br /&gt;
* Retain a list of restrictions and their sources for when the user relogs.&lt;br /&gt;
* Force sit if unsit is prevented when relogging.&lt;br /&gt;
* When relogging, send a &amp;quot;ping&amp;quot; message (see above) to check the in-world object is still available. If no message after a few seconds (not necessarily a &amp;quot;!pong&amp;quot;, any message aimed at the relay can do), release the rules linked to this object.&lt;br /&gt;
* The user must have access to the version of the specification and the version of the implementation (dialog, message, object name...) to check everything works correctly.&lt;br /&gt;
* The relay must silently ignore commands to remove non-existing restrictions without spamming the user with pointless &amp;quot;ask for permission dialogs&amp;quot;&lt;br /&gt;
* Relays must accept !release even if the world object is out of range.&lt;br /&gt;
* Relays must send a !release,ok if they cancel an active session (for example because of an safe-word)&lt;br /&gt;
* Relays must ensure that it preserves the order of commands. For example: If a restriction is queued in the Ask-dialog, the lifting of the restriction must not be executed immediately unless the pending restriction in the ask-dialog-queue is removed, too.&lt;br /&gt;
&lt;br /&gt;
===In-world object requirements===&lt;br /&gt;
* If a world object sent any restrictions, it must end the session with !release even if the relay did not respond with &amp;quot;ok&amp;quot; unless all commands have been &amp;quot;ko&amp;quot;-ed. The relay may have delayed the execution to ask permission from the user who may confirm them after the session has already ended&lt;br /&gt;
* When receiving a &amp;quot;ping&amp;quot; message from a relay, reply with a &amp;quot;!pong&amp;quot; message (as described above) aimed at the avatar owning it, provided they are still restricted by the object.&lt;br /&gt;
* Never rely on an answer from the Relay, requests can be denied silently, the Relay can be unworn, the avatar can TP out or crash... =&amp;gt; use timeouts.&lt;br /&gt;
* Don&#039;t poll the [[dataserver]] for online status, the Relay takes care of the relog part.&lt;br /&gt;
* World objects should not spam the relay channel. For example: Querying every minute the relay version of every person near although nobody shows any signs to actually use the object.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
You can find the change history of this specification at [[LSL Protocol/Restrained Love Relay/Change History|Change History]],&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Restrained_Love_Open_Relay_Group_TOC&amp;diff=1171183</id>
		<title>Template:Restrained Love Open Relay Group TOC</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Restrained_Love_Open_Relay_Group_TOC&amp;diff=1171183"/>
		<updated>2012-07-29T08:17:05Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: cat sort&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;floatright&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;navbox&amp;quot; style=&amp;quot;width:20em; font-weight:bold&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center&amp;quot;&amp;gt;Restrained Love&amp;lt;br/&amp;gt;Open Relay Group&amp;lt;br/&amp;gt;x-tensions&amp;lt;/div&amp;gt;&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group|ORG Home]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/ORG Logo|Logo]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/ORG Introduction|ORG Introduction]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/ORG Requirements|ORG Requirements]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/Prefix|ORG Prefix]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/x-tensions|x-tensions, full list]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/x-tensions Validation Process|x-tensions, validation process]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Restrained Love Relay Specs TOC&amp;lt;noinclude&amp;gt;|cat={{FULLPAGENAME}}&amp;lt;/noinclude&amp;gt;}}&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Restrained_Love_Open_Relay_Group_TOC&amp;diff=1171182</id>
		<title>Template:Restrained Love Open Relay Group TOC</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Restrained_Love_Open_Relay_Group_TOC&amp;diff=1171182"/>
		<updated>2012-07-29T08:14:29Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: cat sort&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;floatright&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;navbox&amp;quot; style=&amp;quot;width:20em; font-weight:bold&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center&amp;quot;&amp;gt;Restrained Love&amp;lt;br/&amp;gt;Open Relay Group&amp;lt;br/&amp;gt;x-tensions&amp;lt;/div&amp;gt;&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group|ORG Home]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/ORG Logo|Logo]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/ORG Introduction|ORG Introduction]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/ORG Requirements|ORG Requirements]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/Prefix|ORG Prefix]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/x-tensions|x-tensions, full list]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/x-tensions Validation Process|x-tensions, validation process]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Restrained Love Relay Specs TOC&amp;lt;includeonly&amp;gt;|cat={{SUBPAGENAME}}&amp;lt;/includeonly&amp;gt;}}&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Restrained_Love_Relay_Specs_TOC&amp;diff=1171181</id>
		<title>Template:Restrained Love Relay Specs TOC</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Restrained_Love_Relay_Specs_TOC&amp;diff=1171181"/>
		<updated>2012-07-29T08:13:08Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;floatright&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;navbox&amp;quot; style=&amp;quot;width: 20em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&#039;&#039;&#039;Restrained Love Relay&#039;&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;[[LSL Protocol/Restrained Love Relay/Introduction|Introduction]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[LSL Protocol/Restrained Love Relay/Specification|Specification]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[LSL Protocol/Restrained Love Relay/Change History|Change History]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[LSL Protocol/Restrained Love Relay/Reference Implementation|Reference Implementation]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[LSL Protocol/Restrained Love Relay/Development &amp;amp; Contribution|Development &amp;amp; Contribution]]&#039;&#039;&#039;&lt;br /&gt;
** [[LSL Protocol/Restrained Love Relay/Bugs and Pending Features|Bugs and Pending Features]]&lt;br /&gt;
** [[LSL Protocol/Restrained Love Relay/How to Test|How to Test]]&lt;br /&gt;
** [[LSL Protocol/Restrained Love Relay/Other Implementations|Other Implementations]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Category:RestrainedLove&amp;lt;includeonly&amp;gt;|{{{cat|{{SUBPAGENAME}}}}}&amp;lt;/includeonly&amp;gt;]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Relay/Bugs_and_Pendings_Features&amp;diff=1171180</id>
		<title>LSL Protocol/Restrained Love Relay/Bugs and Pendings Features</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Relay/Bugs_and_Pendings_Features&amp;diff=1171180"/>
		<updated>2012-07-29T08:12:20Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: moved LSL Protocol/Restrained Love Relay/Bugs and Pendings Features to LSL Protocol/Restrained Love Relay/Bugs and Pending Features:&amp;amp;#32;typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[LSL Protocol/Restrained Love Relay/Bugs and Pending Features]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Relay/Bugs_and_Pending_Features&amp;diff=1171179</id>
		<title>LSL Protocol/Restrained Love Relay/Bugs and Pending Features</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Relay/Bugs_and_Pending_Features&amp;diff=1171179"/>
		<updated>2012-07-29T08:12:20Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: moved LSL Protocol/Restrained Love Relay/Bugs and Pendings Features to LSL Protocol/Restrained Love Relay/Bugs and Pending Features:&amp;amp;#32;typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Restrained Life Relay Specs TOC}}&lt;br /&gt;
&lt;br /&gt;
== Functions in discussion/development ==&lt;br /&gt;
* [[LSL Protocol/Restrained Life Relay/resetting environment settings|resetting environment settings]]&lt;br /&gt;
* [[LSL Protocol/Restrained Life Relay/pong handling contradiction|pong handling contradiction]]&lt;br /&gt;
* [[LSL Protocol/Restrained Life Relay/delay|delay]]&lt;br /&gt;
* [[LSL Protocol/Restrained Life Relay/gender|gender]]&lt;br /&gt;
&lt;br /&gt;
== Discussion about new features in 1.040 ==&lt;br /&gt;
&lt;br /&gt;
* [[LSL Protocol/Restrained Life Relay/vision|vision restriction]]&lt;br /&gt;
* [[LSL Protocol/Restrained Life Relay/handover|handover]]&lt;br /&gt;
* [[LSL Protocol/Restrained Life Relay/who|who]]&lt;br /&gt;
* [[LSL Protocol/Restrained Life Relay/editorial changes|editorial changes]]&lt;br /&gt;
&lt;br /&gt;
== 1.040 ==&lt;br /&gt;
Maike Short single script version&lt;br /&gt;
; Description : In listen event for the permission dialog, message is always freed before being send to the process function =&amp;gt; message is never handled and permission never given. &lt;br /&gt;
; Discovered by : herina Bode&lt;br /&gt;
; Fix : Replace call to processDialogResponse(id, message) by processDialogResponse(id, currentMessage);&lt;br /&gt;
&lt;br /&gt;
== 1.030 ==&lt;br /&gt;
&lt;br /&gt;
=== isObjectNear and non existing objects ===&lt;br /&gt;
&lt;br /&gt;
; Description : If an objects does not exist (anymore) in the current sim and its neighbors, llGetObjectDetails returns &amp;lt;0, 0, 0&amp;gt; which means it is wrongly detected as being close if you are within 100m to that locations&lt;br /&gt;
; Discovered by : Kitty Barnett&lt;br /&gt;
; Fix : [https://wiki.secondlife.com/w/index.php?title=LSL_Protocol%2FRestrained_Life_Relay%2FOther_Implementations%2FMaike_Short%27s_Relay&amp;amp;diff=262273&amp;amp;oldid=255372 Maike&#039;s fix]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== groupless objects are trusted on parcels not set to a group  ===&lt;br /&gt;
&lt;br /&gt;
; Description : On a parcel which is not set to a group, the not-owner warning is not displayed for groupless objects&lt;br /&gt;
; Discovered by : Kitty Barnett&lt;br /&gt;
; Fix : [https://wiki.secondlife.com/w/index.php?title=LSL_Protocol%2FRestrained_Life_Relay%2FOther_Implementations%2FMaike_Short%27s_Relay&amp;amp;diff=262273&amp;amp;oldid=255372 Maike&#039;s fix]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fake Avatar Chat ===&lt;br /&gt;
&lt;br /&gt;
; Description : 1. An object can remove the guarding prefix for chatting on channel using =y. 2. An object can use @getstatus=n or @getstatus=-1 (and in some cased @getstatus=some random text) to cause the agent to should on public chat. This does work for the other query commands as well.&lt;br /&gt;
; Discovered by : Marissa Mistwallow and Maike Short&lt;br /&gt;
; Affected relays : I did some quick tests on a number of different relays and so far all have been vulnerable (including my own one) to one or both of theses attacks.&lt;br /&gt;
; Fix : [https://wiki.secondlife.com/w/index.php?title=LSL_Protocol%2FRestrained_Life_Relay%2FOther_Implementations%2FMaike_Short%27s_Relay&amp;amp;diff=255362&amp;amp;oldid=253182 Maike&#039;s fix]&lt;br /&gt;
&lt;br /&gt;
== 1.020 ==&lt;br /&gt;
&lt;br /&gt;
Version 1.020 reintroduces all the problems listed in 1.014.&lt;br /&gt;
&lt;br /&gt;
=== Foreign Channel Chat ===&lt;br /&gt;
&lt;br /&gt;
; Discovered by : Maike Short&lt;br /&gt;
; Description : An object can force the agent to say any lower case text on any channel using @getstatus&lt;br /&gt;
; Note :  Relays which do not add any restriction on their own (like @detach=n) may be abused using @gestatus to trigger dialog responses, gag talk or other scripts like &amp;quot;to buy as gift, say the name of the receiver on channel /&#039;&#039;x&#039;&#039;&amp;quot;. Any version of the reference implementation smaller than (not including) 1.015 (but including 1.020 which is based on 1.014) are affected by this.&lt;br /&gt;
; Workaround : none&lt;br /&gt;
; Fixed : in [[LSL Protocol/Restrained Life Relay/Other Implementations/Maike Short&#039;s Relay|Maike Short&#039;s Relay]]&lt;br /&gt;
; Proposed fixed : Add &amp;quot;this-is-a-script-generated-message-beyond-the-control-of-the-agent/&amp;quot; at the beginning of @getstatus-replies on all channel by issuing this as the very first restriction. This still allows to trigger gags but it will include a human readable warning (if you speak Gagish well enough). The usual &amp;quot;to buy as gift, say the name of the receiver on channel /&#039;&#039;x&#039;&#039;&amp;quot; scripts will try to resolve this text as part of the name and will fail because such long avatar names are not allowed. Other scripts waiting for commands are very likely not to accept this text either. A more secure solution would be to define one single channel which must be used for such queries but that would break a lot of content.&lt;br /&gt;
&lt;br /&gt;
:: It would probably be sufficient to &amp;quot;ko&amp;quot; @getstatus=x requests where x &amp;lt; 1000.  Most gags or other scripts that expect human-typed channel numbers stick to &amp;lt; 1000, whereas most furniture looking for status use much larger channel numbers (mine use random channels, but with a minimum of 1000000, for example). --Julia Banshee&lt;br /&gt;
::: I agree that disallowing low channel numbers for all query types may be a good idea and I am not objecting a change of the spec although it has a low change of breaking content. (Well, since Marine is back, i can easily say this without having to think about all the time it will cost me to talk to affected people).  I strongly suggest, however, to put something at the beginning of @getstatus replies anyway. Fixed high level channels with a filter to the owner are sometimes used for debugging. (Yes, I am having a concrete object in my mind).  --[[User:Maike Short|Maike Short]] 11:03, 18 September 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
:: This problem appears related to the Fake Avatar Chat above. This issue could be fixed with the RLV Viewer itself, by simply discarding invalid restrictions, preventing this from ocurring in the first place and improving the performance of every relay out there by removing unnecessary checks. --[[User:Da Chrome|Da Chrome]] 7 December 2011&lt;br /&gt;
&lt;br /&gt;
=== Foreign Public Chat ===&lt;br /&gt;
&lt;br /&gt;
; Discovered by : Maike Short&lt;br /&gt;
; Description : An object can force the agent to say any text in public chat using @getstatus=0 and use similar functions (like @version) to spam other text there.&lt;br /&gt;
; Note : This allows the same abuse mentioned in the above entry, too. But being public chat makes even non abusable cases very annoying.&lt;br /&gt;
; Workaround : none&lt;br /&gt;
; Fixed : in the Restraint Life Viewer version 1.12.4. For older viewers the relay should prevent it: [[LSL Protocol/Restrained Life Relay/Other Implementations/Maike Short&#039;s Relay|Maike Short&#039;s Relay]]&lt;br /&gt;
; Proposed fixed : The relay should filter all queries directed to answer on channel 0 for Restraint Life Viewer version 1.12.3 and lower. Add this at the end of the huge if / else if / else if block in executeRLVCommand&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
    else if ((integer) param == 0) {&lt;br /&gt;
        // this is either an unknown param (not &amp;quot;n&amp;quot;, &amp;quot;add&amp;quot;, &amp;quot;y&amp;quot;, &amp;quot;rem&amp;quot;, &amp;quot;force&amp;quot;)&lt;br /&gt;
        // or a query which should be answered on the public chat channel 0.&lt;br /&gt;
        ack(cmd_id, id, command, &amp;quot;ko&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }    &lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Relay Crash in Ask mode ===&lt;br /&gt;
&lt;br /&gt;
; Discovered by : Maike Short&lt;br /&gt;
; Description : A malicious objects scans for all avatars within the sensor range. For each avatar a new object is rezes out of the content. This objects sends 10 messages to the relay each of about 1000 characters causing sPendingMessage to overflow. After the 10 messages are send these objects die making tracking very difficult.&lt;br /&gt;
; Note : Some relays accept commands from objects more than &amp;lt;del&amp;gt;20&amp;lt;/del&amp;gt;100 meters away so the attacking objects can be hidden far away.&lt;br /&gt;
; Workaround : None&lt;br /&gt;
; Open : although fixed in version 1.15 it was reintroduced by the revert in version 1.02&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 1.015 ==&lt;br /&gt;
&lt;br /&gt;
The below problems are fixed [[LSL_Protocol/Restrained_Life_Relay/Other_Implementations/Maike_Short&#039;s_Relay|here]], except for the forced sit issue below.&lt;br /&gt;
&lt;br /&gt;
== 1.014 ==&lt;br /&gt;
&lt;br /&gt;
The following problems occured in version 1.014 and have been fixed:&lt;br /&gt;
&lt;br /&gt;
=== Stuck: Accepting Permission Dialog after !release ===&lt;br /&gt;
; Discovered by : Maike Short&lt;br /&gt;
; Workaround : Don&#039;t accept requests after you have been freed. In case it happend, reenter the cage / sit down again; relog.&lt;br /&gt;
; Fixed : in 1.015&lt;br /&gt;
&lt;br /&gt;
=== Force Sit during Login on the control object instead of the forced-sit one ===&lt;br /&gt;
&lt;br /&gt;
; Discovered by : Azoth Amat&lt;br /&gt;
; Workaround : Always send a &amp;quot;@sit:&amp;lt;id&amp;gt;=force&amp;quot; command if you want a forced sit on relog, even if the victim is already sitting.&lt;br /&gt;
; Fix : change in &amp;lt;code&amp;gt;timer()&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;sendRLCmd (&amp;quot;@sit:&amp;quot;+(string)kSource+&amp;quot;=force&amp;quot;);&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;sendRLCmd (&amp;quot;@sit:&amp;quot;+(string)lastForceSitDestination+&amp;quot;=force&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
; Note : This prevents @unsit to work in case the person set down without being forced if the furniture in question hasn&#039;t sent a @sit:&amp;lt;id&amp;gt;=force command.  (This should probably be considered a bug in the furniture, not the relay.)&lt;br /&gt;
; Fixed : in 1.015 (but that fix breaks other things, forcing sits when not appropriate), and 1.02 (that fix always works, assuming the furniture is properly setting the @sit destination)&lt;br /&gt;
&lt;br /&gt;
:: Sending a bogus force sit on sit as you suggested may not work if force-sits are filtered. As far as I know there is no way for an attachment to detect the object the avatar is sitting on. So the relay will not be able to tell real force-sits (which should be subjected to the filter) and bogus force-sits for this problem apart. &lt;br /&gt;
:: It could accept a force-sit on the control-object but this would allow to kidnap an agent sitting on an other object. Well, the same can happen with my approach of using the sending object as fall back. Could you give an example for a forced sit when not appropriate with my approach? This may reveal other aspects of the problem.&lt;br /&gt;
:: The specification says &amp;quot;Force sit if unsit is prevented when relogging&amp;quot; in &amp;quot;Relay requirements&amp;quot; so I think objects that just send @unsit=n without force-sit should not be called buggy. If it turns out the current approach does cause more problems than it fixes it may be worth to adjust the spec. But this will cause existing world object to break so should not be taken lightly. --[[User:Maike Short|Maike Short]] 12:55, 17 September 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
=== Stuck on crash/relog with objects asking for relay upon being sat on ===&lt;br /&gt;
&lt;br /&gt;
; Discovered by : Gregor Mougin&lt;br /&gt;
; Problem : Many objects check for presence of a relay and the RR viewer by asking for the !version when sat on. If the user crashes, and the object was used by someone else in the meantime (or, for testing, reset), the relay enforces all previous restrictions whereas the object doesn&#039;t know of them.&lt;br /&gt;
; Workaround : none&lt;br /&gt;
; Suggested fix : &lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
--- RLV_v1.014a 2008-07-06 23:17:14.000000000 +0200&lt;br /&gt;
+++ RLV_v1.014a-xxx     2008-07-06 23:18:32.000000000 +0200&lt;br /&gt;
@@ -545,10 +545,16 @@&lt;br /&gt;
                 loginPendingForceSit = FALSE;&lt;br /&gt;
                 releaseRestrictions();&lt;br /&gt;
             }&lt;br /&gt;
-            else&lt;br /&gt;
-            {&lt;br /&gt;
-                 sendRLCmd (&amp;quot;@sit:&amp;quot;+(string)kSource+&amp;quot;=force&amp;quot;);&lt;br /&gt;
-            }&lt;br /&gt;
+            // XXX&lt;br /&gt;
+            // DON&#039;T do it here&lt;br /&gt;
+            // Some (many?) objects ask the relay for the !version upon&lt;br /&gt;
+            // sitting on it. Since the !version is interpreted the same&lt;br /&gt;
+            // as !pong, the relay would think the object is still available&lt;br /&gt;
+            // and put all restrictions on the wearer unconditionally.&lt;br /&gt;
+            //else&lt;br /&gt;
+            //{&lt;br /&gt;
+            //    sendRLCmd (&amp;quot;@sit:&amp;quot;+(string)kSource+&amp;quot;=force&amp;quot;);&lt;br /&gt;
+            //}&lt;br /&gt;
         }&lt;br /&gt;
  &lt;br /&gt;
         if (!loginPendingForceSit &amp;amp;&amp;amp; !loginWaitingForPong)&lt;br /&gt;
@@ -583,6 +589,18 @@&lt;br /&gt;
  &lt;br /&gt;
             loginWaitingForPong = FALSE; // whatever the message, it is for me =&amp;gt; it satisfies the ping request&lt;br /&gt;
  &lt;br /&gt;
+            // XXX&lt;br /&gt;
+            // force sit here instead of unconditionally in the timer event&lt;br /&gt;
+            if (loginPendingForceSit)&lt;br /&gt;
+            {&lt;br /&gt;
+                integer agentInfo = llGetAgentInfo(llGetOwner());&lt;br /&gt;
+                &lt;br /&gt;
+                loginPendingForceSit = FALSE;&lt;br /&gt;
+                if (!(agentInfo &amp;amp; AGENT_SITTING))&lt;br /&gt;
+                    sendRLCmd (&amp;quot;@sit:&amp;quot;+(string)kSource+&amp;quot;=force&amp;quot;);&lt;br /&gt;
+            }&lt;br /&gt;
+            // end XXX&lt;br /&gt;
+            &lt;br /&gt;
             if (!isObjectKnow(id))&lt;br /&gt;
             {&lt;br /&gt;
                 debug(&amp;quot;asking for permission because kSource is NULL_KEY&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
; Fixed : in 1.015 by specially looking for the !pong reply so that the fix works for cages  as well (no &amp;quot;force sit&amp;quot; in this situation but a collision detection which is triggered on login, too).&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Restrained_Love_Relay_Specs_TOC&amp;diff=1171178</id>
		<title>Template:Restrained Love Relay Specs TOC</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Restrained_Love_Relay_Specs_TOC&amp;diff=1171178"/>
		<updated>2012-07-29T08:11:43Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: cat sort&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;floatright&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;navbox&amp;quot; style=&amp;quot;width: 20em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&#039;&#039;&#039;Restrained Love Relay&#039;&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;[[LSL Protocol/Restrained Love Relay/Introduction|Introduction]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[LSL Protocol/Restrained Love Relay/Specification|Specification]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[LSL Protocol/Restrained Love Relay/Change History|Change History]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[LSL Protocol/Restrained Love Relay/Reference Implementation|Reference Implementation]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[LSL Protocol/Restrained Love Relay/Development &amp;amp; Contribution|Development &amp;amp; Contribution]]&#039;&#039;&#039;&lt;br /&gt;
** [[LSL Protocol/Restrained Love Relay/Bugs and Pendings Features|Bugs and Pending Features]]&lt;br /&gt;
** [[LSL Protocol/Restrained Love Relay/How to Test|How to Test]]&lt;br /&gt;
** [[LSL Protocol/Restrained Love Relay/Other Implementations|Other Implementations]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Category:RestrainedLove&amp;lt;includeonly&amp;gt;|{{{cat|{{SUBPAGENAME}}}}}&amp;lt;/includeonly&amp;gt;]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/who/002_draft&amp;diff=1171177</id>
		<title>LSL Protocol/Restrained Love Open Relay Group/who/002 draft</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/who/002_draft&amp;diff=1171177"/>
		<updated>2012-07-29T08:07:28Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: RestrainedLove&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Restrained Love Open Relay Group TOC}}&lt;br /&gt;
&lt;br /&gt;
STATUS: Silver&lt;br /&gt;
&lt;br /&gt;
VERSION: 002&lt;br /&gt;
&lt;br /&gt;
Relay implementations: TK, Dahlia&#039;s, Satomi&#039;s, OpenCollar, Cool HUD(?) ...&lt;br /&gt;
&lt;br /&gt;
Controller implementations: TK/dd, Dahlia, Witchy, and so on...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Commands:&#039;&#039;&#039;&lt;br /&gt;
* !x-who: secondary behavior&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(was previously !who, which is now deprecated)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Synopsis:&#039;&#039;&#039;&lt;br /&gt;
This x-tension makes it possible for the controller to tell the relay who is currently operating the device.&lt;br /&gt;
&lt;br /&gt;
This is motivated by a legitimate question relay wearers ask themselves when they get the authorization dialog &amp;quot;Should I? Should I not? I know this device. It could be fine... if only I knew the one pressing the buttons was not some -BEEP-!&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Using the information provided by !x-who, now the relay can inform the wearer and tell them the name of the avatar pressing the buttons.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
===Syntax===&lt;br /&gt;
!x-who/&amp;amp;lt;key&amp;amp;gt;&lt;br /&gt;
:: (key) is the UUID of the AV that you wish to present to the relay.&lt;br /&gt;
&lt;br /&gt;
It is assumed that all commands following !x-who in the message are sent on behalf of that AV.&lt;br /&gt;
&lt;br /&gt;
Commands in next messages are not affected by !x-who.&lt;br /&gt;
&lt;br /&gt;
===Usage scenarios===&lt;br /&gt;
&#039;&#039;&#039;Use of !x-who in front of a bunch of commands to inform the relay:&#039;&#039;&#039;&lt;br /&gt;
 C -&amp;gt; R: @detach=n|!x-who/&amp;amp;lt;user_key&amp;amp;gt;|@remoutfit=force&lt;br /&gt;
   &amp;lt;-  : @detach=n,ok&lt;br /&gt;
  -- auth dialog, the wearer says they don&#039;t like the avatar with key &amp;amp;lt;user_key&amp;amp;gt; --&lt;br /&gt;
   &amp;lt;-  : !x-who/&amp;amp;lt;user_key&amp;amp;gt;,ko&lt;br /&gt;
   &amp;lt;-  : @remoutfit=force,ko&lt;br /&gt;
   -&amp;gt;  : @remoutfit:shoes=force&lt;br /&gt;
   &amp;lt;-  : @remoutfit:shoes=force,ok&lt;br /&gt;
&lt;br /&gt;
As a result, the wearer&#039;s relay is locked, and the wearer is stripped only of their shoes.&lt;br /&gt;
&lt;br /&gt;
 C -&amp;gt; R: !x-who/&amp;amp;lt;user_key_1&amp;amp;gt;|@remoutfit=force&lt;br /&gt;
  -- auth dialog, the wearer says they like the avatar with key &amp;amp;lt;user_key_1&amp;amp;gt; --&lt;br /&gt;
   &amp;lt;-  : !x-who/&amp;amp;lt;user_key_1&amp;amp;gt;,ok&lt;br /&gt;
   &amp;lt;-  : @remoutfit=force,ok&lt;br /&gt;
   -&amp;gt;  : !x-who/&amp;amp;lt;user_key_2&amp;amp;gt;|@detach:skull=force&lt;br /&gt;
  -- auth dialog, the wearer says they don&#039;t like the avatar with key &amp;amp;lt;user_key_2&amp;amp;gt; --&lt;br /&gt;
   &amp;lt;-  : !x-who/&amp;amp;lt;user_key_2&amp;amp;gt;,ko&lt;br /&gt;
   &amp;lt;-  : @detach:skull=force,ko&lt;br /&gt;
&lt;br /&gt;
As a result, the wearer&#039;s relay is locked, and the wearer is stripped of their clothes, but keeping their prim hair.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alternatively, use of !x-who alone for its acknowledgement value:&#039;&#039;&#039;&lt;br /&gt;
 C -&amp;gt; R: !x-who/&amp;amp;lt;user_key&amp;amp;gt;&lt;br /&gt;
  -- auth dialog, the wearer says they don&#039;t like the avatar with key &amp;amp;lt;user_key&amp;amp;gt; --&lt;br /&gt;
   &amp;lt;-  : !x-who/&amp;amp;lt;user_key&amp;amp;gt;,ko;&lt;br /&gt;
After this ko, the controller knows not to send further commands on behalf of that user.&lt;br /&gt;
&lt;br /&gt;
 C &amp;lt;- R: !x-who/&amp;amp;lt;user_key&amp;amp;gt;&lt;br /&gt;
  -- auth dialog, the wearer says they like the avatar with key &amp;amp;lt;user_key&amp;amp;gt; --&lt;br /&gt;
   -&amp;gt;  : !x-who/&amp;amp;lt;user_key&amp;amp;gt;,ok&lt;br /&gt;
After this ok, the controller knows it is fine to send commands on behalf of that user.&lt;br /&gt;
&lt;br /&gt;
===Requirements===&lt;br /&gt;
* !x-who is always the first command in a RLVR message from the controller.&lt;br /&gt;
* The relay must remember the last key positively authenticated that was given in a !x-who. This way, if several subsequent messages use the same user key in !x-who, the ask dialog will appear for the first message only. Therefore the controller can safely put !x-who in front of every batch of commands.&lt;br /&gt;
* For the sake of simplicity of implementation, it is not expected (but allowed) that the relay remembers all users in the session.&lt;br /&gt;
*!x-who/clear tells the relay that following commands are not sent by a menu user and that it is not required for the relay to remember the user key anymore.&lt;br /&gt;
*!x-who/00000000-0000-0000-0000-000000000000 (NULL_KEY) is valid, meaning &amp;quot;some user&amp;quot;, with no more info given.&lt;br /&gt;
&lt;br /&gt;
===Caveat===&lt;br /&gt;
The content of this message is obviously only as trustworthy as the controller is. Hence when you accept a bunch of commands prefixed by a &amp;quot;!x-who&amp;quot;, you have to trust not only the avatar whose key is in after the &amp;quot;!x-who&amp;quot; &#039;&#039;&#039;&#039;&#039;and&#039;&#039;&#039;&#039;&#039;, but also the owner of the device issuing the command.&lt;br /&gt;
&lt;br /&gt;
Fortunately this requirement can be met easily (i.e.: if the owner is also the land owner, or if you personally know her), which makes this meta-command useful nonetheless.&lt;br /&gt;
&lt;br /&gt;
==Implementation ideas==&lt;br /&gt;
* The acknowledgement to a !x-who can be used by the controller to display some message and warn the user attempting to use its menus. &lt;br /&gt;
* The ask dialog in relays would ideally show the device name, its owner&#039;s name and that of the avatar using the device at the moment. Several actions can be proposed for accepting/rejecting the control attempt, with or without adding owner and/or controller to a white or black list.&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/email/006_draft&amp;diff=1171176</id>
		<title>LSL Protocol/Restrained Love Open Relay Group/email/006 draft</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/email/006_draft&amp;diff=1171176"/>
		<updated>2012-07-29T08:06:09Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: RestrainedLove&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Restrained Love Open Relay Group TOC}}&lt;br /&gt;
&lt;br /&gt;
= !x-email =&lt;br /&gt;
STATUS: draft&lt;br /&gt;
&lt;br /&gt;
VERSION: 006&lt;br /&gt;
&lt;br /&gt;
MANDATORY DEPENDENCIES: &#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/key|key]]&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
RECOMMENDED: &#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/autoforward|autoforward]]&#039;&#039;&#039;&#039;&#039;, &#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/sensor|sensor]]&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;005 implemented in Satomi&#039;s Multi-Relay HUD 0.93, and Satomi&#039;s Witchy Remote 1.1beta2&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;005 Implemented in Dahlia&#039;s multirelay &amp;gt;=0.39 and anythingRLV &amp;gt;=2.97&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Presentation of e-mails==&lt;br /&gt;
The topic: ORG encapsulated RLVR protocol,&amp;lt;protocol version&amp;gt;, &amp;lt;session_key&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ex:  ORG encapsulated RLVR protocol,006,45afb982-d02c-35e1-d492-a948b92c92f3&lt;br /&gt;
The session key is a secret shared by both relay and controlling device, and will be created during the protocol initiation using !x-key as defined in &#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/key|key]]&#039;&#039;&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
==Example of initialization between a controller C and the relay R==&lt;br /&gt;
&lt;br /&gt;
In the following exchange, the controller C and the relay R negotiates a secret UUID key which will be the key of the session. The exchange is done using llRegionSayTo() to keep the key secret (k(R) is the UUID key of the wearer of the relay and k(C) the UUID key of the controller).&lt;br /&gt;
&lt;br /&gt;
 1 C--RLVR--&amp;gt; R    secret_key,k(R),!x-key/a586c562-bf27-b7db-e36e-822d0a9ba02a&lt;br /&gt;
 2 C&amp;lt;-RLVR--- R    secret_key,k(C),!x-key/a586c562-bf27-b7db-e36e-822d0a9ba02a,ok&lt;br /&gt;
&lt;br /&gt;
Then C can start an email session using !x-email as follows: &lt;br /&gt;
&lt;br /&gt;
 1 C--RLVR--&amp;gt; R    blah,k(R),!x-email&lt;br /&gt;
 2 C&amp;lt;-RLVR--- R    blah,k(C),!x-email,ok&lt;br /&gt;
&lt;br /&gt;
Without secret key, the answer for !x-email must be a &amp;quot;ko&amp;quot;. There are no exceptions. Then the session can continue by email using the subject &amp;quot;ORG encapsulated RLVR protocol,006,a586c562-bf27-b7db-e36e-822d0a9ba02a&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 1 -e&amp;gt;     bleh,&amp;lt;anything&amp;gt;&lt;br /&gt;
 2 &amp;lt;e-     bleh,&amp;lt;anything&amp;gt;,&amp;lt;ack&amp;gt;&lt;br /&gt;
 ...&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remark&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The autoforward and sensor x-tensions are not required: a controller does not necessarily need to send @getxxx or @notify commands, or to scan for objects or avatars. The autoforward and the sensor x-tensions may be used also for a simwide control (i.e. a chat session with the controller and the relay distant of more than 100m).&lt;br /&gt;
&lt;br /&gt;
==Ending the email session between a controller C and the relay R==&lt;br /&gt;
&lt;br /&gt;
To end up an email session, the command !x-takeover is used (in 005, the command !x-channel was used but this command will be less useful in the future and probably deprecated because of llRegionSayTo()).&lt;br /&gt;
&lt;br /&gt;
 1 C--RLVR--&amp;gt; R   back_to_chat,k(R),!x-takeover/a586c562-bf27-b7db-e36e-822d0a9ba02a&lt;br /&gt;
 2 C&amp;lt;-RLVR--- R   back_to_chat,k(C),!x-takeover/a586c562-bf27-b7db-e36e-822d0a9ba02a,ok&lt;br /&gt;
&lt;br /&gt;
Note that in the above exchange, the controller C is not necessarily the first controller; the above commands can also be interpreted as a kind of handover. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* The commands using the secret session key must use llRegionSayTo(): !x-key and !x-takeover&lt;br /&gt;
* This behaviour of !x-takeover is already in the version 002 of the x-tension key.&lt;br /&gt;
&lt;br /&gt;
==Testing controller&#039;s presence==&lt;br /&gt;
&lt;br /&gt;
For garbage collection purposes, be it on relog, or on regular basis, R might want to check if C is still active. The ping mechanism can be used here.&lt;br /&gt;
 &amp;lt;e-    ping,ping,ping&lt;br /&gt;
 -e&amp;gt;    ping,!pong&lt;br /&gt;
&lt;br /&gt;
The important thing is that the relay remembers it was an email session after relog.&lt;br /&gt;
&lt;br /&gt;
C can check R&#039;s presence by sending any valid message, as acknowledgement by R is required for every RLVR message from C. If the only purpose of the message is presence verification, the following scenario is recommended:&lt;br /&gt;
 -e&amp;gt;    blah,!x-email&lt;br /&gt;
 &amp;lt;e-    blah,!x-email,ok&lt;br /&gt;
&lt;br /&gt;
==Handover==&lt;br /&gt;
!x-handover/K/n should work like in chat sessions (with the semantics that the session is transferred to the object of key K, chatting on standard RLVR channel).&lt;br /&gt;
&lt;br /&gt;
Handing over to another object while remaining in e-mail mode, doesn&#039;t however require any special step. The following scenario can be used:&lt;br /&gt;
 1 - assume C has a session with R, using key k(S)&lt;br /&gt;
 2 - C gives k(S) to another object C&#039; via any preferred medium&lt;br /&gt;
 3 - now  C&#039; can continue e-mailing with S, using key k(S) (and can use the &amp;quot;C has a new key&amp;quot; scenario)&lt;br /&gt;
&lt;br /&gt;
Handing over to oneself can also be used to switch back to chat mode.&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/key/003_draft&amp;diff=1171175</id>
		<title>LSL Protocol/Restrained Love Open Relay Group/key/003 draft</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/key/003_draft&amp;diff=1171175"/>
		<updated>2012-07-29T08:04:38Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: RestrainedLove&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Restrained Love Open Relay Group TOC}}&lt;br /&gt;
&lt;br /&gt;
STATUS: draft&lt;br /&gt;
&lt;br /&gt;
VERSION: 003&lt;br /&gt;
&lt;br /&gt;
RECOMMENDED WITH: &#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/delay|delay]]&#039;&#039;&#039;&#039;&#039;,&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/cancel|cancel]]&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
COMMANDS:&lt;br /&gt;
* !x-key/&amp;amp;lt;session_key&amp;amp;gt;: associates key &amp;amp;lt;session_key&amp;amp;gt; to current session.&lt;br /&gt;
* !x-takeover/&amp;amp;lt;session_key&amp;amp;gt;: takes over control of the session with specified key.&lt;br /&gt;
&lt;br /&gt;
IMPLEMENTATIONS:&lt;br /&gt;
* Version 002 in Dahlia&#039;s multirelay &amp;gt;= 0.48 and in anythingRLV &amp;gt;= 3.1&lt;br /&gt;
* Version 002 and 003 in Dahlia&#039;s multirelay &amp;gt;= 1.2.20 and in anythingRLV &amp;gt;= 3.7&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=!x-key and !x-takeover=&lt;br /&gt;
&lt;br /&gt;
!x-key/&amp;amp;lt;session_key&amp;amp;gt; associates the key &amp;amp;lt;session_key&amp;amp;gt; with the current session, where &amp;amp;lt;session_key&amp;amp;gt; is a [[UUID]] randomly generated by the controller of the current session. After a session key is set, any other controller can then take the control of this session by sending the command !x-takeover/&amp;amp;lt;session_key&amp;amp;gt;. By &amp;quot;other&amp;quot;, it can also mean the same controller after a relog or region restart and thus a different key.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
Two controllers on the left:&lt;br /&gt;
* C1 is in control of the session before this exchange,&lt;br /&gt;
* and C2 will gain control at the end of the exchange (with all restrictions carried over under its own key).&lt;br /&gt;
On the right, R is the relay.&lt;br /&gt;
&lt;br /&gt;
k(C1), k(C2), k(C) are the keys of the controllers and k(R) is the key of the avatar wearing the relay.&lt;br /&gt;
&lt;br /&gt;
# C1 -&amp;gt; R: blah,k(R),!x-key/a586c562-bf27-b7db-e36e-822d0a9ba02a&lt;br /&gt;
# C1 &amp;lt;- R: blah,k(C1),!x-key/a586c562-bf27-b7db-e36e-822d0a9ba02a,ok&lt;br /&gt;
# C2 -&amp;gt; R: blah,k(R),!x-takeover/a586c562-bf27-b7db-e36e-822d0a9ba02a&lt;br /&gt;
# C2 &amp;lt;- R: blah,k(C2),!x-takeover/a586c562-bf27-b7db-e36e-822d0a9ba02a,ok&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* At 1, C1 generates a random UUID key which must be recorded by the relay.&lt;br /&gt;
* Between 2 and 3, C1 gives the key to C2. Often C2 will actually be C1 after a relog and thus with a new object key, but with LSL remembering everything from before the relog, in particular the session key.&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
General requirements:&lt;br /&gt;
* By supporting this x-tension, a relay associates a new key/UUID field to each RLVR session: the session key.&lt;br /&gt;
* The relay must acknowledge !x-key and !x-takeover using private communications only (so that nobody can eavesdrop and read the session key). Use of [[llRegionSayTo]] is therefore mandatory in case you use chat on standard RLVR channel.&lt;br /&gt;
&lt;br /&gt;
Requirements concerning !x-key:&lt;br /&gt;
* !x-key is to be considered as a secondary behavior (it can trigger an ask dialog and open a session but the session will eventually time out if there is no primary behavior)&lt;br /&gt;
* On !x-key/&amp;lt;UUID&amp;gt; acceptation, the relay sets the current session key to &amp;lt;UUID&amp;gt;.&lt;br /&gt;
* If a relay accepts a command !x-key/&amp;lt;uuid&amp;gt; within a session which already had a key, then the new one replaces the old one.&lt;br /&gt;
&lt;br /&gt;
Requirements concerning !x-takeover:&lt;br /&gt;
* If &amp;lt;UUID&amp;gt; is an existing session key !x-takeover/&amp;lt;UUID&amp;gt; cannot be refused by the relay (acknowledgement by &amp;quot;ok&amp;quot;).&lt;br /&gt;
* If &amp;lt;UUID&amp;gt; is NULL_KEY or is equal to no existing session key, !x-takeover/&amp;lt;UUID&amp;gt; must be refused by the relay (acknowledgement by &amp;quot;ko&amp;quot;).&lt;br /&gt;
* In no case !x-takeover triggers an interactive dialog or opens a session.&lt;br /&gt;
* On accepting !x-takeover/&amp;lt;UUID&amp;gt;&lt;br /&gt;
:* the relay makes the device who issued the command the controller of the session having &amp;lt;uuid&amp;gt; as session key,&lt;br /&gt;
:* the relay considers that if that device already was controlling a session, then that session has no controller anymore.&lt;br /&gt;
* The communication method (chat, email, http, ...) of the session that was taken over becomes the same as the one by which !x-takeover was received, no matter the way that session was previously accessed. For instance, if a device sends !x-takeover by chat and takes over an existing email session, then the session continues by chat.&lt;br /&gt;
&lt;br /&gt;
==Recommendations==&lt;br /&gt;
* The controller should preferably send !x-key and !x-takeover through private channels only too. But letting session keys be &amp;quot;leaked&amp;quot; or not is only the controller&#039;s responsibility. It could actually be done on purpose.&lt;br /&gt;
* The key should preferably be randomly generated, so there is little risk for a session to be stolen by another device by guessing the key.&lt;br /&gt;
* In relay implementations, take care that the following scenario cannot happen:&lt;br /&gt;
:# C1 has an open session with R and no key set&lt;br /&gt;
:# C2 sends hijack_session,!x-takeover/00000000-0000-0000-0000-000000000000&lt;br /&gt;
:# Now C2 controls the session that formerly was C1&#039;s.&lt;br /&gt;
:For this reason, it is required that the relay refuses !x-takeover/NULL_KEY, so that the relay implementation can initialize session keys to NULL_KEY by default (which we recommend).&lt;br /&gt;
* Consequently, if a controller sends !x-key/00000000-0000-0000-0000-00000000000, it is equivalent to !x-key/clear (which does not formally exist); this command is mostly useless: its effect is to make any !x-takeover impossible.&lt;br /&gt;
* A session currently having no controller will fail all pings and thus unless !x-delay is set, a controller sending !x-takeover within a session will lose its former session (all restrictions will be released). In this case, the relay can release the current session immediately after !x-takeover is accepted.&lt;br /&gt;
* As a RLVR controller scriptwriter, most likely you don&#039;t want !x-takeover to be sent within an existing session, as this would mean closing/releasing it. If you do that, ask yourself if you want the session to remain in the background for some more time. If the answer is yes, don&#039;t forget to make the session resistant to !ping&#039;s by sending !x-delay/&amp;lt;some_more_time_in_seconds&amp;gt; before you send !x-takeover/&amp;lt;uuid&amp;gt; of the other session&amp;gt;. Also preferably set a key in the first session so it can be recovered later on.&lt;br /&gt;
&lt;br /&gt;
= (DEPRECATED) !x-noping / !x-nopingclear=&lt;br /&gt;
&lt;br /&gt;
:These commands are &#039;&#039;&#039;deprecated&#039;&#039;&#039;, use !x-delay and !x-delay/clear instead.&lt;br /&gt;
:New RLVR controllers should not use them at all. They can instead send a command like !x-delay/&amp;lt;some_reasonable_amount_of_seconds&amp;gt;/noping|!release if they need to keep the session open for &amp;lt;some_reasonable_amount_of_seconds&amp;gt;, and then !x-delay/clear/noping after !x-takeover.&lt;br /&gt;
:Relays can either interpret them as they used to mean, or preferably translate them to respectively to !x-delay/&amp;lt;some_long_enough_amount_of_time&amp;gt;/noping and !x-delay/clear/noping if the relay supports &#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/delay|delay]]&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
We remind the reader that, like with !x-noping, pings are disabled for a session as long as a delay is running within that session. The obvious advantage over !x-noping is that it forces the controller scriptwriter to think of a reasonable delay after which to release the session is meant to expire if not taken over.&lt;br /&gt;
&lt;br /&gt;
For information, we recall below what !x-noping / !x-nopingclear used to mean:&lt;br /&gt;
&lt;br /&gt;
==Motivation==&lt;br /&gt;
There usually are three ways a relay can end a session:&lt;br /&gt;
* when a !release is sent by the controller,&lt;br /&gt;
* when the user safe-words from the relay,&lt;br /&gt;
* and when the relay finds the controller is not present (not answering !pong to a ping after a relog or on refresh).&lt;br /&gt;
The command !x-noping disables the latter possibility, so that the session can persist despite the controller disappearing. This would typically happen very often if the controller is a portable HUD.&lt;br /&gt;
&lt;br /&gt;
Combined with !x-key and !x-takeover, !x-ping makes it possible for that portable HUD to recover a RLVR session after its wearer relogs, possibly after a long time offline.&lt;br /&gt;
&lt;br /&gt;
* !x-noping cannot exist without !x-key. Without a session key negotiated with !x-key, the relay must answer !x-noping,ko to any !x-noping. The reason of this choice is that a session with !x-noping and without session key is not cancellable anymore by a controller if the controller disappears (e.g. unrezzed).&lt;br /&gt;
&lt;br /&gt;
* The command !x-key/NULL_KEY or !x-key/clear must cancel any previous !x-noping for the same reason.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
After the following sequence of commands, the user of the controller C if it is a HUD can go offline. The session will persist until the relay safe-words.&lt;br /&gt;
&lt;br /&gt;
 1 C -&amp;gt; R: blah,k(R),!x-key/a586c562-bf27-b7db-e36e-822d0a9ba02a&lt;br /&gt;
 2 C &amp;lt;- R: blah,k(C),!x-key/a586c562-bf27-b7db-e36e-822d0a9ba02a,ok&lt;br /&gt;
 3 C -&amp;gt; R: blah,k(R),!x-noping&lt;br /&gt;
 4 C &amp;lt;- R: blah,k(C),!x-noping,ok&lt;br /&gt;
&lt;br /&gt;
k&#039;(C) is the new UUID key of C after the relog. To cancel this setting after a relog: &lt;br /&gt;
&lt;br /&gt;
 1 C -&amp;gt; R: blah,k(R),!x-takeover/a586c562-bf27-b7db-e36e-822d0a9ba02a&lt;br /&gt;
 2 C &amp;lt;- R: blah,k&#039;(C),!x-takeover/a586c562-bf27-b7db-e36e-822d0a9ba02a,ok&lt;br /&gt;
 3 C -&amp;gt; R: blah,k(R),!x-noping/clear&lt;br /&gt;
 4 C &amp;lt;- R: blah,k&#039;(C),!x-noping/clear,ok&lt;br /&gt;
&lt;br /&gt;
To release the victim after a relog: &lt;br /&gt;
&lt;br /&gt;
 1 C -&amp;gt; R: blah,k(R),!x-takeover/a586c562-bf27-b7db-e36e-822d0a9ba02a&lt;br /&gt;
 2 C &amp;lt;- R: blah,k&#039;(C),!x-takeover/a586c562-bf27-b7db-e36e-822d0a9ba02a,ok&lt;br /&gt;
 3 C -&amp;gt; R: blah,k(R),!release&lt;br /&gt;
 4 C &amp;lt;- R: blah,k&#039;(C),!release,ok&lt;br /&gt;
&lt;br /&gt;
To continue with the session after a relog: &lt;br /&gt;
&lt;br /&gt;
 1 C -&amp;gt; R: blah,k(R),!x-takeover/a586c562-bf27-b7db-e36e-822d0a9ba02a&lt;br /&gt;
 2 C &amp;lt;- R: blah,k&#039;(C),!x-takeover/a586c562-bf27-b7db-e36e-822d0a9ba02a,ok&lt;br /&gt;
 3 C -&amp;gt; R: blah,k(R),@xxx=add&lt;br /&gt;
 4 C &amp;lt;- R: blah,k&#039;(C),@xxx=add,ok&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
&lt;br /&gt;
* !x-noping is a secondary behavior. It can trigger an interactive ask dialog, depending on settings.&lt;br /&gt;
* On answering &amp;quot;!x-noping,ok&amp;quot; to !x-noping, the relay commits itself not to check for presence of the controller of this session anymore and thus not to close the session because the controller fails to answer a ping.&lt;br /&gt;
&lt;br /&gt;
==Caveat==&lt;br /&gt;
On relog, the fact there is no ping/pong exchange for a session with !x-noping does not mean the relay should not sit the avatar back to where it was sat if this session had @unsit=n as active behavior. So the key &amp;lt;UUID&amp;gt; of the sit target should still be remembered, and @sit:&amp;lt;UUID&amp;gt;=force be sent a few seconds after relog.&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/x-xtensions&amp;diff=1171174</id>
		<title>LSL Protocol/Restrained Love Open Relay Group/x-xtensions</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/x-xtensions&amp;diff=1171174"/>
		<updated>2012-07-29T07:58:30Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: RestrainedLove&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Restrained Love Open Relay Group TOC}}&lt;br /&gt;
&lt;br /&gt;
Deprecated by !x-orgversions, which is part of [[LSL Protocol/Restrained Love Open Relay Group/ORG Requirements|ORG core requirements]].&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/Satomi%27s_Damn_Fast_Relay&amp;diff=1171172</id>
		<title>LSL Protocol/Restrained Love Open Relay Group/Satomi&#039;s Damn Fast Relay</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/Satomi%27s_Damn_Fast_Relay&amp;diff=1171172"/>
		<updated>2012-07-29T07:56:12Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: RestrainedLove&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Restrained Love Open Relay Group TOC}}&lt;br /&gt;
&lt;br /&gt;
= Satomi&#039;s Damn Fast Relay =&lt;br /&gt;
&lt;br /&gt;
This is the shortest known implementation of an ORG compliant relay.&lt;br /&gt;
&lt;br /&gt;
This relay only makes the minimal verifications (no ask mode, no distance checks, ping on relog only but safe-word on touch). &lt;br /&gt;
&lt;br /&gt;
Code is under a BSD-style license, feel free to use in your own projects, provided you credit Satomi Ahn for the original script.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Damn Fast Relay, by Satomi Ahn&lt;br /&gt;
//&lt;br /&gt;
//This is a minimalist RLV Relay intended for laggy playgrounds, with the aim of making the answer to scan requests as fast as possible and decreasing the global lag.&lt;br /&gt;
//It only features the auto-accept mode but tries to fully comply to ORG 003 specifications.&lt;br /&gt;
//Touching the relay will make it release restrictions and reset (in other words: safewording).&lt;br /&gt;
//&lt;br /&gt;
//This script is provided as-is with mo guarrantee whatsoever.&lt;br /&gt;
//Feel free to use the code in anyway you want, provided you credit the original author, ie: myself, Satomi Ahn.&lt;br /&gt;
//(can be seen as a BSD-style license)&lt;br /&gt;
&lt;br /&gt;
integer rlvrc = -1812221819;&lt;br /&gt;
key source = NULL_KEY;&lt;br /&gt;
key wearer = NULL_KEY;&lt;br /&gt;
integer viewerlistener;&lt;br /&gt;
key sitid;&lt;br /&gt;
list restrictions = [];&lt;br /&gt;
&lt;br /&gt;
release(key id) {&lt;br /&gt;
    llOwnerSay(&amp;quot;@clear&amp;quot;);&lt;br /&gt;
    llRegionSayTo(id, rlvrc, &amp;quot;release,&amp;quot;+(string)id+&amp;quot;,!release,ok&amp;quot;);&lt;br /&gt;
    llResetScript();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        wearer = llGetOwner();&lt;br /&gt;
        llListen(rlvrc,&amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number) {&lt;br /&gt;
        llOwnerSay(&amp;quot;Now safewording. Restrictions will be removed and the relay reset.&amp;quot;);&lt;br /&gt;
        release(source);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer c, string w, key id, string msg) {&lt;br /&gt;
        if (c == 12345) {&lt;br /&gt;
            if (msg) sitid = (key) msg;&lt;br /&gt;
            llListenRemove(viewerlistener);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (source) { if (source != id) return; } // already grabbed by another device&lt;br /&gt;
        list args = llParseStringKeepNulls(msg,[&amp;quot;,&amp;quot;],[]);&lt;br /&gt;
        if (llGetListLength(args)!=3) return;&lt;br /&gt;
        if (llList2Key(args,1)!=wearer &amp;amp;&amp;amp; llList2Key(args, 1)!=(key)&amp;quot;ffffffff-ffff-ffff-ffff-ffffffffffff&amp;quot;) return;&lt;br /&gt;
        string ident = llList2String(args,0);&lt;br /&gt;
        list commands = llParseString2List(llList2String(args,2),[&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        integer i;&lt;br /&gt;
        string command;&lt;br /&gt;
        integer nc = llGetListLength(commands);&lt;br /&gt;
        for (i=0; i&amp;lt;nc; ++i) {&lt;br /&gt;
            command = llList2String(commands,i);&lt;br /&gt;
            if (llGetSubString(command,0,0)==&amp;quot;@&amp;quot;) {&lt;br /&gt;
                llOwnerSay(command);&lt;br /&gt;
                llRegionSayTo(id, rlvrc, ident+&amp;quot;,&amp;quot;+(string)id+&amp;quot;,&amp;quot;+command+&amp;quot;,ok&amp;quot;);&lt;br /&gt;
                list subargs = llParseString2List(command, [&amp;quot;=&amp;quot;], []);&lt;br /&gt;
                string behav = llGetSubString(llList2String(subargs, 0), 1, -1);&lt;br /&gt;
                integer index = llListFindList(restrictions, [behav]);&lt;br /&gt;
                string comtype = llList2String(subargs, 1);                &lt;br /&gt;
                if (comtype == &amp;quot;n&amp;quot; || comtype == &amp;quot;add&amp;quot;) {&lt;br /&gt;
                    if (index == -1) restrictions += [behav];&lt;br /&gt;
                    if (behav == &amp;quot;unsit&amp;quot; &amp;amp;&amp;amp; llGetAgentInfo(wearer) &amp;amp; AGENT_SITTING) {&lt;br /&gt;
                        viewerlistener = llListen(12345, &amp;quot;&amp;quot;, wearer, &amp;quot;&amp;quot;);&lt;br /&gt;
                        llOwnerSay(&amp;quot;@getsitid=12345&amp;quot;);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (comtype==&amp;quot;y&amp;quot; || comtype == &amp;quot;rem&amp;quot;) {&lt;br /&gt;
                    if (index != -1) restrictions = llDeleteSubList(restrictions, index, index);&lt;br /&gt;
                    if (behav == &amp;quot;unsit&amp;quot;) sitid = NULL_KEY;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else if (command==&amp;quot;!pong&amp;quot;) {&lt;br /&gt;
                    llOwnerSay(&amp;quot;@sit:&amp;quot;+(string)sitid+&amp;quot;=force,&amp;quot;+llDumpList2String(restrictions, &amp;quot;=n,&amp;quot;)+&amp;quot;=n&amp;quot;);&lt;br /&gt;
                    llSetTimerEvent(0);&lt;br /&gt;
            }&lt;br /&gt;
            else if (command==&amp;quot;!version&amp;quot;) llRegionSayTo(id, rlvrc, ident+&amp;quot;,&amp;quot;+(string)id+&amp;quot;,!version,1100&amp;quot;);&lt;br /&gt;
            else if (command==&amp;quot;!implversion&amp;quot;) llRegionSayTo(id, rlvrc, ident+&amp;quot;,&amp;quot;+(string)id+&amp;quot;,!implversion,ORG=0003/Satomi&#039;s Damn Fast Relay v2&amp;quot;);&lt;br /&gt;
            else if (command==&amp;quot;!x-orgversions&amp;quot;) llRegionSayTo(id, rlvrc, ident+&amp;quot;,&amp;quot;+(string)id+&amp;quot;,!x-orgversions,ORG=0003&amp;quot;);&lt;br /&gt;
            else if (command==&amp;quot;!release&amp;quot;) release(id);&lt;br /&gt;
            else llRegionSayTo(id, rlvrc, ident+&amp;quot;,&amp;quot;+(string)id+&amp;quot;,&amp;quot;+command+&amp;quot;,ko&amp;quot;);            &lt;br /&gt;
        }&lt;br /&gt;
        if (restrictions) { source = id; llOwnerSay(&amp;quot;@detach=n&amp;quot;); }&lt;br /&gt;
        else { llOwnerSay(&amp;quot;@clear&amp;quot;); llResetScript(); }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    changed(integer c) {&lt;br /&gt;
        if (c &amp;amp; CHANGED_OWNER) llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer i) {&lt;br /&gt;
        if (source) {&lt;br /&gt;
            llSleep(30);&lt;br /&gt;
            llRegionSayTo(source, rlvrc, &amp;quot;ping,&amp;quot;+(string)source+&amp;quot;,ping,ping&amp;quot;);&lt;br /&gt;
            llSetTimerEvent(30);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer() {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/ORG_Requirements/0004_draft&amp;diff=1171171</id>
		<title>LSL Protocol/Restrained Love Open Relay Group/ORG Requirements/0004 draft</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/ORG_Requirements/0004_draft&amp;diff=1171171"/>
		<updated>2012-07-29T07:54:45Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: RestrainedLove&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Restrained Love Open Relay Group TOC}}&lt;br /&gt;
STATUS: draft&lt;br /&gt;
&lt;br /&gt;
VERSION: 0004&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This page lists requirements that make a RLV relay or a RLVR controller &amp;quot;ORG compliant&amp;quot;.&lt;br /&gt;
Main advantages of an ORG compliant device over a classic RLVR devices are the following:&lt;br /&gt;
* ORG devices follow a stricter specification (while keeping compatibility), thus making the experience more predictable for scriptwriters;&lt;br /&gt;
* ORG devices support wildcards for easy and low lag relay scanning and mass effects;&lt;br /&gt;
* ORG devices can support optional x-tensions for more fun. Supported x-tensions can easily be discovered thanks to [[#!x-orgversions|a new query meta-command]].&lt;br /&gt;
&lt;br /&gt;
For a quick overview of the motivations and general working of the RLVR protocol and a few examples, we refer the reader to [[LSL Protocol/Restrained Love Relay/Specification|the original RLVR specification]].&lt;br /&gt;
&lt;br /&gt;
If you are making furniture, traps, or other RLVR controllers and you are not interested in what [[LSL Protocol/Restrained Love Open Relay Group/x-tensions|optional ORG x-tensions]] can offer, then you can stick with the original RLVR specification and still be compatible with [[LSL Protocol/Restrained Love Relay/Comparison|ORG relays]]. However, to have the right to call your controller &amp;quot;ORG compatible&amp;quot;, there are still a few light additional requirements such as:&lt;br /&gt;
* using only [[llRegionSayTo]] for communications (in both directions),&lt;br /&gt;
* not spamming the RLVR channel with messages that do not belong to the protocol,&lt;br /&gt;
* and remain responsive to ping messages at every time if you want the session to remain locked.&lt;br /&gt;
&lt;br /&gt;
If you are interested in [[LSL Protocol/Restrained Love Open Relay Group/x-tensions|ORG x-tensions]], then you should also read the part about [[#!x-orgversions|!x-orgversions]].&lt;br /&gt;
&lt;br /&gt;
If you are making a relay, sorry we are afraid you will have to read all this page.&lt;br /&gt;
&lt;br /&gt;
==Definition of an ORG device==&lt;br /&gt;
&lt;br /&gt;
A RLVR device is compliant with ORG specifications if it implements the consolidated RLVR protocol and meta-commands described in sections below, along with the [[LSL Protocol/Restrained Love Open Relay Group/x-tensions|optional ORG x-tensions]] it announces supporting.&lt;br /&gt;
&lt;br /&gt;
Remarks:&lt;br /&gt;
* An x-tension can constrain the core specification (this document) even more, but cannot alter its requirements or make them less constraining by the mere fact of being there.&lt;br /&gt;
* However requirements may be altered as the result of executing a meta-command belonging to an x-tension.&lt;br /&gt;
* Thus, although the protocol is extensible, a controller can always rely on the fact an ORG relay abides by the core requirements until the controller knowingly asks the relay to do otherwise.&lt;br /&gt;
&lt;br /&gt;
If a device is ORG compliant, it may be advertised by the use of the [[LSL Protocol/Restrained Love Open Relay Group/ORG Logo|ORG logo]]. ORG device makers are encouraged to do so.&lt;br /&gt;
&lt;br /&gt;
==Consolidated RLVR protocol==&lt;br /&gt;
This consolidated RLVR protocol is roughly the same as [[LSL Protocol/Restrained Love Relay/Specification|Marine Kelley&#039;s RLVR protocol version 1.100]], minus a few embarrassing loose ends.&lt;br /&gt;
&lt;br /&gt;
Main differences are highlighted at the beginning of each subsection.&lt;br /&gt;
=== Protocol Syntax ===&lt;br /&gt;
Summary of differences with original RLVR:&lt;br /&gt;
* we force use of llRegionSayTo, &lt;br /&gt;
* we explicitly forbid incorrect syntax on the relay channel&lt;br /&gt;
* the relay is supposed to ignore bad commands&lt;br /&gt;
* wildcards are supported&lt;br /&gt;
&lt;br /&gt;
==== Definitions ====&lt;br /&gt;
* The &#039;&#039;&#039;Restrained Love Relay (RLVR) protocol&#039;&#039;&#039; implies two partners (SL objects): the &#039;&#039;&#039;relay&#039;&#039;&#039;, attachment worn by the avatar commands are intended for, and a &#039;&#039;&#039;controller&#039;&#039;&#039;, which sends commands to the relay. &lt;br /&gt;
&lt;br /&gt;
* The goal of the protocol is to force the relay wearer to make perform actions and to toggle restrictions on their behavior. Both actions and restrictions can be enforced either through use of viewer hooks ([[LSL Protocol/RestrainedLoveAPI|Restrained Love API]], or RLV) or through LSL scripting.&lt;br /&gt;
&lt;br /&gt;
* Hence we distinguish between &amp;quot;&#039;&#039;&#039;RLV commands&#039;&#039;&#039;&amp;quot;, starting with &amp;quot;@&amp;quot;, which are commands following the syntax of the RLV API and which will ultimately be forwarded to the viewer, and &amp;quot;&#039;&#039;&#039;meta-commands&#039;&#039;&#039;&amp;quot;, starting with &amp;quot;!&amp;quot;, which are meant to be interpreted by LSL functions.&lt;br /&gt;
&lt;br /&gt;
====Requirements====&lt;br /&gt;
RLVR protocol consists of messages exchanged between relay and controller&lt;br /&gt;
* on channel -1812221819 (called &#039;&#039;&#039;RLVR channel&#039;&#039;&#039;),&lt;br /&gt;
* using the LSL function [[llRegionSayTo]] (except for &amp;lt;c_msg&amp;gt;&#039;s using a wildcard)&lt;br /&gt;
* all sent from the same prim of the controller or relay (within a [[#Protocol session|session]])&lt;br /&gt;
* and having the following syntax (non-terminal &amp;lt;c_msg&amp;gt; for controller messages/&#039;&#039;&#039;command messages&#039;&#039;&#039; and &amp;lt;r_msg&amp;gt; for relay messages/&#039;&#039;&#039;acknowledgement messages&#039;&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;c_msg&amp;gt; ::= IDENT &amp;quot;,&amp;quot; KEY &amp;quot;,&amp;quot; &amp;lt;commands&amp;gt;&lt;br /&gt;
 &amp;lt;r_msg&amp;gt; ::= IDENT &amp;quot;,&amp;quot; KEY &amp;quot;,&amp;quot; &amp;lt;command&amp;gt; &amp;quot;,&amp;quot; ACK&lt;br /&gt;
 &amp;lt;commands&amp;gt; ::= &amp;lt;command&amp;gt; | &amp;lt;command&amp;gt; &amp;quot;|&amp;quot; &amp;lt;commands&amp;gt;&lt;br /&gt;
 &amp;lt;command&amp;gt; ::= &amp;lt;rlv-command&amp;gt; | &amp;lt;meta-command&amp;gt;&lt;br /&gt;
 &amp;lt;rlv-command&amp;gt; ::= &amp;quot;@&amp;quot; RLV-COMMAND&lt;br /&gt;
 &amp;lt;meta-command&amp;gt; ::= &amp;quot;!&amp;quot; META-COMMAND_NAME &amp;lt;meta-command arguments&amp;gt;&lt;br /&gt;
 &amp;lt;meta-command arguments&amp;gt; ::= &amp;quot;&amp;quot; | &amp;quot;/&amp;quot; ARG &amp;lt;meta-command arguments&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where we explicit the different terminal tokens:&lt;br /&gt;
 IDENT: any string without &amp;quot;,&amp;quot;&lt;br /&gt;
 KEY: any UUID&lt;br /&gt;
 ACK: any string without &amp;quot;,&amp;quot;&lt;br /&gt;
 RLV-COMMAND: any string without &amp;quot;,&amp;quot;&lt;br /&gt;
 META-COMMAND_NAME: any string without &amp;quot;/&amp;quot; and &amp;quot;,&amp;quot;&lt;br /&gt;
 ARG: any string without &amp;quot;/&amp;quot; and &amp;quot;,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Relays can only send &amp;lt;r_msg&amp;gt;&#039;s, and controllers &amp;lt;c_msg&amp;gt;&#039;s. Nothing else is allowed on RLVR channel.&lt;br /&gt;
* In &amp;lt;c_msg&amp;gt;, KEY is always either the UUID of the relay wearer or ffffffff-ffff-ffff-ffff-ffffffffffff (&#039;&#039;&#039;wildcard&#039;&#039;&#039;) if it is a message intended for all relays who can hear it. If llRegionSayTo is used, then the first parameter will also be the UUID of the relay wearer.&lt;br /&gt;
* In &amp;lt;r_msg&amp;gt;, KEY is always the UUID of the controller (more accurately: the uuid of the primitive sending the &amp;lt;c_msg&amp;gt;&#039;s), this will also be used as the first parameter of llRegionSayTo.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remark&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
IDENT and ARG can be empty, relay makers must take care of properly handling messages with empty IDENT or ARG (use [[llParseStringKeepNulls]] instead of [[llParseString2List]]). However, due to the fact many existing relays do not properly handle them, controllers should avoid using empty IDENTS.&lt;br /&gt;
&lt;br /&gt;
====On the relay side only====&lt;br /&gt;
&#039;&#039;&#039;Further requirements:&#039;&#039;&#039;&lt;br /&gt;
*A relay MUST ignore any message on RLVR channel which is not a &amp;lt;c_msg&amp;gt; with KEY being either the key of the avatar wearing the relay or ffffffff-ffff-ffff-ffff-ffffffffffff.&lt;br /&gt;
Then, for every &amp;lt;command&amp;gt;:&lt;br /&gt;
* if &amp;lt;command&amp;gt; is neither a valid &amp;lt;rlv-command&amp;gt; or &amp;lt;meta-command&amp;gt;, the relay must ignore it and process the next &amp;lt;command&amp;gt;&#039;s;&lt;br /&gt;
* if &amp;lt;command&amp;gt; is a &amp;lt;rlv-command&amp;gt; or a &amp;lt;meta-command&amp;gt;, the relay MUST send back to the controller a &amp;lt;r_msg&amp;gt; (see above) such that:&lt;br /&gt;
:*IDENT is the same as IDENT in the &amp;lt;c_msg&amp;gt; being processed,&lt;br /&gt;
:*&amp;lt;command&amp;gt; is the subcommand being processed&lt;br /&gt;
:*and ACK is a string called &#039;&#039;acknowledgement value&#039;&#039;. By default the acknowledgement value is &amp;quot;ok&amp;quot; if the relay will execute the &amp;lt;command &amp;gt;, &amp;quot;ko&amp;quot; otherwise.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
* Many meta-commands may have other acknowledgements than &amp;quot;ok&amp;quot; or &amp;quot;ko&amp;quot; (or none, for !pong). Their definitions supersede this specification.&lt;br /&gt;
* Note that unknown meta-commands cannot be executed and thus wil be acknowledged by &amp;quot;ko&amp;quot;.&lt;br /&gt;
* Known meta-commands which are sent with not enough parameters or parameters with types incompatible with those in the definition known by the relay also cannot be executed and will also be acknowledged by &amp;quot;ko&amp;quot;. (ex: the relay knows !x-who/key, but receives !x-who/integer/string).&lt;br /&gt;
&lt;br /&gt;
===On executing commands===&lt;br /&gt;
Summary of differences with original RLVR:&lt;br /&gt;
* explanation on how to handle meta-commands with variable number of parameters,&lt;br /&gt;
* the relay knows commands in both core specification and x-tensions,&lt;br /&gt;
* clarification on multi-controller relays.&lt;br /&gt;
&lt;br /&gt;
====Relay side====&lt;br /&gt;
&#039;&#039;&#039;Requirements:&#039;&#039;&#039;&lt;br /&gt;
* If a &amp;lt;rlv-command&amp;gt; is acknowledged with value &amp;quot;ok&amp;quot;, the relay ensures the viewer is affected the same way as if the LSL instruction llOwnerSay(&amp;lt;rlv-command&amp;gt;) was executed by a script in a primitive that handles only one controller.&lt;br /&gt;
* When processing a &amp;lt;meta-command&amp;gt;, if the relay knows at least one definition of &#039;!&#039;+META-COMMAND_NAME for which the received &amp;lt;meta-command arguments&amp;gt; provide enough parameters, then it will be handled according to the definition handling the most parameters among the latter. Extra parameters are ignored.&lt;br /&gt;
* A relays knows the following meta-command definitions:&lt;br /&gt;
:*[[#Core meta-commands and associated mechanisms|definitions listed in the core requirements]]&lt;br /&gt;
:*all definitions included in [[LSL Protocol/Restrained Love Relay/Comparison|x-tensions]] announced by the relay.&lt;br /&gt;
* When acknowledging a &amp;lt;meta-command&amp;gt; by anything else than &amp;quot;ko&amp;quot;, the relay commits itself to execute it.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
* For first requirement, it must be understood that the reference behavior is that the relay would have if it had one controller per prim. However handling several controllers from one unique prim is possible but requires taking care that different controllers do not interfere with each other, releasing each others restrictions, for instance.&lt;br /&gt;
* For the second requirement, the word &amp;quot;handled&amp;quot; means that if the meta-command with these parameters is known, then requirements in known definition cannot be ignored. Sometimes, this can imply that the meta-command cannot be refused, for instance.&lt;br /&gt;
&lt;br /&gt;
====Controller side====&lt;br /&gt;
* The controller can send any command within allowed syntax.&lt;br /&gt;
* Only commands described in this specification and commands belonging to x-tensions announced by the relay are guaranteed to be understood by the relay. If not understood, the relay will just answer &amp;quot;ko&amp;quot;, do nothing and skip to the next command.&lt;br /&gt;
&lt;br /&gt;
===Protocol session===&lt;br /&gt;
Summary of differences with original RLVR:&lt;br /&gt;
* it is now clear when a session starts and stops (and what a session is!)&lt;br /&gt;
* it is clear when to expect interactive dialogs (and how to avoid spamming relay wearers with blue dialogs)&lt;br /&gt;
* no session for unreachable controllers (answer to ping is mandatory to ensure session persistence)&lt;br /&gt;
&lt;br /&gt;
====Definitions====&lt;br /&gt;
* During an execution of the RLVR protocol, a relay and a controller establish a &#039;&#039;&#039;session&#039;&#039;&#039; together. A relay may manage several sessions with several controllers. Likewise, a controller could establish sessions with several relays.&lt;br /&gt;
* Restrictions on a relay wearer are relative to a session. So are most other variables (authorization state, key of the controller, ... ).&lt;br /&gt;
* A session is &#039;&#039;&#039;Opened&#039;&#039;&#039; whenever the relay accepts a RLVR command from a controller.&lt;br /&gt;
* A session is &#039;&#039;&#039;Closed&#039;&#039;&#039; (or &#039;&#039;&#039;released&#039;&#039;&#039;) as soon as the relay forgets every variables and releases all restrictions pertaining to that session.&lt;br /&gt;
* A session is &#039;&#039;&#039;Locked&#039;&#039;&#039; whenever it holds active restrictions.&lt;br /&gt;
* A session is &#039;&#039;&#039;Authenticated&#039;&#039;&#039; if the controller has been allowed to control the relay (not only store some variables with no consequence). Once authenticated, no interactive &amp;quot;ask&amp;quot; dialog should pop up anymore concerning this session. Most commands should now normally be accepted (and maybe a few automatically rejected).&lt;br /&gt;
* A controller is called &#039;&#039;&#039;reachable&#039;&#039;&#039; if it can receive messages from the relay and can prove it by answering [[#ping/!pong|ping]] requests from the relay. By &amp;quot;can&amp;quot;, it is meant by the method of communication agreed upon by the relay and controller (by default: chat messages sent on RLVR channel by llRegionSayTo). X-tensions such as email and delay can modify what is meant by reachable.&lt;br /&gt;
&lt;br /&gt;
====Relay side requirements====&lt;br /&gt;
On closing sessions:&lt;br /&gt;
*Closing a session clears all RLV restrictions that belong only to that session, clears all session variables and disables all restrictions relative to that session. This MUST happen on the following events and no other:&lt;br /&gt;
:*on executing !release (received from the controller, or relay-triggered as in a safe-word, see [[#!release]])&lt;br /&gt;
:*on noticing the controller is not reachable&lt;br /&gt;
:*on timeout, if the session is not Locked&lt;br /&gt;
*Sessions that are not locked MUST be closed after a reasonable timeout.&lt;br /&gt;
&lt;br /&gt;
On interactive Authentication:&lt;br /&gt;
*Unless specified otherwise (see !x-who), no command can trigger an interactive dialog unless the command requires an Authenticated session and the session is not already Authenticated.&lt;br /&gt;
*Relay implementations MAY require an authenticated session for all &amp;lt;rlv-command&amp;gt;&#039;s of the form @xxx=force, @xxx=add and @xxx=n, and for meta-commands whose specifications say it is allowed.&lt;br /&gt;
*Other RLV commands MUST automatically accepted or rejected by any relay.&lt;br /&gt;
&lt;br /&gt;
On removing and adding restrictions:&lt;br /&gt;
* Commands that remove restrictions are always accepted (RLV @...=&amp;lt;channel_number&amp;gt;, @clear[=...] and @...=y/rem commands, !release, and !x-.../clear[/...] meta-commands).&lt;br /&gt;
* No restriction can be released unless as the result of one of the above commands, or of closing a session.&lt;br /&gt;
*@xxx=n/add &amp;lt;rlv-command&amp;gt;&#039;s, after being accepted, add a restriction and therefore Lock the session.&lt;br /&gt;
*Some meta-commands described in x-tensions can also add restrictions and therefore Lock the session.&lt;br /&gt;
&lt;br /&gt;
Reachability:&lt;br /&gt;
*A relay MUST provide a mechanism for checking that every controlling device is reachable. It is not specified whether this checking process should be automatic or manually triggered.&lt;br /&gt;
&lt;br /&gt;
====Controller side requirements====&lt;br /&gt;
* A controller MUST eventually close any Locked session using the meta-command !release.&lt;br /&gt;
&lt;br /&gt;
In particular, non-portable controllers should not let a Locked relay wearer run free out of reach. Moreover, any controller should either react to some kind of event that is bound to happen (timer expiration being the most common) or provide a user interface for closing the session. It should be clear at least to the person who set the trap how the victim will be released.&lt;br /&gt;
&lt;br /&gt;
==Core meta-commands and associated mechanisms==&lt;br /&gt;
&lt;br /&gt;
An ORG device MUST at least support the meta-commands !release, !pong, !version, !implversion and !x-orgversions described below and implement their associated mechanisms.&lt;br /&gt;
&lt;br /&gt;
Particular meta-commands definitions and mechanisms may override general requirements above.&lt;br /&gt;
&lt;br /&gt;
New in ORG compared to RLVR: !x-orgversions&lt;br /&gt;
&lt;br /&gt;
===!release===&lt;br /&gt;
Sent by a controller, this command closes the session.&lt;br /&gt;
&lt;br /&gt;
* !release obviously opens no session, requires no Authrnyication and is not Locking.&lt;br /&gt;
* If there is an actual session to close, !release MUST be accepted by the relay and acknowledged by &amp;quot;ok&amp;quot;.&lt;br /&gt;
* On accepting !release, the relay erases all data pertaining to the session and disables all restrictions of the session.&lt;br /&gt;
* When a relay decides to close a session on its own (user safe-word, for instance) and it is not due to the controller being unreachable, the relay must send the following acknowledgement message:&lt;br /&gt;
       release,&amp;lt;controller_key&amp;gt;,!release,ok&lt;br /&gt;
&lt;br /&gt;
When receiving the latter message, the controller should act accordingly, for instance by resetting itself and making itself ready for the next session.&lt;br /&gt;
&lt;br /&gt;
Note that !release is not the same as @clear. @clear is interpreted by the relay as a RLV command and, as such, can only clear RLV restrictions. If RLV restrictions were the only restrictions of the session, then the session will be closed, but some x-tensions also define pure LSL based restrictions.&lt;br /&gt;
&lt;br /&gt;
===ping/!pong===&lt;br /&gt;
&lt;br /&gt;
The ping/!pong mechanism exists so that relays can check presence and responsiveness of a controller. This was primarily meant to be used on relay wearer relog, in order to reactivate all restrictions so that sessions persist on relog if the controller still exists and is ready to continue the session.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;!pong&#039;&#039; cannot require authentication and does not lock a session&lt;br /&gt;
&lt;br /&gt;
We call &#039;&#039;ping message&#039;&#039; a message from the relay, having the following syntax:&lt;br /&gt;
 ping,&amp;lt;controller_key&amp;gt;,ping,ping&lt;br /&gt;
We call &#039;&#039;!pong message&#039;&#039; a message from the controller, having the following syntax:&lt;br /&gt;
 ping,&amp;lt;relay_key&amp;gt;,!pong&lt;br /&gt;
&lt;br /&gt;
====Relay side====&lt;br /&gt;
*A relay SHOULD NOT send an acknowledgement in response to &#039;&#039;!pong&#039;&#039;.&lt;br /&gt;
*A ping message can be sent any time by the relay to a known controller.&lt;br /&gt;
*On wearer relog, for each existing Locked session, the relay must send a ping message to the session controller.&lt;br /&gt;
*When a !pong message is received from a controller, if it was a reply to a previous ping message:&lt;br /&gt;
:#if the session RLV restrictions contain unsit and the avatar was sitting on some object when the restriction was applied, then the relay MUST force the avatar to sit back on the same object (if still existing);&lt;br /&gt;
:#the relay MUST make sure all restrictions belonging to the session are made active again.&lt;br /&gt;
*If a ping message is sent and is not answered by the controller, then the relay closes the session.&lt;br /&gt;
&lt;br /&gt;
Note that the relay is responsible for storing restrictions and the key of the sit target across sessions, not the controller.&lt;br /&gt;
&lt;br /&gt;
====Controller side====&lt;br /&gt;
*Unless it does not matter that the relay could close the session (or for another reason, the controller knows the relay will not close it), a controller SHOULD listen to ping messages and answer any ping message with a !pong message.&lt;br /&gt;
*A controller should ignore ping requests from relays it is not ready to handle.&lt;br /&gt;
&lt;br /&gt;
Note controller don&#039;t have to poll for relay presence to resume a session but should just listen for ping messages instead. The relay should have stored all restrictions and handle sitting back to whatever furniture the relay wearer was tied up to.&lt;br /&gt;
&lt;br /&gt;
Concerning the second bullet: for instance, if the controller is a furniture which is already in use by another relay wearer, it would be cause dysfunctions to let the pinging relay restore the restrictions without letting its wearer sit on the furniture. Or if the controller is not stateless and the state for the pinging relay has not been saved before, resuming the session from the initial state might be inconsistent.&lt;br /&gt;
&lt;br /&gt;
===!version===&lt;br /&gt;
The purpose of this meta-command is to query the version of the RLVR protocol supported by a relay.&lt;br /&gt;
&lt;br /&gt;
* !version opens no session (and requires no authentication, neither can lock a session)&lt;br /&gt;
* A relay MUST always acknowledge !version with the version number of the RLVR protocol it supports (&amp;quot;1100&amp;quot; here, since ORG 0004 includes RLVR 1.100).&lt;br /&gt;
&lt;br /&gt;
Note this is the most common command for a controller to scan for nearby relays, as non-ORG relays also accept this command and answer it the way described above.&lt;br /&gt;
&lt;br /&gt;
===!implversion===&lt;br /&gt;
The purpose of this meta-command is to query the name and version of the relay implementation.&lt;br /&gt;
&lt;br /&gt;
* !implversion opens no session (and requires no authentication, neither can lock a session)&lt;br /&gt;
* A relay MUST always acknowledge !implversion with its implementation version string... which can be any string.&lt;br /&gt;
&lt;br /&gt;
It is recommended this string includes the following elements:&lt;br /&gt;
* the relay name/brand/identifier,&lt;br /&gt;
* the version number of that relay name/brand/identifier,&lt;br /&gt;
* at the beginning, the string prefix &amp;quot;ORG=0004/&amp;quot;&lt;br /&gt;
The latter is convenient for checking for ORG compatibility using a command even non-ORG relay should understand.&lt;br /&gt;
&lt;br /&gt;
===!x-orgversions===&lt;br /&gt;
&lt;br /&gt;
This meta-command&#039;s purpose is to make it possible for the controller to have detailed information on the protocol the relay supports. First the version of the ORG consolidated protocol, second the list of supported optional x-tensions, also with their version numbers.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example:&#039;&#039;&#039;&lt;br /&gt;
 C&amp;lt;-&amp;gt;R&lt;br /&gt;
   -&amp;gt;   query,rUUID,!x-orgversions&lt;br /&gt;
  &amp;lt;-    query,cUUID,!x-orgversions,ORG=0004/who=002/email=006&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirements:&#039;&#039;&#039;&lt;br /&gt;
* !x-orgversions should always be accepted with no Auth required, it does not open a session or Lock one.&lt;br /&gt;
* The acknowledgement value in a reply to !x-orgversions is a &amp;quot;/&amp;quot;-list of items of the form &amp;lt;package&amp;gt;=&amp;lt;version&amp;gt;. The first &amp;lt;package&amp;gt; is always &amp;quot;ORG&amp;quot; (representing the core specification package of ORG relays), its version string is the version of the specification (4 digits).  The other packages are x-tension names, whose version string is 3 digits.&lt;br /&gt;
* If several incompatible versions of a same x-tension are supported, they must be listed ordered by version number. Ex: ORG=0004/who=002/email=005/email=006. If versions are backward compatible, only the last version should be reported.&lt;br /&gt;
* By announcing an x-tension, the relay commits itself to comply to all requirements of its specification.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarks:&#039;&#039;&#039;&lt;br /&gt;
* In a controller, it is however recommended to use !x-orgversions as soon as possible in order to avoid sending unsupported and useless meta-commands later on.&lt;br /&gt;
* In the acknowledgement message, x-tension names are listed, not meta-command names (as one x-tension can have several meta-commands). Thus listed names do not include the prefix &amp;quot;!x-&amp;quot;.&lt;br /&gt;
* x-tensions do not have to be standards defined by ORG but can also be proprietary. We recommend that the x-tension name then contains the name of the brand who proposes it.&lt;br /&gt;
&lt;br /&gt;
===Other meta-commands===&lt;br /&gt;
&lt;br /&gt;
Commands not listed here can belong to one of the following categories:&lt;br /&gt;
# (unlikely) commands from a future revision of Marine Kelley&#039;s original RLVR protocol.&lt;br /&gt;
# (more likely but not that much!) core commands from a future revision of ORG&lt;br /&gt;
# (very likely) commands from optional [[LSL Protocol/Restrained Love Open Relay Group/x-tensions|x-tensions]]&lt;br /&gt;
# proprietary commands&lt;br /&gt;
&lt;br /&gt;
ORG intends for its successive versions to be backward compatible. Therefore ORG relays handle all unknown meta-commands.&lt;br /&gt;
&lt;br /&gt;
We also intend for future versions of ORG consolidated protocol to include last version of original RLVR protocol, hence the prefix &amp;quot;!x-&amp;quot; for all meta-commands coming from ORG, which ensures there will be reasonably no collision.&lt;br /&gt;
&lt;br /&gt;
For the same reason, we require that proprietary commands use an obvious prefix such as &amp;quot;!a-&amp;quot; or &amp;quot;!b-&amp;quot;, and so on. Not doing so would prevent ensuring backward compatibility, hence a relay or controller who would use proprietary commands with wrong prefixes are not ORG compliant.&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Life_Open_Relay_Group/x-xtensions&amp;diff=1171155</id>
		<title>LSL Protocol/Restrained Life Open Relay Group/x-xtensions</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Life_Open_Relay_Group/x-xtensions&amp;diff=1171155"/>
		<updated>2012-07-28T16:24:34Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: moved LSL Protocol/Restrained Life Open Relay Group/x-xtensions to LSL Protocol/Restrained Love Open Relay Group/x-xtensions:&amp;amp;#32;RestrainedLove&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[LSL Protocol/Restrained Love Open Relay Group/x-xtensions]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/x-xtensions&amp;diff=1171154</id>
		<title>LSL Protocol/Restrained Love Open Relay Group/x-xtensions</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/x-xtensions&amp;diff=1171154"/>
		<updated>2012-07-28T16:24:34Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: moved LSL Protocol/Restrained Life Open Relay Group/x-xtensions to LSL Protocol/Restrained Love Open Relay Group/x-xtensions:&amp;amp;#32;RestrainedLove&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ ORG Restrained Life Relay Specs TOC }}&lt;br /&gt;
&lt;br /&gt;
Deprecated by !x-orgversions, which is part of [[LSL_Protocol/Restrained_Life_Open_Relay_Group/ORG_Requirements|ORG core requirements]].&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/Prefix&amp;diff=1171153</id>
		<title>LSL Protocol/Restrained Love Open Relay Group/Prefix</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/Prefix&amp;diff=1171153"/>
		<updated>2012-07-28T16:23:26Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: RestrainedLove&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Restrained Love Open Relay Group TOC}}&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Prefix Discussion&#039;&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
The current relay specification calls for two prefixes ! for meta-commands and @ for commands to be passed through to and executed by the viewer. For the most part, meta-commands are informational only (!release being an obvious exception). [[LSL Protocol/Restrained Love Open Relay Group/x-tensions|x-tensions]] fall into two significant categories: those that are largely informational and those that could be (but are not) implemented in the viewer. There is no hard and fast line between these two, for example, the currently proposed !gender add-on to the existing relay spec implies functionality that could, potentially, be implemented in the viewer or could be implemented by a script in the relay.&lt;br /&gt;
&lt;br /&gt;
Clearly, though, there is need of some form of prefix for x-tensions, if only to separate them from the functionality required by all relays. There are a number of obvious alternatives: use the existing prefixes and simply document the x-tensions; create a single, new prefix for all x-tensions; and use multiple, new prefixes for the x-tensions. The first choice seems inappropriate, and choices for the second and third are to either use &#039;&#039;&#039;!x-&#039;&#039;&#039; alone or &#039;&#039;&#039;!x-&#039;&#039;&#039; for informational and &#039;&#039;&#039;#&#039;&#039;&#039; for viewer commands.&lt;br /&gt;
&lt;br /&gt;
Clearly, making this choice needs to be done very early in the life of ORG.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Well, I wouldn&#039;t draw the line between informational or not, but between RLVR protocol load (commands proper) and RLVR protocol control (meta-commands).&lt;br /&gt;
:*For me a meta-command is something which is only there for making the protocol work. Information about protocol and relay version (!version and !implversion), are of course meta-commands. But !ping/!pong isn&#039;t really informational, neither it is a command that will have a direct observable effect, but it is needed for the protocol to work when you log on. !who gives information, but not about the relay or its wearer, but about the furniture user. !handover makes the protocol able to transfer a session from one furniture to another. !release ends a protocol session.&lt;br /&gt;
:*Commands proper have no effect on how the protocol behaves but instead have extra-protocol effects (up to now, the only type of effect was issuing RLV commands to the viewer). !vision (or now !x-vision) is also such a command, as it doesn&#039;t change anything to the RLVR session, but produces a HUD behavior.&lt;br /&gt;
:NB: this distinction only makes sense with respect to one precise protocol. Indeed the load of the RLVR protocol contains RLV commands which in turn can have different roles with respect to RLV API (a different &amp;quot;protocol&amp;quot; it encapsulates). For instance @version is load with respect to RLVR protocol, but is clearly a &amp;quot;meta-command&amp;quot; w.r.t. RLV API.&lt;br /&gt;
:Drawing the line between load and control isn&#039;t always easier than between mostly &amp;quot;informational&amp;quot; or not, but I find this distinction more useful. --[[User:Satomi Ahn|Satomi Ahn]] 20:35, 25 April 2009 (UTC)&lt;br /&gt;
:: Hmmmm... you&#039;re almost certainly right... !x-vision could be implemented in the viewer, indeed, I wish it was because then I could do without every device trying to put a prim on my screen so it can block this, or that! I think that !handover is in a gray area.. and could be in either camp. It affects the protocol (which device the relay should respond to) but also the RLV API (which restrictions the person is under).&lt;br /&gt;
:: My bottom line is that I would like to get something simple, I really like the !x- convention, but am willing to go with another choice if that makes sense. --[[User:Chloe1982 Constantine|Chloe1982 Constantine]] 13:39, 11 June 2009 (UTC)&lt;br /&gt;
::: Let us wait for having more people on this discussion rather than take a hasty decision ;-). Btw, I have some other ideas like suggesting y-, z- prefixes for proprietary and draft extensions (so that device makers can play around without messing with the x- namespace).--[[User:Satomi Ahn|Satomi Ahn]] 16:21, 11 June 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
This discussion is dying... and I believe this would be a big mistake not pursue it to its goal. Independently from what we decide in the end, I can easily already sort the different x-tensions of the current list into 2 categories without any ambiguity:&lt;br /&gt;
&lt;br /&gt;
True meta-commands:&lt;br /&gt;
* who&lt;br /&gt;
* handover&lt;br /&gt;
* e-mail&lt;br /&gt;
* http&lt;br /&gt;
* channel&lt;br /&gt;
&lt;br /&gt;
LSL effect commands:&lt;br /&gt;
* vision&lt;br /&gt;
* gender&lt;br /&gt;
* species&lt;br /&gt;
* freeze&lt;br /&gt;
* follow&lt;br /&gt;
* control&lt;br /&gt;
* listen&lt;br /&gt;
* message&lt;br /&gt;
* animate&lt;br /&gt;
&lt;br /&gt;
The second category contains both commands that will enable/disable a behavior (like !x-vision/!x-vision-clear), and commands that will ask for some data (!x-get-gender). Maybe the second subcategory can be handled in a generic way by requiring that the asked data is actually the acknowledgement string (in this respect very similar to !version, !implversion and !x-orgversions).&lt;br /&gt;
&lt;br /&gt;
My current view is that the LSL effect commands can be implemented by relay plugins whereas meta-commands are too much imbricated within the inner working of a relay to become a separate plugin. I believe this criterion alone could be enough to distinguish what is a meta-command and what is a LSL effect command.&lt;br /&gt;
&lt;br /&gt;
Now that the distinction is clear enough (for me at least!), my argument for having a different prefix would be to make easy for a relay to distinguish between the two at a early stage for handling them differently (for LSL effects, that would mean transmitting the command to the plugin in a link message).&lt;br /&gt;
&lt;br /&gt;
Moreover, LSL effects could possibly become viewer effects in the future, either without modification, or with a trivial conversion. The plugin architecture will make it easy to replace the handling of a given effect in a plugin by a LSL mechanism with a viewer mechanism when it becomes available, only replacing the plugin.&lt;br /&gt;
&lt;br /&gt;
--[[User:Satomi Ahn|Satomi Ahn]] 12:25, 24 July 2009 (UTC)&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/x-tensions_Validation_Process&amp;diff=1171152</id>
		<title>LSL Protocol/Restrained Love Open Relay Group/x-tensions Validation Process</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/x-tensions_Validation_Process&amp;diff=1171152"/>
		<updated>2012-07-28T16:19:36Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: RestrainedLove&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Restrained Love Open Relay Group TOC}}&lt;br /&gt;
&lt;br /&gt;
Proposed x-tensions should go through the following successive stages:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Proposal&#039;&#039;&#039;: someone proposes a new feature&lt;br /&gt;
* &#039;&#039;&#039;Draft&#039;&#039;&#039;: there is a proof of concept implementation and specification&lt;br /&gt;
* &#039;&#039;&#039;Accepted&#039;&#039;&#039;: a vote of board members decided the extension is accepted as an ORG x-tension.&lt;br /&gt;
* &#039;&#039;&#039;Ready&#039;&#039;&#039;: a complete test set has been written and approved by 3 board members.&lt;br /&gt;
* &#039;&#039;&#039;Bronze&#039;&#039;&#039;: there exists one implementation of the feature in one relay and one compatible controlling device, which both pass the test set.&lt;br /&gt;
* &#039;&#039;&#039;Silver&#039;&#039;&#039;: there exists 2 interoperable implementations on each side passing the tests. One implementation either relay side or controller side has to be open source.&lt;br /&gt;
* &#039;&#039;&#039;Gold&#039;&#039;&#039;: there exists 3 tested interoperable implementations both sides. There must exist at least one open source relay side implementation and one open source controller side implementation.&lt;br /&gt;
* &#039;&#039;&#039;Platinum&#039;&#039;&#039;: 4 tested interoperable implementations both sides. One open source each side. Further more we require that a fully automated test suite (implemented by open source scripts) exists.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Ready&#039;&#039;&#039; stage should be interpreted as a green light for device makers: &amp;quot;this x-tension is almost ready for prime time, you should really consider implementing it now&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The subsequent stages are more indicators of the level of confidence the buyer should have in the stuff (and confidence for the maker that enough compatible devices already exist).&lt;br /&gt;
&lt;br /&gt;
However, those levels of confidence (from &#039;&#039;&#039;Ready&#039;&#039;&#039; to &#039;&#039;&#039;Platinum&#039;&#039;&#039;) only apply to one given version of the specification. If it is updated, new tests might have to be written, and anyway all the tests tests have to be started over. This means that any new version starts at &#039;&#039;&#039;Accepted&#039;&#039;&#039; stage.&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/ORG_Requirements&amp;diff=1171151</id>
		<title>LSL Protocol/Restrained Love Open Relay Group/ORG Requirements</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/ORG_Requirements&amp;diff=1171151"/>
		<updated>2012-07-28T16:17:35Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: RestrainedLove&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Restrained Love Open Relay Group TOC}}&lt;br /&gt;
STATUS: ready&lt;br /&gt;
&lt;br /&gt;
VERSION: 0003&lt;br /&gt;
&lt;br /&gt;
(In writing: [[LSL Protocol/Restrained Love Open Relay Group/ORG Requirements/0004 draft|Version 0004 draft]])&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
This page is a list of requirements for a relay or an in-world device to have the right to be called &amp;quot;ORG compliant&amp;quot;. It is mostly about adding support for an ORG-centered informational meta-command and specifying Marine Kelley&#039;s RLVR protocol a bit more that it is now, while of course preserving full compatibility.&lt;br /&gt;
&lt;br /&gt;
If you are making in-world devices and are not interested in optional ORG x-tensions, you can skip most of this page, as your requirements amount to the following:&lt;br /&gt;
#Do not let your device spam the RLVR channel with commands that are not syntactically correct with respect to RLVR protocol.&lt;br /&gt;
#Never let your device be stuck in a state where no future event can unlock a currently locked relay.&lt;br /&gt;
&lt;br /&gt;
If you are interested in ORG x-tensions, then you should also read the part about !x-orgversions.&lt;br /&gt;
&lt;br /&gt;
If you are a relay maker, sorry we are afraid you will have to read all the page!&lt;br /&gt;
&lt;br /&gt;
==Definition of an ORG device==&lt;br /&gt;
&lt;br /&gt;
A RLVR device is compliant with ORG specifications if&lt;br /&gt;
* it implements Marine Kelley&#039;s RLVR protocol version 1.100&lt;br /&gt;
* it handles rely commands whose second field is ffffffff-ffff-ffff-ffff-ffffffffffff exactly the same as if it was the key of the wearer (NULL_KEY is a wildcard)&lt;br /&gt;
* it implements the !x-orgversions meta-command as defined below&lt;br /&gt;
* it implements the protocol fixes below&lt;br /&gt;
* all meta-commands it supports are of the following types:&lt;br /&gt;
:*meta-commands in RLVR protocol, behaving as described in RLVR specifications&lt;br /&gt;
:*meta-commands, whose names start with &amp;quot;!x-&amp;quot;, behaving as described in ORG specifications&lt;br /&gt;
:*proprietary or experimental meta-commands, whose names start with &amp;quot;!_-&amp;quot; (replace &amp;quot;_&amp;quot; by any letter that is not &amp;quot;x&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that as soon as a RLVR controlling device makes use of a command defined in an ORG x-tension, then the specification of this x-tension MAY override one or several requirements of the core specification (this document).&#039;&#039;&#039; An x-tension that is not triggered by a specific command that it defines can only add more constraints, never override existing requirements. Indeed a controlling device has no way to know what requirements an unknown x-tension could override.&lt;br /&gt;
&lt;br /&gt;
ORG devices may be advertised by the use of the [[LSL Protocol/Restrained Love Open Relay Group/ORG Logo|ORG logo]] for advertising compliance with ORG requirements. ORG devices makers are encouraged to do so.&lt;br /&gt;
&lt;br /&gt;
==!x-orgversions==&lt;br /&gt;
&lt;br /&gt;
This meta-command purpose it two-fold. First it allows a controlling device to ask a relay for the list of ORG x-tensions it supports, second it is similar to !version in RLVR protocol, as its reply gives the versions of the ORG core specification and ORG x-tensions that are implemented in the relay.&lt;br /&gt;
&lt;br /&gt;
 C&amp;lt;-&amp;gt;R&lt;br /&gt;
   -&amp;gt;   query,rUUID,!x-orgversions&lt;br /&gt;
  &amp;lt;-    query,cUUID,!x-orgversions,ORG=0001/who=001/email=005&lt;br /&gt;
&lt;br /&gt;
The acknowledgement string of the relay is a list separated by &amp;quot;/&amp;quot; whose items are of the form &amp;lt;package&amp;gt;=&amp;lt;version&amp;gt;. The first package is &amp;quot;ORG&amp;quot;, the core specification of ORG relays, its version string is the version of the specification (4 digits).  The other packages are ORG x-tension names (not meta-command names, as one x-tension can require several meta-commands, thus the name does not include the prefix &amp;quot;!x-&amp;quot;), whose version string is 3 digits.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Requirements for a relay:&#039;&#039;&lt;br /&gt;
* The support of this meta-command is mandatory for an ORG relay.&lt;br /&gt;
* It is also required that the list of packages in the !x-orgversions reply includes the package &amp;quot;ORG&amp;quot; and the exact list of supported optional x-tensions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Requirements for a controlling device:&#039;&#039; None. It is however recommended to use !x-orgversions when it makes sense for avoiding sending unsupported and useless meta-commands later.&lt;br /&gt;
&lt;br /&gt;
==ORG RLVR fixes==&lt;br /&gt;
Marine Kelley&#039;s specification for RLVR protocol gives too much room for interpretation and incompatibilities between supposedly compliant devices. This is why in this section we add further requirements for RLVR+ORG devices.&lt;br /&gt;
&lt;br /&gt;
===Preliminaries/Reminders===&lt;br /&gt;
&lt;br /&gt;
Here we establish some notations related to RLVR protocol.&lt;br /&gt;
&lt;br /&gt;
Here is the RLVR device message grammar (as it already is, nothing new):&lt;br /&gt;
 &amp;lt;r_msg&amp;gt; ::= IDENT&#039;,&#039;KEY&#039;,&#039;&amp;lt;command&amp;gt;&#039;,&#039;ACK;&lt;br /&gt;
 &amp;lt;d_msg&amp;gt; ::= IDENT&#039;,&#039;KEY&#039;,&#039;&amp;lt;commands&amp;gt;;&lt;br /&gt;
 &amp;lt;commands&amp;gt; ::= &amp;lt;command&amp;gt; | &amp;lt;command&amp;gt;&#039;|&#039;&amp;lt;commands&amp;gt;;&lt;br /&gt;
 &amp;lt;command&amp;gt; ::= &amp;lt;rlv-command&amp;gt; | &amp;lt;meta-command&amp;gt;;&lt;br /&gt;
 &amp;lt;rlv-command&amp;gt; ::= &#039;@&#039;RLV-COMMAND;&lt;br /&gt;
 &amp;lt;meta-command&amp;gt; ::= &#039;!&#039;META-COMMAND_NAME&amp;lt;meta-command arguments&amp;gt;;&lt;br /&gt;
 &amp;lt;meta-command arguments&amp;gt; ::= &#039;&#039; | &#039;/&#039;ARG&amp;lt;meta-command arguments&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
where the following tokens were used:&lt;br /&gt;
 IDENT: any string without &amp;quot;,&amp;quot;&lt;br /&gt;
 KEY: any UUID&lt;br /&gt;
 ACK: any string without &amp;quot;,&amp;quot;&lt;br /&gt;
 RLV-COMMAND: any string without &amp;quot;,&amp;quot;&lt;br /&gt;
 META-COMMAND_NAME: any string without &amp;quot;/&amp;quot; and &amp;quot;,&amp;quot;&lt;br /&gt;
 ARG: any string without &amp;quot;/&amp;quot; and &amp;quot;,&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Furthermore we give the following definitions:&lt;br /&gt;
* A controlling device is always considered to be &amp;quot;reachable&amp;quot; if it is within shout range of the relay, as long it does not fail to answer a ping request from the relay.  A controlling device is usually considered to be &amp;quot;unreachable&amp;quot; if it is out of shout range of the relay, but x-tensions such as !x-email or proprietary enhancements may modify the notion of &amp;quot;unreachability&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* The following actions are considered &#039;&#039;locking&#039;&#039; a relay:&lt;br /&gt;
:* a restricting command followed by a &amp;quot;ok&amp;quot; acknowledgement&lt;br /&gt;
:* a ping/pong exchange with this relay&lt;br /&gt;
&lt;br /&gt;
* The following actions are considered &#039;&#039;unlocking&#039;&#039; a relay:&lt;br /&gt;
:* the controlling device becoming unreachable.&lt;br /&gt;
:* the relay sends &amp;quot;release,KEY,!release,ok&amp;quot;&lt;br /&gt;
:* the controlling device sends a !release&lt;br /&gt;
* A relay is &#039;&#039;locked&#039;&#039; by a controller if their last interaction of the above types was locking.&lt;br /&gt;
&lt;br /&gt;
===General Relay requirements===&lt;br /&gt;
The relay must behave the following way by default (unless at some point a meta-command explicitly requires another behavior):&lt;br /&gt;
*A relay MUST provide a mechanism for checking that every controlling device is reachable, and releasing it if it is not.  It is not specified whether this checking process should be automatic or manually triggered.&lt;br /&gt;
*A relay MUST NOT send anything on RLVR channel that is not a valid &amp;lt;r_msg&amp;gt;.&lt;br /&gt;
*A relay MUST ignore any message on RLVR channel that is not a &amp;quot;,&amp;quot;-list of 3 items and whose second item is not the key of the avatar wearing the relay or ffffffff-ffff-ffff-ffff-ffffffffffff.&lt;br /&gt;
*When the relay receives a message meeting the above conditions, considering the 3rd item as a &amp;quot;|&amp;quot;-list of &amp;lt;command&amp;gt;s, then for every &amp;lt;command&amp;gt;:&lt;br /&gt;
:* if the &amp;lt;command&amp;gt; is a &amp;lt;rlv-command&amp;gt;, the relay MUST acknowledge it, either by &amp;quot;ok&amp;quot;, and transmit the command as such to the viewer with llOwnerSay(&amp;quot;@&amp;quot;+RLV-COMMAND), or by &amp;quot;ko&amp;quot; and not transmit it.&lt;br /&gt;
:* if the &amp;lt;command&amp;gt; is a &amp;lt;meta-command&amp;gt;&lt;br /&gt;
::* if the META-COMMAND_NAME is !pong, no acknowledgement is expected. The relay MUST reinstate all stored restrictions belonging to the controlling device if they weren&#039;t already active.&lt;br /&gt;
::* if the META-COMMAND_NAME is unknown or is not provided with enough arguments for at least one definition of the meta-command, the relay MUST acknowledge by &amp;quot;ko&amp;quot;&lt;br /&gt;
::* else if the relay knows the META-COMMAND_NAME with at least one definition having less or as many arguments as received in &amp;lt;meta-command arguments&amp;gt;, it MUST acknowledge it by &amp;quot;ok&amp;quot; and choose among possible definitions the one that uses the most arguments. Then if the number of arguments of this definition is &#039;&#039;n&#039;&#039;, it MUST execute it using only the &#039;&#039;n&#039;&#039; first arguments of &amp;lt;meta-command arguments&amp;gt;, ignoring the trailing arguments if any.&lt;br /&gt;
:* if the &amp;lt;command&amp;gt; is neither, then the relay MUST ignore it (no acknowledgement whatsoever)&lt;br /&gt;
:* every acknowledgement or message sent by the relay to one given controlling device must be issued by the same prim (so that the controlling device can restrict its listener to one source key)&lt;br /&gt;
*A relay MUST release all restrictions belonging to a controlling device when an unlocking action relative to this device happens (whether if it is just before or just after is irrelevant, as long as the relay does not wait for any further event).&lt;br /&gt;
*A relay MUST never release a restriction outside one of those 2 cases:&lt;br /&gt;
:* the controlling device the restriction comes from specifically asks for the restriction to be released (&amp;quot;@restriction=y&amp;quot;, &amp;quot;@clear=restriction&amp;quot;)&lt;br /&gt;
:* the relay is being unlocked with respect to the device the restriction belongs to (for instance !release coming from the device, or safe-word)&lt;br /&gt;
&lt;br /&gt;
===General controlling device requirements===&lt;br /&gt;
* A controlling device MUST not send anything on RLVR channel that is not a valid &amp;lt;d_msg&amp;gt;.&lt;br /&gt;
* A controlling device MUST, at any time when a relay is locked, provide a mechanism that will unlock it in bounded time. (i.e.: either there is a menu that will release the victim, or there is a timer, or a menu should be able to start such a timer). At least one person MUST know what this mechanism is, and if it requires an action from someone else, be able to tell that other person what s/he has to do.&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group&amp;diff=1171150</id>
		<title>LSL Protocol/Restrained Love Open Relay Group</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group&amp;diff=1171150"/>
		<updated>2012-07-28T16:10:45Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: RestrainedLove&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Restrained Love Open Relay Group TOC}}&lt;br /&gt;
&lt;br /&gt;
The purpose of this and other related pages is to create an environment for the development of extensions to the existing Restrained Love Relay specification. The goal is to create an environment where ideas for extending the existing specification can be discussed openly and in the spirit of cooperation and not competition.&lt;br /&gt;
&lt;br /&gt;
A stated aim of the existing relay is that the specification should not include anything that can be done in a script. The goal of this specification is to get as many of those &#039;&#039;script&#039;&#039; ideas made as open as possible so that toy builders do not have to invent new and incompatible ways of doing the same thing.&lt;br /&gt;
&lt;br /&gt;
Finally, and perhaps the most important, our thanks go out to Maike Short. Her work on the existing relay specification was tireless and, appears to have been under-appreciated. Her generosity in making her relay code public enabled many others to develop their relays, using her script as a basis.&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;&#039;Founding Members&#039;&#039;&#039;&lt;br /&gt;
* Chloe1982 Constantine&lt;br /&gt;
* Ilana Debevec&lt;br /&gt;
* Kira Welty&lt;br /&gt;
* Kitty Barnett&lt;br /&gt;
* Lyssa Daehlie&lt;br /&gt;
* Maike Short &lt;br /&gt;
* Monica Jewell&lt;br /&gt;
* Nano Siemens&lt;br /&gt;
* samatha Congrejo&lt;br /&gt;
* Satomi Ahn&lt;br /&gt;
* Toy Wylie&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/ORG_Introduction&amp;diff=1171149</id>
		<title>LSL Protocol/Restrained Love Open Relay Group/ORG Introduction</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/ORG_Introduction&amp;diff=1171149"/>
		<updated>2012-07-28T16:09:30Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: RestrainedLove&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Restrained Love Open Relay Group TOC}}&lt;br /&gt;
&lt;br /&gt;
==ORG - The OpenRelay Group==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ORG&#039;&#039;&#039;, &#039;&#039;the OpenRelay Group&#039;&#039;, are scriptwriters and builders of Restrained Love Enabled furniture and &lt;br /&gt;
devices. &#039;&#039;&#039;ORG&#039;&#039;&#039; wants to see the RLV Relay Spec grow and evolve to meet the needs of all &lt;br /&gt;
users, even to meet needs outside the capabilities of the RL Viewer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The purpose of an ORG Enhanced Relay is two-fold: First, to capture and validate the necessary commands to &lt;br /&gt;
pass to the RL Viewer to enable its functionality for whatever purpose. Second, to do the things &lt;br /&gt;
that the Viewer does not (or will not) do that may have use in the &#039;&#039;&#039;RLV&#039;&#039;&#039; environment, but to do it in an &lt;br /&gt;
open, documented form to avoid a confusing flood of &amp;quot;secret&amp;quot;, or &amp;quot;special purpose&amp;quot; relays. Any &lt;br /&gt;
extension documented here are, by definition explicitly non-proprietary and open for anyone&lt;br /&gt;
to use in any their products. We specifically reject the &amp;quot;not invented here&amp;quot;, closed minded &lt;br /&gt;
position. There are already several builders using the RLV for non-BDSM solutions to problems, &lt;br /&gt;
the RLV is slowly becoming mainstream and we can help that process along.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The only required job of a relay is to deliver a properly formed &#039;&#039;&amp;quot;llOwnerSay&amp;quot;&#039;&#039; command to the RLViewer, &lt;br /&gt;
with properly formed RLV commands.. whatever else done in the relay proper is to enable features the viewer &lt;br /&gt;
can&#039;t. The viewer&#039;s work starts at &#039;&#039;&amp;quot;llOwnerSay&amp;quot;&#039;&#039;.. the viewer&#039;s tasks start at &#039;&#039;&amp;quot;llOwnerSay&amp;quot;&#039;&#039; anything &lt;br /&gt;
else is up to us, and it is our responsibility to make sure that everyone knows what and how we do it and &lt;br /&gt;
make it easier for them to do it. From a furniture builder&#039;s perspective, the more standard the set of features, &lt;br /&gt;
the easier it is to design furniture and other devices to enhance the RLV-user&#039;s experience, no matter if it&#039;s&lt;br /&gt;
BDSM or any other use. Imagination is a good thing that should be encouraged.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
This is not to say that every extension may be accepted by &#039;&#039;&#039;ORG&#039;&#039;&#039;. If it&#039;s dangerous, uses undocumented hacks&lt;br /&gt;
to the viewer and is not user friendly, then this is not the place. But we will discuss every suggested&lt;br /&gt;
extension and consider how to make them more useful to the user and the viewer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
One caveat for our discussions. Personal, &#039;&#039;ad-hominem&#039;&#039; attacks are not welcome and not permitted. We&#039;re here&lt;br /&gt;
to help builders, not to build empires. No one is required to use any of these extensions, &lt;br /&gt;
but everyone is welcome to do so. We want to help people avoid &#039;re-inventing the wheel&#039; and we want to &lt;br /&gt;
do so in the spirit of cooperation, not control.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We are making &#039;&#039;&#039;x-tensions&#039;&#039;&#039; to the existing relay spec as meta-commands, adopting the &#039;&#039;&#039;!x-&#039;&#039;&#039; prefix convention. Other &lt;br /&gt;
&#039;&#039;&#039;x-tensions&#039;&#039;&#039; that might be implemented in a viewer could use the &#039;&#039;&#039;!x-&#039;&#039;&#039; convention or adopt some other prefix &lt;br /&gt;
such as &#039;&#039;&#039;#&#039;&#039;&#039;. Given the importance of a decision, [[LSL Protocol/Restrained Love Open Relay Group/Prefix|discussion]] has been initiated.&lt;br /&gt;
&lt;br /&gt;
The relay spec is silent with respect to unknown commands and the behavior has been dependent on each relay&lt;br /&gt;
maker&#039;s whim&#039;s, &#039;&#039;e.g.&#039;&#039;, they may not even be &#039;&#039;&#039;ko&#039;ed&#039;&#039;&#039;. So you can never assume the extensions will always be &lt;br /&gt;
recognized or even acknowledged.&lt;br /&gt;
We require that every &#039;&#039;ORG Enabled&#039;&#039; relay respond to the meta-command &#039;&#039;&#039;!x-orgversions&#039;&#039;&#039;, comparable to the current meta-command &#039;&#039;&#039;!version&#039;&#039;&#039;, with a string such as&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ORG=0001/who=001/email=005/vision=002&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
so the device talking to the relay can know which extensions the relay you are talking to are supported and what specification version is used for each, and which version of the core [[LSL Protocol/Restrained Love Open Relay Group/ORG Requirements|ORG requirements]] is implemented.&lt;br /&gt;
&lt;br /&gt;
Some example [[LSL Protocol/Restrained Love Open Relay Group/x-tensions|x-tensions]] that have been implemented or proposed are:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;&#039;&#039;!x-vision&#039;&#039;&#039;&#039;&#039; - provide a means of obscuring the subjects vision without having to muck about with extra attachments. Originally conceived as a mouselook enforcer/punisher and requires a HUD-style relay. (already implemented and available to use).&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;&#039;&#039;!x-listen&#039;&#039;&#039;&#039;&#039; - to open up a second channel for any commands the device needs. This allows scriptwriters to open a channel for short term use; the intent is to cut down on lag by not requiring listeners that are always on.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;&#039;&#039;!x-gender&#039;&#039;&#039;&#039;&#039; - allow the users to set their defined sex, and be queried by a device and set by the device!&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;&#039;&#039;!x-species&#039;&#039;&#039;&#039;&#039; - ditto for species.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;&#039;&#039;!x-freeze&#039;&#039;&#039;&#039;&#039;  - stop the victim dead in their tracks. Effectively disables the arrow movement keys, jump and crouch. Sure you can do it other ways, but this keeps down extra script/attachment counts and gives a &#039;standard interface&#039;. Nice for &#039;&#039;area effects&#039;&#039; (prison lock-down perhaps), cages (hold them in place so you can open the cage and take out one specific captive.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Come join us and help us make our Restrained Love life, the best life.&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/ack&amp;diff=1171145</id>
		<title>LSL Protocol/Restrained Love Open Relay Group/ack</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/ack&amp;diff=1171145"/>
		<updated>2012-07-28T16:00:57Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: RestrainedLove&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Restrained Love Open Relay Group TOC}}&lt;br /&gt;
&lt;br /&gt;
= !x-ack =&lt;br /&gt;
STATUS: draft&lt;br /&gt;
&lt;br /&gt;
VERSION: 002&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;002 Implemented in Dahlia&#039;s multirelay (&amp;lt;-- this command is not supported anymore due to llRegionSayTo())&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;001 Implemented in Satomi&#039;s multirelay&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!x-ack/quiet: tells the relay to stop sending &amp;quot;ok&amp;quot; and &amp;quot;ko&amp;quot; acknowledgements&lt;br /&gt;
&lt;br /&gt;
!x-ack/verbose: tells the relay to resume sending them&lt;br /&gt;
&lt;br /&gt;
Rationale: reduce relay channel spam, and thus lag, by disabling acknowledgements that the controlling device does not care about.&lt;br /&gt;
&lt;br /&gt;
General syntax: !x-ack[/STRING]*, where STRING is the desired acknowledgement policy.&lt;br /&gt;
&lt;br /&gt;
Behavior requirements:&lt;br /&gt;
* This will change the way the relay acknowledge commands, applying the policy given in the argument of the command, thus overriding the [[LSL Protocol/Restrained Love Open Relay Group/ORG Requirements|core requirement]] that every command should be acknowledged. There are now, in 002, two policies:&lt;br /&gt;
:* verbose: it is the default usual policy for RLV relays&lt;br /&gt;
:* quiet: &amp;quot;ok&amp;quot; and &amp;quot;ko&amp;quot; acknowledgements are not sent (other useful replies &#039;&#039;&#039;should&#039;&#039;&#039; still be sent!).&lt;br /&gt;
* This behavior change only concerns the acknowledgements to commands from the device issuing !x-ack.&lt;br /&gt;
* The possible acknowledgements to &amp;quot;!x-ack&amp;quot; are &amp;quot;ok&amp;quot; to say it was accepted, and &amp;quot;ko&amp;quot; otherwise. The acknowledgement may or may not be sent, depending on the current acknowledgement policy but, in every case, if there is a policy change, its effects start immediately, that is &#039;&#039;before&#039;&#039; the relay (does not) acknowledges &amp;quot;!x-ack&amp;quot;.&lt;br /&gt;
* No matter the active acknowledgement policy, &amp;quot;!release,ok&amp;quot; should be always sent in case of safe-wording (which is not really an acknowledgement because it is not a reply to a command from the controlling device). Same goes for any other message sent at the initiative of the relay.&lt;br /&gt;
* The acknowledgement policy is restored on relog.&lt;br /&gt;
&lt;br /&gt;
Example 1:&lt;br /&gt;
 C -&amp;gt; R: !x-ack/quiet&lt;br /&gt;
 (nothing)&lt;br /&gt;
 C -&amp;gt; R: @remoutfit=force&lt;br /&gt;
 (nothing)&lt;br /&gt;
 C -&amp;gt; R: !x-orgversions&lt;br /&gt;
 C &amp;lt;- R: 0002/ack=001&lt;br /&gt;
 C -&amp;gt; R: !x-ack/verbose&lt;br /&gt;
 C &amp;lt;- R: !x-ack/verbose,ok&lt;br /&gt;
 C -&amp;gt; R: @detach:pelvis=force&lt;br /&gt;
 R &amp;lt;- C: @detach:pelvis=force,ok&lt;br /&gt;
&lt;br /&gt;
Example 2, a low-lag RLV zone controller:&lt;br /&gt;
 C −&amp;gt; *: !x-ack/quiet|@sittp=n|@tplure=n|@tploc=n|@tplm=n|@showworldmap=n|@showminimap=n|@showloc=n&lt;br /&gt;
 (Then no relay should answer, but everybody should be restricted. &amp;quot;*&amp;quot; instead of &amp;quot;R&amp;quot; means&lt;br /&gt;
 a wildcard was used, as introduced in ORG-0002. Without the wildcard and !x-ack,  a lot of&lt;br /&gt;
 spam would have been sent to the RLV channel.)&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Restrained_Love_Relay_Specs_TOC&amp;diff=1171143</id>
		<title>Template:Restrained Love Relay Specs TOC</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Restrained_Love_Relay_Specs_TOC&amp;diff=1171143"/>
		<updated>2012-07-28T15:56:41Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: cat&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;floatright&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;navbox&amp;quot; style=&amp;quot;width: 20em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&#039;&#039;&#039;Restrained Love Relay&#039;&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;[[LSL Protocol/Restrained Love Relay/Introduction|Introduction]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[LSL Protocol/Restrained Love Relay/Specification|Specification]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[LSL Protocol/Restrained Love Relay/Change History|Change History]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[LSL Protocol/Restrained Love Relay/Reference Implementation|Reference Implementation]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[LSL Protocol/Restrained Love Relay/Development &amp;amp; Contribution|Development &amp;amp; Contribution]]&#039;&#039;&#039;&lt;br /&gt;
** [[LSL Protocol/Restrained Love Relay/Bugs and Pendings Features|Bugs and Pending Features]]&lt;br /&gt;
** [[LSL Protocol/Restrained Love Relay/How to Test|How to Test]]&lt;br /&gt;
** [[LSL Protocol/Restrained Love Relay/Other Implementations|Other Implementations]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Category:RestrainedLove]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/ORG_Logo&amp;diff=1171142</id>
		<title>LSL Protocol/Restrained Love Open Relay Group/ORG Logo</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/ORG_Logo&amp;diff=1171142"/>
		<updated>2012-07-28T15:55:22Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: RestrainedLove&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Restrained Love Open Relay Group TOC}}&lt;br /&gt;
&lt;br /&gt;
== Logo ==&lt;br /&gt;
&lt;br /&gt;
A graphical image can make it easier to recognize devices and relays that support ORG extensions to the standard relay. As such, the following image&lt;br /&gt;
&lt;br /&gt;
[[File:org button.png]]&lt;br /&gt;
&lt;br /&gt;
can be added to an existing store or device logo to indicate use of or support for ORG.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a great place to post suggestions for an overall ORG logo.&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/x-tensions&amp;diff=1171141</id>
		<title>LSL Protocol/Restrained Love Open Relay Group/x-tensions</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/x-tensions&amp;diff=1171141"/>
		<updated>2012-07-28T15:53:55Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: RestrainedLove&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Restrained Love Open Relay Group TOC}}&lt;br /&gt;
&lt;br /&gt;
== Full list of x-tensions ==&lt;br /&gt;
&lt;br /&gt;
At present, the list of x-tensions is short and it makes sense to list them all on a single page, In the future, it may make sense to separate the list into those that have group approval and those that do not, either because they are still under discussion or because they have been rejected by majority opinion.&lt;br /&gt;
&lt;br /&gt;
Proposed list of approval stages [[LSL Protocol/Restrained Love Open Relay Group/x-tensions Validation Process|here]].&lt;br /&gt;
&lt;br /&gt;
Feature table (including ORG x-tensions) of existing relays [[LSL Protocol/Restrained Love Relay/Comparison|here]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;x-tensions&#039;&#039;&#039; that have been implemented or proposed are:&lt;br /&gt;
&lt;br /&gt;
These x-tensions are live, up and well running with several independant implementations:&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; border-width: 1px; border-style: solid; border-color: #000&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! x-tension &lt;br /&gt;
! [[LSL Protocol/Restrained Love Open Relay Group/x-tensions Validation Process|status]]&lt;br /&gt;
! version &lt;br /&gt;
! description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/who|who]]&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
| silver (?)&lt;br /&gt;
| 001 &lt;br /&gt;
| tells the relay the identity of the avatar operating the controlling device. Can be useful in playgrounds with bondage furnitures whose grabbing function is open to everybody.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/handover|handover]]&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
| bronze (?)&lt;br /&gt;
| 001&lt;br /&gt;
| hands over the control of the relay to another device, with no further auth required, and possiblity to keep all the previous restrictions.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/vision|vision]]&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
| bronze (?)&lt;br /&gt;
| 001&lt;br /&gt;
| provide a means of obscuring the subjects vision &#039;&#039;&#039;WITHOUT&#039;&#039;&#039; having to muck about with extra wearables. Originally conceived as a &#039;&#039;&#039;MOUSELOOK ENFORCER/PUNISHER&#039;&#039;&#039; and &#039;&#039;&#039;REQUIRES&#039;&#039;&#039; a HUDstyle relay. (already implemented and available to use).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/follow|follow]]&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
| draft&lt;br /&gt;
| 002&lt;br /&gt;
| makes the victim follow a given object or avatar at the given distance. &lt;br /&gt;
::::This is exactly what current leashes already do, but without the particles. Useful for bringing the victim &lt;br /&gt;
::::from one place to another without using magic tricks like teleportation.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/email|email]]&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
| draft&lt;br /&gt;
| 006&lt;br /&gt;
| initiates a gridwide email encapsulated protocol session.&lt;br /&gt;
::::The protocol itself is a work in progress now. A proof of concept is on its way in my relay and RLV remote. --[[User:Satomi Ahn|Satomi Ahn]] 10:03, 19 May 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/delay|delay]]&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
| draft&lt;br /&gt;
| 004&lt;br /&gt;
| !x-delay/10 will delay the execution of the remaining subcommands by 10 seconds. This can be useful either for setting release timers or... making delayed surprises.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These x-tensions have some working implementations are not considered useful anymore due to llRegionSayTo:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; border-width: 1px; border-style: solid; border-color: #000&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! x-tension &lt;br /&gt;
! [[LSL Protocol/Restrained Love Open Relay Group/x-tensions Validation Process|status]]&lt;br /&gt;
! version &lt;br /&gt;
! description&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/channel|channel]]&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
| draft&lt;br /&gt;
| 001&lt;br /&gt;
| switches the control channel for the RLV relay communications to the specified channel to cut down on spam.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/ack|ack]]&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
| draft&lt;br /&gt;
| 002&lt;br /&gt;
| !x-ack/quiet tells the relay to stop sending &amp;quot;ok&amp;quot; and &amp;quot;ko&amp;quot; acknowledgements... until it receives !x-ack/verbose. This should help reduce spam on the relay channel.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These x-tensions have only one implementation but their specifications look final enough:&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; border-width: 1px; border-style: solid; border-color: #000&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! x-tension &lt;br /&gt;
! [[LSL Protocol/Restrained Love Open Relay Group/x-tensions Validation Process|status]]&lt;br /&gt;
! version &lt;br /&gt;
! description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/freeze|freeze]]&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
| draft&lt;br /&gt;
| 002&lt;br /&gt;
| stop the victim dead in their tracks. Effectively disables the arrow movement keys, jump and crouch. &lt;br /&gt;
::::Sure you can do it other ways, but this keeps down extra script/attachment counts and gives a &#039;standard interface&#039;. &lt;br /&gt;
::::Nice for &#039;&#039;area effects&#039;&#039; (prison lock-down perhaps), cages (hold them in place so you can open the cage and take out one specific captive.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/key|key]]&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
| draft&lt;br /&gt;
| 002 &lt;br /&gt;
| creates an abstract key for the current session which enables another controller (or the same one after a relog) to take over the session; with !ping activated or not if the controller is not present&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These x-tensions are under debate:&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; border-width: 1px; border-style: solid; border-color: #000&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! x-tension &lt;br /&gt;
! [[LSL Protocol/Restrained Love Open Relay Group/x-tensions Validation Process|status]]&lt;br /&gt;
! version &lt;br /&gt;
! description&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;s&amp;gt;&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/simwide|simwide]]&#039;&#039;&#039;&#039;&#039; &amp;lt;/s&amp;gt;&lt;br /&gt;
| deprecated&lt;br /&gt;
| 000 &lt;br /&gt;
| Enables simwide control without requiring a gridwide control: the viewer&#039;s answer is resent in a special channel and the relay performs the llSensor; interest of this simwide mode even if the capture avatar is close to the grabber: a scan is done around the avatar, not around the grabber.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/speech|speech]]&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
| draft&lt;br /&gt;
| 002 &lt;br /&gt;
| Forced speech&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/gridurl|gridurl]]&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
| proposal&lt;br /&gt;
| 000 &lt;br /&gt;
| Persistent URL to get the UUID key of the relay&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;s&amp;gt;&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/thirdview|thirdview]]&#039;&#039;&#039;&#039;&#039;&amp;lt;/s&amp;gt;&lt;br /&gt;
| deprecated&lt;br /&gt;
| 001 &lt;br /&gt;
| Forced mouselook mode&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/camera|camera]]&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
| draft&lt;br /&gt;
| 001 &lt;br /&gt;
| Controlling/tracking the camera of the wearer of the relay (this x-tension contains thirdview)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/autoforward|autoforward]]&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
| draft&lt;br /&gt;
| 001 &lt;br /&gt;
| Simpler alternative to simwide: no new listener is opened, fully compatible with a !x-email session&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;s&amp;gt;&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/forward|forward]]&#039;&#039;&#039;&#039;&#039;&amp;lt;/s&amp;gt;&lt;br /&gt;
| deprecated&lt;br /&gt;
| 001 &lt;br /&gt;
| Deprecated but the first idea could be taken in a future version of autoforward, depending how these things will evolve&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/sensor|sensor]]&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
| draft&lt;br /&gt;
| 002&lt;br /&gt;
| remote llSensor&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/cancel|cancel]]&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
| draft&lt;br /&gt;
| 001 &lt;br /&gt;
| release any avatars from any session controlled by an object owned by the owner of the object sending this command&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These x-tensions have different stages of maturity but are not currently implemented and neither being worked on at the moment:&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; border-width: 1px; border-style: solid; border-color: #000&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! x-tension &lt;br /&gt;
! [[LSL Protocol/Restrained Love Open Relay Group/x-tensions Validation Process|status]]&lt;br /&gt;
! version &lt;br /&gt;
! description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;gender&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
| proposal&lt;br /&gt;
| 000&lt;br /&gt;
| allow the users to set their defined sex, and be queried by a device &#039;&#039;&#039;AND SET BY THE DEVICE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;species&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
| proposal&lt;br /&gt;
| 000&lt;br /&gt;
| ditto for species.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;control&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
| proposal&lt;br /&gt;
| 000&lt;br /&gt;
| makes the victim move as if the control given in argument had been pressed. In conjunction with !x-freeze, this allows the device user to control the victim as if they controlled their own avatar.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/listen|listen]]&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
| ?&lt;br /&gt;
| 001&lt;br /&gt;
| opens up a listener on the specified channel. Useful for cutting down the load on a sim by only having multiple listeners as needed.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;animate&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
| proposal&lt;br /&gt;
| 000&lt;br /&gt;
| animates the victim with the given animation. The animation has to be a standard one, or an animation from a freebie set we would have to standardize and include in every relay that supports x-animate.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/http-in|http-in]]&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
| draft&lt;br /&gt;
| 002&lt;br /&gt;
| initiates a gridwide http encapsulated protocol session, using the new SL server http-in feature.&lt;br /&gt;
::::I see it as using exactly the same mechanisms as the email extension. It is likely that one of the two methods should eventually be deprecated as they would have the same use and one of the two has to be more efficient than the other! --[[User:Satomi Ahn|Satomi Ahn]] 10:03, 19 May 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;message&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
| proposal&lt;br /&gt;
| 000&lt;br /&gt;
| Use the relay to send messages from the restraining device to the victim. &lt;br /&gt;
::::Mainly to negate the inconvenients of llInstantMessage as the only means for a restraining device to send a message only to the victim (Especially useful with multi line messages where the inherent script delay for llInstantMessage is more apparent). --[Regan Flasheart] 13:59, 26 June 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/custom|custom]]&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
| proposal&lt;br /&gt;
| 001&lt;br /&gt;
| Asks the relay for a list of custom commands or sublists of such. The controlling device issuing this would display the list in a dialog to the device user. Items of the list could include simple actions like triggering animations, or blinding the relay wearer, or even display the menus of various compatible restraints worn by the relay wearer. The idea is to give the possibility for any relay maker to implement various custom extensions without having to wait for every furniture or remote maker to implement them in their menus.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/mode|mode]]&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
| proposal&lt;br /&gt;
| 000&lt;br /&gt;
| Queries for relay current auth mode. Answers (in ack) should tell the source useful information such as if the relay is in interactive mode (ask) or not (auto) and the presence of black and white lists.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/safe|safe]]&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
| proposal&lt;br /&gt;
| 000&lt;br /&gt;
| Enables safewording in the relay for the current source (if safewording was disabled). Options could specify that only conditional safewording (&amp;quot;evil safeword&amp;quot;) should be allowed, thus allowing another way to close a session if the source is not available to send !release. This x-tension should have a command to query the current safewording mode.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/multi|multi]]&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
| proposal&lt;br /&gt;
| 000&lt;br /&gt;
| By announcing this x-tension, a relay announces it can support several simultaneous controllers. This x-tension should also contain a command to ask for (an estimation of) a number of available controllers, and a command to close the relay to new controllers.&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;&#039;&#039;&#039;[[LSL Protocol/Restrained Love Open Relay Group/status|status]]&#039;&#039;&#039;&#039;&#039; &lt;br /&gt;
| proposal&lt;br /&gt;
| 000 &lt;br /&gt;
| an alternative for @getstatus&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These commands are forever deprecated:&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; border-width: 1px; border-style: solid; border-color: #000&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
! x-tension &lt;br /&gt;
! [[LSL Protocol/Restrained Love Open Relay Group/x-tensions Validation Process|status]]&lt;br /&gt;
! version &lt;br /&gt;
! description&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!&amp;lt;s&amp;gt;&#039;&#039;&#039;&#039;&#039;(!x-)tensions&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
| deprecated&lt;br /&gt;
| 000&lt;br /&gt;
| queries the relay for supported x-tensions.&amp;lt;/s&amp;gt; Deprecated by !x-orgversions, which is part of [[LSL_Protocol/Restrained_Love_Open_Relay_Group/ORG_Requirements|ORG core requirements]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: x-tension names do not contain &amp;quot;!x-&amp;quot; or even &amp;quot;x-&amp;quot;. Only the meta-commands they define are prefixed that way. One x-tension can define several meta-commands, which must all be implemented if the x-tension is supported.&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/channel&amp;diff=1171139</id>
		<title>LSL Protocol/Restrained Love Open Relay Group/channel</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Open_Relay_Group/channel&amp;diff=1171139"/>
		<updated>2012-07-28T15:48:22Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: RestrainedLove&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Restrained Love Open Relay Group TOC}}&lt;br /&gt;
&lt;br /&gt;
== !x-channel ==&lt;br /&gt;
&lt;br /&gt;
STATUS: draft&lt;br /&gt;
&lt;br /&gt;
VERSION: 001&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;001 Implemented in Dahlia&#039;s multirelay and the RLV remote control anythingRLV&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;001 Implemented in Satomi&#039;s multirelay and Witchy Remote&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!x-channel/xxxx: changes the communication beween relay and controlling device to channel xxxx instead of RLVR, assuming xxxx is a high negative integer.&lt;br /&gt;
&lt;br /&gt;
Motivation: the relay and the device thus stop spamming the RLVR channel with messages that only concerns those two objects.&lt;br /&gt;
&lt;br /&gt;
Scenario:&lt;br /&gt;
 (session on channel RLVR between R and C)&lt;br /&gt;
 -RLVR&amp;gt; blah,k(R),!x-channel/-12345&lt;br /&gt;
 &amp;lt;RLVR- blah,k(C),!x-channel/-12345,ok&lt;br /&gt;
 (session continues on channel -12345)&lt;br /&gt;
&lt;br /&gt;
Neither R and C are required to listen on channel RLVR after this. It is even recommended that R and C close every useless listener.&lt;br /&gt;
&lt;br /&gt;
Both R and C are required to listen to each other on channel -12345 after this dialog.&lt;br /&gt;
&lt;br /&gt;
C should only propose high negative channels (&amp;lt;1000). The relay is not required to accept any other channel than high negative ones. If the proposed channel is wrong, the relay can &amp;quot;ko&amp;quot; the message.&lt;br /&gt;
&lt;br /&gt;
Recommendation: this command should preferably be used after the session is locked, as the relay is not required to retain any data concerning a non-locking device.&lt;br /&gt;
&lt;br /&gt;
Good practice scenario:&lt;br /&gt;
 (session on channel RLVR between R and C)&lt;br /&gt;
 -RLVR&amp;gt; blah,k(R),@randomlockingcommand=n|!x-channel/-12345&lt;br /&gt;
 &amp;lt;RLVR- blah,k(C),@randomlockingcommand=n,ok&lt;br /&gt;
 &amp;lt;RLVR- blah,k(C),!x-channel/-12345,ok&lt;br /&gt;
 (session continues on channel -12345)&lt;br /&gt;
&lt;br /&gt;
It is not recommended to place other commands after the !x-listen, as it is not clear on which channel they should be acknowledged (depending on whether or not the relay ok&#039;s the !x-listen, and even when ok&#039;d it is might make relay implementation harder in some cases if the acknowledgement channel changes within a batch of commands).&lt;br /&gt;
&lt;br /&gt;
== Probably to be deprecated ==&lt;br /&gt;
&lt;br /&gt;
See [[llRegionSayTo]].&lt;br /&gt;
&lt;br /&gt;
--[[User:Satomi Ahn|Satomi Ahn]] 06:18, 7 May 2011 (PDT)&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Restrained_Love_Open_Relay_Group_TOC&amp;diff=1171138</id>
		<title>Template:Restrained Love Open Relay Group TOC</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Restrained_Love_Open_Relay_Group_TOC&amp;diff=1171138"/>
		<updated>2012-07-28T15:47:54Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: Restrained Love Relay Specs TOC&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;floatright&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;navbox&amp;quot; style=&amp;quot;width:20em; font-weight:bold&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center&amp;quot;&amp;gt;Restrained Love&amp;lt;br/&amp;gt;Open Relay Group&amp;lt;br/&amp;gt;x-tensions&amp;lt;/div&amp;gt;&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group|ORG Home]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/ORG Logo|Logo]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/ORG Introduction|ORG Introduction]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/ORG Requirements|ORG Requirements]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/Prefix|ORG Prefix]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/x-tensions|x-tensions, full list]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/x-tensions Validation Process|x-tensions, validation process]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Restrained Love Relay Specs TOC}}&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:Restrained_Love_Open_Relay_Group_TOC&amp;diff=1171136</id>
		<title>Template:Restrained Love Open Relay Group TOC</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:Restrained_Love_Open_Relay_Group_TOC&amp;diff=1171136"/>
		<updated>2012-07-28T15:44:58Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: cleanup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;floatright&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;navbox&amp;quot; style=&amp;quot;width:20em; font-weight:bold&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center&amp;quot;&amp;gt;Restrained Love&amp;lt;br/&amp;gt;Open Relay Group&amp;lt;br/&amp;gt;x-tensions&amp;lt;/div&amp;gt;&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group|ORG Home]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/ORG Logo|Logo]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/ORG Introduction|ORG Introduction]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/ORG Requirements|ORG Requirements]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/Prefix|ORG Prefix]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/x-tensions|x-tensions, full list]]&lt;br /&gt;
*[[LSL Protocol/Restrained Love Open Relay Group/x-tensions Validation Process|x-tensions, validation process]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;navbox&amp;quot; style=&amp;quot;width:20em; font-weight:bold&amp;quot;&amp;gt;&lt;br /&gt;
*[[LSL Protocol/Restrained Love Relay|Basic Relay Pages]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Category:RestrainedLove]]&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:RestrainedLove/Documentation/Command&amp;diff=1171135</id>
		<title>Category:RestrainedLove/Documentation/Command</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Category:RestrainedLove/Documentation/Command&amp;diff=1171135"/>
		<updated>2012-07-28T15:33:23Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: cat sort&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This category collects all Restrained Love API commands.&lt;br /&gt;
&lt;br /&gt;
== Function Index ==&lt;br /&gt;
{{#vardefine:path|User:Toy_Wylie/RLV_Documentation}}&lt;br /&gt;
&lt;br /&gt;
*[[{{#var:path}}/acceptpermission|@acceptpermission]]&lt;br /&gt;
*[[{{#var:path}}/accepttp|@accepttp]]&lt;br /&gt;
*[[{{#var:path}}/addattach|@addattach]]&lt;br /&gt;
*[[{{#var:path}}/addoutfit|@addoutfit]]&lt;br /&gt;
*[[{{#var:path}}/attach|@attach]]&lt;br /&gt;
*[[{{#var:path}}/attachall|@attachall]]&lt;br /&gt;
*[[{{#var:path}}/attachallthis|@attachallthis]]&lt;br /&gt;
*[[{{#var:path}}/attachthis|@attachthis]]&lt;br /&gt;
*[[{{#var:path}}/chatnormal|@chatnormal]]&lt;br /&gt;
*[[{{#var:path}}/chatshout|@chatshout]]&lt;br /&gt;
*[[{{#var:path}}/chatwhisper|@chatwhisper]]&lt;br /&gt;
*[[{{#var:path}}/clear|@clear]]&lt;br /&gt;
*[[{{#var:path}}/defaultwear|@defaultwear]]&lt;br /&gt;
*[[{{#var:path}}/denypermission|@denypermission]]&lt;br /&gt;
*[[{{#var:path}}/detach|@detach]]&lt;br /&gt;
*[[{{#var:path}}/detachall|@detachall]]&lt;br /&gt;
*[[{{#var:path}}/detachallthis|@detachallthis]]&lt;br /&gt;
*[[{{#var:path}}/detachme|@detachme]]&lt;br /&gt;
*[[{{#var:path}}/detachthis|@detachthis]]&lt;br /&gt;
*[[{{#var:path}}/edit|@edit]]&lt;br /&gt;
*[[{{#var:path}}/emote|@emote]]&lt;br /&gt;
*[[{{#var:path}}/fartouch|@fartouch]]&lt;br /&gt;
*[[{{#var:path}}/findfolder|@findfolder]]&lt;br /&gt;
*[[{{#var:path}}/fly|@fly]]&lt;br /&gt;
*[[{{#var:path}}/getattach|@getattach]]&lt;br /&gt;
*[[{{#var:path}}/getdebug_|@getdebug_]]&lt;br /&gt;
*[[{{#var:path}}/getenv|@getenv]]&lt;br /&gt;
*[[{{#var:path}}/getinv|@getinv]]&lt;br /&gt;
*[[{{#var:path}}/getinvworn|@getinvworn]]&lt;br /&gt;
*[[{{#var:path}}/getoutfit|@getoutfit]]&lt;br /&gt;
*[[{{#var:path}}/getpath|@getpath]]&lt;br /&gt;
*[[{{#var:path}}/getsitid|@getsitid]]&lt;br /&gt;
*[[{{#var:path}}/getstatus|@getstatus]]&lt;br /&gt;
*[[{{#var:path}}/getstatusall|@getstatusall]]&lt;br /&gt;
*[[{{#var:path}}/notify|@notify]]&lt;br /&gt;
*[[{{#var:path}}/permissive|@permissive]]&lt;br /&gt;
*[[{{#var:path}}/recvchat|@recvchat]]&lt;br /&gt;
*[[{{#var:path}}/recvchat_sec|@recvchat_sec]]&lt;br /&gt;
*[[{{#var:path}}/recvemote|@recvemote]]&lt;br /&gt;
*[[{{#var:path}}/recvemote_sec|@recvemote_sec]]&lt;br /&gt;
*[[{{#var:path}}/recvim|@recvim]]&lt;br /&gt;
*[[{{#var:path}}/recvim_sec|@recvim_sec]]&lt;br /&gt;
*[[{{#var:path}}/redirchat|@redirchat]]&lt;br /&gt;
*[[{{#var:path}}/rediremote|@rediremote]]&lt;br /&gt;
*[[{{#var:path}}/remattach|@remattach]]&lt;br /&gt;
*[[{{#var:path}}/remoutfit|@remoutfit]]&lt;br /&gt;
*[[{{#var:path}}/rez|@rez]]&lt;br /&gt;
*[[{{#var:path}}/sendchannel|@sendchannel]]&lt;br /&gt;
*[[{{#var:path}}/sendchannel_sec|@sendchannel_sec]]&lt;br /&gt;
*[[{{#var:path}}/sendchat|@sendchat]]&lt;br /&gt;
*[[{{#var:path}}/sendim|@sendim]]&lt;br /&gt;
*[[{{#var:path}}/sendim_sec|@sendim_sec]]&lt;br /&gt;
*[[{{#var:path}}/setdebug|@setdebug]]&lt;br /&gt;
*[[{{#var:path}}/setdebug_|@setdebug_]]&lt;br /&gt;
*[[{{#var:path}}/setdebug_avatarsex|@setdebug_avatarsex]]&lt;br /&gt;
*[[{{#var:path}}/setdebug_renderresolutiondivisor|@setdebug_renderresolutiondivisor]]&lt;br /&gt;
*[[{{#var:path}}/setenv|@setenv]]&lt;br /&gt;
*[[{{#var:path}}/setrot|@setrot]]&lt;br /&gt;
*[[{{#var:path}}/showhovertext|@showhovertext]]&lt;br /&gt;
*[[{{#var:path}}/showhovertextall|@showhovertextall]]&lt;br /&gt;
*[[{{#var:path}}/showhovertexthud|@showhovertexthud]]&lt;br /&gt;
*[[{{#var:path}}/showhovertextworld|@showhovertextworld]]&lt;br /&gt;
*[[{{#var:path}}/showinv|@showinv]]&lt;br /&gt;
*[[{{#var:path}}/showloc|@showloc]]&lt;br /&gt;
*[[{{#var:path}}/showminimap|@showminimap]]&lt;br /&gt;
*[[{{#var:path}}/shownames|@shownames]]&lt;br /&gt;
*[[{{#var:path}}/showworldmap|@showworldmap]]&lt;br /&gt;
*[[{{#var:path}}/sit|@sit]]&lt;br /&gt;
*[[{{#var:path}}/sittp|@sittp]]&lt;br /&gt;
*[[{{#var:path}}/tplm|@tplm]]&lt;br /&gt;
*[[{{#var:path}}/tploc|@tploc]]&lt;br /&gt;
*[[{{#var:path}}/tplure|@tplure]]&lt;br /&gt;
*[[{{#var:path}}/tplure_sec|@tplure_sec]]&lt;br /&gt;
*[[{{#var:path}}/tpto|@tpto]]&lt;br /&gt;
*[[{{#var:path}}/unsit|@unsit]]&lt;br /&gt;
*[[{{#var:path}}/version|@version]]&lt;br /&gt;
*[[{{#var:path}}/versionnew|@versionnew]]&lt;br /&gt;
*[[{{#var:path}}/versionnum|@versionnum]]&lt;br /&gt;
*[[{{#var:path}}/viewnote|@viewnote]]&lt;br /&gt;
*[[{{#var:path}}/viewscript|@viewscript]]&lt;br /&gt;
*[[{{#var:path}}/viewtexture|@viewtexture]]&lt;br /&gt;
&lt;br /&gt;
[[Category:RestrainedLove/Documentation|{{SUBPAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:RestrainedLove/Documentation&amp;diff=1171134</id>
		<title>Category:RestrainedLove/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Category:RestrainedLove/Documentation&amp;diff=1171134"/>
		<updated>2012-07-28T15:32:46Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: cat sort&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This category is for documentation around the Restrained Love Viewer API: [[User:Toy Wylie/RLV Documentation|RLV Documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Category:RestrainedLove|{{SUBPAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Toy_Wylie/RLV_Documentation/Function_Index&amp;diff=1171133</id>
		<title>User:Toy Wylie/RLV Documentation/Function Index</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Toy_Wylie/RLV_Documentation/Function_Index&amp;diff=1171133"/>
		<updated>2012-07-28T15:24:04Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[:Category:RestrainedLove/Documentation/Command]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:RLV_Documentation/Command&amp;diff=1171132</id>
		<title>Template:RLV Documentation/Command</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:RLV_Documentation/Command&amp;diff=1171132"/>
		<updated>2012-07-28T15:22:42Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: cat sort&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__{{#if:{{{lock|}}}|&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ff9999; padding:1em; font-size:12px; text-align:center&amp;quot;&amp;gt;&#039;&#039;&#039;LOCKED - Locked by {{{lock}}} - Please do not modify! - LOCKED&#039;&#039;&#039;&amp;lt;/div&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== @{{SUBPAGENAME}} ==&lt;br /&gt;
&lt;br /&gt;
{{#if:{{{deprecated|}}}|&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top:2em; clear:both; color:red&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;DEPRECATED&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&#039;&#039;&#039;This function is DEPRECATED - Do not use it!&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top:2em; float:right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Type&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;{{{type|&amp;lt;noinclude&amp;gt;&amp;quot;Restriction&amp;quot;, &amp;quot;Force&amp;quot;, &amp;quot;Exception&amp;quot; or &amp;quot;General&amp;quot;&amp;lt;/noinclude&amp;gt;}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top:2em; margin-right:2em; float:right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Implemented&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.5em&amp;quot;&amp;gt;Implemented since RLV version {{{version|&amp;lt;noinclude&amp;gt;NUMBER&amp;lt;/noinclude&amp;gt;}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top:2em; float:left&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Usage&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;{{{usage|&amp;lt;noinclude&amp;gt;Usage here&amp;lt;/noinclude&amp;gt;}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top:2em; clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Purpose&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;{{{purpose|&amp;lt;noinclude&amp;gt;Purpose of this command here&amp;lt;/noinclude&amp;gt;}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#if:{{{notes|}}}|&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top:2em; clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Notes&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.5em&amp;quot;&amp;gt;{{{notes|&amp;lt;noinclude&amp;gt;Additional notes go here&amp;lt;/noinclude&amp;gt;}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top:2em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;See Also&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;{{#if:{{{seealso|}}}|&lt;br /&gt;
{{#vardefine:path|User:Toy Wylie/RLV Documentation/}}&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |0}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |1}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |2}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |3}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |4}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |5}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |6}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |7}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |8}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |9}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
}} }} }} }} }} }} }} }} }} }}&amp;lt;noinclude&amp;gt;|&lt;br /&gt;
*List of related commands here&amp;lt;/noinclude&amp;gt;}}&lt;br /&gt;
{{#if:{{{seealsoalso|}}}|{{{seealsoalso}}}&amp;lt;noinclude&amp;gt;|Further notes here&amp;lt;noinclude&amp;gt;}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top:2em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;{{#if:{{{example_2|}}}|Example 1|Example}}&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.5em&amp;quot;&amp;gt;{{{example&amp;lt;noinclude&amp;gt;|Example LSL code here&amp;lt;/noinclude&amp;gt;}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#if:{{{example_2|}}}|&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top:2em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Example 2&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.5em&amp;quot;&amp;gt;{{{example_2&amp;lt;noinclude&amp;gt;|Second Example LSL code here&amp;lt;/noinclude&amp;gt;}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
[[Category:RestrainedLove/Documentation/Command&amp;lt;includeonly&amp;gt;|{{SUBPAGENAME}}&amp;lt;/includeonly&amp;gt;]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:RLV_Documentation/Command&amp;diff=1171131</id>
		<title>Template:RLV Documentation/Command</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:RLV_Documentation/Command&amp;diff=1171131"/>
		<updated>2012-07-28T15:21:46Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: cleanup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__{{#if:{{{lock|}}}|&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#ff9999; padding:1em; font-size:12px; text-align:center&amp;quot;&amp;gt;&#039;&#039;&#039;LOCKED - Locked by {{{lock}}} - Please do not modify! - LOCKED&#039;&#039;&#039;&amp;lt;/div&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== @{{SUBPAGENAME}} ==&lt;br /&gt;
&lt;br /&gt;
{{#if:{{{deprecated|}}}|&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top:2em; clear:both; color:red&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;DEPRECATED&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&#039;&#039;&#039;This function is DEPRECATED - Do not use it!&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top:2em; float:right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Type&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;{{{type|&amp;lt;noinclude&amp;gt;&amp;quot;Restriction&amp;quot;, &amp;quot;Force&amp;quot;, &amp;quot;Exception&amp;quot; or &amp;quot;General&amp;quot;&amp;lt;/noinclude&amp;gt;}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top:2em; margin-right:2em; float:right&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Implemented&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.5em&amp;quot;&amp;gt;Implemented since RLV version {{{version|&amp;lt;noinclude&amp;gt;NUMBER&amp;lt;/noinclude&amp;gt;}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top:2em; float:left&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Usage&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;{{{usage|&amp;lt;noinclude&amp;gt;Usage here&amp;lt;/noinclude&amp;gt;}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top:2em; clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Purpose&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;{{{purpose|&amp;lt;noinclude&amp;gt;Purpose of this command here&amp;lt;/noinclude&amp;gt;}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#if:{{{notes|}}}|&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top:2em; clear:both&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Notes&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.5em&amp;quot;&amp;gt;{{{notes|&amp;lt;noinclude&amp;gt;Additional notes go here&amp;lt;/noinclude&amp;gt;}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top:2em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;See Also&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;{{#if:{{{seealso|}}}|&lt;br /&gt;
{{#vardefine:path|User:Toy Wylie/RLV Documentation/}}&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |0}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |1}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |2}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |3}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |4}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |5}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |6}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |7}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |8}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{{seealso}}}| |9}}}}{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
}} }} }} }} }} }} }} }} }} }}&amp;lt;noinclude&amp;gt;|&lt;br /&gt;
*List of related commands here&amp;lt;/noinclude&amp;gt;}}&lt;br /&gt;
{{#if:{{{seealsoalso|}}}|{{{seealsoalso}}}&amp;lt;noinclude&amp;gt;|Further notes here&amp;lt;noinclude&amp;gt;}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top:2em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;{{#if:{{{example_2|}}}|Example 1|Example}}&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.5em&amp;quot;&amp;gt;{{{example&amp;lt;noinclude&amp;gt;|Example LSL code here&amp;lt;/noinclude&amp;gt;}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#if:{{{example_2|}}}|&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top:2em&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Example 2&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding:0.5em&amp;quot;&amp;gt;{{{example_2&amp;lt;noinclude&amp;gt;|Second Example LSL code here&amp;lt;/noinclude&amp;gt;}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
[[Category:RestrainedLove/Documentation/Command&amp;lt;noinclude&amp;gt;|{{SUBPAGENAME}}&amp;lt;/noinclude&amp;gt;]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:RLV_Documentation/Command&amp;diff=1171130</id>
		<title>Template:RLV Documentation/Command</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:RLV_Documentation/Command&amp;diff=1171130"/>
		<updated>2012-07-28T14:34:47Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__{{#if:{{{lock|}}}|&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #ff9999; padding: 1em; font-size: 12px; text-align: center;&amp;quot;&amp;gt;&#039;&#039;&#039;LOCKED - Locked by {{{lock}}} - Please do not modify! - LOCKED&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
== @{{SUBPAGENAME}} ==&lt;br /&gt;
&lt;br /&gt;
{{#if:{{{deprecated|}}}|&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; clear: both; color: red;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;DEPRECATED&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;This function is DEPRECATED - Do not use it!&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; float: right;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Type&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{type|&amp;lt;noinclude&amp;gt;&amp;quot;Restriction&amp;quot;, &amp;quot;Force&amp;quot;, &amp;quot;Exception&amp;quot; or &amp;quot;General&amp;quot;&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; margin-right: 2em; float: right;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Implemented&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
Implemented since RLV version {{{version|&amp;lt;noinclude&amp;gt;NUMBER&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; float: left;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Usage&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{usage|&amp;lt;noinclude&amp;gt;Usage here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; clear: both;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Purpose&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{purpose|&amp;lt;noinclude&amp;gt;Purpose of this command here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#if:{{{notes|}}}|&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; clear: both;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Notes&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{notes|&amp;lt;noinclude&amp;gt;Additional notes go here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;See Also&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{#if:{{{seealso|}}}|&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:path|User:Toy_Wylie/RLV_Documentation/}}&lt;br /&gt;
{{#vardefine:commands|{{{seealso}}}}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |0}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |1}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |2}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |3}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |4}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |5}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |6}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |7}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |8}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |9}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}|*[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
}} }} }} }} }} }} }} }} }} }}&lt;br /&gt;
&lt;br /&gt;
|&amp;lt;noinclude&amp;gt;List of related commands here&amp;lt;/noinclude&amp;gt;}}&lt;br /&gt;
{{#if:{{{seealsoalso|}}}|{{#if:{{{seealso|}}}|&amp;lt;br /&amp;gt;}}&lt;br /&gt;
{{{seealsoalso}}}|&amp;lt;noinclude&amp;gt;Further notes here&amp;lt;/noinclude&amp;gt;}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Example {{#if:{{{example_2|}}}|1}}&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{example|&amp;lt;noinclude&amp;gt;Example LSL code here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#if:{{{example_2|}}}|&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Example 2&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{example_2|&amp;lt;noinclude&amp;gt;Second Example LSL code here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&amp;lt;includeonly&amp;gt;&lt;br /&gt;
[[Category:RestrainedLove/Documentation/Command|{{SUBPAGENAME}}]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:RestrainedLove/Documentation]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Toy_Wylie/RLV_Documentation&amp;diff=1171129</id>
		<title>User:Toy Wylie/RLV Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Toy_Wylie/RLV_Documentation&amp;diff=1171129"/>
		<updated>2012-07-28T14:30:52Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Restrained Love Documentation ==&lt;br /&gt;
&lt;br /&gt;
I want to start a proper documentation of the available Restrained Love (RLV) functions, their usage and caveats. Since I don&#039;t know yet how to structure this properly, I don&#039;t want to pollute the LSL_Protocol namespace yet. So the document will be found here for the time being.&lt;br /&gt;
&lt;br /&gt;
Be aware that this is a documentation on how to use the commands only, not how to use them together with a relay. This will be part of another project. RLV only works with objects you own yourself - for example, in attachments - so all of the example scripts use the [[llOwnerSay]] command.&lt;br /&gt;
&lt;br /&gt;
[[:Category:RestrainedLove/Documentation/Command|Alphabetical Function Index]]&lt;br /&gt;
&lt;br /&gt;
= Function Groups =&lt;br /&gt;
&lt;br /&gt;
*[[/General|General]]&lt;br /&gt;
*[[/Chat|Chat]]&lt;br /&gt;
*[[/Movement|Movement]]&lt;br /&gt;
*[[/Outfit|Outfit]]&lt;br /&gt;
*[[/Interaction|Interaction]]&lt;br /&gt;
*[[/Informational|Informational]]&lt;br /&gt;
*[[/Environment|Environment]]&lt;br /&gt;
**@setdebug_renderresolutiondivisor&lt;br /&gt;
**@setenv_&lt;br /&gt;
**@showhovertext&lt;br /&gt;
**@showhovertextall&lt;br /&gt;
**@showhovertexthud&lt;br /&gt;
**@showhovertextworld&lt;br /&gt;
**@shownames&lt;br /&gt;
*[[/User Interface|User Interface]]&lt;br /&gt;
**@setenv&lt;br /&gt;
**@setdebug&lt;br /&gt;
**@showinv&lt;br /&gt;
**@showloc&lt;br /&gt;
**@showminimap&lt;br /&gt;
**@showworldmap&lt;br /&gt;
**@viewnote&lt;br /&gt;
**@viewscript&lt;br /&gt;
**@viewtexture&lt;br /&gt;
*[[/Shared Items|Shared Items]]&lt;br /&gt;
**@attach&lt;br /&gt;
**@attachall&lt;br /&gt;
**@attachallover&lt;br /&gt;
**@attachallthis&lt;br /&gt;
**@attachallthisover&lt;br /&gt;
**@attachover&lt;br /&gt;
**@attachthis&lt;br /&gt;
**@attachthisover&lt;br /&gt;
**@detach&lt;br /&gt;
**@detachall&lt;br /&gt;
**@detachallthis&lt;br /&gt;
**@detachthis&lt;br /&gt;
**@findfolder&lt;br /&gt;
**@getinv&lt;br /&gt;
**@getinvworn&lt;br /&gt;
**@getpath&lt;br /&gt;
**@getpathnew&lt;br /&gt;
&lt;br /&gt;
[[Category:RestrainedLove/Documentation|*]]&lt;br /&gt;
[[Category:RestrainedLove|{{SUBPAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Toy_Wylie/RLV_Documentation&amp;diff=1171128</id>
		<title>User:Toy Wylie/RLV Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Toy_Wylie/RLV_Documentation&amp;diff=1171128"/>
		<updated>2012-07-28T14:28:07Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: cat sort&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Restrained Love Documentation ==&lt;br /&gt;
&lt;br /&gt;
I want to start a proper documentation of the available Restrained Love (RLV) functions, their usage and caveats. Since I don&#039;t know yet how to structure this properly, I don&#039;t want to pollute the LSL_Protocol namespace yet. So the document will be found here for the time being.&lt;br /&gt;
&lt;br /&gt;
Be aware that this is a documentation on how to use the commands only, not how to use them together with a relay. This will be part of another project. RLV only works with objects you own yourself - for example, in attachments - so all of the example scripts use the [[llOwnerSay]] command.&lt;br /&gt;
&lt;br /&gt;
[[Category:RestrainedLove/Documentation/Command|Alphabetical Function Index]]&lt;br /&gt;
&lt;br /&gt;
= Function Groups =&lt;br /&gt;
&lt;br /&gt;
*[[/General|General]]&lt;br /&gt;
*[[/Chat|Chat]]&lt;br /&gt;
*[[/Movement|Movement]]&lt;br /&gt;
*[[/Outfit|Outfit]]&lt;br /&gt;
*[[/Interaction|Interaction]]&lt;br /&gt;
*[[/Informational|Informational]]&lt;br /&gt;
*[[/Environment|Environment]]&lt;br /&gt;
**@setdebug_renderresolutiondivisor&lt;br /&gt;
**@setenv_&lt;br /&gt;
**@showhovertext&lt;br /&gt;
**@showhovertextall&lt;br /&gt;
**@showhovertexthud&lt;br /&gt;
**@showhovertextworld&lt;br /&gt;
**@shownames&lt;br /&gt;
*[[/User Interface|User Interface]]&lt;br /&gt;
**@setenv&lt;br /&gt;
**@setdebug&lt;br /&gt;
**@showinv&lt;br /&gt;
**@showloc&lt;br /&gt;
**@showminimap&lt;br /&gt;
**@showworldmap&lt;br /&gt;
**@viewnote&lt;br /&gt;
**@viewscript&lt;br /&gt;
**@viewtexture&lt;br /&gt;
*[[/Shared Items|Shared Items]]&lt;br /&gt;
**@attach&lt;br /&gt;
**@attachall&lt;br /&gt;
**@attachallover&lt;br /&gt;
**@attachallthis&lt;br /&gt;
**@attachallthisover&lt;br /&gt;
**@attachover&lt;br /&gt;
**@attachthis&lt;br /&gt;
**@attachthisover&lt;br /&gt;
**@detach&lt;br /&gt;
**@detachall&lt;br /&gt;
**@detachallthis&lt;br /&gt;
**@detachthis&lt;br /&gt;
**@findfolder&lt;br /&gt;
**@getinv&lt;br /&gt;
**@getinvworn&lt;br /&gt;
**@getpath&lt;br /&gt;
**@getpathnew&lt;br /&gt;
&lt;br /&gt;
[[Category:RestrainedLove/Documentation|*]]&lt;br /&gt;
[[Category:RestrainedLove|{{SUBPAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:RestrainedLove/Documentation&amp;diff=1171127</id>
		<title>Category:RestrainedLove/Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Category:RestrainedLove/Documentation&amp;diff=1171127"/>
		<updated>2012-07-28T14:20:36Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This category is for documentation around the Restrained Love Viewer API: [[User:Toy Wylie/RLV Documentation|RLV Documentation]]&lt;br /&gt;
&lt;br /&gt;
[[Category:RestrainedLove]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Toy_Wylie/RLV_Documentation/Function_Index&amp;diff=1171126</id>
		<title>User:Toy Wylie/RLV Documentation/Function Index</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Toy_Wylie/RLV_Documentation/Function_Index&amp;diff=1171126"/>
		<updated>2012-07-28T14:18:49Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: redir to cat&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Category:RestrainedLove/Documentation/Command]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:RestrainedLove/Documentation/Command&amp;diff=1171125</id>
		<title>Category:RestrainedLove/Documentation/Command</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Category:RestrainedLove/Documentation/Command&amp;diff=1171125"/>
		<updated>2012-07-28T14:15:03Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: function index&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This category collects all Restrained Love API commands.&lt;br /&gt;
&lt;br /&gt;
== Function Index ==&lt;br /&gt;
{{#vardefine:path|User:Toy_Wylie/RLV_Documentation}}&lt;br /&gt;
&lt;br /&gt;
*[[{{#var:path}}/acceptpermission|@acceptpermission]]&lt;br /&gt;
*[[{{#var:path}}/accepttp|@accepttp]]&lt;br /&gt;
*[[{{#var:path}}/addattach|@addattach]]&lt;br /&gt;
*[[{{#var:path}}/addoutfit|@addoutfit]]&lt;br /&gt;
*[[{{#var:path}}/attach|@attach]]&lt;br /&gt;
*[[{{#var:path}}/attachall|@attachall]]&lt;br /&gt;
*[[{{#var:path}}/attachallthis|@attachallthis]]&lt;br /&gt;
*[[{{#var:path}}/attachthis|@attachthis]]&lt;br /&gt;
*[[{{#var:path}}/chatnormal|@chatnormal]]&lt;br /&gt;
*[[{{#var:path}}/chatshout|@chatshout]]&lt;br /&gt;
*[[{{#var:path}}/chatwhisper|@chatwhisper]]&lt;br /&gt;
*[[{{#var:path}}/clear|@clear]]&lt;br /&gt;
*[[{{#var:path}}/defaultwear|@defaultwear]]&lt;br /&gt;
*[[{{#var:path}}/denypermission|@denypermission]]&lt;br /&gt;
*[[{{#var:path}}/detach|@detach]]&lt;br /&gt;
*[[{{#var:path}}/detachall|@detachall]]&lt;br /&gt;
*[[{{#var:path}}/detachallthis|@detachallthis]]&lt;br /&gt;
*[[{{#var:path}}/detachme|@detachme]]&lt;br /&gt;
*[[{{#var:path}}/detachthis|@detachthis]]&lt;br /&gt;
*[[{{#var:path}}/edit|@edit]]&lt;br /&gt;
*[[{{#var:path}}/emote|@emote]]&lt;br /&gt;
*[[{{#var:path}}/fartouch|@fartouch]]&lt;br /&gt;
*[[{{#var:path}}/findfolder|@findfolder]]&lt;br /&gt;
*[[{{#var:path}}/fly|@fly]]&lt;br /&gt;
*[[{{#var:path}}/getattach|@getattach]]&lt;br /&gt;
*[[{{#var:path}}/getdebug_|@getdebug_]]&lt;br /&gt;
*[[{{#var:path}}/getenv|@getenv]]&lt;br /&gt;
*[[{{#var:path}}/getinv|@getinv]]&lt;br /&gt;
*[[{{#var:path}}/getinvworn|@getinvworn]]&lt;br /&gt;
*[[{{#var:path}}/getoutfit|@getoutfit]]&lt;br /&gt;
*[[{{#var:path}}/getpath|@getpath]]&lt;br /&gt;
*[[{{#var:path}}/getsitid|@getsitid]]&lt;br /&gt;
*[[{{#var:path}}/getstatus|@getstatus]]&lt;br /&gt;
*[[{{#var:path}}/getstatusall|@getstatusall]]&lt;br /&gt;
*[[{{#var:path}}/notify|@notify]]&lt;br /&gt;
*[[{{#var:path}}/permissive|@permissive]]&lt;br /&gt;
*[[{{#var:path}}/recvchat|@recvchat]]&lt;br /&gt;
*[[{{#var:path}}/recvchat_sec|@recvchat_sec]]&lt;br /&gt;
*[[{{#var:path}}/recvemote|@recvemote]]&lt;br /&gt;
*[[{{#var:path}}/recvemote_sec|@recvemote_sec]]&lt;br /&gt;
*[[{{#var:path}}/recvim|@recvim]]&lt;br /&gt;
*[[{{#var:path}}/recvim_sec|@recvim_sec]]&lt;br /&gt;
*[[{{#var:path}}/redirchat|@redirchat]]&lt;br /&gt;
*[[{{#var:path}}/rediremote|@rediremote]]&lt;br /&gt;
*[[{{#var:path}}/remattach|@remattach]]&lt;br /&gt;
*[[{{#var:path}}/remoutfit|@remoutfit]]&lt;br /&gt;
*[[{{#var:path}}/rez|@rez]]&lt;br /&gt;
*[[{{#var:path}}/sendchannel|@sendchannel]]&lt;br /&gt;
*[[{{#var:path}}/sendchannel_sec|@sendchannel_sec]]&lt;br /&gt;
*[[{{#var:path}}/sendchat|@sendchat]]&lt;br /&gt;
*[[{{#var:path}}/sendim|@sendim]]&lt;br /&gt;
*[[{{#var:path}}/sendim_sec|@sendim_sec]]&lt;br /&gt;
*[[{{#var:path}}/setdebug|@setdebug]]&lt;br /&gt;
*[[{{#var:path}}/setdebug_|@setdebug_]]&lt;br /&gt;
*[[{{#var:path}}/setdebug_avatarsex|@setdebug_avatarsex]]&lt;br /&gt;
*[[{{#var:path}}/setdebug_renderresolutiondivisor|@setdebug_renderresolutiondivisor]]&lt;br /&gt;
*[[{{#var:path}}/setenv|@setenv]]&lt;br /&gt;
*[[{{#var:path}}/setrot|@setrot]]&lt;br /&gt;
*[[{{#var:path}}/showhovertext|@showhovertext]]&lt;br /&gt;
*[[{{#var:path}}/showhovertextall|@showhovertextall]]&lt;br /&gt;
*[[{{#var:path}}/showhovertexthud|@showhovertexthud]]&lt;br /&gt;
*[[{{#var:path}}/showhovertextworld|@showhovertextworld]]&lt;br /&gt;
*[[{{#var:path}}/showinv|@showinv]]&lt;br /&gt;
*[[{{#var:path}}/showloc|@showloc]]&lt;br /&gt;
*[[{{#var:path}}/showminimap|@showminimap]]&lt;br /&gt;
*[[{{#var:path}}/shownames|@shownames]]&lt;br /&gt;
*[[{{#var:path}}/showworldmap|@showworldmap]]&lt;br /&gt;
*[[{{#var:path}}/sit|@sit]]&lt;br /&gt;
*[[{{#var:path}}/sittp|@sittp]]&lt;br /&gt;
*[[{{#var:path}}/tplm|@tplm]]&lt;br /&gt;
*[[{{#var:path}}/tploc|@tploc]]&lt;br /&gt;
*[[{{#var:path}}/tplure|@tplure]]&lt;br /&gt;
*[[{{#var:path}}/tplure_sec|@tplure_sec]]&lt;br /&gt;
*[[{{#var:path}}/tpto|@tpto]]&lt;br /&gt;
*[[{{#var:path}}/unsit|@unsit]]&lt;br /&gt;
*[[{{#var:path}}/version|@version]]&lt;br /&gt;
*[[{{#var:path}}/versionnew|@versionnew]]&lt;br /&gt;
*[[{{#var:path}}/versionnum|@versionnum]]&lt;br /&gt;
*[[{{#var:path}}/viewnote|@viewnote]]&lt;br /&gt;
*[[{{#var:path}}/viewscript|@viewscript]]&lt;br /&gt;
*[[{{#var:path}}/viewtexture|@viewtexture]]&lt;br /&gt;
&lt;br /&gt;
[[Category:RestrainedLove/Documentation]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:RLV_Documentation/Command&amp;diff=1171124</id>
		<title>Template:RLV Documentation/Command</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:RLV_Documentation/Command&amp;diff=1171124"/>
		<updated>2012-07-28T14:11:59Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: SUBPAGENAME better than passing in command name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__{{#if:{{{lock|}}}|&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #ff9999; padding: 1em; font-size: 12px; text-align: center;&amp;quot;&amp;gt;&#039;&#039;&#039;LOCKED - Locked by {{{lock}}} - Please do not modify! - LOCKED&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
== @{{SUBPAGENAME}} ==&lt;br /&gt;
&lt;br /&gt;
{{#if:{{{deprecated|}}}|&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; clear: both; color: red;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;DEPRECATED&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;This function is DEPRECATED - Do not use it!&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; float: right;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Type&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{type|&amp;lt;noinclude&amp;gt;&amp;quot;Restriction&amp;quot;, &amp;quot;Force&amp;quot;, &amp;quot;Exception&amp;quot; or &amp;quot;General&amp;quot;&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; margin-right: 2em; float: right;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Implemented&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
Implemented since RLV version {{{version|&amp;lt;noinclude&amp;gt;NUMBER&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; float: left;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Usage&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{usage|&amp;lt;noinclude&amp;gt;Usage here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; clear: both;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Purpose&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{purpose|&amp;lt;noinclude&amp;gt;Purpose of this command here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#if:{{{notes|}}}|&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; clear: both;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Notes&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{notes|&amp;lt;noinclude&amp;gt;Additional notes go here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;See Also&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{#if:{{{seealso|}}}|&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:path|User:Toy_Wylie/RLV_Documentation/}}&lt;br /&gt;
{{#vardefine:commands|{{{seealso}}}}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |0}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}|[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |1}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |2}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |3}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |4}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |5}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |6}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |7}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |8}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |9}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
}} }} }} }} }} }} }} }} }} }}&lt;br /&gt;
&lt;br /&gt;
|&amp;lt;noinclude&amp;gt;List of related commands here&amp;lt;/noinclude&amp;gt;}}&lt;br /&gt;
{{#if:{{{seealsoalso|}}}|{{#if:{{{seealso|}}}|&amp;lt;br /&amp;gt;}}&lt;br /&gt;
{{{seealsoalso}}}|&amp;lt;noinclude&amp;gt;Further notes here&amp;lt;/noinclude&amp;gt;}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Example {{#if:{{{example_2|}}}|1}}&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{example|&amp;lt;noinclude&amp;gt;Example LSL code here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#if:{{{example_2|}}}|&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Example 2&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{example_2|&amp;lt;noinclude&amp;gt;Second Example LSL code here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&amp;lt;includeonly&amp;gt;&lt;br /&gt;
[[Category:RestrainedLove/Documentation/Command|{{SUBPAGENAME}}]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:RestrainedLove/Documentation]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:RLV_Documentation/Command&amp;diff=1171123</id>
		<title>Template:RLV Documentation/Command</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:RLV_Documentation/Command&amp;diff=1171123"/>
		<updated>2012-07-28T14:10:20Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: cat sort&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__{{#if:{{{lock|}}}|&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #ff9999; padding: 1em; font-size: 12px; text-align: center;&amp;quot;&amp;gt;&#039;&#039;&#039;LOCKED - Locked by {{{lock}}} - Please do not modify! - LOCKED&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
== {{{command}}} ==&lt;br /&gt;
&lt;br /&gt;
{{#if:{{{deprecated|}}}|&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; clear: both; color: red;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;DEPRECATED&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;This function is DEPRECATED - Do not use it!&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; float: right;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Type&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{type|&amp;lt;noinclude&amp;gt;&amp;quot;Restriction&amp;quot;, &amp;quot;Force&amp;quot;, &amp;quot;Exception&amp;quot; or &amp;quot;General&amp;quot;&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; margin-right: 2em; float: right;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Implemented&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
Implemented since RLV version {{{version|&amp;lt;noinclude&amp;gt;NUMBER&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; float: left;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Usage&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{usage|&amp;lt;noinclude&amp;gt;Usage here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; clear: both;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Purpose&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{purpose|&amp;lt;noinclude&amp;gt;Purpose of this command here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#if:{{{notes|}}}|&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; clear: both;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Notes&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{notes|&amp;lt;noinclude&amp;gt;Additional notes go here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;See Also&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{#if:{{{seealso|}}}|&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:path|User:Toy_Wylie/RLV_Documentation/}}&lt;br /&gt;
{{#vardefine:commands|{{{seealso}}}}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |0}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}|[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |1}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |2}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |3}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |4}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |5}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |6}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |7}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |8}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |9}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
}} }} }} }} }} }} }} }} }} }}&lt;br /&gt;
&lt;br /&gt;
|&amp;lt;noinclude&amp;gt;List of related commands here&amp;lt;/noinclude&amp;gt;}}&lt;br /&gt;
{{#if:{{{seealsoalso|}}}|{{#if:{{{seealso|}}}|&amp;lt;br /&amp;gt;}}&lt;br /&gt;
{{{seealsoalso}}}|&amp;lt;noinclude&amp;gt;Further notes here&amp;lt;/noinclude&amp;gt;}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Example {{#if:{{{example_2|}}}|1}}&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{example|&amp;lt;noinclude&amp;gt;Example LSL code here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#if:{{{example_2|}}}|&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Example 2&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{example_2|&amp;lt;noinclude&amp;gt;Second Example LSL code here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&amp;lt;includeonly&amp;gt;&lt;br /&gt;
[[Category:RestrainedLove/Documentation/Command|{{SUBPAGENAME}}]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:RestrainedLove/Documentation]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:RLV_Documentation/Command&amp;diff=1171122</id>
		<title>Template:RLV Documentation/Command</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:RLV_Documentation/Command&amp;diff=1171122"/>
		<updated>2012-07-28T14:04:02Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: cat sort&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__{{#if:{{{lock|}}}|&lt;br /&gt;
&amp;lt;div style=&amp;quot;background: #ff9999; padding: 1em; font-size: 12px; text-align: center;&amp;quot;&amp;gt;&#039;&#039;&#039;LOCKED - Locked by {{{lock}}} - Please do not modify! - LOCKED&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
== {{{command}}} ==&lt;br /&gt;
&lt;br /&gt;
{{#if:{{{deprecated|}}}|&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; clear: both; color: red;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;DEPRECATED&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;This function is DEPRECATED - Do not use it!&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; float: right;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Type&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{type|&amp;lt;noinclude&amp;gt;&amp;quot;Restriction&amp;quot;, &amp;quot;Force&amp;quot;, &amp;quot;Exception&amp;quot; or &amp;quot;General&amp;quot;&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; margin-right: 2em; float: right;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Implemented&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
Implemented since RLV version {{{version|&amp;lt;noinclude&amp;gt;NUMBER&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; float: left;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Usage&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{usage|&amp;lt;noinclude&amp;gt;Usage here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; clear: both;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Purpose&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{purpose|&amp;lt;noinclude&amp;gt;Purpose of this command here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
{{#if:{{{notes|}}}|&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em; clear: both;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Notes&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{notes|&amp;lt;noinclude&amp;gt;Additional notes go here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;See Also&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{#if:{{{seealso|}}}|&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:path|User:Toy_Wylie/RLV_Documentation/}}&lt;br /&gt;
{{#vardefine:commands|{{{seealso}}}}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |0}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}|[[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |1}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |2}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |3}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |4}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |5}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |6}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |7}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |8}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
{{#vardefine:cmd|{{#explode:{{#var:commands}}| |9}}}}&lt;br /&gt;
{{#if:{{#var:cmd|}}| [[{{#var:path}}{{#var:cmd|}}|@{{#var:cmd|}}]]&lt;br /&gt;
}} }} }} }} }} }} }} }} }} }}&lt;br /&gt;
&lt;br /&gt;
|&amp;lt;noinclude&amp;gt;List of related commands here&amp;lt;/noinclude&amp;gt;}}&lt;br /&gt;
{{#if:{{{seealsoalso|}}}|{{#if:{{{seealso|}}}|&amp;lt;br /&amp;gt;}}&lt;br /&gt;
{{{seealsoalso}}}|&amp;lt;noinclude&amp;gt;Further notes here&amp;lt;/noinclude&amp;gt;}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Example {{#if:{{{example_2|}}}|1}}&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{example|&amp;lt;noinclude&amp;gt;Example LSL code here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#if:{{{example_2|}}}|&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;margin-top: 2em;&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Example 2&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{example_2|&amp;lt;noinclude&amp;gt;Second Example LSL code here&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&amp;lt;includeonly&amp;gt;&lt;br /&gt;
[[Category:RestrainedLove/Documentation/Command|{{#explode:{{{command}}}|@|1}}]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:RestrainedLove/Documentation]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Toy_Wylie/RLV_Documentation/Outfit&amp;diff=1171121</id>
		<title>User:Toy Wylie/RLV Documentation/Outfit</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Toy_Wylie/RLV_Documentation/Outfit&amp;diff=1171121"/>
		<updated>2012-07-28T13:57:48Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: cat sort&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Outfit Functions ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/attach|@attach]]&lt;br /&gt;
| Forces the user to attach all items inside a shared folder&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/addattach|@addattach]]&lt;br /&gt;
| Blocks the user from attaching something to a certain attachment spot&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/addoutfit|@addoutfit]]&lt;br /&gt;
| Blocks the user from wearing a certain type of clothing&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/defaultwear|@defaultwear]]&lt;br /&gt;
| Disables the &amp;quot;Wear&amp;quot; contect menu item to prevent kicking off of attachments&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/detach|@detach]]&lt;br /&gt;
| Prevent the user from detaching an object, or forcing them to detach an object or a folder&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/detachme|@detachme]]&lt;br /&gt;
| Detaches the object issuing this command&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/getattach|@getattach]]&lt;br /&gt;
| Retrieve a list of all attachments currently worn&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/getoutfit|@getoutfit]]&lt;br /&gt;
| Retrieve a list of all clothes currently worn&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/remattach|@remattach]]&lt;br /&gt;
| Blocks the user from detaching an object or forcing them to detach it&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/remoutfit|@remoutfit]]&lt;br /&gt;
| Blocks the user from removing a certain type of clothing or forcing them to remove it&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:RestrainedLove/Documentation|{{SUBPAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Toy_Wylie/RLV_Documentation/Movement&amp;diff=1171120</id>
		<title>User:Toy Wylie/RLV Documentation/Movement</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Toy_Wylie/RLV_Documentation/Movement&amp;diff=1171120"/>
		<updated>2012-07-28T13:57:36Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: cat sort&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Movement Functions ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/accepttp|@accepttp]]&lt;br /&gt;
| Automatically accepts teleport requests from certain people or from everyone&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/fly|@fly]]&lt;br /&gt;
| Forbids the user to fly&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/setrot|@setrot]]&lt;br /&gt;
| Rotates the user&#039;s avatar to a given orientation&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/sittp|@sittp]]&lt;br /&gt;
| Forbids the user from sitting on objects that are far away&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/standtp|@standtp]]&lt;br /&gt;
| Makes sure to move the avatar back to the position they were before sitting down&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/tplm|@tplm]]&lt;br /&gt;
| Blocks the user from teleporting using landmarks&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/tploc|@tploc]]&lt;br /&gt;
| Blocks the user from teleporting using the map or other means&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/tplure|@tplure]]&amp;lt;br /&amp;gt;[[User:Toy_Wylie/RLV_Documentation/tplure_sec|@tplure_sec]]&lt;br /&gt;
| Blocks the user from accepting teleports from others or adds an exception to the block&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/tpto|@tpto]]&lt;br /&gt;
| Teleports the user to a given location without confirmation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:RestrainedLove/Documentation|{{SUBPAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Toy_Wylie/RLV_Documentation/Interaction&amp;diff=1171119</id>
		<title>User:Toy Wylie/RLV Documentation/Interaction</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Toy_Wylie/RLV_Documentation/Interaction&amp;diff=1171119"/>
		<updated>2012-07-28T13:57:22Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: cat sort&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Interaction Functions ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/edit|@edit]]&lt;br /&gt;
| Prevents the user from editing objects&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/fartouch|@fartouch]]&lt;br /&gt;
| Prevents the user from clicking on (touching) objects that are far away&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/rez|@rez]]&lt;br /&gt;
| Blocks the user from rezzing or creating objects&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/sit|@sit]]&lt;br /&gt;
| Blocks the user from sitting down or forces the user to sit on a specific object&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/unsit |@unsit ]]&lt;br /&gt;
| Forbids the user to stand up or forces them to stand up immediately&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:RestrainedLove/Documentation|{{SUBPAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Toy_Wylie/RLV_Documentation/Informational&amp;diff=1171118</id>
		<title>User:Toy Wylie/RLV Documentation/Informational</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Toy_Wylie/RLV_Documentation/Informational&amp;diff=1171118"/>
		<updated>2012-07-28T13:57:06Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: cat sort&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Informational Functions ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/getdebug_avatarsex|@getdebug_avatarsex]]&lt;br /&gt;
| Get the avatar&#039;s gender&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/getdebug_renderresolutiondivisor|@getdebug_renderresolutiondivisor]]&lt;br /&gt;
| Get the current screen blurriness&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/getenv|@getenv]]&lt;br /&gt;
| A set of functions to get the environmental values of the user&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/getsitid|@getsitid]]&lt;br /&gt;
| Get the key of the object the user is sitting on&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/getstatus|@getstatus]]&lt;br /&gt;
| Get a list of restrictions placed on the user by this object&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/getstatusall|@getstatusall]]&lt;br /&gt;
| Get a list of all restrictions the user is currently subject to&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/notify|@notify]]&lt;br /&gt;
| Get notified if certain restrictions are applied or removed&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/version|@version]]&lt;br /&gt;
| Gets a version string from the user&#039;s RLV compliant viewer (deprecated)&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/versionnew|@versionnew]]&lt;br /&gt;
| Gets a version string from the user&#039;s RLV compliant viewer&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/versionnum|@versionnum]]&lt;br /&gt;
| Gets the RLV version the user&#039;s client implements&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:RestrainedLove/Documentation|{{SUBPAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Toy_Wylie/RLV_Documentation/General&amp;diff=1171117</id>
		<title>User:Toy Wylie/RLV Documentation/General</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Toy_Wylie/RLV_Documentation/General&amp;diff=1171117"/>
		<updated>2012-07-28T13:56:50Z</updated>

		<summary type="html">&lt;p&gt;Uzume Grigorovich: cat sort&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General Functions ==&lt;br /&gt;
&lt;br /&gt;
{| border=1 cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/acceptpermission|@acceptpermission]]&lt;br /&gt;
| Removes the permission dialog for control and attach requests&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/clear|@clear]]&lt;br /&gt;
| Releases all restrictions placed on the avatar by this object&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/denypermission|@denypermission]]&lt;br /&gt;
| Denies all permission requests for control and attach automatically&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/permissive|@permissive]]&lt;br /&gt;
| Turns all commands that have a _sec counterpart into their secure variations&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Toy_Wylie/RLV_Documentation/setdebug_avatarsex|@setdebug_avatarsex]]&lt;br /&gt;
| Set the avatar&#039;s gender&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:RestrainedLove/Documentation|{{SUBPAGENAME}}]]&lt;/div&gt;</summary>
		<author><name>Uzume Grigorovich</name></author>
	</entry>
</feed>