diff --git a/.gitea/workflows/codegen.yml b/.gitea/workflows/codegen.yml
new file mode 100644
index 0000000..16ca513
--- /dev/null
+++ b/.gitea/workflows/codegen.yml
@@ -0,0 +1,31 @@
+name: Native code generation
+
+on:
+ push:
+ pull_request:
+
+jobs:
+ deterministic:
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [ubuntu-latest, macos-latest, windows-latest]
+ runs-on: ${{ matrix.os }}
+ steps:
+ - uses: actions/checkout@v4
+ - uses: dtolnay/rust-toolchain@stable
+ with:
+ components: clippy,rustfmt
+ - name: Test diagnostics and byte-identical generation
+ run: cargo test -p libremetaverse-codegen
+ - name: Verify vendored hashes and checked-in output
+ run: cargo run -p libremetaverse-codegen -- check
+ - name: Regenerate twice without reference checkout access
+ run: |
+ cargo run -p libremetaverse-codegen -- generate
+ cargo run -p libremetaverse-codegen -- generate
+ git diff --exit-code -- codegen/generated
+ - name: Lint native generator
+ run: cargo clippy -p libremetaverse-codegen --all-targets -- -D warnings
+ - name: Prove normal consumer build does not execute generation
+ run: cargo build -p libremetaverse --locked
diff --git a/Cargo.lock b/Cargo.lock
index b72ac66..4c1d827 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -370,6 +370,15 @@ dependencies = [
"libremetaverse-types",
]
+[[package]]
+name = "libremetaverse-codegen"
+version = "0.0.1"
+dependencies = [
+ "serde",
+ "serde_json",
+ "sha2",
+]
+
[[package]]
name = "libremetaverse-compat-tests"
version = "0.0.1"
@@ -691,6 +700,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
dependencies = [
"serde_core",
+ "serde_derive",
]
[[package]]
diff --git a/Cargo.toml b/Cargo.toml
index afaf8a3..ac6517e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -17,6 +17,7 @@ members = [
"crates/libremetaverse-voice-webrtc",
"programs",
"tests/compat",
+ "tools/codegen",
]
[workspace.package]
diff --git a/README.md b/README.md
index 4d313e7..d371481 100644
--- a/README.md
+++ b/README.md
@@ -178,3 +178,6 @@ baselines are documented in
[`docs/imaging-meshing.md`](docs/imaging-meshing.md).
The controlled audit aggregates every expected failure by standardized C#
member ID and rejects unrelated fixture, assertion, compile, or symbol errors.
+The deterministic, Rust-only source-data generator framework and its complete
+pinned input inventory are documented in
+[`codegen/README.md`](codegen/README.md).
diff --git a/codegen/README.md b/codegen/README.md
new file mode 100644
index 0000000..34f62d6
--- /dev/null
+++ b/codegen/README.md
@@ -0,0 +1,60 @@
+# Native data generation
+
+`libremetaverse-codegen` is the Rust-only framework for the six source
+generators present at LibreMetaverse commit
+`2aa70bb68513b39795da5d13c88f31b86e85a3ba`. Normal builds compile only the
+checked-in Rust outputs. They do not run this tool, invoke .NET or Roslyn, read
+an environment-dependent path, access the network, or open the sibling
+reference checkout.
+
+## Provenance inventory
+
+[`sources.json`](sources.json) is the machine-readable inventory. It records
+the upstream repository and commit, source-generator hashes, every actual
+`AdditionalFile`, its vendored path, SHA-256, format, and BSD-3-Clause license.
+
+| Golden generator | Pinned data inputs |
+| --- | --- |
+| PacketSourceGenerator | `message_template.msg` |
+| VisualParamGenerator | `avatar_lad.xml` |
+| SkeletonGenerator | `avatar_skeleton.xml` |
+| AttentionsGenerator | `attentions.xml`, `attentionsN.xml` |
+| TreesGenerator | `trees.xml`, `grass.xml` |
+| GenepoolGenerator | `genepool.xml` |
+
+The C# project does not provide the optional `visualparamtemplate.cs` file.
+The pinned VisualParam generator therefore uses the template embedded in its
+own source; the inventory records that generator source and hash as provenance.
+
+The files under `inputs/` are exact, unmodified snapshots. Their license and
+copyright attribution are covered by the repository
+[`LICENSE.md`](../LICENSE.md). The generated source manifest repeats each hash
+and license in its header and data table.
+
+## Commands
+
+Regenerate every currently registered Rust output using only checked-in data:
+
+```console
+cargo run -p libremetaverse-codegen -- generate
+```
+
+Verify hashes and reject stale output without writing:
+
+```console
+cargo run -p libremetaverse-codegen -- check
+```
+
+Maintainers can refresh the vendored snapshots from an explicitly supplied
+checkout. The command verifies all six golden generator hashes and all input
+hashes before writing, so a different upstream revision is rejected:
+
+```console
+cargo run -p libremetaverse-codegen -- vendor ../libremetaverse
+```
+
+Generation uses UTF-8 with an optional BOM, normalizes CRLF/CR to LF, rejects
+NUL input, reports stable `path:line:column: severity[code]` diagnostics, sorts
+manifest records by stable IDs, emits provenance-rich generated headers, and
+always terminates output with one LF. Tests generate twice in memory and
+require byte identity before comparing with the checked-in file.
diff --git a/codegen/generated/source_manifest.rs b/codegen/generated/source_manifest.rs
new file mode 100644
index 0000000..22e2f5b
--- /dev/null
+++ b/codegen/generated/source_manifest.rs
@@ -0,0 +1,32 @@
+// @generated by libremetaverse-codegen; DO NOT EDIT.
+// Regenerate: cargo run -p libremetaverse-codegen -- generate
+// Generator: source-manifest
+// Source: codegen/inputs/attentions.xml sha256=bdbc4ca02dd3bde78b86e796f7eb4ada0000e47be9a127e35d2b77f3010a20af license=BSD-3-Clause
+// Source: codegen/inputs/attentionsN.xml sha256=80055e12a04d05ef5bb16e8c542cd6c218735f8c72f7e48317b8a34282d1ac5b license=BSD-3-Clause
+// Source: codegen/inputs/avatar_lad.xml sha256=6f97a1408fa8f0ab5c09043da433c701701fe075e8a97867fcbcda207adf9eaf license=BSD-3-Clause
+// Source: codegen/inputs/avatar_skeleton.xml sha256=addb3cc4cd582ed4343d778e06daf90c6b77b61b4ecb4a20d4bf202c2b93908a license=BSD-3-Clause
+// Source: codegen/inputs/genepool.xml sha256=6fa1391cd98fddec0d7fe762343ea21e53a655a8ddd4f33af52f8a02aaa3f56d license=BSD-3-Clause
+// Source: codegen/inputs/grass.xml sha256=90015f9768afe3cfee761d04239bf9e284b2739b095b7ab8331966fa1fbfcb4e license=BSD-3-Clause
+// Source: codegen/inputs/message_template.msg sha256=15e524a46a9a449ead33c26d495a292ae2e100e641a408ac66ef63b8a7a2489d license=BSD-3-Clause
+// Source: codegen/inputs/trees.xml sha256=f54e626b00bd2c4fec9f59a574a45860f209e4440bbb02b81d27050b9df8ffba license=BSD-3-Clause
+
+pub const UPSTREAM_COMMIT: &str = "2aa70bb68513b39795da5d13c88f31b86e85a3ba";
+pub const UPSTREAM_REPOSITORY: &str = "https://github.com/cinderblocks/libremetaverse";
+pub const SOURCES: &[(&str, &str, &str, &str)] = &[
+ ("attentions", "codegen/inputs/attentions.xml", "bdbc4ca02dd3bde78b86e796f7eb4ada0000e47be9a127e35d2b77f3010a20af", "BSD-3-Clause"),
+ ("attentions_updated", "codegen/inputs/attentionsN.xml", "80055e12a04d05ef5bb16e8c542cd6c218735f8c72f7e48317b8a34282d1ac5b", "BSD-3-Clause"),
+ ("avatar_lad", "codegen/inputs/avatar_lad.xml", "6f97a1408fa8f0ab5c09043da433c701701fe075e8a97867fcbcda207adf9eaf", "BSD-3-Clause"),
+ ("avatar_skeleton", "codegen/inputs/avatar_skeleton.xml", "addb3cc4cd582ed4343d778e06daf90c6b77b61b4ecb4a20d4bf202c2b93908a", "BSD-3-Clause"),
+ ("genepool", "codegen/inputs/genepool.xml", "6fa1391cd98fddec0d7fe762343ea21e53a655a8ddd4f33af52f8a02aaa3f56d", "BSD-3-Clause"),
+ ("grass", "codegen/inputs/grass.xml", "90015f9768afe3cfee761d04239bf9e284b2739b095b7ab8331966fa1fbfcb4e", "BSD-3-Clause"),
+ ("message_template", "codegen/inputs/message_template.msg", "15e524a46a9a449ead33c26d495a292ae2e100e641a408ac66ef63b8a7a2489d", "BSD-3-Clause"),
+ ("trees", "codegen/inputs/trees.xml", "f54e626b00bd2c4fec9f59a574a45860f209e4440bbb02b81d27050b9df8ffba", "BSD-3-Clause"),
+];
+pub const GENERATORS: &[(&str, &str, &str, &str)] = &[
+ ("attentions", "SourceGenerators/AttentionsGenerator/AttentionsGenerator.cs", "b2870ae020c42a8a6ec455363fbb70a1b3c94c814b205bad9b61609d5230da3e", "BSD-3-Clause"),
+ ("genepool", "SourceGenerators/GenepoolGenerator/GenepoolGenerator.cs", "a48e914fc62efbb1bc4b2e17162121621eebd4cf03872cc226bc8a83a9230cd2", "BSD-3-Clause"),
+ ("packets", "SourceGenerators/PacketSourceGenerator/PacketSourceGenerator.cs", "8e63c0356cd0269e10521d15fbcde780cf58f821935601b4f223933930db758f", "BSD-3-Clause"),
+ ("skeleton", "SourceGenerators/SkeletonGenerator/SkeletonGenerator.cs", "6e1a5dd95b2604319cf65037c59b69a739af563e49cfb29e5db00c3d9c371d49", "BSD-3-Clause"),
+ ("trees", "SourceGenerators/TreesGenerator/TreesGenerator.cs", "151a593ba215400361f9bf20848537a5c01bb0ab4a95b15c1e16fa4b1897f8bb", "BSD-3-Clause"),
+ ("visual_params", "SourceGenerators/VisualParamGenerator/VisualParamGenerator.cs", "bff0ec0f823b415e811f0c84210b3ee8d7baa65cc21de19ed19b3c26560c6dac", "BSD-3-Clause"),
+];
diff --git a/codegen/inputs/attentions.xml b/codegen/inputs/attentions.xml
new file mode 100644
index 0000000..be9a2b2
--- /dev/null
+++ b/codegen/inputs/attentions.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/codegen/inputs/attentionsN.xml b/codegen/inputs/attentionsN.xml
new file mode 100644
index 0000000..e7d9bb6
--- /dev/null
+++ b/codegen/inputs/attentionsN.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/codegen/inputs/avatar_lad.xml b/codegen/inputs/avatar_lad.xml
new file mode 100644
index 0000000..63e3265
--- /dev/null
+++ b/codegen/inputs/avatar_lad.xml
@@ -0,0 +1,17504 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/codegen/inputs/avatar_skeleton.xml b/codegen/inputs/avatar_skeleton.xml
new file mode 100644
index 0000000..f8daa87
--- /dev/null
+++ b/codegen/inputs/avatar_skeleton.xml
@@ -0,0 +1,232 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/codegen/inputs/genepool.xml b/codegen/inputs/genepool.xml
new file mode 100644
index 0000000..52300c2
--- /dev/null
+++ b/codegen/inputs/genepool.xml
@@ -0,0 +1,7107 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/codegen/inputs/grass.xml b/codegen/inputs/grass.xml
new file mode 100644
index 0000000..38b8d92
--- /dev/null
+++ b/codegen/inputs/grass.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
diff --git a/codegen/inputs/message_template.msg b/codegen/inputs/message_template.msg
new file mode 100644
index 0000000..8af99f5
--- /dev/null
+++ b/codegen/inputs/message_template.msg
@@ -0,0 +1,9291 @@
+// Linden Lab development message templates
+
+version 2.0
+
+// The Version 2.0 template requires preservation of message
+// numbers. Each message must be numbered relative to the
+// other messages of that type. The current highest number
+// for each type is listed below:
+// Low: 431
+// Medium: 18
+// High: 30
+// PLEASE UPDATE THIS WHEN YOU ADD A NEW MESSAGE!
+
+
+// *************************************************************************
+// Test Message
+// *************************************************************************
+
+// Test Message
+
+{
+ TestMessage Low 1 NotTrusted Zerocoded
+ {
+ TestBlock1 Single
+ { Test1 U32 }
+ }
+ {
+ NeighborBlock Multiple 4
+ { Test0 U32 }
+ { Test1 U32 }
+ { Test2 U32 }
+ }
+}
+
+// *************************************************************************
+// Messaging Internal Data Management Message
+// *************************************************************************
+
+// *************************
+// List fixed messages first
+// *************************
+
+
+// Packet Ack - Ack a list of packets sent reliable
+{
+ PacketAck Fixed 0xFFFFFFFB NotTrusted Unencoded
+ {
+ Packets Variable
+ { ID U32 }
+ }
+}
+
+
+// OpenCircuit - Tells the recipient's messaging system to open the descibed circuit
+{
+ OpenCircuit Fixed 0xFFFFFFFC NotTrusted Unencoded UDPBlackListed
+ {
+ CircuitInfo Single
+ { IP IPADDR }
+ { Port IPPORT }
+ }
+}
+
+
+// CloseCircuit - Tells the recipient's messaging system to close the descibed circuit
+{
+ CloseCircuit Fixed 0xFFFFFFFD NotTrusted Unencoded
+}
+
+
+// ******************
+// End fixed messages
+// ******************
+
+// StartPingCheck - used to measure circuit ping times
+// PingID is used to determine how backlogged the ping was that was
+// returned (or how hosed the other side is)
+{
+ StartPingCheck High 1 NotTrusted Unencoded
+ {
+ PingID Single
+ { PingID U8 }
+ { OldestUnacked U32 } // Current oldest "unacked" packet on the sender side
+ }
+}
+
+// CompletePingCheck - used to measure circuit ping times
+
+{
+ CompletePingCheck High 2 NotTrusted Unencoded
+ {
+ PingID Single
+ { PingID U8 }
+ }
+}
+
+// space->sim
+// sim->sim
+// AddCircuitCode - Tells the recipient's messaging system that this code
+// is for a legal circuit
+{
+ AddCircuitCode Low 2 Trusted Unencoded
+ {
+ CircuitCode Single
+ { Code U32 }
+ { SessionID LLUUID }
+ { AgentID LLUUID } // WARNING - may be null in valid message
+ }
+}
+
+// viewer->sim
+// UseCircuitCode - Attempts to provide the recipient with IP and Port
+// info. In the case of viewers, the id is the session id. For other
+// machines it may be null. The session id will always be the session
+// id of the process, which every server will generate on startup and
+// the viewer will be handed after login.
+{
+ UseCircuitCode Low 3 NotTrusted Unencoded
+ {
+ CircuitCode Single
+ { Code U32 }
+ { SessionID LLUUID }
+ { ID LLUUID } // agent id
+ }
+}
+
+
+// *************************************************************************
+// SpaceServer to Simulator Messages
+// ************************************************************************
+
+// Neighbor List - Passed anytime neighbors change
+{
+ NeighborList High 3 Trusted Unencoded
+ {
+ NeighborBlock Multiple 4
+ { IP IPADDR }
+ { Port IPPORT }
+ { PublicIP IPADDR }
+ { PublicPort IPPORT }
+ { RegionID LLUUID }
+ { Name Variable 1 } // string
+ { SimAccess U8 }
+ }
+}
+
+
+// AvatarTextureUpdate
+// simulator -> dataserver
+// reliable
+{
+ AvatarTextureUpdate Low 4 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { TexturesChanged BOOL }
+ }
+ {
+ WearableData Variable
+ { CacheID LLUUID }
+ { TextureIndex U8 }
+ { HostName Variable 1 }
+ }
+ {
+ TextureData Variable
+ { TextureID LLUUID }
+ }
+}
+
+
+// SimulatorMapUpdate
+// simulator -> dataserver
+// reliable
+{
+ SimulatorMapUpdate Low 5 Trusted Unencoded
+ {
+ MapData Single
+ { Flags U32 }
+ }
+}
+
+// SimulatorSetMap
+// simulator -> dataserver
+// reliable
+// Used to upload a map image into the database (currently used only for Land For Sale)
+{
+ SimulatorSetMap Low 6 Trusted Unencoded
+ {
+ MapData Single
+ { RegionHandle U64 }
+ { Type S32 }
+ { MapImage LLUUID }
+ }
+}
+
+// SubscribeLoad
+// spaceserver -> simulator
+// reliable
+{
+ SubscribeLoad Low 7 Trusted Unencoded
+}
+
+// UnsubscribeLoad
+// spaceserver -> simulator
+// reliable
+{
+ UnsubscribeLoad Low 8 Trusted Unencoded
+}
+
+
+// ************************************************************************
+// Simulator to SpaceServer Messages
+// ************************************************************************
+
+// SimulatorReady - indicates the sim has finished loading its state
+// and is ready to receive updates from others
+{
+ SimulatorReady Low 9 Trusted Zerocoded
+ {
+ SimulatorBlock Single
+ { SimName Variable 1 }
+ { SimAccess U8 }
+ { RegionFlags U32 }
+ { RegionID LLUUID }
+ { EstateID U32 }
+ { ParentEstateID U32 }
+ }
+ {
+ TelehubBlock Single
+ { HasTelehub BOOL }
+ { TelehubPos LLVector3 }
+ }
+}
+
+// TelehubInfo - fill in the UI for telehub creation floater.
+// sim -> viewer
+// reliable
+{
+ TelehubInfo Low 10 Trusted Unencoded
+ {
+ TelehubBlock Single
+ { ObjectID LLUUID } // null if no telehub
+ { ObjectName Variable 1 } // string
+ { TelehubPos LLVector3 } // fallback if viewer can't find object
+ { TelehubRot LLQuaternion }
+ }
+ {
+ SpawnPointBlock Variable
+ { SpawnPointPos LLVector3 } // relative to telehub position
+ }
+}
+
+// SimulatorPresentAtLocation - indicates that the sim is present at a grid
+// location and passes what it believes its neighbors are
+{
+ SimulatorPresentAtLocation Low 11 Trusted Unencoded
+ {
+ SimulatorPublicHostBlock Single
+ { Port IPPORT }
+ { SimulatorIP IPADDR }
+ { GridX U32 }
+ { GridY U32 }
+ }
+ {
+ NeighborBlock Multiple 4
+ { IP IPADDR }
+ { Port IPPORT }
+ }
+ {
+ SimulatorBlock Single
+ { SimName Variable 1 }
+ { SimAccess U8 }
+ { RegionFlags U32 }
+ { RegionID LLUUID }
+ { EstateID U32 }
+ { ParentEstateID U32 }
+ }
+ {
+ TelehubBlock Variable
+ { HasTelehub BOOL }
+ { TelehubPos LLVector3 }
+ }
+}
+
+// SimulatorLoad
+// simulator -> spaceserver
+// reliable
+{
+ SimulatorLoad Low 12 Trusted Unencoded
+ {
+ SimulatorLoad Single
+ { TimeDilation F32 }
+ { AgentCount S32 }
+ { CanAcceptAgents BOOL }
+ }
+ {
+ AgentList Variable
+ { CircuitCode U32 }
+ { X U8 }
+ { Y U8 }
+ }
+}
+
+// Simulator Shutdown Request - Tells spaceserver that a simulator is trying to shutdown
+{
+ SimulatorShutdownRequest Low 13 Trusted Unencoded
+}
+
+// ****************************************************************************
+// Presense messages
+// ****************************************************************************
+
+// sim -> dataserver
+{
+ RegionPresenceRequestByRegionID Low 14 Trusted Unencoded
+ {
+ RegionData Variable
+ { RegionID LLUUID }
+ }
+}
+
+// sim -> dataserver
+{
+ RegionPresenceRequestByHandle Low 15 Trusted Unencoded
+ {
+ RegionData Variable
+ { RegionHandle U64 }
+ }
+}
+
+// dataserver -> sim
+{
+ RegionPresenceResponse Low 16 Trusted Zerocoded
+ {
+ RegionData Variable
+ { RegionID LLUUID }
+ { RegionHandle U64 }
+ { InternalRegionIP IPADDR }
+ { ExternalRegionIP IPADDR }
+ { RegionPort IPPORT }
+ { ValidUntil F64 }
+ { Message Variable 1 }
+ }
+}
+
+
+// ****************************************************************************
+// Simulator to dataserver messages
+// ****************************************************************************
+
+// Updates SimName, EstateID and SimAccess using RegionID as a key
+{
+ UpdateSimulator Low 17 Trusted Unencoded
+ {
+ SimulatorInfo Single
+ { RegionID LLUUID }
+ { SimName Variable 1 }
+ { EstateID U32 }
+ { SimAccess U8 }
+ }
+}
+
+
+// record dwell time.
+{
+ LogDwellTime Low 18 Trusted Unencoded
+ {
+ DwellInfo Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { Duration F32 }
+ { SimName Variable 1 }
+ { RegionX U32 }
+ { RegionY U32 }
+ { AvgAgentsInView U8 }
+ { AvgViewerFPS U8 }
+ }
+}
+
+// Disabled feature response message
+{
+ FeatureDisabled Low 19 Trusted Unencoded
+ {
+ FailureInfo Single
+ { ErrorMessage Variable 1 }
+ { AgentID LLUUID }
+ { TransactionID LLUUID }
+ }
+}
+
+
+// record lost money transactions. This message could be generated
+// from either the simulator or the dataserver, depending on how
+// the transaction failed.
+{
+ LogFailedMoneyTransaction Low 20 Trusted Unencoded
+ {
+ TransactionData Single
+ { TransactionID LLUUID }
+ { TransactionTime U32 } // utc seconds since epoch
+ { TransactionType S32 } // see lltransactiontypes.h
+ { SourceID LLUUID }
+ { DestID LLUUID } // destination of the transfer
+ { Flags U8 }
+ { Amount S32 }
+ { SimulatorIP IPADDR } // U32 encoded IP
+ { GridX U32 }
+ { GridY U32 }
+ { FailureType U8 }
+ }
+}
+
+// complaint/bug-report - sim -> dataserver. see UserReport for details.
+// reliable
+{
+ UserReportInternal Low 21 Trusted Zerocoded
+ {
+ ReportData Single
+ { ReportType U8 }
+ { Category U8 }
+ { ReporterID LLUUID }
+ { ViewerPosition LLVector3 }
+ { AgentPosition LLVector3 }
+ { ScreenshotID LLUUID }
+ { ObjectID LLUUID }
+ { OwnerID LLUUID }
+ { LastOwnerID LLUUID }
+ { CreatorID LLUUID }
+ { RegionID LLUUID }
+ { AbuserID LLUUID }
+ { AbuseRegionName Variable 1 }
+ { AbuseRegionID LLUUID }
+ { Summary Variable 1 }
+ { Details Variable 2 }
+ { VersionString Variable 1 }
+ }
+}
+
+// SetSimStatusInDatabase
+// alters the "simulator" table in the database
+// sim -> dataserver
+// reliable
+{
+ SetSimStatusInDatabase Low 22 Trusted Unencoded
+ {
+ Data Single
+ { RegionID LLUUID }
+ { HostName Variable 1 }
+ { X S32 }
+ { Y S32 }
+ { PID S32 }
+ { AgentCount S32 }
+ { TimeToLive S32 } // in seconds
+ { Status Variable 1 }
+ }
+}
+
+// SetSimPresenceInDatabase
+// updates the "presence" table in the database to ensure
+// that a given simulator is present and valid for a set amount of
+// time
+{
+ SetSimPresenceInDatabase Low 23 Trusted Unencoded UDPDeprecated
+ {
+ SimData Single
+ { RegionID LLUUID }
+ { HostName Variable 1 }
+ { GridX U32 }
+ { GridY U32 }
+ { PID S32 }
+ { AgentCount S32 }
+ { TimeToLive S32 } // in seconds
+ { Status Variable 1 }
+ }
+}
+
+// ***************************************************************************
+// Economy messages
+// ***************************************************************************
+
+// once we use local stats, this will include a region handle
+{
+ EconomyDataRequest Low 24 NotTrusted Unencoded
+}
+
+// dataserver to sim, response w/ econ data
+{
+ EconomyData Low 25 Trusted Zerocoded
+ {
+ Info Single
+ { ObjectCapacity S32 }
+ { ObjectCount S32 }
+ { PriceEnergyUnit S32 }
+ { PriceObjectClaim S32 }
+ { PricePublicObjectDecay S32 }
+ { PricePublicObjectDelete S32 }
+ { PriceParcelClaim S32 }
+ { PriceParcelClaimFactor F32 }
+ { PriceUpload S32 }
+ { PriceRentLight S32 }
+ { TeleportMinPrice S32 }
+ { TeleportPriceExponent F32 }
+ { EnergyEfficiency F32 }
+ { PriceObjectRent F32 }
+ { PriceObjectScaleFactor F32 }
+ { PriceParcelRent S32 }
+ { PriceGroupCreate S32 }
+ }
+}
+
+// ***************************************************************************
+// Search messages
+// ***************************************************************************
+
+// AvatarPickerRequest
+// Get a list of names to select a person
+// viewer -> sim -> data
+// reliable
+{
+ AvatarPickerRequest Low 26 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { QueryID LLUUID }
+ }
+ {
+ Data Single
+ { Name Variable 1 }
+ }
+}
+
+// backend implementation which tracks if the user is a god.
+{
+ AvatarPickerRequestBackend Low 27 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { QueryID LLUUID }
+ { GodLevel U8 }
+ }
+ {
+ Data Single
+ { Name Variable 1 }
+ }
+}
+
+// AvatarPickerReply
+// List of names to select a person
+// reliable
+{
+ AvatarPickerReply Low 28 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { QueryID LLUUID }
+ }
+ {
+ Data Variable
+ { AvatarID LLUUID }
+ { FirstName Variable 1 }
+ { LastName Variable 1 }
+ }
+}
+
+// PlacesQuery
+// Used for getting a list of places for the group land panel
+// and the user land holdings panel. NOT for the directory.
+{
+ PlacesQuery Low 29 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { QueryID LLUUID }
+ }
+ {
+ TransactionData Single
+ { TransactionID LLUUID }
+ }
+ {
+ QueryData Single
+ { QueryText Variable 1 }
+ { QueryFlags U32 }
+ { Category S8 }
+ { SimName Variable 1 }
+ }
+}
+
+// PlacesReply
+// dataserver -> simulator -> viewer
+// If the user has specified a location, use that to compute
+// global x,y,z. Otherwise, use center of the AABB.
+// reliable
+{
+ PlacesReply Low 30 Trusted Zerocoded UDPDeprecated
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { QueryID LLUUID }
+ }
+ {
+ TransactionData Single
+ { TransactionID LLUUID }
+ }
+ {
+ QueryData Variable
+ { OwnerID LLUUID }
+ { Name Variable 1 }
+ { Desc Variable 1 }
+ { ActualArea S32 }
+ { BillableArea S32 }
+ { Flags U8 }
+ { GlobalX F32 } // meters
+ { GlobalY F32 } // meters
+ { GlobalZ F32 } // meters
+ { SimName Variable 1 }
+ { SnapshotID LLUUID }
+ { Dwell F32 }
+ { Price S32 }
+ //{ ProductSKU Variable 1 }
+ }
+}
+
+// DirFindQuery viewer->sim
+// Message to start asking questions for the directory
+{
+ DirFindQuery Low 31 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ { QueryText Variable 1 }
+ { QueryFlags U32 }
+ { QueryStart S32 } // prev/next page support
+ }
+}
+
+// DirFindQueryBackend sim->data
+// Trusted message generated by receipt of DirFindQuery to sim.
+{
+ DirFindQueryBackend Low 32 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ { QueryText Variable 1 }
+ { QueryFlags U32 }
+ { QueryStart S32 } // prev/next page support
+ { EstateID U32 }
+ { Godlike BOOL }
+ }
+}
+
+
+// DirPlacesQuery viewer->sim
+// Used for the Find directory of places
+{
+ DirPlacesQuery Low 33 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ { QueryText Variable 1 }
+ { QueryFlags U32 }
+ { Category S8 }
+ { SimName Variable 1 }
+ { QueryStart S32 }
+ }
+}
+
+// DirPlacesQueryBackend sim->dataserver
+// Used for the Find directory of places.
+{
+ DirPlacesQueryBackend Low 34 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ { QueryText Variable 1 }
+ { QueryFlags U32 }
+ { Category S8 }
+ { SimName Variable 1 }
+ { EstateID U32 }
+ { Godlike BOOL }
+ { QueryStart S32 }
+ }
+}
+
+// DirPlacesReply dataserver->sim->viewer
+// If the user has specified a location, use that to compute
+// global x,y,z. Otherwise, use center of the AABB.
+// reliable
+{
+ DirPlacesReply Low 35 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ QueryData Variable
+ { QueryID LLUUID }
+ }
+ {
+ QueryReplies Variable
+ { ParcelID LLUUID }
+ { Name Variable 1 }
+ { ForSale BOOL }
+ { Auction BOOL }
+ { Dwell F32 }
+ }
+ {
+ StatusData Variable
+ { Status U32 }
+ }
+}
+
+// DirPeopleReply
+{
+ DirPeopleReply Low 36 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ }
+ {
+ QueryReplies Variable
+ { AgentID LLUUID }
+ { FirstName Variable 1 }
+ { LastName Variable 1 }
+ { Group Variable 1 }
+ { Online BOOL }
+ { Reputation S32 }
+ }
+}
+
+// DirEventsReply
+{
+ DirEventsReply Low 37 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ }
+ {
+ QueryReplies Variable
+ { OwnerID LLUUID }
+ { Name Variable 1 }
+ { EventID U32 }
+ { Date Variable 1 }
+ { UnixTime U32 }
+ { EventFlags U32 }
+ }
+ {
+ StatusData Variable
+ { Status U32 }
+ }
+}
+
+// DirGroupsReply
+// dataserver -> userserver -> viewer
+// reliable
+{
+ DirGroupsReply Low 38 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ }
+ {
+ QueryReplies Variable
+ { GroupID LLUUID }
+ { GroupName Variable 1 } // string
+ { Members S32 }
+ { SearchOrder F32 }
+ }
+}
+
+
+// DirClassifiedQuery viewer->sim
+// reliable
+{
+ DirClassifiedQuery Low 39 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ { QueryText Variable 1 }
+ { QueryFlags U32 }
+ { Category U32 }
+ { QueryStart S32 }
+ }
+}
+
+// DirClassifiedQueryBackend sim->dataserver
+// reliable
+{
+ DirClassifiedQueryBackend Low 40 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ { QueryText Variable 1 }
+ { QueryFlags U32 }
+ { Category U32 }
+ { EstateID U32 }
+ { Godlike BOOL }
+ { QueryStart S32 }
+ }
+}
+
+// DirClassifiedReply dataserver->sim->viewer
+// reliable
+{
+ DirClassifiedReply Low 41 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ }
+ {
+ QueryReplies Variable
+ { ClassifiedID LLUUID }
+ { Name Variable 1 }
+ { ClassifiedFlags U8 }
+ { CreationDate U32 }
+ { ExpirationDate U32 }
+ { PriceForListing S32 }
+ }
+ {
+ StatusData Variable
+ { Status U32 }
+ }
+}
+
+
+// AvatarClassifiedReply
+// dataserver -> simulator -> viewer
+// Send the header information for this avatar's classifieds
+// This fills in the tabs of the Classifieds panel.
+// reliable
+{
+ AvatarClassifiedReply Low 42 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { TargetID LLUUID }
+ }
+ {
+ Data Variable
+ { ClassifiedID LLUUID }
+ { Name Variable 1 }
+ }
+}
+
+
+// ClassifiedInfoRequest
+// viewer -> simulator
+// simulator -> dataserver
+// reliable
+{
+ ClassifiedInfoRequest Low 43 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { ClassifiedID LLUUID }
+ }
+}
+
+
+// ClassifiedInfoReply
+// dataserver -> simulator
+// simulator -> viewer
+// reliable
+{
+ ClassifiedInfoReply Low 44 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ Data Single
+ { ClassifiedID LLUUID }
+ { CreatorID LLUUID }
+ { CreationDate U32 }
+ { ExpirationDate U32 }
+ { Category U32 }
+ { Name Variable 1 }
+ { Desc Variable 2 }
+ { ParcelID LLUUID }
+ { ParentEstate U32 }
+ { SnapshotID LLUUID }
+ { SimName Variable 1 }
+ { PosGlobal LLVector3d }
+ { ParcelName Variable 1 }
+ { ClassifiedFlags U8 }
+ { PriceForListing S32 }
+ }
+}
+
+
+// ClassifiedInfoUpdate
+// Update a classified. ParcelID and EstateID are set
+// on the simulator as the message passes through.
+// viewer -> simulator -> dataserver
+// reliable
+{
+ ClassifiedInfoUpdate Low 45 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { ClassifiedID LLUUID }
+ { Category U32 }
+ { Name Variable 1 }
+ { Desc Variable 2 }
+ { ParcelID LLUUID }
+ { ParentEstate U32 }
+ { SnapshotID LLUUID }
+ { PosGlobal LLVector3d }
+ { ClassifiedFlags U8 }
+ { PriceForListing S32 }
+ }
+}
+
+
+// ClassifiedDelete
+// Delete a classified from the database.
+// viewer -> simulator -> dataserver
+// reliable
+{
+ ClassifiedDelete Low 46 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { ClassifiedID LLUUID }
+ }
+}
+
+// ClassifiedGodDelete
+// Delete a classified from the database.
+// QueryID is needed so database can send a repeat list of
+// classified.
+// viewer -> simulator -> dataserver
+// reliable
+{
+ ClassifiedGodDelete Low 47 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { ClassifiedID LLUUID }
+ { QueryID LLUUID }
+ }
+}
+
+
+// DirLandQuery viewer->sim
+// Special query for the land for sale/auction panel.
+// reliable
+{
+ DirLandQuery Low 48 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ { QueryFlags U32 }
+ { SearchType U32 }
+ { Price S32 }
+ { Area S32 }
+ { QueryStart S32 }
+ }
+}
+
+// DirLandQueryBackend sim->dataserver
+// Special query for the land for sale/auction panel.
+{
+ DirLandQueryBackend Low 49 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ { QueryFlags U32 }
+ { SearchType U32 }
+ { Price S32 }
+ { Area S32 }
+ { QueryStart S32 }
+ { EstateID U32 }
+ { Godlike BOOL }
+ }
+}
+
+// DirLandReply
+// dataserver -> simulator -> viewer
+// reliable
+{
+ DirLandReply Low 50 Trusted Zerocoded UDPDeprecated
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ }
+ {
+ QueryReplies Variable
+ { ParcelID LLUUID }
+ { Name Variable 1 }
+ { Auction BOOL }
+ { ForSale BOOL }
+ { SalePrice S32 }
+ { ActualArea S32 }
+ //{ ProductSKU Variable 1 }
+ }
+}
+
+// DEPRECATED: DirPopularQuery viewer->sim
+// Special query for the land for sale/auction panel.
+// reliable
+{
+ DirPopularQuery Low 51 NotTrusted Zerocoded Deprecated
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ { QueryFlags U32 }
+ }
+}
+
+// DEPRECATED: DirPopularQueryBackend sim->dataserver
+// Special query for the land for sale/auction panel.
+// reliable
+{
+ DirPopularQueryBackend Low 52 Trusted Zerocoded Deprecated
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ { QueryFlags U32 }
+ { EstateID U32 }
+ { Godlike BOOL }
+ }
+}
+
+// DEPRECATED: DirPopularReply
+// dataserver -> simulator -> viewer
+// reliable
+{
+ DirPopularReply Low 53 Trusted Zerocoded Deprecated
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ }
+ {
+ QueryReplies Variable
+ { ParcelID LLUUID }
+ { Name Variable 1 }
+ { Dwell F32 }
+ }
+}
+
+// ParcelInfoRequest
+// viewer -> simulator -> dataserver
+// reliable
+{
+ ParcelInfoRequest Low 54 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { ParcelID LLUUID }
+ }
+}
+
+// ParcelInfoReply
+// dataserver -> simulator -> viewer
+// reliable
+{
+ ParcelInfoReply Low 55 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ Data Single
+ { ParcelID LLUUID }
+ { OwnerID LLUUID }
+ { Name Variable 1 }
+ { Desc Variable 1 }
+ { ActualArea S32 }
+ { BillableArea S32 }
+ { Flags U8 }
+ { GlobalX F32 } // meters
+ { GlobalY F32 } // meters
+ { GlobalZ F32 } // meters
+ { SimName Variable 1 }
+ { SnapshotID LLUUID }
+ { Dwell F32 }
+ { SalePrice S32 }
+ { AuctionID S32 }
+ }
+}
+
+
+// ParcelObjectOwnersRequest
+// viewer -> simulator
+// reliable
+{
+ ParcelObjectOwnersRequest Low 56 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ParcelData Single
+ { LocalID S32 }
+ }
+}
+
+
+// ParcelObjectOwnersReply
+// simulator -> viewer
+// reliable
+{
+ ParcelObjectOwnersReply Low 57 Trusted Zerocoded UDPDeprecated
+ {
+ Data Variable
+ { OwnerID LLUUID }
+ { IsGroupOwned BOOL }
+ { Count S32 }
+ { OnlineStatus BOOL }
+ }
+}
+
+// GroupNoticeListRequest
+// viewer -> simulator -> dataserver
+// reliable
+{
+ GroupNoticesListRequest Low 58 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { GroupID LLUUID }
+ }
+}
+
+// GroupNoticesListReply
+// dataserver -> simulator -> viewer
+// reliable
+{
+ GroupNoticesListReply Low 59 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ Data Variable
+ { NoticeID LLUUID }
+ { Timestamp U32 }
+ { FromName Variable 2 }
+ { Subject Variable 2 }
+ { HasAttachment BOOL }
+ { AssetType U8 }
+ }
+}
+
+// GroupNoticeRequest
+// viewer -> simulator
+// simulator -> dataserver
+// reliable
+{
+ GroupNoticeRequest Low 60 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { GroupNoticeID LLUUID }
+ }
+}
+
+// GroupNoticeAdd
+// Add a group notice.
+// simulator -> dataserver
+// reliable
+{
+ GroupNoticeAdd Low 61 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ MessageBlock Single
+ { ToGroupID LLUUID }
+ { ID LLUUID }
+ { Dialog U8 }
+ { FromAgentName Variable 1 }
+ { Message Variable 2 }
+ { BinaryBucket Variable 2 }
+ }
+}
+
+
+// ****************************************************************************
+// Teleport messages
+//
+// The teleport messages are numerous, so I have attempted to give them a
+// consistent naming convention. Since there is a bit of glob pattern
+// aliasing, the rules are applied in order.
+//
+// Teleport* - viewer->sim or sim->viewer message which announces a
+// teleportation request, progrees, start, or end.
+// Data* - sim->data or data->sim trusted message.
+// Space* - sim->space or space->sim trusted messaging
+// *Lure - A lure message to pass around information.
+//
+// All actual viewer teleports will begin with a Teleport* message and
+// end in a TeleportStart, TeleportLocal or TeleportFailed message. The TeleportFailed
+// message may be returned by any process and must be routed through the
+// teleporting agent's simulator and back to the viewer.
+// ****************************************************************************
+
+// TeleportRequest
+// viewer -> sim specifying exact teleport destination
+{
+ TeleportRequest Low 62 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Info Single
+ { RegionID LLUUID }
+ { Position LLVector3 }
+ { LookAt LLVector3 }
+ }
+}
+
+// TeleportLocationRequest
+// viewer -> sim specifying exact teleport destination
+{
+ TeleportLocationRequest Low 63 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Info Single
+ { RegionHandle U64 }
+ { Position LLVector3 }
+ { LookAt LLVector3 }
+ }
+}
+
+// TeleportLocal
+// sim -> viewer reply telling the viewer that we've successfully TP'd
+// to somewhere else within the sim
+{
+ TeleportLocal Low 64 Trusted Unencoded
+ {
+ Info Single
+ { AgentID LLUUID }
+ { LocationID U32 }
+ { Position LLVector3 } // region
+ { LookAt LLVector3 }
+ { TeleportFlags U32 }
+ }
+}
+
+// TeleportLandmarkRequest viewer->sim
+// teleport to landmark asset ID destination. use LLUUD::null for home.
+{
+ TeleportLandmarkRequest Low 65 NotTrusted Zerocoded
+ {
+ Info Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { LandmarkID LLUUID }
+ }
+}
+
+// TeleportProgress sim->viewer
+// Tell the agent how the teleport is going.
+{
+ TeleportProgress Low 66 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ Info Single
+ { TeleportFlags U32 }
+ { Message Variable 1 } // string
+ }
+}
+
+// DataHomeLocationRequest sim->data
+// Request
+{
+ DataHomeLocationRequest Low 67 Trusted Zerocoded
+ {
+ Info Single
+ { AgentID LLUUID }
+ { KickedFromEstateID U32 }
+ }
+ {
+ AgentInfo Single
+ { AgentEffectiveMaturity U32 }
+ }
+}
+
+// DataHomeLocationReply data->sim
+// response is the location of agent home.
+{
+ DataHomeLocationReply Low 68 Trusted Unencoded
+ {
+ Info Single
+ { AgentID LLUUID }
+ { RegionHandle U64 }
+ { Position LLVector3 } // region coords
+ { LookAt LLVector3 }
+ }
+}
+
+
+// TeleportFinish sim->viewer
+// called when all of the information has been collected and readied for
+// the agent.
+{
+ TeleportFinish Low 69 Trusted Unencoded UDPBlackListed
+ {
+ Info Single
+ { AgentID LLUUID }
+ { LocationID U32 }
+ { SimIP IPADDR }
+ { SimPort IPPORT }
+ { RegionHandle U64 }
+ { SeedCapability Variable 2 } // URL
+ { SimAccess U8 }
+ { TeleportFlags U32 }
+ }
+}
+
+// StartLure viewer->sim
+// Sent from viewer to the local simulator to lure target id to near
+// agent id. This will generate an instant message that will be routed
+// through the space server and out to the userserver. When that IM
+// goes through the userserver and the TargetID is online, the
+// userserver will send an InitializeLure to the spaceserver. When that
+// packet is acked, the original instant message is finally forwarded to
+// TargetID.
+{
+ StartLure Low 70 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Info Single
+ { LureType U8 }
+ { Message Variable 1 }
+ }
+ {
+ TargetData Variable
+ { TargetID LLUUID }
+ }
+}
+
+// TeleportLureRequest viewer->sim
+// Message from target of lure to begin the teleport process on the
+// local simulator.
+{
+ TeleportLureRequest Low 71 NotTrusted Unencoded
+ {
+ Info Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { LureID LLUUID }
+ { TeleportFlags U32 }
+ }
+}
+
+// TeleportCancel viewer->sim
+// reliable
+{
+ TeleportCancel Low 72 NotTrusted Unencoded
+ {
+ Info Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+}
+
+
+// TeleportStart sim->viewer
+// announce a successful teleport request to the viewer.
+{
+ TeleportStart Low 73 Trusted Unencoded
+ {
+ Info Single
+ { TeleportFlags U32 }
+ }
+}
+
+// TeleportFailed somewhere->sim->viewer
+// announce failure of teleport request
+{
+ TeleportFailed Low 74 Trusted Unencoded
+ {
+ Info Single
+ { AgentID LLUUID }
+ { Reason Variable 1 } // string
+ }
+ {
+ AlertInfo Variable
+ { Message Variable 1 } // string id
+ { ExtraParams Variable 1 } // llsd extra parameters
+ }
+}
+
+
+// ***************************************************************************
+// Viewer to Simulator Messages
+// ***************************************************************************
+
+// Undo
+{
+ Undo Low 75 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectID LLUUID }
+ }
+}
+
+
+// Redo
+{
+ Redo Low 76 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectID LLUUID }
+ }
+}
+
+// UndoLand
+{
+ UndoLand Low 77 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+}
+
+
+// AgentPause - viewer occasionally will block, inform simulator of this fact
+{
+ AgentPause Low 78 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { SerialNum U32 } // used by both pause and resume. Non-increasing numbers are ignored.
+ }
+}
+
+// AgentResume - unblock the agent
+{
+ AgentResume Low 79 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { SerialNum U32 } // used by both pause and resume. Non-increasing numbers are ignored.
+ }
+}
+
+
+// AgentUpdate - Camera info sent from viewer to simulator
+// or, more simply, two axes and compute cross product
+// State data is temporary, indicates current behavior state:
+// 0 = walking
+// 1 = mouselook
+// 2 = typing
+//
+// Center is region local (JNC 8.16.2001)
+// Camera center is region local (JNC 8.29.2001)
+{
+ AgentUpdate High 4 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { BodyRotation LLQuaternion }
+ { HeadRotation LLQuaternion }
+ { State U8 }
+ { CameraCenter LLVector3 }
+ { CameraAtAxis LLVector3 }
+ { CameraLeftAxis LLVector3 }
+ { CameraUpAxis LLVector3 }
+ { Far F32 }
+ { ControlFlags U32 }
+ { Flags U8 }
+ }
+}
+
+// ChatFromViewer
+// Specifies the text to be said and the "type",
+// normal speech, shout, whisper.
+// with the specified radius
+{
+ ChatFromViewer Low 80 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ChatData Single
+ { Message Variable 2 }
+ { Type U8 }
+ { Channel S32 }
+ }
+}
+
+
+// AgentThrottle
+{
+ AgentThrottle Low 81 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { CircuitCode U32 }
+ }
+ {
+ Throttle Single
+ { GenCounter U32 }
+ { Throttles Variable 1 }
+ }
+}
+
+
+// AgentFOV - Update to agent's field of view, angle is vertical, single F32 float in radians
+{
+ AgentFOV Low 82 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { CircuitCode U32 }
+ }
+ {
+ FOVBlock Single
+ { GenCounter U32 }
+ { VerticalAngle F32 }
+ }
+}
+
+
+// AgentHeightWidth - Update to height and aspect, sent as height/width to save space
+// Usually sent when window resized or created
+{
+ AgentHeightWidth Low 83 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { CircuitCode U32 }
+ }
+ {
+ HeightWidthBlock Single
+ { GenCounter U32 }
+ { Height U16 }
+ { Width U16 }
+ }
+}
+
+
+// AgentSetAppearance - Update to agent appearance
+{
+ AgentSetAppearance Low 84 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { SerialNum U32 } // Increases every time the appearance changes. A value of 0 resets.
+ { Size LLVector3 }
+ }
+ {
+ WearableData Variable
+ { CacheID LLUUID }
+ { TextureIndex U8 }
+ }
+ {
+ ObjectData Single
+ { TextureEntry Variable 2 }
+ }
+ {
+ VisualParam Variable
+ { ParamValue U8 }
+ }
+}
+
+// AgentAnimation - Update animation state
+// viewer --> simulator
+{
+ AgentAnimation High 5 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ AnimationList Variable
+ { AnimID LLUUID }
+ { StartAnim BOOL }
+ }
+ {
+ PhysicalAvatarEventList Variable
+ { TypeData Variable 1 }
+ }
+}
+
+// AgentRequestSit - Try to sit on an object
+{
+ AgentRequestSit High 6 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ TargetObject Single
+ { TargetID LLUUID }
+ { Offset LLVector3 }
+ }
+}
+
+// AgentSit - Actually sit on object
+{
+ AgentSit High 7 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+}
+
+
+// quit message sent between simulators
+{
+ AgentQuitCopy Low 85 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ FuseBlock Single
+ { ViewerCircuitCode U32 }
+ }
+}
+
+
+// Request Image - Sent by the viewer to request a specified image at a specified resolution
+
+{
+ RequestImage High 8 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ RequestImage Variable
+ { Image LLUUID }
+ { DiscardLevel S8 }
+ { DownloadPriority F32 }
+ { Packet U32 }
+ { Type U8 }
+ }
+}
+
+// ImageNotInDatabase
+// Simulator informs viewer that a requsted image definitely does not exist in the asset database
+{
+ ImageNotInDatabase Low 86 Trusted Unencoded
+ {
+ ImageID Single
+ { ID LLUUID }
+ }
+}
+
+// RebakeAvatarTextures
+// simulator -> viewer request when a temporary baked avatar texture is not found
+{
+ RebakeAvatarTextures Low 87 Trusted Unencoded
+ {
+ TextureData Single
+ { TextureID LLUUID }
+ }
+}
+
+
+// SetAlwaysRun
+// Lets the viewer choose between running and walking
+{
+ SetAlwaysRun Low 88 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { AlwaysRun BOOL }
+ }
+}
+
+// ObjectAdd - create new object in the world
+// Simulator will assign ID and send message back to signal
+// object actually created.
+//
+// AddFlags (see also ObjectUpdate)
+// 0x01 - use physics
+// 0x02 - create selected
+//
+// If only one ImageID is sent for an object type that has more than
+// one face, the same image is repeated on each subsequent face.
+//
+// Data field is opaque type-specific data for this object
+{
+ ObjectAdd Medium 1 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ ObjectData Single
+ { PCode U8 }
+ { Material U8 }
+ { AddFlags U32 } // see object_flags.h
+
+ { PathCurve U8 }
+ { ProfileCurve U8 }
+ { PathBegin U16 } // 0 to 1, quanta = 0.01
+ { PathEnd U16 } // 0 to 1, quanta = 0.01
+ { PathScaleX U8 } // 0 to 1, quanta = 0.01
+ { PathScaleY U8 } // 0 to 1, quanta = 0.01
+ { PathShearX U8 } // -.5 to .5, quanta = 0.01
+ { PathShearY U8 } // -.5 to .5, quanta = 0.01
+ { PathTwist S8 } // -1 to 1, quanta = 0.01
+ { PathTwistBegin S8 } // -1 to 1, quanta = 0.01
+ { PathRadiusOffset S8 } // -1 to 1, quanta = 0.01
+ { PathTaperX S8 } // -1 to 1, quanta = 0.01
+ { PathTaperY S8 } // -1 to 1, quanta = 0.01
+ { PathRevolutions U8 } // 0 to 3, quanta = 0.015
+ { PathSkew S8 } // -1 to 1, quanta = 0.01
+ { ProfileBegin U16 } // 0 to 1, quanta = 0.01
+ { ProfileEnd U16 } // 0 to 1, quanta = 0.01
+ { ProfileHollow U16 } // 0 to 1, quanta = 0.01
+
+ { BypassRaycast U8 }
+ { RayStart LLVector3 }
+ { RayEnd LLVector3 }
+ { RayTargetID LLUUID }
+ { RayEndIsIntersection U8 }
+
+ { Scale LLVector3 }
+ { Rotation LLQuaternion }
+
+ { State U8 }
+ }
+}
+
+
+// ObjectDelete
+// viewer -> simulator
+{
+ ObjectDelete Low 89 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { Force BOOL } // god trying to force delete
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ }
+}
+
+
+// ObjectDuplicate
+// viewer -> simulator
+// Makes a copy of a set of objects, offset by a given amount
+{
+ ObjectDuplicate Low 90 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ SharedData Single
+ { Offset LLVector3 }
+ { DuplicateFlags U32 } // see object_flags.h
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ }
+}
+
+
+// ObjectDuplicateOnRay
+// viewer -> simulator
+// Makes a copy of an object, using the add object raycast
+// code to abut it to other objects.
+{
+ ObjectDuplicateOnRay Low 91 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupID LLUUID }
+ { RayStart LLVector3 } // region local
+ { RayEnd LLVector3 } // region local
+ { BypassRaycast BOOL }
+ { RayEndIsIntersection BOOL }
+ { CopyCenters BOOL }
+ { CopyRotates BOOL }
+ { RayTargetID LLUUID }
+ { DuplicateFlags U32 } // see object_flags.h
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ }
+}
+
+
+// MultipleObjectUpdate
+// viewer -> simulator
+// updates position, rotation and scale in one message
+// positions sent as region-local floats
+{
+ MultipleObjectUpdate Medium 2 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ { Type U8 }
+ { Data Variable 1 } // custom type
+ }
+}
+
+// RequestMultipleObjects
+// viewer -> simulator
+// reliable
+//
+// When the viewer gets a local_id/crc for an object that
+// it either doesn't have, or doesn't have the current version
+// of, it sends this upstream get get an update.
+//
+// CacheMissType 0 => full object (viewer doesn't have it)
+// CacheMissType 1 => CRC mismatch only
+{
+ RequestMultipleObjects Medium 3 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { CacheMissType U8 }
+ { ID U32 }
+ }
+}
+
+
+// DEPRECATED: ObjectPosition
+// == Old Behavior ==
+// Set the position on objects
+//
+// == Reason for deprecation ==
+// Unused code path was removed in the move to Havok4
+// Object position, scale and rotation messages were already unified
+// to MultipleObjectUpdate and this message was unused cruft.
+//
+// == New Location ==
+// MultipleObjectUpdate can be used instead.
+{
+ ObjectPosition Medium 4 NotTrusted Zerocoded Deprecated
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ { Position LLVector3 } // region
+ }
+}
+
+
+// DEPRECATED: ObjectScale
+// == Old Behavior ==
+// Set the scale on objects
+//
+// == Reason for deprecation ==
+// Unused code path was removed in the move to Havok4
+// Object position, scale and rotation messages were already unified
+// to MultipleObjectUpdate and this message was unused cruft.
+//
+// == New Location ==
+// MultipleObjectUpdate can be used instead.
+{
+ ObjectScale Low 92 NotTrusted Zerocoded Deprecated
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ { Scale LLVector3 }
+ }
+}
+
+
+// ObjectRotation
+// viewer -> simulator
+{
+ ObjectRotation Low 93 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ { Rotation LLQuaternion }
+ }
+}
+
+
+// ObjectFlagUpdate
+// viewer -> simulator
+{
+ ObjectFlagUpdate Low 94 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { ObjectLocalID U32 }
+ { UsePhysics BOOL }
+ { IsTemporary BOOL }
+ { IsPhantom BOOL }
+ { CastsShadows BOOL }
+ }
+ {
+ ExtraPhysics Variable
+ { PhysicsShapeType U8 }
+ { Density F32 }
+ { Friction F32 }
+ { Restitution F32 }
+ { GravityMultiplier F32 }
+ }
+}
+
+
+// ObjectClickAction
+// viewer -> simulator
+{
+ ObjectClickAction Low 95 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ { ClickAction U8 }
+ }
+}
+
+
+// ObjectImage
+// viewer -> simulator
+{
+ ObjectImage Low 96 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ { MediaURL Variable 1 }
+ { TextureEntry Variable 2 }
+ }
+}
+
+// ObjectBypassModUpdate
+// Viewer -> Simulator
+// Allows the owner of an object to bypass mod protections for
+// Predefined fields.
+{
+ ObjectBypassModUpdate Low 431 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ { PropertyID U8 }
+ { Value Variable 2 }
+ }
+}
+
+{
+ ObjectMaterial Low 97 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ { Material U8 }
+ }
+}
+
+{
+ ObjectShape Low 98 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ { PathCurve U8 }
+ { ProfileCurve U8 }
+ { PathBegin U16 } // 0 to 1, quanta = 0.01
+ { PathEnd U16 } // 0 to 1, quanta = 0.01
+ { PathScaleX U8 } // 0 to 1, quanta = 0.01
+ { PathScaleY U8 } // 0 to 1, quanta = 0.01
+ { PathShearX U8 } // -.5 to .5, quanta = 0.01
+ { PathShearY U8 } // -.5 to .5, quanta = 0.01
+ { PathTwist S8 } // -1 to 1, quanta = 0.01
+ { PathTwistBegin S8 } // -1 to 1, quanta = 0.01
+ { PathRadiusOffset S8 } // -1 to 1, quanta = 0.01
+ { PathTaperX S8 } // -1 to 1, quanta = 0.01
+ { PathTaperY S8 } // -1 to 1, quanta = 0.01
+ { PathRevolutions U8 } // 0 to 3, quanta = 0.015
+ { PathSkew S8 } // -1 to 1, quanta = 0.01
+ { ProfileBegin U16 } // 0 to 1, quanta = 0.01
+ { ProfileEnd U16 } // 0 to 1, quanta = 0.01
+ { ProfileHollow U16 } // 0 to 1, quanta = 0.01
+ }
+}
+
+{
+ ObjectExtraParams Low 99 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ { ParamType U16 }
+ { ParamInUse BOOL }
+ { ParamSize U32 }
+ { ParamData Variable 1 }
+ }
+}
+
+
+// ObjectOwner
+// To make public, set OwnerID to LLUUID::null.
+// TODO: Eliminate god-bit. Maybe not. God-bit is ok, because it's
+// known on the server.
+{
+ ObjectOwner Low 100 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ HeaderData Single
+ { Override BOOL } // God-bit.
+ { OwnerID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ }
+}
+
+// ObjectGroup
+// To make the object part of no group, set GroupID = LLUUID::null.
+// This call only works if objectid.ownerid == agentid.
+{
+ ObjectGroup Low 101 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ }
+}
+
+// Attempt to buy an object. This will only pack root objects.
+{
+ ObjectBuy Low 102 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupID LLUUID }
+ { CategoryID LLUUID } // folder where it goes (if derezed)
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ { SaleType U8 } // U8 -> EForSale
+ { SalePrice S32 }
+ }
+}
+
+// viewer -> simulator
+
+// buy object inventory. If the transaction succeeds, it will add
+// inventory to the agent, and potentially remove the original.
+{
+ BuyObjectInventory Low 103 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { ObjectID LLUUID }
+ { ItemID LLUUID }
+ { FolderID LLUUID }
+ }
+}
+
+// sim -> viewer
+// Used to propperly handle buying asset containers
+{
+ DerezContainer Low 104 Trusted Zerocoded
+ {
+ Data Single
+ { ObjectID LLUUID }
+ { Delete BOOL }
+ }
+}
+
+// ObjectPermissions
+// Field - see llpermissionsflags.h
+// If Set is true, tries to turn on bits in mask.
+// If set is false, tries to turn off bits in mask.
+// BUG: This just forces the permissions field.
+{
+ ObjectPermissions Low 105 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ HeaderData Single
+ { Override BOOL } // God-bit.
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ { Field U8 }
+ { Set U8 }
+ { Mask U32 }
+ }
+}
+
+// set object sale information
+{
+ ObjectSaleInfo Low 106 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { LocalID U32 }
+ { SaleType U8 } // U8 -> EForSale
+ { SalePrice S32 }
+ }
+}
+
+
+// set object names
+{
+ ObjectName Low 107 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { LocalID U32 }
+ { Name Variable 1 }
+ }
+}
+
+// set object descriptions
+{
+ ObjectDescription Low 108 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { LocalID U32 }
+ { Description Variable 1 }
+ }
+}
+
+// set object category
+{
+ ObjectCategory Low 109 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { LocalID U32 }
+ { Category U32 }
+ }
+}
+
+// ObjectSelect
+// Variable object data because rectangular selection can
+// generate a large list very quickly.
+{
+ ObjectSelect Low 110 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ }
+
+}
+
+
+// ObjectDeselect
+{
+ ObjectDeselect Low 111 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ }
+
+}
+
+// ObjectAttach
+{
+ ObjectAttach Low 112 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { AttachmentPoint U8 }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ { Rotation LLQuaternion }
+ }
+}
+
+// ObjectDetach -- derezzes an attachment, marking its item in your inventory as not "(worn)"
+{
+ ObjectDetach Low 113 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ }
+}
+
+
+// ObjectDrop -- drops an attachment from your avatar onto the ground
+{
+ ObjectDrop Low 114 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ }
+}
+
+
+// ObjectLink
+{
+ ObjectLink Low 115 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ }
+}
+
+// ObjectDelink
+{
+ ObjectDelink Low 116 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ }
+}
+
+
+// ObjectGrab
+{
+ ObjectGrab Low 117 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Single
+ { LocalID U32 }
+ { GrabOffset LLVector3 }
+ }
+ {
+ SurfaceInfo Variable
+ { UVCoord LLVector3 }
+ { STCoord LLVector3 }
+ { FaceIndex S32 }
+ { Position LLVector3 }
+ { Normal LLVector3 }
+ { Binormal LLVector3 }
+ }
+}
+
+
+// ObjectGrabUpdate
+// TODO: Quantize this data, reduce message size.
+// TimeSinceLast could go to 1 byte, since capped
+// at 100 on sim.
+{
+ ObjectGrabUpdate Low 118 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Single
+ { ObjectID LLUUID }
+ { GrabOffsetInitial LLVector3 } // LLVector3
+ { GrabPosition LLVector3 } // LLVector3, region local
+ { TimeSinceLast U32 }
+ }
+ {
+ SurfaceInfo Variable
+ { UVCoord LLVector3 }
+ { STCoord LLVector3 }
+ { FaceIndex S32 }
+ { Position LLVector3 }
+ { Normal LLVector3 }
+ { Binormal LLVector3 }
+ }
+
+}
+
+
+// ObjectDeGrab
+{
+ ObjectDeGrab Low 119 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Single
+ { LocalID U32 }
+ }
+ {
+ SurfaceInfo Variable
+ { UVCoord LLVector3 }
+ { STCoord LLVector3 }
+ { FaceIndex S32 }
+ { Position LLVector3 }
+ { Normal LLVector3 }
+ { Binormal LLVector3 }
+ }
+}
+
+
+// ObjectSpinStart
+{
+ ObjectSpinStart Low 120 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Single
+ { ObjectID LLUUID }
+ }
+}
+
+
+// ObjectSpinUpdate
+{
+ ObjectSpinUpdate Low 121 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Single
+ { ObjectID LLUUID }
+ { Rotation LLQuaternion }
+ }
+}
+
+
+// ObjectSpinStop
+{
+ ObjectSpinStop Low 122 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Single
+ { ObjectID LLUUID }
+ }
+}
+
+// Export selected objects
+// viewer->sim
+{
+ ObjectExportSelected Low 123 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { RequestID LLUUID }
+ { VolumeDetail S16 }
+ }
+ {
+ ObjectData Variable
+ { ObjectID LLUUID }
+ }
+}
+
+
+// ModifyLand - sent to modify a piece of land on a simulator.
+// viewer -> sim
+{
+ ModifyLand Low 124 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ModifyBlock Single
+ { Action U8 }
+ { BrushSize U8 }
+ { Seconds F32 }
+ { Height F32 }
+ }
+ {
+ ParcelData Variable
+ { LocalID S32 }
+ { West F32 }
+ { South F32 }
+ { East F32 }
+ { North F32 }
+ }
+ {
+ ModifyBlockExtended Variable
+ { BrushSize F32 }
+ }
+}
+
+
+// VelocityInterpolateOn
+// viewer->sim
+// requires administrative access
+{
+ VelocityInterpolateOn Low 125 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+}
+
+
+// VelocityInterpolateOff
+// viewer->sim
+// requires administrative access
+{
+ VelocityInterpolateOff Low 126 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+}
+
+// Save State
+// viewer->sim
+// requires administrative access
+{
+ StateSave Low 127 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ DataBlock Single
+ { Filename Variable 1 }
+ }
+}
+
+// ReportAutosaveCrash
+// sim->launcher
+{
+ ReportAutosaveCrash Low 128 NotTrusted Unencoded
+ {
+ AutosaveData Single
+ { PID S32 }
+ { Status S32 }
+ }
+}
+
+// SimWideDeletes
+{
+ SimWideDeletes Low 129 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ DataBlock Single
+ { TargetID LLUUID }
+ { Flags U32 }
+ }
+}
+
+// RequestObjectPropertiesFamily
+// Ask for extended information, such as creator, permissions, resources, etc.
+// Medium frequency because it is driven by mouse hovering over objects, which
+// occurs at high rates.
+{
+ RequestObjectPropertiesFamily Medium 5 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Single
+ { RequestFlags U32 }
+ { ObjectID LLUUID }
+ }
+}
+
+
+// Track agent - this information is used when sending out the
+// coarse location update so that we know who you are tracking.
+// To stop tracking - send a null uuid as the prey.
+{
+ TrackAgent Low 130 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ TargetData Single
+ { PreyID LLUUID }
+ }
+}
+
+// end viewer to simulator section
+
+{
+ ViewerStats Low 131 NotTrusted Zerocoded UDPDeprecated
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { IP IPADDR }
+ { StartTime U32 }
+ { RunTime F32 } // F32
+ { SimFPS F32 } // F32
+ { FPS F32 } // F32
+ { AgentsInView U8 }
+ { Ping F32 } // F32
+ { MetersTraveled F64 }
+ { RegionsVisited S32 }
+ { SysRAM U32 }
+ { SysOS Variable 1 } // String
+ { SysCPU Variable 1 } // String
+ { SysGPU Variable 1 } // String
+ }
+
+ {
+ DownloadTotals Single
+ { World U32 }
+ { Objects U32 }
+ { Textures U32 }
+ }
+
+ {
+ NetStats Multiple 2
+ { Bytes U32 }
+ { Packets U32 }
+ { Compressed U32 }
+ { Savings U32 }
+ }
+
+ {
+ FailStats Single
+ { SendPacket U32 }
+ { Dropped U32 }
+ { Resent U32 }
+ { FailedResends U32 }
+ { OffCircuit U32 }
+ { Invalid U32 }
+ }
+
+ {
+ MiscStats Variable
+ { Type U32 }
+ { Value F64 }
+ }
+}
+
+// ScriptAnswerYes
+// reliable
+{
+ ScriptAnswerYes Low 132 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { TaskID LLUUID }
+ { ItemID LLUUID }
+ { Questions S32 }
+ }
+}
+
+
+// complaint/bug-report
+// reliable
+{
+ UserReport Low 133 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ReportData Single
+ { ReportType U8 } // BUG=1, COMPLAINT=2
+ { Category U8 } // see sequence.user_report_category
+ { Position LLVector3 } // screenshot position, region-local
+ { CheckFlags U8 } // checkboxflags
+ { ScreenshotID LLUUID }
+ { ObjectID LLUUID }
+ { AbuserID LLUUID }
+ { AbuseRegionName Variable 1 }
+ { AbuseRegionID LLUUID }
+ { Summary Variable 1 }
+ { Details Variable 2 }
+ { VersionString Variable 1 }
+ }
+}
+
+
+// ***************************************************************************
+// Simulator to Viewer Messages
+// ***************************************************************************
+
+// AlertMessage
+// Specifies the text to be posted in an alert dialog
+// Also sent from dataserver to simulator with AgentInfo block
+// Simulator doesn't include AgentInfo block to viewer
+{
+ AlertMessage Low 134 Trusted Unencoded
+ {
+ AlertData Single
+ { Message Variable 1 }
+ }
+ {
+ AlertInfo Variable
+ { Message Variable 1 }
+ { ExtraParams Variable 1 }
+ }
+ {
+ AgentInfo Variable
+ { AgentID LLUUID }
+ }
+}
+
+// Send an AlertMessage to the named agent.
+// usually dataserver->simulator
+{
+ AgentAlertMessage Low 135 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ AlertData Single
+ { Modal BOOL }
+ { Message Variable 1 }
+ }
+}
+
+
+// MeanCollisionAlert
+// Specifies the text to be posted in an alert dialog
+{
+ MeanCollisionAlert Low 136 Trusted Zerocoded
+ {
+ MeanCollision Variable
+ { Victim LLUUID }
+ { Perp LLUUID }
+ { Time U32 }
+ { Mag F32 }
+ { Type U8 }
+ }
+}
+
+// ViewerFrozenMessage
+// Specifies the text to be posted in an alert dialog
+{
+ ViewerFrozenMessage Low 137 Trusted Unencoded
+ {
+ FrozenData Single
+ { Data BOOL }
+ }
+}
+
+// Health Message
+// Tells viewer what agent health is
+{
+ HealthMessage Low 138 Trusted Zerocoded
+ {
+ HealthData Single
+ { Health F32 }
+ }
+}
+
+// ChatFromSimulator
+// Chat text to appear on a user's screen
+// Position is region local.
+// Viewer can optionally use position to animate
+// If audible is CHAT_NOT_AUDIBLE, message will not be valid
+{
+ ChatFromSimulator Low 139 Trusted Unencoded
+ {
+ ChatData Single
+ { FromName Variable 1 }
+ { SourceID LLUUID } // agent id or object id
+ { OwnerID LLUUID } // object's owner
+ { SourceType U8 }
+ { ChatType U8 }
+ { Audible U8 }
+ { Position LLVector3 }
+ { Message Variable 2 } // UTF-8 text
+ }
+}
+
+
+// Simulator statistics packet (goes out to viewer and dataserver/spaceserver)
+{
+ SimStats Low 140 Trusted Unencoded
+ {
+ Region Single
+ { RegionX U32 }
+ { RegionY U32 }
+ { RegionFlags U32 }
+ { ObjectCapacity U32 }
+ }
+ {
+ Stat Variable
+ { StatID U32 }
+ { StatValue F32 }
+ }
+ {
+ PidStat Single
+ { PID S32 }
+ }
+ {
+ RegionInfo Variable
+ { RegionFlagsExtended U64 }
+ }
+}
+
+// viewer -> sim
+// reliable
+{
+ RequestRegionInfo Low 141 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+}
+
+// RegionInfo
+// Used to populate UI for both region/estate floater
+// and god tools floater
+// sim -> viewer
+// reliable
+{
+ RegionInfo Low 142 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ RegionInfo Single
+ { SimName Variable 1 } // string
+ { EstateID U32 }
+ { ParentEstateID U32 }
+ { RegionFlags U32 }
+ { SimAccess U8 }
+ { MaxAgents U8 }
+ { BillableFactor F32 }
+ { ObjectBonusFactor F32 }
+ { WaterHeight F32 }
+ { TerrainRaiseLimit F32 }
+ { TerrainLowerLimit F32 }
+ { PricePerMeter S32 }
+ { RedirectGridX S32 }
+ { RedirectGridY S32 }
+ { UseEstateSun BOOL }
+ { SunHour F32 } // last value set by estate or region controls JC
+ }
+ {
+ RegionInfo2 Single
+ { ProductSKU Variable 1 } // string
+ { ProductName Variable 1 } // string
+ { MaxAgents32 U32 } // Identical to RegionInfo.MaxAgents but allows greater range
+ { HardMaxAgents U32 }
+ { HardMaxObjects U32 }
+ }
+ {
+ RegionInfo3 Variable
+ { RegionFlagsExtended U64 }
+ }
+ {
+ RegionInfo5 Variable
+ { ChatWhisperRange F32 }
+ { ChatNormalRange F32 }
+ { ChatShoutRange F32 }
+ { ChatWhisperOffset F32 }
+ { ChatNormalOffset F32 }
+ { ChatShoutOffset F32 }
+ { ChatFlags U32 }
+ }
+ {
+ CombatSettings Variable
+ { CombatFlags U32 }
+ { OnDeath U8 }
+ { DamageThrottle F32 }
+ { RegenerationRate F32 }
+ { InvulnerabilyTime F32 }
+ { DamageLimit F32 }
+ }
+
+}
+
+// GodUpdateRegionInfo
+// Sent from viewer to sim after a god has changed some
+// of the parameters in the god tools floater
+// viewer -> sim
+// reliable
+{
+ GodUpdateRegionInfo Low 143 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ RegionInfo Single
+ { SimName Variable 1 } // string
+ { EstateID U32 }
+ { ParentEstateID U32 }
+ { RegionFlags U32 }
+ { BillableFactor F32 }
+ { PricePerMeter S32 }
+ { RedirectGridX S32 }
+ { RedirectGridY S32 }
+ }
+ {
+ RegionInfo2 Variable
+ { RegionFlagsExtended U64 }
+ }
+}
+
+//NearestLandingRegionRequest
+//sim->dataserver
+//Sent from the region to the data server
+//to request the most up to date region for the requesting
+//region to redirect teleports to
+{
+ NearestLandingRegionRequest Low 144 Trusted Unencoded
+ {
+ RequestingRegionData Single
+ { RegionHandle U64 }
+ }
+}
+
+//NearestLandingPointReply
+//dataserver->sim
+//Sent from the data server to a region in reply
+//to the redirectregion request stating which region
+//the requesting region should redirect teleports to if necessary
+{
+ NearestLandingRegionReply Low 145 Trusted Unencoded
+ {
+ LandingRegionData Single
+ { RegionHandle U64 }
+ }
+}
+
+//NearestLandingPointUpdated
+//sim->dataserver
+//Sent from a region to the data server
+//to have the dataserver note/clear in the db
+//that the region has updated it's nearest landing point
+{
+ NearestLandingRegionUpdated Low 146 Trusted Unencoded
+ {
+ RegionData Single
+ { RegionHandle U64 }
+ }
+}
+
+
+//TeleportLandingStatusChanged
+//sim->dataserver
+//Sent from the region to the data server
+//to note that the region's teleportation landing status has changed
+{
+ TeleportLandingStatusChanged Low 147 Trusted Unencoded
+ {
+ RegionData Single
+ { RegionHandle U64 }
+ }
+}
+
+// RegionHandshake
+// Sent by region to viewer after it has received UseCircuitCode
+// from that viewer.
+// sim -> viewer
+// reliable
+{
+ RegionHandshake Low 148 Trusted Zerocoded
+ {
+ RegionInfo Single
+ { RegionFlags U32 }
+ { SimAccess U8 }
+ { SimName Variable 1 } // string
+ { SimOwner LLUUID }
+ { IsEstateManager BOOL } // this agent, for this sim
+ { WaterHeight F32 }
+ { BillableFactor F32 }
+ { CacheID LLUUID }
+ { TerrainBase0 LLUUID }
+ { TerrainBase1 LLUUID }
+ { TerrainBase2 LLUUID }
+ { TerrainBase3 LLUUID }
+ { TerrainDetail0 LLUUID }
+ { TerrainDetail1 LLUUID }
+ { TerrainDetail2 LLUUID }
+ { TerrainDetail3 LLUUID }
+ { TerrainStartHeight00 F32 }
+ { TerrainStartHeight01 F32 }
+ { TerrainStartHeight10 F32 }
+ { TerrainStartHeight11 F32 }
+ { TerrainHeightRange00 F32 }
+ { TerrainHeightRange01 F32 }
+ { TerrainHeightRange10 F32 }
+ { TerrainHeightRange11 F32 }
+ }
+ {
+ RegionInfo2 Single
+ { RegionID LLUUID }
+ }
+ {
+ RegionInfo3 Single
+ { CPUClassID S32 }
+ { CPURatio S32 }
+ { ColoName Variable 1 } // string
+ { ProductSKU Variable 1 } // string
+ { ProductName Variable 1 } // string
+ }
+ {
+ RegionInfo4 Variable
+ { RegionFlagsExtended U64 }
+ { RegionProtocols U64 }
+ }
+}
+
+// RegionHandshakeReply
+// viewer -> sim
+// reliable
+// Sent after viewer has initialized the (pre-existing)
+// LLViewerRegion with the name, access level, etc. and
+// has loaded the cache for the region.
+// After the simulator receives this, it will start sending
+// data about objects.
+{
+ RegionHandshakeReply Low 149 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ RegionInfo Single
+ { Flags U32 }
+ }
+}
+
+// The CoarseLocationUpdate message is sent to notify the viewer of
+// the location of mappable objects in the region. 1 meter resolution is
+// sufficient for this. The index block is used to show where you are,
+// and where someone you are tracking is located. They are -1 if not
+// applicable.
+{
+ CoarseLocationUpdate Medium 6 Trusted Unencoded
+ {
+ Location Variable
+ { X U8 }
+ { Y U8 }
+ { Z U8 } // Z in meters / 4
+ }
+ {
+ Index Single
+ { You S16 }
+ { Prey S16 }
+ }
+ {
+ AgentData Variable
+ { AgentID LLUUID }
+ }
+}
+
+// ImageData - sent to viewer to transmit information about an image
+{
+ ImageData High 9 Trusted Unencoded
+ {
+ ImageID Single
+ { ID LLUUID }
+ { Codec U8 }
+ { Size U32 }
+ { Packets U16 }
+ }
+ {
+ ImageData Single
+ { Data Variable 2 }
+ }
+}
+
+// ImagePacket - follow on image data for images having > 1 packet of data
+{
+ ImagePacket High 10 Trusted Unencoded
+ {
+ ImageID Single
+ { ID LLUUID }
+ { Packet U16 }
+ }
+ {
+ ImageData Single
+ { Data Variable 2 }
+ }
+}
+
+// LayerData - Sent to viewer - encodes layer data
+
+{
+ LayerData High 11 Trusted Unencoded
+ {
+ LayerID Single
+ { Type U8 }
+
+ }
+ {
+ LayerData Single
+ { Data Variable 2 }
+ }
+}
+
+// ObjectUpdate - Sent by objects from the simulator to the viewer
+//
+// If only one ImageID is sent for an object type that has more than
+// one face, the same image is repeated on each subsequent face.
+//
+// NameValue is a list of name-value strings, separated by \n characters,
+// terminated by \0
+//
+// Data is type-specific opaque data for this object
+{
+ ObjectUpdate High 12 Trusted Zerocoded
+ {
+ RegionData Single
+ { RegionHandle U64 }
+ { TimeDilation U16 }
+ }
+ {
+ ObjectData Variable
+ { ID U32 }
+ { State U8 }
+
+ { FullID LLUUID }
+ { CRC U32 } // TEMPORARY HACK FOR JAMES
+ { PCode U8 }
+ { Material U8 }
+ { ClickAction U8 }
+ { Scale LLVector3 }
+ { ObjectData Variable 1 }
+
+ { ParentID U32 }
+ { UpdateFlags U32 } // see object_flags.h
+
+ { PathCurve U8 }
+ { ProfileCurve U8 }
+ { PathBegin U16 } // 0 to 1, quanta = 0.01
+ { PathEnd U16 } // 0 to 1, quanta = 0.01
+ { PathScaleX U8 } // 0 to 1, quanta = 0.01
+ { PathScaleY U8 } // 0 to 1, quanta = 0.01
+ { PathShearX U8 } // -.5 to .5, quanta = 0.01
+ { PathShearY U8 } // -.5 to .5, quanta = 0.01
+ { PathTwist S8 } // -1 to 1, quanta = 0.01
+ { PathTwistBegin S8 } // -1 to 1, quanta = 0.01
+ { PathRadiusOffset S8 } // -1 to 1, quanta = 0.01
+ { PathTaperX S8 } // -1 to 1, quanta = 0.01
+ { PathTaperY S8 } // -1 to 1, quanta = 0.01
+ { PathRevolutions U8 } // 0 to 3, quanta = 0.015
+ { PathSkew S8 } // -1 to 1, quanta = 0.01
+ { ProfileBegin U16 } // 0 to 1, quanta = 0.01
+ { ProfileEnd U16 } // 0 to 1, quanta = 0.01
+ { ProfileHollow U16 } // 0 to 1, quanta = 0.01
+
+ { TextureEntry Variable 2 }
+ { TextureAnim Variable 1 }
+
+ { NameValue Variable 2 }
+ { Data Variable 2 }
+ { Text Variable 1 } // llSetText() hovering text
+ { TextColor Fixed 4 } // actually, a LLColor4U
+ { MediaURL Variable 1 } // URL for web page, movie, etc.
+
+ // Info for particle systems
+ { PSBlock Variable 1 }
+
+ // Extra parameters
+ { ExtraParams Variable 1 }
+
+ // info for looped attached sounds
+ // because these are almost always all zero
+ // the hit after zero-coding is only 2 bytes
+ // not the 42 you see here
+ { Sound LLUUID }
+ { OwnerID LLUUID } // HACK object's owner id, only set if non-null sound, for muting
+ { Gain F32 }
+ { Flags U8 }
+ { Radius F32 } // cutoff radius
+
+ // joint info -- is sent in the update of each joint-child-root
+ { JointType U8 }
+ { JointPivot LLVector3 }
+ { JointAxisOrAnchor LLVector3 }
+ }
+}
+
+
+// ObjectUpdateCompressed
+{
+ ObjectUpdateCompressed High 13 Trusted Unencoded
+ {
+ RegionData Single
+ { RegionHandle U64 }
+ { TimeDilation U16 }
+ }
+ {
+ ObjectData Variable
+ { UpdateFlags U32 }
+ { Data Variable 2 }
+ }
+}
+
+// ObjectUpdateCached
+// reliable
+{
+ ObjectUpdateCached High 14 Trusted Unencoded
+ {
+ RegionData Single
+ { RegionHandle U64 }
+ { TimeDilation U16 }
+ }
+ {
+ ObjectData Variable
+ { ID U32 }
+ { CRC U32 }
+ { UpdateFlags U32 }
+ }
+}
+
+// packed terse object update format
+{
+ ImprovedTerseObjectUpdate High 15 Trusted Unencoded
+ {
+ RegionData Single
+ { RegionHandle U64 }
+ { TimeDilation U16 }
+ }
+ {
+ ObjectData Variable
+ { Data Variable 1 }
+ { TextureEntry Variable 2 }
+ }
+}
+
+// KillObject - Sent by objects to the viewer to tell them to kill themselves
+
+{
+ KillObject High 16 Trusted Unencoded
+ {
+ ObjectData Variable
+ { ID U32 }
+ }
+}
+
+
+// CrossedRegion - new way to tell a viewer it has gone across a region
+// boundary
+{
+ CrossedRegion Medium 7 Trusted Unencoded UDPBlackListed
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ RegionData Single
+ { SimIP IPADDR }
+ { SimPort IPPORT }
+ { RegionHandle U64 }
+ { SeedCapability Variable 2 } // URL
+ }
+ {
+ Info Single
+ { Position LLVector3 }
+ { LookAt LLVector3 }
+ }
+}
+
+// SimulatorViewerTimeMessage - Allows viewer to resynch to world time
+
+{
+ SimulatorViewerTimeMessage Low 150 Trusted Unencoded
+ {
+ TimeInfo Single
+ { UsecSinceStart U64 }
+ { SecPerDay U32 }
+ { SecPerYear U32 }
+ { SunDirection LLVector3 }
+ { SunPhase F32 }
+ { SunAngVelocity LLVector3 }
+ }
+}
+
+// EnableSimulator - Preps a viewer to receive data from a simulator
+
+{
+ EnableSimulator Low 151 Trusted Unencoded UDPBlackListed
+ {
+ SimulatorInfo Single
+ { Handle U64 }
+ { IP IPADDR }
+ { Port IPPORT }
+ }
+}
+
+// DisableThisSimulator - Tells a viewer not to expect data from this simulator anymore
+
+{
+ DisableSimulator Low 152 Trusted Unencoded
+}
+
+// ConfirmEnableSimulator - A confirmation message sent from simulator to neighbors that the simulator
+// has successfully been enabled by the viewer
+
+{
+ ConfirmEnableSimulator Medium 8 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// New Transfer system
+//-----------------------------------------------------------------------------
+
+// Request a new transfer (target->source)
+{
+ TransferRequest Low 153 NotTrusted Zerocoded
+ {
+ TransferInfo Single
+ { TransferID LLUUID }
+ { ChannelType S32 }
+ { SourceType S32 }
+ { Priority F32 }
+ { Params Variable 2 }
+ }
+}
+
+// Return info about a transfer/initiate transfer (source->target)
+// Possibly should have a Params field like above
+{
+ TransferInfo Low 154 NotTrusted Zerocoded
+ {
+ TransferInfo Single
+ { TransferID LLUUID }
+ { ChannelType S32 }
+ { TargetType S32 }
+ { Status S32 }
+ { Size S32 }
+ { Params Variable 2 }
+ }
+}
+
+{
+ TransferPacket High 17 NotTrusted Unencoded
+ {
+ TransferData Single
+ { TransferID LLUUID }
+ { ChannelType S32 }
+ { Packet S32 }
+ { Status S32 }
+ { Data Variable 2 }
+ }
+}
+
+// Abort a transfer in progress (either from target->source or source->target)
+{
+ TransferAbort Low 155 NotTrusted Zerocoded
+ {
+ TransferInfo Single
+ { TransferID LLUUID }
+ { ChannelType S32 }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// General file transfer
+//-----------------------------------------------------------------------------
+
+// RequestXfer - request an arbitrary xfer
+{
+ RequestXfer Low 156 NotTrusted Zerocoded
+ {
+ XferID Single
+ { ID U64 }
+ { Filename Variable 1 }
+ { FilePath U8 } // ELLPath
+ { DeleteOnCompletion BOOL }
+ { UseBigPackets BOOL }
+ { VFileID LLUUID }
+ { VFileType S16 }
+ }
+}
+
+// SendXferPacket - send an additional packet of an arbitrary xfer from sim -> viewer
+{
+ SendXferPacket High 18 NotTrusted Unencoded
+ {
+ XferID Single
+ { ID U64 }
+ { Packet U32 }
+ }
+ {
+ DataPacket Single
+ { Data Variable 2 }
+ }
+}
+
+// ConfirmXferPacket
+{
+ ConfirmXferPacket High 19 NotTrusted Unencoded
+ {
+ XferID Single
+ { ID U64 }
+ { Packet U32 }
+ }
+}
+
+// AbortXfer
+{
+ AbortXfer Low 157 NotTrusted Unencoded
+ {
+ XferID Single
+ { ID U64 }
+ { Result S32 }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Avatar information
+//-----------------------------------------------------------------------------
+
+
+// AvatarAnimation - Update animation state
+// simulator --> viewer
+{
+ AvatarAnimation High 20 Trusted Unencoded
+ {
+ Sender Single
+ { ID LLUUID }
+ }
+ {
+ AnimationList Variable
+ { AnimID LLUUID }
+ { AnimSequenceID S32 }
+ }
+ {
+ AnimationSourceList Variable
+ { ObjectID LLUUID }
+ }
+ {
+ PhysicalAvatarEventList Variable
+ { TypeData Variable 1 }
+ }
+
+}
+
+// AvatarAppearance - Update visual params
+{
+ AvatarAppearance Low 158 Trusted Zerocoded
+ {
+ Sender Single
+ { ID LLUUID }
+ { IsTrial BOOL }
+ }
+ {
+ ObjectData Single
+ { TextureEntry Variable 2 }
+ }
+ {
+ VisualParam Variable
+ { ParamValue U8 }
+ }
+ {
+ AppearanceData Variable
+ { AppearanceVersion U8 }
+ { CofVersion S32 }
+ { Flags U32 }
+ }
+ {
+ AppearanceHover Variable
+ { HoverHeight LLVector3 }
+ }
+ {
+ AttachmentBlock Variable
+ { ID LLUUID }
+ { AttachmentPoint U8 }
+ }
+}
+
+// AvatarSitResponse - response to a request to sit on an object
+{
+ AvatarSitResponse High 21 Trusted Zerocoded
+ {
+ SitObject Single
+ { ID LLUUID }
+ }
+ {
+ SitTransform Single
+ { AutoPilot BOOL }
+ { SitPosition LLVector3 }
+ { SitRotation LLQuaternion }
+ { CameraEyeOffset LLVector3 }
+ { CameraAtOffset LLVector3 }
+ { ForceMouselook BOOL }
+ }
+}
+
+// SetFollowCamProperties
+{
+ SetFollowCamProperties Low 159 Trusted Unencoded
+ {
+ ObjectData Single
+ { ObjectID LLUUID }
+ }
+ {
+ CameraProperty Variable
+ { Type S32 }
+ { Value F32 }
+ }
+}
+
+// ClearFollowCamProperties
+{
+ ClearFollowCamProperties Low 160 Trusted Unencoded
+ {
+ ObjectData Single
+ { ObjectID LLUUID }
+ }
+}
+
+// CameraConstraint - new camera distance limit (based on collision with objects)
+{
+ CameraConstraint High 22 Trusted Zerocoded
+ {
+ CameraCollidePlane Single
+ { Plane LLVector4 }
+ }
+}
+
+// ObjectProperties
+// Extended information such as creator, permissions, etc.
+// Medium because potentially driven by mouse hover events.
+{
+ ObjectProperties Medium 9 Trusted Zerocoded
+ {
+ ObjectData Variable
+ { ObjectID LLUUID }
+ { CreatorID LLUUID }
+ { OwnerID LLUUID }
+ { GroupID LLUUID }
+ { CreationDate U64 }
+ { BaseMask U32 }
+ { OwnerMask U32 }
+ { GroupMask U32 }
+ { EveryoneMask U32 }
+ { NextOwnerMask U32 }
+ { OwnershipCost S32 }
+// { TaxRate F32 } // F32
+ { SaleType U8 } // U8 -> EForSale
+ { SalePrice S32 }
+ { AggregatePerms U8 }
+ { AggregatePermTextures U8 }
+ { AggregatePermTexturesOwner U8 }
+ { Category U32 } // LLCategory
+ { InventorySerial S16 } // S16
+ { ItemID LLUUID }
+ { FolderID LLUUID }
+ { FromTaskID LLUUID }
+ { LastOwnerID LLUUID }
+ { Name Variable 1 }
+ { Description Variable 1 }
+ { TouchName Variable 1 }
+ { SitName Variable 1 }
+ { TextureID Variable 1 }
+ }
+}
+
+// ObjectPropertiesFamily
+// Medium because potentially driven by mouse hover events.
+{
+ ObjectPropertiesFamily Medium 10 Trusted Zerocoded
+ {
+ ObjectData Single
+ { RequestFlags U32 }
+ { ObjectID LLUUID }
+ { OwnerID LLUUID }
+ { GroupID LLUUID }
+ { BaseMask U32 }
+ { OwnerMask U32 }
+ { GroupMask U32 }
+ { EveryoneMask U32 }
+ { NextOwnerMask U32 }
+ { OwnershipCost S32 }
+ { SaleType U8 } // U8 -> EForSale
+ { SalePrice S32 }
+ { Category U32 } // LLCategory
+ { LastOwnerID LLUUID }
+ { Name Variable 1 }
+ { Description Variable 1 }
+ }
+}
+
+// RequestPayPrice
+// viewer -> sim
+{
+ RequestPayPrice Low 161 NotTrusted Unencoded
+ {
+ ObjectData Single
+ { ObjectID LLUUID }
+ }
+}
+
+// PayPriceReply
+// sim -> viewer
+{
+ PayPriceReply Low 162 Trusted Unencoded
+ {
+ ObjectData Single
+ { ObjectID LLUUID }
+ { DefaultPayPrice S32 }
+ }
+ {
+ ButtonData Variable
+ { PayButton S32 }
+ }
+}
+
+// KickUser
+// *FIXME*
+// Kick off a logged-in user, such as when two people log in with the
+// same account name.
+// ROUTED dataserver -> userserver -> spaceserver -> simulator -> viewer
+// reliable, but that may not matter if a system component is quitting
+{
+ KickUser Low 163 Trusted Unencoded
+ {
+ TargetBlock Single
+ { TargetIP IPADDR } // U32 encoded IP
+ { TargetPort IPPORT }
+ }
+ {
+ UserInfo Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { Reason Variable 2 } // string
+ }
+}
+
+// ack sent from the simulator up to the main database so that login
+// can continue.
+{
+ KickUserAck Low 164 Trusted Unencoded
+ {
+ UserInfo Single
+ { SessionID LLUUID }
+ { Flags U32 }
+ }
+}
+
+// GodKickUser
+// When a god wants someone kicked
+// viewer -> sim
+// reliable
+{
+ GodKickUser Low 165 NotTrusted Unencoded
+ {
+ UserInfo Single
+ { GodID LLUUID }
+ { GodSessionID LLUUID }
+ { AgentID LLUUID }
+ { KickFlags U32 }
+ { Reason Variable 2 } // string
+ }
+}
+
+// SystemKickUser
+// user->space, reliable
+{
+ SystemKickUser Low 166 Trusted Unencoded
+ {
+ AgentInfo Variable
+ { AgentID LLUUID }
+ }
+}
+
+// EjectUser
+// viewer -> sim
+// reliable
+{
+ EjectUser Low 167 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { TargetID LLUUID }
+ { Flags U32 }
+ }
+}
+
+// FreezeUser
+// Freeze someone who is on my land.
+// viewer -> sim
+// reliable
+{
+ FreezeUser Low 168 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { TargetID LLUUID }
+ { Flags U32 }
+ }
+}
+
+
+// AvatarPropertiesRequest
+// viewer -> simulator
+// reliable
+{
+ AvatarPropertiesRequest Low 169 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { AvatarID LLUUID }
+ }
+}
+
+// AvatarPropertiesRequestBackend
+// simulator -> dataserver
+// reliable
+{
+ AvatarPropertiesRequestBackend Low 170 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { AvatarID LLUUID }
+ { GodLevel U8 }
+ { WebProfilesDisabled BOOL }
+ }
+}
+// AvatarPropertiesReply
+// dataserver -> simulator
+// simulator -> viewer
+// reliable
+{
+ AvatarPropertiesReply Low 171 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID } // your id
+ { AvatarID LLUUID } // avatar you're asking about
+ }
+ {
+ PropertiesData Single
+ { ImageID LLUUID }
+ { FLImageID LLUUID }
+ { PartnerID LLUUID }
+ { AboutText Variable 2 } // string, up to 512
+ { FLAboutText Variable 1 } // string
+ { BornOn Variable 1 } // string
+ { ProfileURL Variable 1 } // string
+ { CharterMember Variable 1 } // special - usually U8
+ { Flags U32 }
+ }
+}
+
+{
+ AvatarInterestsReply Low 172 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID } // your id
+ { AvatarID LLUUID } // avatar you're asking about
+ }
+ {
+ PropertiesData Single
+ { WantToMask U32 }
+ { WantToText Variable 1 } // string
+ { SkillsMask U32 }
+ { SkillsText Variable 1 } // string
+ { LanguagesText Variable 1 } // string
+ }
+}
+
+// AvatarGroupsReply
+// dataserver -> simulator
+// simulator -> viewer
+// reliable
+{
+ AvatarGroupsReply Low 173 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID } // your id
+ { AvatarID LLUUID } // avatar you're asking about
+ }
+ {
+ GroupData Variable
+ { GroupPowers U64 }
+ { AcceptNotices BOOL }
+ { GroupTitle Variable 1 }
+ { GroupID LLUUID }
+ { GroupName Variable 1 }
+ { GroupInsigniaID LLUUID }
+ }
+ {
+ NewGroupData Single
+ { ListInProfile BOOL } // whether group displays in profile
+ }
+}
+
+
+// AvatarPropertiesUpdate
+// viewer -> simulator
+// reliable
+{
+ AvatarPropertiesUpdate Low 174 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ PropertiesData Single
+ { ImageID LLUUID }
+ { FLImageID LLUUID }
+ { AboutText Variable 2 } // string, up to 512
+ { FLAboutText Variable 1 }
+ { AllowPublish BOOL } // whether profile is externally visible or not
+ { MaturePublish BOOL } // profile is "mature"
+ { ProfileURL Variable 1 } // string
+ }
+}
+
+// AvatarInterestsUpdate
+// viewer -> simulator
+// reliable
+{
+ AvatarInterestsUpdate Low 175 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ PropertiesData Single
+ { WantToMask U32 }
+ { WantToText Variable 1 } // string
+ { SkillsMask U32 }
+ { SkillsText Variable 1 } // string
+ { LanguagesText Variable 1 } // string
+ }
+}
+
+
+
+// AvatarNotesReply
+// dataserver -> simulator
+// simulator -> viewer
+// reliable
+{
+ AvatarNotesReply Low 176 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ Data Single
+ { TargetID LLUUID }
+ { Notes Variable 2 } // string
+ }
+}
+
+
+// AvatarNotesUpdate
+// viewer -> simulator -> dataserver
+// reliable
+{
+ AvatarNotesUpdate Low 177 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { TargetID LLUUID }
+ { Notes Variable 2 } // string
+ }
+}
+
+
+// AvatarPicksReply
+// dataserver -> simulator -> viewer
+// Send the header information for this avatar's picks
+// This fills in the tabs of the Picks panel.
+// reliable
+{
+ AvatarPicksReply Low 178 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { TargetID LLUUID }
+ }
+ {
+ Data Variable
+ { PickID LLUUID }
+ { PickName Variable 1 } // string
+ }
+}
+
+
+// EventInfoRequest
+// viewer -> simulator
+// simulator -> dataserver
+// reliable
+{
+ EventInfoRequest Low 179 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ EventData Single
+ { EventID U32 }
+ }
+}
+
+
+// EventInfoReply
+// dataserver -> simulator
+// simulator -> viewer
+// reliable
+{
+ EventInfoReply Low 180 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ EventData Single
+ { EventID U32 }
+ { Creator Variable 1 }
+ { Name Variable 1 }
+ { Category Variable 1 }
+ { Desc Variable 2 }
+ { Date Variable 1 }
+ { DateUTC U32 }
+ { Duration U32 }
+ { Cover U32 }
+ { Amount U32 }
+ { SimName Variable 1 }
+ { GlobalPos LLVector3d }
+ { EventFlags U32 }
+ }
+}
+
+
+// EventNotificationAddRequest
+// viewer -> simulator
+// simulator -> dataserver
+// reliable
+{
+ EventNotificationAddRequest Low 181 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ EventData Single
+ { EventID U32 }
+ }
+}
+
+
+// EventNotificationRemoveRequest
+// viewer -> simulator
+// simulator -> dataserver
+// reliable
+{
+ EventNotificationRemoveRequest Low 182 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ EventData Single
+ { EventID U32 }
+ }
+}
+
+// EventGodDelete
+// viewer -> simulator
+// simulator -> dataserver
+// QueryData is used to resend a search result after the deletion
+// reliable
+{
+ EventGodDelete Low 183 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ EventData Single
+ { EventID U32 }
+ }
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ { QueryText Variable 1 }
+ { QueryFlags U32 }
+ { QueryStart S32 } // prev/next page support
+ }
+}
+
+
+// PickInfoReply
+// dataserver -> simulator
+// simulator -> viewer
+// reliable
+{
+ PickInfoReply Low 184 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ Data Single
+ { PickID LLUUID }
+ { CreatorID LLUUID }
+ { TopPick BOOL }
+ { ParcelID LLUUID }
+ { Name Variable 1 }
+ { Desc Variable 2 }
+ { SnapshotID LLUUID }
+ { User Variable 1 }
+ { OriginalName Variable 1 }
+ { SimName Variable 1 }
+ { PosGlobal LLVector3d }
+ { SortOrder S32 }
+ { Enabled BOOL }
+ }
+}
+
+
+// PickInfoUpdate
+// Update a pick. ParcelID is set on the simulator as the message
+// passes through.
+// If TopPick is TRUE, the simulator will only pass on the message
+// if the agent_id is a god.
+// viewer -> simulator -> dataserver
+// reliable
+{
+ PickInfoUpdate Low 185 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { PickID LLUUID }
+ { CreatorID LLUUID }
+ { TopPick BOOL }
+ { ParcelID LLUUID }
+ { Name Variable 1 }
+ { Desc Variable 2 }
+ { SnapshotID LLUUID }
+ { PosGlobal LLVector3d }
+ { SortOrder S32 }
+ { Enabled BOOL }
+ }
+}
+
+
+// PickDelete
+// Delete a non-top pick from the database.
+// viewer -> simulator -> dataserver
+// reliable
+{
+ PickDelete Low 186 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { PickID LLUUID }
+ }
+}
+
+// PickGodDelete
+// Delete a pick from the database.
+// QueryID is needed so database can send a repeat list of
+// picks.
+// viewer -> simulator -> dataserver
+// reliable
+{
+ PickGodDelete Low 187 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { PickID LLUUID }
+ { QueryID LLUUID }
+ }
+}
+
+
+// ScriptQuestion
+// reliable
+{
+ ScriptQuestion Low 188 Trusted Unencoded
+ {
+ Data Single
+ { TaskID LLUUID }
+ { ItemID LLUUID }
+ { ObjectName Variable 1 }
+ { ObjectOwner Variable 1 }
+ { Questions S32 }
+ }
+ {
+ Experience Single
+ { ExperienceID LLUUID }
+ }
+}
+
+// ScriptControlChange
+// reliable
+{
+ ScriptControlChange Low 189 Trusted Unencoded
+ {
+ Data Variable
+ { TakeControls BOOL }
+ { Controls U32 }
+ { PassToAgent BOOL }
+ }
+}
+
+// ScriptDialog
+// sim -> viewer
+// reliable
+{
+ ScriptDialog Low 190 Trusted Zerocoded
+ {
+ Data Single
+ { ObjectID LLUUID }
+ { FirstName Variable 1 }
+ { LastName Variable 1 }
+ { ObjectName Variable 1 }
+ { Message Variable 2 }
+ { ChatChannel S32 }
+ { ImageID LLUUID }
+ }
+ {
+ Buttons Variable
+ { ButtonLabel Variable 1 }
+ }
+ {
+ OwnerData Variable
+ { OwnerID LLUUID }
+ }
+}
+
+
+// ScriptDialogReply
+// viewer -> sim
+// reliable
+{
+ ScriptDialogReply Low 191 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { ObjectID LLUUID }
+ { ChatChannel S32 }
+ { ButtonIndex S32 }
+ { ButtonLabel Variable 1 }
+ }
+}
+
+
+// ForceScriptControlRelease
+// reliable
+{
+ ForceScriptControlRelease Low 192 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+}
+
+// RevokePermissions
+// reliable
+{
+ RevokePermissions Low 193 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { ObjectID LLUUID }
+ { ObjectPermissions U32 }
+ }
+}
+
+// LoadURL
+// sim -> viewer
+// Ask the user if they would like to load a URL
+// reliable
+{
+ LoadURL Low 194 Trusted Unencoded
+ {
+ Data Single
+ { ObjectName Variable 1 }
+ { ObjectID LLUUID }
+ { OwnerID LLUUID }
+ { OwnerIsGroup BOOL }
+ { Message Variable 1 }
+ { URL Variable 1 }
+ }
+}
+
+// ScriptTeleportRequest
+// Interestingly, this message does not actually "Request a Teleport"
+// on the viewer. Instead it opens the world map and places a beacon
+// at the indicated location.
+// reliable
+{
+ ScriptTeleportRequest Low 195 Trusted Unencoded
+ {
+ Data Single
+ { ObjectName Variable 1 }
+ { SimName Variable 1 }
+ { SimPosition LLVector3 }
+ { LookAt LLVector3 }
+ }
+ {
+ Options Variable
+ { Flags U32 }
+ }
+}
+
+
+
+
+// ***************************************************************************
+// Land Parcel system
+// ***************************************************************************
+
+// ParcelOverlay
+// We send N packets per region to the viewer.
+// N = 4, currently. At 256x256 meter regions, 4x4 meter parcel grid,
+// there are 4096 parcel units per region. At N = 4, that's 1024 units
+// per packet, allowing 8 bit bytes.
+// sim -> viewer
+// reliable
+{
+ ParcelOverlay Low 196 Trusted Zerocoded
+ {
+ ParcelData Single
+ { SequenceID S32 } // 0...3, which piece of region
+ { Data Variable 2 } // packed bit-field, (grids*grids)/N
+ }
+}
+
+
+// ParcelPropertiesRequest
+// SequenceID should be -1 or -2, and is echoed back in the
+// parcel properties message.
+// viewer -> sim
+// reliable
+{
+ ParcelPropertiesRequest Medium 11 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ParcelData Single
+ { SequenceID S32 }
+ { West F32 }
+ { South F32 }
+ { East F32 }
+ { North F32 }
+ { SnapSelection BOOL }
+ }
+}
+
+// ParcelPropertiesRequestByID
+// viewer -> sim
+// reliable
+{
+ ParcelPropertiesRequestByID Low 197 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ParcelData Single
+ { SequenceID S32 }
+ { LocalID S32 }
+ }
+}
+
+// ParcelProperties
+// sequence id = -1 for parcels that you explicitly selected
+// For agents, sequence id increments every time the agent transits into
+// a new parcel. It is used to detect out-of-order agent parcel info updates.
+// Bitmap = packed bit field, one bit per parcel grid, on if that grid is
+// part of the selected parcel.
+// sim -> viewer
+// WARNING: This packet is potentially large. With max length name,
+// description, music URL and media URL, it is 1526 + sizeof ( LLUUID ) bytes.
+{
+ ParcelProperties High 23 Trusted Zerocoded UDPDeprecated
+ {
+ ParcelData Single
+ { RequestResult S32 }
+ { SequenceID S32 }
+ { SnapSelection BOOL }
+ { SelfCount S32 }
+ { OtherCount S32 }
+ { PublicCount S32 }
+ { LocalID S32 }
+ { OwnerID LLUUID }
+ { IsGroupOwned BOOL }
+ { AuctionID U32 }
+ { ClaimDate S32 } // time_t
+ { ClaimPrice S32 }
+ { RentPrice S32 }
+ { AABBMin LLVector3 }
+ { AABBMax LLVector3 }
+ { Bitmap Variable 2 } // packed bit-field
+ { Area S32 }
+ { Status U8 } // owned vs. pending
+ { SimWideMaxPrims S32 }
+ { SimWideTotalPrims S32 }
+ { MaxPrims S32 }
+ { TotalPrims S32 }
+ { OwnerPrims S32 }
+ { GroupPrims S32 }
+ { OtherPrims S32 }
+ { SelectedPrims S32 }
+ { ParcelPrimBonus F32 }
+
+ { OtherCleanTime S32 }
+
+ { ParcelFlags U32 }
+ { SalePrice S32 }
+ { Name Variable 1 } // string
+ { Desc Variable 1 } // string
+ { MusicURL Variable 1 } // string
+ { MediaURL Variable 1 } // string
+ { MediaID LLUUID }
+ { MediaAutoScale U8 }
+ { GroupID LLUUID }
+ { PassPrice S32 }
+ { PassHours F32 }
+ { Category U8 }
+ { AuthBuyerID LLUUID }
+ { SnapshotID LLUUID }
+ { UserLocation LLVector3 }
+ { UserLookAt LLVector3 }
+ { LandingType U8 }
+ { RegionPushOverride BOOL }
+ { RegionDenyAnonymous BOOL }
+ { RegionDenyIdentified BOOL }
+ { RegionDenyTransacted BOOL }
+ // in llsd message, SeeAVs, GroupAVSounds and AnyAVSounds BOOLs are also sent
+ }
+ {
+ AgeVerificationBlock Single
+ { RegionDenyAgeUnverified BOOL }
+ }
+ {
+ RegionAllowAccessBlock Single
+ { RegionAllowAccessOverride BOOL }
+ }
+ {
+ ParcelEnvironmentBlock Single
+ { ParcelEnvironmentVersion S32 }
+ { RegionAllowEnvironmentOverride BOOL }
+ }
+}
+
+// ParcelPropertiesUpdate
+// viewer -> sim
+// reliable
+{
+ ParcelPropertiesUpdate Low 198 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ParcelData Single
+ { LocalID S32 }
+ { Flags U32 }
+
+ { ParcelFlags U32 }
+ { SalePrice S32 }
+ { Name Variable 1 } // string
+ { Desc Variable 1 } // string
+ { MusicURL Variable 1 } // string
+ { MediaURL Variable 1 } // string
+ { MediaID LLUUID }
+ { MediaAutoScale U8 }
+ { GroupID LLUUID }
+ { PassPrice S32 }
+ { PassHours F32 }
+ { Category U8 }
+ { AuthBuyerID LLUUID }
+ { SnapshotID LLUUID }
+ { UserLocation LLVector3 }
+ { UserLookAt LLVector3 }
+ { LandingType U8 }
+ }
+}
+
+// ParcelReturnObjects
+// viewer -> sim
+// reliable
+{
+ ParcelReturnObjects Low 199 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ParcelData Single
+ { LocalID S32 }
+ { ReturnType U32 }
+ }
+ {
+ TaskIDs Variable
+ { TaskID LLUUID }
+ }
+ {
+ OwnerIDs Variable
+ { OwnerID LLUUID }
+ }
+}
+
+// ParcelSetOtherCleanTime
+// viewer -> sim
+// reliable
+{
+ ParcelSetOtherCleanTime Low 200 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ParcelData Single
+ { LocalID S32 }
+ { OtherCleanTime S32 }
+ }
+}
+
+
+// Disable makes objects nonphysical and turns off their scripts.
+// ParcelDisableObjects
+// viewer -> sim
+// reliable
+{
+ ParcelDisableObjects Low 201 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ParcelData Single
+ { LocalID S32 }
+ { ReturnType U32 }
+ }
+ {
+ TaskIDs Variable
+ { TaskID LLUUID }
+ }
+ {
+ OwnerIDs Variable
+ { OwnerID LLUUID }
+ }
+}
+
+
+// ParcelSelectObjects
+// viewer -> sim
+// reliable
+{
+ ParcelSelectObjects Low 202 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ParcelData Single
+ { LocalID S32 }
+ { ReturnType U32 }
+ }
+ {
+ ReturnIDs Variable
+ { ReturnID LLUUID }
+ }
+}
+
+
+// EstateCovenantRequest
+// viewer -> sim
+// reliable
+{
+ EstateCovenantRequest Low 203 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+}
+
+// EstateCovenantReply
+// sim -> viewer
+// reliable
+{
+ EstateCovenantReply Low 204 Trusted Unencoded
+ {
+ Data Single
+ { CovenantID LLUUID }
+ { CovenantTimestamp U32 }
+ { EstateName Variable 1 } // string
+ { EstateOwnerID LLUUID }
+ }
+}
+
+
+// ForceObjectSelect
+// sim -> viewer
+// reliable
+{
+ ForceObjectSelect Low 205 Trusted Unencoded
+ {
+ Header Single
+ { ResetList BOOL }
+ }
+ {
+ Data Variable
+ { LocalID U32 }
+ }
+}
+
+
+// ParcelBuyPass - purchase a temporary access pass
+// viewer -> sim
+// reliable
+{
+ ParcelBuyPass Low 206 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ParcelData Single
+ { LocalID S32 }
+ }
+}
+
+// ParcelDeedToGroup - deed a patch of land to a group
+// viewer -> sim
+// reliable
+{
+ ParcelDeedToGroup Low 207 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { GroupID LLUUID }
+ { LocalID S32 } // parcel id
+ }
+}
+
+// reserved for when island owners force re-claim parcel
+{
+ ParcelReclaim Low 208 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { LocalID S32 } // parcel id
+ }
+}
+
+// ParcelClaim - change the owner of a patch of land
+// viewer -> sim
+// reliable
+{
+ ParcelClaim Low 209 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { GroupID LLUUID }
+ { IsGroupOwned BOOL }
+ { Final BOOL } // true if buyer is in tier
+ }
+ {
+ ParcelData Variable
+ { West F32 }
+ { South F32 }
+ { East F32 }
+ { North F32 }
+ }
+}
+
+// ParcelJoin - Take all parcels which are owned by agent and inside
+// rectangle, and make them 1 parcel if they all are leased.
+// viewer -> sim
+// reliable
+{
+ ParcelJoin Low 210 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ParcelData Single
+ { West F32 }
+ { South F32 }
+ { East F32 }
+ { North F32 }
+ }
+}
+
+// ParcelDivide
+// If the selection is a subsection of exactly one parcel,
+// chop out that section and make a new parcel of it.
+// viewer -> sim
+// reliable
+{
+ ParcelDivide Low 211 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ParcelData Single
+ { West F32 }
+ { South F32 }
+ { East F32 }
+ { North F32 }
+ }
+}
+
+// ParcelRelease
+// Release a parcel to public
+// viewer -> sim
+// reliable
+{
+ ParcelRelease Low 212 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { LocalID S32 } // parcel ID
+ }
+}
+
+// ParcelBuy - change the owner of a patch of land.
+// viewer -> sim
+// reliable
+{
+ ParcelBuy Low 213 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { GroupID LLUUID }
+ { IsGroupOwned BOOL }
+ { RemoveContribution BOOL }
+ { LocalID S32 }
+ { Final BOOL } // true if buyer is in tier
+ }
+ {
+ ParcelData Single
+ { Price S32 }
+ { Area S32 }
+ }
+}
+
+
+// ParcelGodForceOwner Unencoded
+{
+ ParcelGodForceOwner Low 214 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { OwnerID LLUUID }
+ { LocalID S32 } // parcel ID
+ }
+}
+
+
+// viewer -> sim
+// ParcelAccessListRequest
+{
+ ParcelAccessListRequest Low 215 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { SequenceID S32 }
+ { Flags U32 }
+ { LocalID S32 }
+ }
+}
+
+
+// sim -> viewer
+// ParcelAccessListReply
+{
+ ParcelAccessListReply Low 216 Trusted Zerocoded
+ {
+ Data Single
+ { AgentID LLUUID }
+ { SequenceID S32 }
+ { Flags U32 }
+ { LocalID S32 }
+ }
+ {
+ List Variable
+ { ID LLUUID }
+ { Time S32 } // time_t
+ { Flags U32 }
+ }
+}
+
+// viewer -> sim
+// ParcelAccessListUpdate
+{
+ ParcelAccessListUpdate Low 217 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { Flags U32 }
+ { LocalID S32 }
+ { TransactionID LLUUID }
+ { SequenceID S32 }
+ { Sections S32 }
+ }
+ {
+ List Variable
+ { ID LLUUID }
+ { Time S32 } // time_t
+ { Flags U32 }
+ }
+}
+
+
+// viewer -> sim -> dataserver
+// reliable
+{
+ ParcelDwellRequest Low 218 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { LocalID S32 }
+ { ParcelID LLUUID } // filled in on sim
+ }
+}
+
+
+// dataserver -> sim -> viewer
+// reliable
+{
+ ParcelDwellReply Low 219 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ Data Single
+ { LocalID S32 }
+ { ParcelID LLUUID }
+ { Dwell F32 }
+ }
+}
+
+// sim -> dataserver
+// This message is used to check if a user can buy a parcel. If
+// successful, the transaction is approved through a money balance reply
+// with the same transaction id.
+{
+ RequestParcelTransfer Low 220 Trusted Zerocoded
+ {
+ Data Single
+ { TransactionID LLUUID }
+ { TransactionTime U32 } // utc seconds since epoch
+ { SourceID LLUUID }
+ { DestID LLUUID }
+ { OwnerID LLUUID }
+ { Flags U8 } // see lltransactiontypes.h
+ { TransactionType S32 } // see lltransactiontypes.h
+ { Amount S32 }
+ { BillableArea S32 }
+ { ActualArea S32 }
+ { Final BOOL } // true if buyer should be in tier
+ }
+ {
+ RegionData Single // included so region name shows up in transaction logs
+ { RegionID LLUUID }
+ { GridX U32 }
+ { GridY U32 }
+ }
+}
+
+// sim ->dataserver
+// This message is used to send up complete parcel properties for
+// persistance in the database.
+// If you add something here, you should probably also change the
+// simulator's database update query on startup.
+{
+ UpdateParcel Low 221 Trusted Zerocoded
+ {
+ ParcelData Single
+ { ParcelID LLUUID }
+ { RegionHandle U64 }
+ { OwnerID LLUUID }
+ { GroupOwned BOOL }
+ { Status U8 }
+ { Name Variable 1 }
+ { Description Variable 1 }
+ { MusicURL Variable 1 }
+ { RegionX F32 }
+ { RegionY F32 }
+ { ActualArea S32 }
+ { BillableArea S32 }
+ { ShowDir BOOL }
+ { IsForSale BOOL }
+ { Category U8 }
+ { SnapshotID LLUUID }
+ { UserLocation LLVector3 }
+ { SalePrice S32 }
+ { AuthorizedBuyerID LLUUID }
+ { AllowPublish BOOL }
+ { MaturePublish BOOL }
+ }
+}
+
+// sim -> dataserver or space ->sim
+// This message is used to tell the dataserver that a parcel has been
+// removed.
+{
+ RemoveParcel Low 222 Trusted Unencoded
+ {
+ ParcelData Variable
+ { ParcelID LLUUID }
+ }
+}
+
+// sim -> dataserver
+// Merges some of the database information for parcels (dwell).
+{
+ MergeParcel Low 223 Trusted Unencoded
+ {
+ MasterParcelData Single
+ { MasterID LLUUID }
+ }
+ {
+ SlaveParcelData Variable
+ { SlaveID LLUUID }
+ }
+}
+
+// sim -> dataserver
+{
+ LogParcelChanges Low 224 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ RegionData Single
+ { RegionHandle U64 }
+ }
+ {
+ ParcelData Variable
+ { ParcelID LLUUID }
+ { OwnerID LLUUID }
+ { IsOwnerGroup BOOL }
+ { ActualArea S32 }
+ { Action S8 }
+ { TransactionID LLUUID }
+ }
+}
+
+// sim -> dataserver
+{
+ CheckParcelSales Low 225 Trusted Unencoded
+ {
+ RegionData Variable
+ { RegionHandle U64 }
+ }
+}
+
+// dataserver -> simulator
+// tell a particular simulator to finish parcel sale.
+{
+ ParcelSales Low 226 Trusted Unencoded
+ {
+ ParcelData Variable
+ { ParcelID LLUUID }
+ { BuyerID LLUUID }
+ }
+}
+
+// viewer -> sim
+// mark parcel and double secret agent content on parcel as owned by
+// governor/maint and adjusts permissions approriately. Godlike request.
+{
+ ParcelGodMarkAsContent Low 227 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ParcelData Single
+ { LocalID S32 }
+ }
+}
+
+
+// viewer -> sim
+// start an auction. viewer fills in the appropriate date, simulator
+// validates and fills in the rest of the information to start an auction
+// on a parcel. Processing currently requires that AgentID is a god.
+{
+ ViewerStartAuction Low 228 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ParcelData Single
+ { LocalID S32 }
+ { SnapshotID LLUUID }
+ }
+}
+
+// sim -> dataserver
+// Once all of the data has been gathered,
+{
+ StartAuction Low 229 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ ParcelData Single
+ { ParcelID LLUUID }
+ { SnapshotID LLUUID }
+ { Name Variable 1 } // string
+ }
+}
+
+// dataserver -> sim
+{
+ ConfirmAuctionStart Low 230 Trusted Unencoded
+ {
+ AuctionData Single
+ { ParcelID LLUUID }
+ { AuctionID U32 }
+ }
+}
+
+// sim -> dataserver
+// Tell the dataserver that an auction has completed.
+{
+ CompleteAuction Low 231 Trusted Unencoded
+ {
+ ParcelData Variable
+ { ParcelID LLUUID }
+ }
+}
+
+// Tell the dataserver that an auction has been canceled.
+{
+ CancelAuction Low 232 Trusted Unencoded
+ {
+ ParcelData Variable
+ { ParcelID LLUUID }
+ }
+}
+
+// sim -> dataserver
+{
+ CheckParcelAuctions Low 233 Trusted Unencoded
+ {
+ RegionData Variable
+ { RegionHandle U64 }
+ }
+}
+
+// dataserver -> sim
+// tell a particular simulator to finish parcel sale.
+{
+ ParcelAuctions Low 234 Trusted Unencoded
+ {
+ ParcelData Variable
+ { ParcelID LLUUID }
+ { WinnerID LLUUID }
+ }
+}
+
+// ***************************************************************************
+// UUID to name lookup
+// ***************************************************************************
+
+// UUIDNameRequest
+// Translate a UUID into first and last names
+{
+ UUIDNameRequest Low 235 NotTrusted Unencoded
+ {
+ UUIDNameBlock Variable
+ { ID LLUUID }
+ }
+}
+
+// UUIDNameReply
+// Translate a UUID into first and last names
+{
+ UUIDNameReply Low 236 Trusted Unencoded
+ {
+ UUIDNameBlock Variable
+ { ID LLUUID }
+ { FirstName Variable 1 }
+ { LastName Variable 1 }
+ }
+}
+
+// UUIDGroupNameRequest
+// Translate a UUID into a group name
+{
+ UUIDGroupNameRequest Low 237 NotTrusted Unencoded
+ {
+ UUIDNameBlock Variable
+ { ID LLUUID }
+ }
+}
+
+// UUIDGroupNameReply
+// Translate a UUID into a group name
+{
+ UUIDGroupNameReply Low 238 Trusted Unencoded
+ {
+ UUIDNameBlock Variable
+ { ID LLUUID }
+ { GroupName Variable 1 }
+ }
+}
+
+// end uuid to name lookup
+
+// ***************************************************************************
+// Simulator to Simulator Messages
+// ***************************************************************************
+
+// ChatPass
+// Chat message transmission to neighbors
+// Chat is region local to receiving simulator.
+// Type is one of CHAT_TYPE_NORMAL, _WHISPER, _SHOUT
+{
+ ChatPass Low 239 Trusted Zerocoded
+ {
+ ChatData Single
+ { Channel S32 }
+ { Position LLVector3 }
+ { ID LLUUID }
+ { OwnerID LLUUID }
+ { Name Variable 1 }
+ { SourceType U8 }
+ { Type U8 }
+ { Radius F32 }
+ { SimAccess U8 }
+ { Message Variable 2 }
+ }
+}
+
+// Edge data - compressed edge data
+
+{
+ EdgeDataPacket High 24 Trusted Zerocoded
+ {
+ EdgeData Single
+ { LayerType U8 }
+ { Direction U8 }
+ { LayerData Variable 2 }
+ }
+}
+
+// Sim status, condition of this sim
+// sent reliably, when dirty
+{
+ SimStatus Medium 12 Trusted Unencoded
+ {
+ SimStatus Single
+ { CanAcceptAgents BOOL }
+ { CanAcceptTasks BOOL }
+ }
+ {
+ SimFlags Single
+ { Flags U64 }
+ }
+}
+
+// Child Agent Update - agents send child agents to neighboring simulators.
+// This will create a child camera if there isn't one at the target already
+// Can't send viewer IP and port between simulators -- the port may get remapped
+// if the viewer is behind a Network Address Translation (NAT) box.
+//
+// Note: some of the fields of this message really only need to be sent when an
+// agent crosses a region boundary and changes from a child to a main agent
+// (such as Head/BodyRotation, ControlFlags, Animations etc)
+// simulator -> simulator
+// reliable
+{
+ ChildAgentUpdate High 25 Trusted Zerocoded
+ {
+ AgentData Single
+
+ { RegionHandle U64 }
+ { ViewerCircuitCode U32 }
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+
+ { AgentPos LLVector3 }
+ { AgentVel LLVector3 }
+ { Center LLVector3 }
+ { Size LLVector3 }
+ { AtAxis LLVector3 }
+ { LeftAxis LLVector3 }
+ { UpAxis LLVector3 }
+ { ChangedGrid BOOL }
+
+ { Far F32 }
+ { Aspect F32 }
+ { Throttles Variable 1 }
+ { LocomotionState U32 }
+ { HeadRotation LLQuaternion }
+ { BodyRotation LLQuaternion }
+ { ControlFlags U32 }
+ { EnergyLevel F32 }
+ { GodLevel U8 } // Changed from BOOL to U8, and renamed GodLevel (from Godlike)
+ { AlwaysRun BOOL }
+ { PreyAgent LLUUID }
+ { AgentAccess U8 }
+ { AgentTextures Variable 2 }
+ { ActiveGroupID LLUUID }
+ }
+ {
+ GroupData Variable
+ { GroupID LLUUID }
+ { GroupPowers U64 }
+ { AcceptNotices BOOL }
+ }
+ {
+ AnimationData Variable
+ { Animation LLUUID }
+ { ObjectID LLUUID }
+ }
+ {
+ GranterBlock Variable
+ { GranterID LLUUID }
+ }
+ {
+ NVPairData Variable
+ { NVPairs Variable 2 }
+ }
+ {
+ VisualParam Variable
+ { ParamValue U8 }
+ }
+ {
+ AgentAccess Variable
+ { AgentLegacyAccess U8 }
+ { AgentMaxAccess U8 }
+ }
+ {
+ AgentInfo Variable
+ { Flags U32 }
+ }
+ {
+ AgentInventoryHost Variable
+ { InventoryHost Variable 1 } //String
+ }
+}
+
+// ChildAgentAlive
+// sent to child agents just to keep them alive
+{
+ ChildAgentAlive High 26 Trusted Unencoded
+ {
+ AgentData Single
+ { RegionHandle U64 }
+ { ViewerCircuitCode U32 }
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+}
+
+// ChildAgentPositionUpdate
+// sent to child agents just to keep them alive
+{
+ ChildAgentPositionUpdate High 27 Trusted Unencoded
+ {
+ AgentData Single
+
+ { RegionHandle U64 }
+ { ViewerCircuitCode U32 }
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+
+ { AgentPos LLVector3 }
+ { AgentVel LLVector3 }
+ { Center LLVector3 }
+ { Size LLVector3 }
+ { AtAxis LLVector3 }
+ { LeftAxis LLVector3 }
+ { UpAxis LLVector3 }
+ { ChangedGrid BOOL }
+ }
+}
+
+
+// Obituary for child agents - make sure the parent know the child is dead
+// This way, children can be reliably restarted
+{
+ ChildAgentDying Low 240 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+}
+
+
+// This is sent if a full child agent hasn't been accepted yet
+{
+ ChildAgentUnknown Low 241 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+}
+
+
+// This message is sent how objects get passed between regions.
+{
+ AtomicPassObject High 28 Trusted Unencoded
+ {
+ TaskData Single
+ { TaskID LLUUID }
+ { AttachmentNeedsSave BOOL } // true iff is attachment and needs asset saved
+ }
+}
+
+
+// KillChildAgents - A new agent has connected to the simulator . . . make sure that any old child cameras are blitzed
+{
+ KillChildAgents Low 242 Trusted Unencoded
+ {
+ IDBlock Single
+ { AgentID LLUUID }
+ }
+}
+
+
+// GetScriptRunning - asks if a script is running or not. the simulator
+// responds with ScriptRunningReply
+{
+ GetScriptRunning Low 243 NotTrusted Unencoded
+ {
+ Script Single
+ { ObjectID LLUUID }
+ { ItemID LLUUID }
+ }
+}
+
+// ScriptRunningReply - response from simulator to message above
+{
+ ScriptRunningReply Low 244 NotTrusted Unencoded UDPDeprecated
+ {
+ Script Single
+ { ObjectID LLUUID }
+ { ItemID LLUUID }
+ { Running BOOL }
+// { Mono BOOL } Added to LLSD message
+ }
+}
+
+
+// SetScriptRunning - makes a script active or inactive (Enable may be
+// true or false)
+{
+ SetScriptRunning Low 245 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Script Single
+ { ObjectID LLUUID }
+ { ItemID LLUUID }
+ { Running BOOL }
+ }
+}
+
+// ScriptReset - causes a script to reset
+{
+ ScriptReset Low 246 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Script Single
+ { ObjectID LLUUID }
+ { ItemID LLUUID }
+ }
+}
+
+// ScriptSensorRequest - causes the receiving sim to run a script sensor and return the results
+{
+ ScriptSensorRequest Low 247 Trusted Zerocoded
+ {
+ Requester Single
+ { SourceID LLUUID }
+ { RequestID LLUUID }
+ { SearchID LLUUID }
+ { SearchPos LLVector3 }
+ { SearchDir LLQuaternion }
+ { SearchName Variable 1 }
+ { Type S32 }
+ { Range F32 }
+ { Arc F32 }
+ { RegionHandle U64 }
+ { SearchRegions U8 }
+ }
+}
+
+// ScriptSensorReply - returns the request script search information back to the requester
+{
+ ScriptSensorReply Low 248 Trusted Zerocoded
+ {
+ Requester Single
+ { SourceID LLUUID }
+ }
+ {
+ SensedData Variable
+ { ObjectID LLUUID }
+ { OwnerID LLUUID }
+ { GroupID LLUUID }
+ { Position LLVector3 }
+ { Velocity LLVector3 }
+ { Rotation LLQuaternion }
+ { Name Variable 1 }
+ { Type S32 }
+ { Range F32 }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Login and Agent Motion
+//-----------------------------------------------------------------------------
+
+// viewer -> sim
+// agent is coming into the region. The region should be expecting the
+// agent.
+{
+ CompleteAgentMovement Low 249 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { CircuitCode U32 }
+ }
+}
+
+// sim -> viewer
+{
+ AgentMovementComplete Low 250 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { Position LLVector3 }
+ { LookAt LLVector3 }
+ { RegionHandle U64 }
+ { Timestamp U32 }
+ }
+ {
+ SimData Single
+ { ChannelVersion Variable 2 }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Logout
+//-----------------------------------------------------------------------------
+
+// userserver -> dataserver
+{
+ DataServerLogout Low 251 Trusted Unencoded
+ {
+ UserData Single
+ { AgentID LLUUID }
+ { ViewerIP IPADDR }
+ { Disconnect BOOL }
+ { SessionID LLUUID }
+ }
+}
+
+// LogoutRequest
+// viewer -> sim
+// reliable
+{
+ LogoutRequest Low 252 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+}
+
+
+// LogoutReply
+// it's ok for the viewer to quit.
+// sim -> viewer
+// reliable
+// Includes inventory items to update with new asset ids
+{
+ LogoutReply Low 253 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ InventoryData Variable
+ { ItemID LLUUID } // null if list is actually empty (but has one entry 'cause it can't have none)
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Instant Message
+//-----------------------------------------------------------------------------
+
+// ImprovedInstantMessage
+// This message can potentially route all over the place
+// ParentEstateID: parent estate id of the source estate
+// RegionID: region id of the source of the IM.
+// Position: position of the sender in region local coordinates
+// Dialog see llinstantmessage.h for values
+// ID May be used by dialog. Interpretation depends on context.
+// BinaryBucket May be used by some dialog types
+// reliable
+{
+ ImprovedInstantMessage Low 254 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ MessageBlock Single
+ { FromGroup BOOL }
+ { ToAgentID LLUUID }
+ { ParentEstateID U32 }
+ { RegionID LLUUID }
+ { Position LLVector3 }
+ { Offline U8 }
+ { Dialog U8 } // U8 - IM type
+ { ID LLUUID }
+ { Timestamp U32 }
+ { FromAgentName Variable 1 }
+ { Message Variable 2 }
+ { BinaryBucket Variable 2 }
+ }
+ {
+ EstateBlock Single
+ { EstateID U32 }
+ }
+ {
+ MetaData Variable
+ { Data Variable 2 }
+ }
+}
+
+// RetrieveInstantMessages - used to get instant messages that
+// were persisted out to the database while the user was offline
+// Sent from viewer->simulator. Also see RetrieveIMsExtended (back-end only)
+{
+ RetrieveInstantMessages Low 255 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+}
+
+// FindAgent - used to find an agent's global position. I used a
+// variable sized LocationBlock so that the message can be recycled with
+// minimum new messages and handlers.
+{
+ FindAgent Low 256 NotTrusted Unencoded
+ {
+ AgentBlock Single
+ { Hunter LLUUID }
+ { Prey LLUUID }
+ { SpaceIP IPADDR }
+ }
+ {
+ LocationBlock Variable
+ { GlobalX F64 }
+ { GlobalY F64 }
+ }
+}
+
+// Set godlike to 1 if you want to become godlike.
+// Set godlike to 0 if you want to relinquish god powers.
+// viewer -> simulator -> dataserver
+// reliable
+{
+ RequestGodlikePowers Low 257 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ RequestBlock Single
+ { Godlike BOOL }
+ { Token LLUUID } // viewer packs a null, sim packs token
+ }
+}
+
+// At the simulator, turn the godlike bit on.
+// At the viewer, show the god menu.
+// dataserver -> simulator -> viewer
+// reliable
+{
+ GrantGodlikePowers Low 258 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ GrantData Single
+ { GodLevel U8 }
+ { Token LLUUID } // checked on sim, ignored on viewer
+ }
+}
+
+// GodlikeMessage - generalized construct for Gods to send messages
+// around the system. Each Request has it's own internal protocol.
+{
+ GodlikeMessage Low 259 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { TransactionID LLUUID }
+ }
+ {
+ MethodData Single
+ { Method Variable 1 }
+ { Invoice LLUUID }
+ }
+ {
+ ParamList Variable
+ { Parameter Variable 1 }
+ }
+}
+
+// EstateOwnerMessage
+// format must be identical to above
+{
+ EstateOwnerMessage Low 260 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { TransactionID LLUUID }
+ }
+ {
+ MethodData Single
+ { Method Variable 1 }
+ { Invoice LLUUID }
+ }
+ {
+ ParamList Variable
+ { Parameter Variable 1 }
+ }
+}
+
+// GenericMessage
+// format must be identical to above
+// As above, but don't have to be god or estate owner to send.
+{
+ GenericMessage Low 261 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { TransactionID LLUUID }
+ }
+ {
+ MethodData Single
+ { Method Variable 1 }
+ { Invoice LLUUID }
+ }
+ {
+ ParamList Variable
+ { Parameter Variable 1 }
+ }
+}
+
+// GenericStreamingMessage
+// Optimized generic message for streaming arbitrary data to viewer
+// Avoid payloads over 7KB (8KB ceiling)
+// Method -- magic number indicating method to use to decode payload:
+// 0x4175 - GLTF material override data
+// Payload -- data to be decoded
+{
+ GenericStreamingMessage High 31 Trusted Unencoded
+ {
+ MethodData Single
+ { Method U16 }
+ }
+
+ {
+ DataBlock Single
+ { Data Variable 2 }
+ }
+}
+
+// LargeGenericMessage
+// Similar to the above messages, but can handle larger payloads and serialized
+// LLSD. Uses HTTP transport
+{
+ LargeGenericMessage Low 430 NotTrusted Unencoded UDPDeprecated
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { TransactionID LLUUID }
+ }
+ {
+ MethodData Single
+ { Method Variable 1 }
+ { Invoice LLUUID }
+ }
+ {
+ ParamList Variable
+ { Parameter Variable 2 }
+ }
+}
+
+// ***************************************************************************
+// Requests for possessions, acquisition, money, etc
+// ***************************************************************************
+
+// request for mute list
+{
+ MuteListRequest Low 262 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ MuteData Single
+ { MuteCRC U32 }
+ }
+}
+
+// update/add someone in the mute list
+{
+ UpdateMuteListEntry Low 263 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ MuteData Single
+ { MuteID LLUUID }
+ { MuteName Variable 1 }
+ { MuteType S32 }
+ { MuteFlags U32 }
+ }
+}
+
+// Remove a mute list entry.
+{
+ RemoveMuteListEntry Low 264 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ MuteData Single
+ { MuteID LLUUID }
+ { MuteName Variable 1 }
+ }
+}
+
+
+//
+// Inventory update messages
+// UDP DEPRECATED - Now a viewer capability.
+
+{
+ CopyInventoryFromNotecard Low 265 NotTrusted Zerocoded UDPDeprecated
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ NotecardData Single
+ { NotecardItemID LLUUID }
+ { ObjectID LLUUID }
+ }
+ {
+ InventoryData Variable
+ { ItemID LLUUID }
+ { FolderID LLUUID }
+ }
+}
+
+//
+// This is used bi-directionally between sim, dataserver, and viewer.
+// THIS MESSAGE CAN NOT CREATE NEW INVENTORY ITEMS.
+//
+{
+ UpdateInventoryItem Low 266 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { TransactionID LLUUID }
+ }
+ {
+ InventoryData Variable
+ { ItemID LLUUID }
+ { FolderID LLUUID }
+ { CallbackID U32 } // Async Response
+
+ { CreatorID LLUUID } // permissions
+ { OwnerID LLUUID } // permissions
+ { GroupID LLUUID } // permissions
+ { BaseMask U32 } // permissions
+ { OwnerMask U32 } // permissions
+ { GroupMask U32 } // permissions
+ { EveryoneMask U32 } // permissions
+ { NextOwnerMask U32 } // permissions
+ { GroupOwned BOOL } // permissions
+
+ { TransactionID LLUUID } // TransactionID: new assets only
+ { Type S8 }
+ { InvType S8 }
+ { Flags U32 }
+ { SaleType U8 }
+ { SalePrice S32 }
+ { Name Variable 1 }
+ { Description Variable 1 }
+ { CreationDate S32 }
+ { CRC U32 }
+ }
+}
+
+//
+// For sim to request update/create.
+// DO NOT ALLOW THIS FROM THE VIEWER.
+//
+{
+ UpdateCreateInventoryItem Low 267 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SimApproved BOOL }
+ { TransactionID LLUUID }
+ }
+ {
+ InventoryData Variable
+ { ItemID LLUUID }
+ { FolderID LLUUID }
+ { CallbackID U32 } // Async Response
+
+ { CreatorID LLUUID } // permissions
+ { OwnerID LLUUID } // permissions
+ { GroupID LLUUID } // permissions
+ { BaseMask U32 } // permissions
+ { OwnerMask U32 } // permissions
+ { GroupMask U32 } // permissions
+ { EveryoneMask U32 } // permissions
+ { NextOwnerMask U32 } // permissions
+ { GroupOwned BOOL } // permissions
+
+ { AssetID LLUUID }
+ { Type S8 }
+ { InvType S8 }
+ { Flags U32 }
+ { SaleType U8 }
+ { SalePrice S32 }
+ { Name Variable 1 }
+ { Description Variable 1 }
+ { CreationDate S32 }
+ { CRC U32 }
+ }
+}
+
+{
+ MoveInventoryItem Low 268 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { Stamp BOOL } // should the server re-timestamp?
+ }
+ {
+ InventoryData Variable
+ { ItemID LLUUID }
+ { FolderID LLUUID }
+ { NewName Variable 1 }
+ }
+}
+
+// copy inventory item by item id to specified destination folder,
+// send out bulk inventory update when done.
+//
+// Inventory items are only unique for {agent, inv_id} pairs;
+// the OldItemID needs to be paired with the OldAgentID to
+// produce a unique inventory item.
+{
+ CopyInventoryItem Low 269 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ InventoryData Variable
+ { CallbackID U32 } // Async response
+ { OldAgentID LLUUID }
+ { OldItemID LLUUID }
+ { NewFolderID LLUUID }
+ { NewName Variable 1 }
+ }
+}
+
+{
+ RemoveInventoryItem Low 270 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ InventoryData Variable
+ { ItemID LLUUID }
+ }
+}
+
+{
+ ChangeInventoryItemFlags Low 271 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ InventoryData Variable
+ { ItemID LLUUID }
+ { Flags U32 }
+ }
+}
+
+//
+// Sim outgoing only (to dataserver, to viewer)
+// NOT viewer to sim, sim should not have handler, ever
+// This message is currently only uses objects, so the viewer ignores
+// the asset id.
+{
+ SaveAssetIntoInventory Low 272 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ InventoryData Single
+ { ItemID LLUUID }
+ { NewAssetID LLUUID }
+ }
+}
+
+{
+ CreateInventoryFolder Low 273 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ FolderData Single
+ { FolderID LLUUID }
+ { ParentID LLUUID }
+ { Type S8 }
+ { Name Variable 1 }
+ }
+}
+
+{
+ UpdateInventoryFolder Low 274 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ FolderData Variable
+ { FolderID LLUUID }
+ { ParentID LLUUID }
+ { Type S8 }
+ { Name Variable 1 }
+ }
+}
+
+{
+ MoveInventoryFolder Low 275 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { Stamp BOOL } // should the server re-timestamp children
+ }
+ {
+ InventoryData Variable
+ { FolderID LLUUID }
+ { ParentID LLUUID }
+ }
+}
+
+{
+ RemoveInventoryFolder Low 276 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ FolderData Variable
+ { FolderID LLUUID }
+ }
+}
+
+// Get inventory segment.
+{
+ FetchInventoryDescendents Low 277 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ InventoryData Single
+ { FolderID LLUUID }
+ { OwnerID LLUUID }
+ { SortOrder S32 } // 0 = name, 1 = time
+ { FetchFolders BOOL } // false will omit folders in query
+ { FetchItems BOOL } // false will omit items in query
+ }
+}
+
+// return inventory segment.
+// *NOTE: This could be compressed more since we already know the
+// parent_id for folders and the folder_id for items, but this is
+// reasonable until we heve server side inventory.
+{
+ InventoryDescendents Low 278 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { FolderID LLUUID }
+ { OwnerID LLUUID } // owner of the folders creatd.
+ { Version S32 } // version of the folder for caching
+ { Descendents S32 } // count to help with caching
+ }
+ {
+ FolderData Variable
+ { FolderID LLUUID }
+ { ParentID LLUUID }
+ { Type S8 }
+ { Name Variable 1 }
+ }
+ {
+ ItemData Variable
+ { ItemID LLUUID }
+ { FolderID LLUUID }
+ { CreatorID LLUUID } // permissions
+ { OwnerID LLUUID } // permissions
+ { GroupID LLUUID } // permissions
+ { BaseMask U32 } // permissions
+ { OwnerMask U32 } // permissions
+ { GroupMask U32 } // permissions
+ { EveryoneMask U32 } // permissions
+ { NextOwnerMask U32 } // permissions
+ { GroupOwned BOOL } // permissions
+ { AssetID LLUUID }
+ { Type S8 }
+ { InvType S8 }
+ { Flags U32 }
+ { SaleType U8 }
+ { SalePrice S32 }
+ { Name Variable 1 }
+ { Description Variable 1 }
+ { CreationDate S32 }
+ { CRC U32 }
+ }
+}
+
+// Get inventory item(s) - response comes through FetchInventoryReply
+{
+ FetchInventory Low 279 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ InventoryData Variable
+ { OwnerID LLUUID }
+ { ItemID LLUUID }
+ }
+}
+
+// response to fetch inventory
+{
+ FetchInventoryReply Low 280 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ InventoryData Variable
+ { ItemID LLUUID }
+ { FolderID LLUUID }
+
+ { CreatorID LLUUID } // permissions
+ { OwnerID LLUUID } // permissions
+ { GroupID LLUUID } // permissions
+ { BaseMask U32 } // permissions
+ { OwnerMask U32 } // permissions
+ { GroupMask U32 } // permissions
+ { EveryoneMask U32 } // permissions
+ { NextOwnerMask U32 } // permissions
+ { GroupOwned BOOL } // permissions
+
+ { AssetID LLUUID }
+ { Type S8 }
+ { InvType S8 }
+ { Flags U32 }
+ { SaleType U8 }
+ { SalePrice S32 }
+ { Name Variable 1 }
+ { Description Variable 1 }
+ { CreationDate S32 }
+ { CRC U32 }
+ }
+}
+
+// Can only fit around 7 items per packet - that's the way it goes. At
+// least many bulk updates can be packed.
+// Only from dataserver->sim->viewer
+{
+ BulkUpdateInventory Low 281 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { TransactionID LLUUID }
+ }
+ {
+ FolderData Variable
+ { FolderID LLUUID }
+ { ParentID LLUUID }
+ { Type S8 }
+ { Name Variable 1 }
+ }
+ {
+ ItemData Variable
+ { ItemID LLUUID }
+ { CallbackID U32 } // Async Response
+ { FolderID LLUUID }
+ { CreatorID LLUUID } // permissions
+ { OwnerID LLUUID } // permissions
+ { GroupID LLUUID } // permissions
+ { BaseMask U32 } // permissions
+ { OwnerMask U32 } // permissions
+ { GroupMask U32 } // permissions
+ { EveryoneMask U32 } // permissions
+ { NextOwnerMask U32 } // permissions
+ { GroupOwned BOOL } // permissions
+ { AssetID LLUUID }
+ { Type S8 }
+ { InvType S8 }
+ { Flags U32 }
+ { SaleType U8 }
+ { SalePrice S32 }
+ { Name Variable 1 }
+ { Description Variable 1 }
+ { CreationDate S32 }
+ { CRC U32 }
+ }
+}
+
+
+
+// request permissions for agent id to get the asset for owner_id's
+// item_id.
+{
+ RequestInventoryAsset Low 282 Trusted Unencoded
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ { AgentID LLUUID }
+ { OwnerID LLUUID }
+ { ItemID LLUUID }
+ }
+}
+
+// response to RequestInventoryAsset
+// lluuid will be null if agentid in the request above cannot read asset
+{
+ InventoryAssetResponse Low 283 Trusted Unencoded
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ { AssetID LLUUID }
+ { IsReadable BOOL }
+ }
+}
+
+// This is the new improved way to remove inventory items. It is
+// currently only supported in viewer->userserver->dataserver
+// messages typically initiated by an empty trash method.
+{
+ RemoveInventoryObjects Low 284 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ FolderData Variable
+ { FolderID LLUUID }
+ }
+ {
+ ItemData Variable
+ { ItemID LLUUID }
+ }
+}
+
+// This is how you remove inventory when you're not even sure what it
+// is - only it's parenting.
+{
+ PurgeInventoryDescendents Low 285 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ InventoryData Single
+ { FolderID LLUUID }
+ }
+}
+
+// These messages are viewer->simulator requests to update a task's
+// inventory.
+// if Key == 0, itemid is the key. if Key == 1, assetid is the key.
+{
+ UpdateTaskInventory Low 286 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ UpdateData Single
+ { LocalID U32 }
+ { Key U8 }
+ }
+ {
+ InventoryData Single
+ { ItemID LLUUID }
+ { FolderID LLUUID }
+ { CreatorID LLUUID } // permissions
+ { OwnerID LLUUID } // permissions
+ { GroupID LLUUID } // permissions
+ { BaseMask U32 } // permissions
+ { OwnerMask U32 } // permissions
+ { GroupMask U32 } // permissions
+ { EveryoneMask U32 } // permissions
+ { NextOwnerMask U32 } // permissions
+ { GroupOwned BOOL } // permissions
+ { TransactionID LLUUID }
+ { Type S8 }
+ { InvType S8 }
+ { Flags U32 }
+ { SaleType U8 }
+ { SalePrice S32 }
+ { Name Variable 1 }
+ { Description Variable 1 }
+ { CreationDate S32 }
+ { CRC U32 }
+ }
+}
+
+{
+ RemoveTaskInventory Low 287 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ InventoryData Single
+ { LocalID U32 }
+ { ItemID LLUUID }
+ }
+}
+
+{
+ MoveTaskInventory Low 288 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { FolderID LLUUID }
+ }
+ {
+ InventoryData Single
+ { LocalID U32 }
+ { ItemID LLUUID }
+ }
+}
+
+{
+ RequestTaskInventory Low 289 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ InventoryData Single
+ { LocalID U32 }
+ }
+}
+
+{
+ ReplyTaskInventory Low 290 Trusted Zerocoded
+ {
+ InventoryData Single
+ { TaskID LLUUID }
+ { Serial S16 } // S16
+ { Filename Variable 1 }
+ }
+}
+
+// These messages are viewer->simulator requests regarding objects
+// which are currently being simulated. The viewer will get an
+// UpdateInventoryItem response if a DeRez succeeds, and the object
+// will appear if a RezObject succeeds.
+// The Destination field tells where the derez should wind up, and the
+// meaning of DestinationID depends on it. For example, if the
+// destination is a category, then the destination is the category id. If
+// the destination is a task inventory, then the destination id is the
+// task id.
+// The transaction id is generated by the viewer on derez, and then
+// the packets are counted and numbered. The rest of the information is
+// just duplicated (it's not that much, and derezzes that span multiple
+// packets will be rare.)
+{
+ DeRezObject Low 291 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ AgentBlock Single
+ { GroupID LLUUID }
+ { Destination U8 }
+ { DestinationID LLUUID } // see above
+ { TransactionID LLUUID }
+ { PacketCount U8 }
+ { PacketNumber U8 }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 } // object id in world
+ }
+}
+
+// This message is sent when a derez succeeds, but there's no way to
+// know, since no inventory is created on the viewer. For example, when
+// saving into task inventory.
+{
+ DeRezAck Low 292 Trusted Unencoded
+ {
+ TransactionData Single
+ { TransactionID LLUUID }
+ { Success BOOL }
+ }
+}
+
+// This message is sent from viewer -> simulator when the viewer wants
+// to rez an object out of inventory.
+{
+ RezObject Low 293 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ RezData Single
+ { FromTaskID LLUUID }
+ { BypassRaycast U8 }
+ { RayStart LLVector3 }
+ { RayEnd LLVector3 }
+ { RayTargetID LLUUID }
+ { RayEndIsIntersection BOOL }
+ { RezSelected BOOL }
+ { RemoveItem BOOL }
+ { ItemFlags U32 }
+ { GroupMask U32 }
+ { EveryoneMask U32 }
+ { NextOwnerMask U32 }
+ }
+ {
+ InventoryData Single
+ { ItemID LLUUID }
+ { FolderID LLUUID }
+ { CreatorID LLUUID } // permissions
+ { OwnerID LLUUID } // permissions
+ { GroupID LLUUID } // permissions
+ { BaseMask U32 } // permissions
+ { OwnerMask U32 } // permissions
+ { GroupMask U32 } // permissions
+ { EveryoneMask U32 } // permissions
+ { NextOwnerMask U32 } // permissions
+ { GroupOwned BOOL } // permissions
+ { TransactionID LLUUID }
+ { Type S8 }
+ { InvType S8 }
+ { Flags U32 }
+ { SaleType U8 }
+ { SalePrice S32 }
+ { Name Variable 1 }
+ { Description Variable 1 }
+ { CreationDate S32 }
+ { CRC U32 }
+ }
+}
+
+// This message is sent from viewer -> simulator when the viewer wants
+// to rez an object from a notecard.
+{
+ RezObjectFromNotecard Low 294 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ RezData Single
+ { FromTaskID LLUUID }
+ { BypassRaycast U8 }
+ { RayStart LLVector3 }
+ { RayEnd LLVector3 }
+ { RayTargetID LLUUID }
+ { RayEndIsIntersection BOOL }
+ { RezSelected BOOL }
+ { RemoveItem BOOL }
+ { ItemFlags U32 }
+ { GroupMask U32 }
+ { EveryoneMask U32 }
+ { NextOwnerMask U32 }
+ }
+ {
+ NotecardData Single
+ { NotecardItemID LLUUID }
+ { ObjectID LLUUID }
+ }
+ {
+ InventoryData Variable
+ { ItemID LLUUID }
+ }
+}
+
+
+// sim -> dataserver
+// sent during agent to agent inventory transfers
+{
+ TransferInventory Low 295 Trusted Zerocoded
+ {
+ InfoBlock Single
+ { SourceID LLUUID }
+ { DestID LLUUID }
+ { TransactionID LLUUID }
+ }
+ {
+ InventoryBlock Variable
+ { InventoryID LLUUID }
+ { Type S8 }
+ }
+ {
+ ValidationBlock Single
+ { NeedsValidation BOOL }
+ { EstateID U32 }
+ }
+}
+
+// dataserver -> sim
+// InventoryID is the id of the inventory object that the end user
+// should discard if they deny the transfer.
+{
+ TransferInventoryAck Low 296 Trusted Zerocoded
+ {
+ InfoBlock Single
+ { TransactionID LLUUID }
+ { InventoryID LLUUID }
+ }
+}
+
+
+{
+ AcceptFriendship Low 297 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ TransactionBlock Single
+ { TransactionID LLUUID }
+ }
+ {
+ FolderData Variable
+ { FolderID LLUUID } // place to put calling card.
+ }
+}
+
+{
+ DeclineFriendship Low 298 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ TransactionBlock Single
+ { TransactionID LLUUID }
+ }
+}
+
+{
+ FormFriendship Low 299 Trusted Unencoded
+ {
+ AgentBlock Single
+ { SourceID LLUUID }
+ { DestID LLUUID }
+ }
+}
+
+// Cancels user relationship
+// Updates inventory for both users.
+// Stops agent tracking in userserver.
+// viewer -> userserver -> dataserver
+// reliable
+{
+ TerminateFriendship Low 300 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ExBlock Single
+ { OtherID LLUUID }
+ }
+}
+
+// used to give someone a calling card.
+{
+ OfferCallingCard Low 301 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ AgentBlock Single
+ { DestID LLUUID }
+ { TransactionID LLUUID }
+ }
+}
+
+{
+ AcceptCallingCard Low 302 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ TransactionBlock Single
+ { TransactionID LLUUID }
+ }
+ {
+ FolderData Variable
+ { FolderID LLUUID } // place to put calling card.
+ }
+}
+
+{
+ DeclineCallingCard Low 303 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ TransactionBlock Single
+ { TransactionID LLUUID }
+ }
+}
+
+
+// Rez a script onto an object
+{
+ RezScript Low 304 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ UpdateBlock Single
+ { ObjectLocalID U32 } // object id in world
+ { Enabled BOOL } // is script rezzed in enabled?
+ }
+ {
+ InventoryBlock Single
+ { ItemID LLUUID }
+ { FolderID LLUUID }
+ { CreatorID LLUUID } // permissions
+ { OwnerID LLUUID } // permissions
+ { GroupID LLUUID } // permissions
+ { BaseMask U32 } // permissions
+ { OwnerMask U32 } // permissions
+ { GroupMask U32 } // permissions
+ { EveryoneMask U32 } // permissions
+ { NextOwnerMask U32 } // permissions
+ { GroupOwned BOOL } // permissions
+ { TransactionID LLUUID }
+ { Type S8 }
+ { InvType S8 }
+ { Flags U32 }
+ { SaleType U8 }
+ { SalePrice S32 }
+ { Name Variable 1 }
+ { Description Variable 1 }
+ { CreationDate S32 }
+ { CRC U32 }
+ }
+}
+
+// Create inventory
+{
+ CreateInventoryItem Low 305 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ InventoryBlock Single
+ { CallbackID U32 } // Async Response
+ { FolderID LLUUID }
+ { TransactionID LLUUID } // Going to become TransactionID
+ { NextOwnerMask U32 }
+ { Type S8 }
+ { InvType S8 }
+ { WearableType U8 }
+ { Name Variable 1 }
+ { Description Variable 1 }
+ }
+}
+
+// give agent a landmark for an event.
+{
+ CreateLandmarkForEvent Low 306 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ EventData Single
+ { EventID U32 }
+ }
+ {
+ InventoryBlock Single
+ { FolderID LLUUID }
+ { Name Variable 1 }
+ }
+}
+
+{
+ EventLocationRequest Low 307 Trusted Zerocoded
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ }
+ {
+ EventData Single
+ { EventID U32 }
+ }
+}
+
+{
+ EventLocationReply Low 308 Trusted Zerocoded
+ {
+ QueryData Single
+ { QueryID LLUUID }
+ }
+ {
+ EventData Single
+ { Success BOOL }
+ { RegionID LLUUID }
+ { RegionPos LLVector3 }
+ }
+}
+
+// get information about landmarks. Used by viewers for determining
+// the location of a landmark, and by simulators for teleport
+{
+ RegionHandleRequest Low 309 NotTrusted Unencoded
+ {
+ RequestBlock Single
+ { RegionID LLUUID }
+ }
+}
+
+{
+ RegionIDAndHandleReply Low 310 Trusted Unencoded
+ {
+ ReplyBlock Single
+ { RegionID LLUUID }
+ { RegionHandle U64 }
+ }
+}
+
+// Move money from one agent to another. Validation will happen at the
+// simulator, the dataserver will actually do the work. Dataserver
+// generates a MoneyBalance message in reply. The simulator
+// will generate a MoneyTransferBackend in response to this.
+// viewer -> simulator -> dataserver
+{
+ MoneyTransferRequest Low 311 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ MoneyData Single
+ { SourceID LLUUID }
+ { DestID LLUUID } // destination of the transfer
+ { Flags U8 }
+ { Amount S32 }
+ { AggregatePermNextOwner U8 }
+ { AggregatePermInventory U8 }
+ { TransactionType S32 } // see lltransactiontypes.h
+ { Description Variable 1 } // string, name of item for purchases
+ }
+}
+
+// And, the money transfer
+// *NOTE: Unused as of 2010-04-06, because all back-end money transactions
+// are done with web services via L$ API. JC
+{
+ MoneyTransferBackend Low 312 Trusted Zerocoded
+ {
+ MoneyData Single
+ { TransactionID LLUUID }
+ { TransactionTime U32 } // utc seconds since epoch
+ { SourceID LLUUID }
+ { DestID LLUUID } // destination of the transfer
+ { Flags U8 }
+ { Amount S32 }
+ { AggregatePermNextOwner U8 }
+ { AggregatePermInventory U8 }
+ { TransactionType S32 } // see lltransactiontypes.h
+ { RegionID LLUUID } // region sending the request, for logging
+ { GridX U32 } // *HACK: database doesn't have region_id in schema
+ { GridY U32 } // *HACK: database doesn't have region_id in schema
+ { Description Variable 1 } // string, name of item for purchases
+ }
+}
+
+
+// viewer -> userserver -> dataserver
+// Reliable
+{
+ MoneyBalanceRequest Low 313 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ MoneyData Single
+ { TransactionID LLUUID }
+ }
+}
+
+
+// dataserver -> simulator -> viewer
+{
+ MoneyBalanceReply Low 314 Trusted Zerocoded
+ {
+ MoneyData Single
+ { AgentID LLUUID }
+ { TransactionID LLUUID }
+ { TransactionSuccess BOOL }
+ { MoneyBalance S32 }
+ { SquareMetersCredit S32 }
+ { SquareMetersCommitted S32 }
+ { Description Variable 1 } // string
+ }
+ // For replies that are part of a transaction (buying something) provide
+ // metadata for localization. If TransactionType is 0, the message is
+ // purely a balance update. Added for server 1.40 and viewer 2.1. JC
+ {
+ TransactionInfo Single
+ { TransactionType S32 } // lltransactiontype.h
+ { SourceID LLUUID }
+ { IsSourceGroup BOOL }
+ { DestID LLUUID }
+ { IsDestGroup BOOL }
+ { Amount S32 }
+ { ItemDescription Variable 1 } // string
+ }
+}
+
+
+// RoutedMoneyBalanceReply
+// This message is used when a dataserver needs to send updated
+// money balance information to a simulator other than the one it
+// is connected to. It uses the standard TransferBlock format.
+// dataserver -> simulator -> spaceserver -> simulator -> viewer
+// reliable
+{
+ RoutedMoneyBalanceReply Low 315 Trusted Zerocoded UDPDeprecated
+ {
+ TargetBlock Single
+ { TargetIP IPADDR } // U32 encoded IP
+ { TargetPort IPPORT }
+ }
+ {
+ MoneyData Single
+ { AgentID LLUUID }
+ { TransactionID LLUUID }
+ { TransactionSuccess BOOL }
+ { MoneyBalance S32 }
+ { SquareMetersCredit S32 }
+ { SquareMetersCommitted S32 }
+ { Description Variable 1 } // string
+ }
+ // See MoneyBalanceReply above.
+ {
+ TransactionInfo Single
+ { TransactionType S32 } // lltransactiontype.h
+ { SourceID LLUUID }
+ { IsSourceGroup BOOL }
+ { DestID LLUUID }
+ { IsDestGroup BOOL }
+ { Amount S32 }
+ { ItemDescription Variable 1 } // string
+ }
+}
+
+
+
+//---------------------------------------------------------------------------
+// Gesture saves/loads
+//---------------------------------------------------------------------------
+
+
+// Tell the database that some gestures are now active
+// viewer -> sim -> data
+{
+ ActivateGestures Low 316 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { Flags U32 }
+ }
+ {
+ Data Variable
+ { ItemID LLUUID }
+ { AssetID LLUUID }
+ { GestureFlags U32 }
+ }
+}
+
+// Tell the database some gestures are no longer active
+// viewer -> sim -> data
+{
+ DeactivateGestures Low 317 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { Flags U32 }
+ }
+ {
+ Data Variable
+ { ItemID LLUUID }
+ { GestureFlags U32 }
+ }
+}
+
+//---------------------------------------------------------------------------
+//
+//---------------------------------------------------------------------------
+
+// userserver -> viewer, up-to-date inventory is here
+// could be sent as a result of spam
+// as well as in response to InventoryRequest
+//{
+// InventoryUpdate Low Trusted Unencoded
+// {
+// AgentData Single
+// { AgentID LLUUID }
+// }
+// {
+// InventoryData Single
+// { IsComplete U8 }
+// { Filename Variable 1 }
+// }
+//}
+
+// dataserver-> userserver -> viewer to move around the mute list
+{
+ MuteListUpdate Low 318 Trusted Unencoded
+ {
+ MuteData Single
+ { AgentID LLUUID }
+ { Filename Variable 1 }
+ }
+}
+
+// tell viewer to use the local mute cache
+{
+ UseCachedMuteList Low 319 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+}
+
+// Sent from viewer to simulator to set user rights. This message will be
+// relayed up to the dataserver through a PUT. If that
+// succeeds, an UpdateUserRights will be relayed to the originating
+// viewer, and a presence lookup will be performed to find
+// agent-related and the same PUT will be issued to the sim host if
+// they are online.
+{
+ GrantUserRights Low 320 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Rights Variable
+ { AgentRelated LLUUID }
+ { RelatedRights S32 }
+ }
+}
+
+// This message is sent from the simulator to the viewer to indicate a
+// targets granted rights. This is only sent to the originator of the
+// request and the target agent if it is a modify or map
+// right. Adding/removing online status rights will show up as an
+// online/offline notification.
+{
+ ChangeUserRights Low 321 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ Rights Variable
+ { AgentRelated LLUUID }
+ { RelatedRights S32 }
+ }
+}
+
+// notification for login and logout.
+// source_sim -> dest_viewer
+{
+ OnlineNotification Low 322 Trusted Unencoded
+ {
+ AgentBlock Variable
+ { AgentID LLUUID }
+ }
+}
+{
+ OfflineNotification Low 323 Trusted Unencoded
+ {
+ AgentBlock Variable
+ { AgentID LLUUID }
+ }
+}
+
+
+// SetStartLocationRequest
+// viewer -> sim
+// failure checked at sim and triggers ImprovedInstantMessage
+// success triggers SetStartLocation
+{
+ SetStartLocationRequest Low 324 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ StartLocationData Single
+ { SimName Variable 1 } // string
+ { LocationID U32 }
+ { LocationPos LLVector3 } // region coords
+ { LocationLookAt LLVector3 }
+ }
+}
+
+// SetStartLocation
+// sim -> dataserver
+{
+ SetStartLocation Low 325 Trusted Zerocoded
+ {
+ StartLocationData Single
+ { AgentID LLUUID }
+ { RegionID LLUUID }
+ { LocationID U32 }
+ { RegionHandle U64 }
+ { LocationPos LLVector3 } // region coords
+ { LocationLookAt LLVector3 }
+ }
+}
+
+
+// ***************************************************************************
+// Launcher messages
+// ***************************************************************************
+
+
+// NetTest - This goes back and forth to the space server because of
+// problems determining the port
+{
+ NetTest Low 326 NotTrusted Unencoded
+ {
+ NetBlock Single
+ { Port IPPORT }
+ }
+}
+
+// SetChildCount - Sent to launcher to adjust nominal child count
+// Simulator sends this increase the sim/cpu ratio on startup
+{
+ SetCPURatio Low 327 NotTrusted Unencoded
+ {
+ Data Single
+ { Ratio U8 }
+ }
+}
+
+
+
+// SimCrashed - Sent to dataserver when the sim goes down.
+// Maybe we should notify the spaceserver as well?
+{
+ SimCrashed Low 328 NotTrusted Unencoded
+ {
+ Data Single
+ { RegionX U32 }
+ { RegionY U32 }
+ }
+ {
+ Users Variable
+ { AgentID LLUUID }
+ }
+}
+
+// ***************************************************************************
+// Name Value Pair messages
+// ***************************************************************************
+
+// NameValuePair - if the specific task exists on simulator, add or replace this name value pair
+{
+ NameValuePair Low 329 Trusted Unencoded
+ {
+ TaskData Single
+ { ID LLUUID }
+ }
+ {
+ NameValueData Variable
+ { NVPair Variable 2 }
+ }
+}
+
+// NameValuePair - if the specific task exists on simulator or dataserver, remove the name value pair (value is ignored)
+{
+ RemoveNameValuePair Low 330 Trusted Unencoded
+ {
+ TaskData Single
+ { ID LLUUID }
+ }
+ {
+ NameValueData Variable
+ { NVPair Variable 2 }
+ }
+}
+
+
+// ***************************************************************************
+// Add/Remove Attachment messages
+// ***************************************************************************
+
+//
+// Simulator informs Dataserver of new attachment or attachment asset update
+// DO NOT ALLOW THIS FROM THE VIEWER
+//
+{
+ UpdateAttachment Low 331 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ AttachmentBlock Single
+ { AttachmentPoint U8 }
+ }
+ {
+ OperationData Single
+ { AddItem BOOL }
+ { UseExistingAsset BOOL }
+ }
+ {
+ InventoryData Single // Standard inventory item block
+ { ItemID LLUUID }
+ { FolderID LLUUID }
+
+ { CreatorID LLUUID } // permissions
+ { OwnerID LLUUID } // permissions
+ { GroupID LLUUID } // permissions
+ { BaseMask U32 } // permissions
+ { OwnerMask U32 } // permissions
+ { GroupMask U32 } // permissions
+ { EveryoneMask U32 } // permissions
+ { NextOwnerMask U32 } // permissions
+ { GroupOwned BOOL } // permissions
+
+ { AssetID LLUUID }
+ { Type S8 }
+ { InvType S8 }
+ { Flags U32 }
+ { SaleType U8 }
+ { SalePrice S32 }
+ { Name Variable 1 }
+ { Description Variable 1 }
+ { CreationDate S32 }
+ { CRC U32 }
+ }
+}
+
+// Simulator informs Dataserver that attachment has been taken off
+{
+ RemoveAttachment Low 332 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ AttachmentBlock Single
+ { AttachmentPoint U8 }
+ { ItemID LLUUID }
+ }
+}
+
+
+// ***************************************************************************
+// GUIDed Sound messages
+// ***************************************************************************
+
+// SoundTrigger - Sent by simulator to viewer to trigger sound outside current region
+{
+ SoundTrigger High 29 NotTrusted Unencoded
+ {
+ SoundData Single
+ { SoundID LLUUID }
+ { OwnerID LLUUID }
+ { ObjectID LLUUID }
+ { ParentID LLUUID } // null if this object is the parent
+ { Handle U64 } // region handle
+ { Position LLVector3 } // region local
+ { Gain F32 }
+ }
+}
+
+// AttachedSound - Sent by simulator to viewer to play sound attached with an object
+{
+ AttachedSound Medium 13 Trusted Unencoded
+ {
+ DataBlock Single
+ { SoundID LLUUID }
+ { ObjectID LLUUID }
+ { OwnerID LLUUID }
+ { Gain F32 }
+ { Flags U8 }
+ }
+}
+
+// AttachedSoundGainChange - Sent by simulator to viewer to change an attached sounds' volume
+
+{
+ AttachedSoundGainChange Medium 14 Trusted Unencoded
+ {
+ DataBlock Single
+ { ObjectID LLUUID }
+ { Gain F32 }
+ }
+}
+
+
+// PreloadSound - Sent by simulator to viewer to preload sound for an object
+
+{
+ PreloadSound Medium 15 Trusted Unencoded
+ {
+ DataBlock Variable
+ { ObjectID LLUUID }
+ { OwnerID LLUUID }
+ { SoundID LLUUID }
+ }
+}
+
+// *************************************************************************
+// Object animation messages
+// *************************************************************************
+
+// Note this is basically identical to AvatarAnimation.
+// Needs to be a different message because existing viewers
+// have insufficiently smart handler functions.
+
+// ObjectAnimation - Update animation state
+// simulator --> viewer
+{
+ ObjectAnimation High 30 Trusted Unencoded
+ {
+ Sender Single
+ { ID LLUUID }
+ }
+ {
+ AnimationList Variable
+ { AnimID LLUUID }
+ { AnimSequenceID S32 }
+ }
+}
+
+// *************************************************************************
+// Asset storage messages
+// *************************************************************************
+
+// current assumes an existing UUID, need to enhance for new assets
+{
+ AssetUploadRequest Low 333 NotTrusted Unencoded
+ {
+ AssetBlock Single
+ { TransactionID LLUUID }
+ { Type S8 }
+ { Tempfile BOOL }
+ { StoreLocal BOOL }
+ { AssetData Variable 2 } // Optional: the actual asset data if the whole thing will fit it this packet
+ }
+}
+
+{
+ AssetUploadComplete Low 334 NotTrusted Unencoded
+ {
+ AssetBlock Single
+ { UUID LLUUID }
+ { Type S8 }
+ { Success BOOL }
+ }
+}
+
+
+// Script on simulator asks dataserver if there are any email messages
+// waiting.
+{
+ EmailMessageRequest Low 335 Trusted Unencoded
+ {
+ DataBlock Single
+ { ObjectID LLUUID }
+ { FromAddress Variable 1 }
+ { Subject Variable 1 }
+ }
+}
+
+// Dataserver gives simulator the oldest email message in the queue, along with
+// how many messages are left in the queue. And passes back the filter used to request emails.
+{
+ EmailMessageReply Low 336 Trusted Unencoded
+ {
+ DataBlock Single
+ { ObjectID LLUUID }
+ { More U32 }
+ { Time U32 }
+ { FromAddress Variable 1 }
+ { Subject Variable 1 }
+ { Data Variable 2 }
+ { MailFilter Variable 1 }
+ }
+}
+
+// Script on simulator sends mail to another script
+{
+ InternalScriptMail Medium 16 Trusted Unencoded
+ {
+ DataBlock Single
+ { From Variable 1 }
+ { To LLUUID }
+ { Subject Variable 1 }
+ { Body Variable 2 }
+ }
+}
+
+// Script on simulator asks dataserver for information
+{
+ ScriptDataRequest Low 337 Trusted Unencoded
+ {
+ DataBlock Variable
+ { Hash U64 }
+ { RequestType S8 }
+ { Request Variable 2 }
+ }
+}
+
+// Data server responds with data
+{
+ ScriptDataReply Low 338 Trusted Unencoded
+ {
+ DataBlock Variable
+ { Hash U64 }
+ { Reply Variable 2 }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Group messages
+//-----------------------------------------------------------------------------
+
+// CreateGroupRequest
+// viewer -> simulator
+// reliable
+{
+ CreateGroupRequest Low 339 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ GroupData Single
+ { Name Variable 1 } // string
+ { Charter Variable 2 } // string
+ { ShowInList BOOL }
+ { InsigniaID LLUUID }
+ { MembershipFee S32 }
+ { OpenEnrollment BOOL }
+ { AllowPublish BOOL } // whether profile is externally visible or not
+ { MaturePublish BOOL } // profile is "mature"
+ }
+}
+
+// CreateGroupReply
+// dataserver -> simulator
+// simulator -> viewer
+// reliable
+{
+ CreateGroupReply Low 340 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ ReplyData Single
+ { GroupID LLUUID }
+ { Success BOOL }
+ { Message Variable 1 } // string
+ }
+}
+
+// UpdateGroupInfo
+// viewer -> simulator
+// simulator -> dataserver
+// reliable
+{
+ UpdateGroupInfo Low 341 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ GroupData Single
+ { GroupID LLUUID }
+ { Charter Variable 2 } // string
+ { ShowInList BOOL }
+ { InsigniaID LLUUID }
+ { MembershipFee S32 }
+ { OpenEnrollment BOOL }
+ { AllowPublish BOOL }
+ { MaturePublish BOOL }
+ }
+}
+
+// GroupRoleChanges
+// viewer -> simulator -> dataserver
+// reliable
+{
+ GroupRoleChanges Low 342 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ RoleChange Variable
+ { RoleID LLUUID }
+ { MemberID LLUUID }
+ { Change U32 }
+ }
+}
+
+// JoinGroupRequest
+// viewer -> simulator -> dataserver
+// reliable
+{
+ JoinGroupRequest Low 343 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ GroupData Single
+ { GroupID LLUUID }
+ }
+}
+
+// JoinGroupReply
+// dataserver -> simulator -> viewer
+{
+ JoinGroupReply Low 344 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ GroupData Single
+ { GroupID LLUUID }
+ { Success BOOL }
+ }
+}
+
+
+// EjectGroupMemberRequest
+// viewer -> simulator -> dataserver
+// reliable
+{
+ EjectGroupMemberRequest Low 345 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ GroupData Single
+ { GroupID LLUUID }
+ }
+ {
+ EjectData Variable
+ { EjecteeID LLUUID }
+ }
+}
+
+// EjectGroupMemberReply
+// dataserver -> simulator -> viewer
+// reliable
+{
+ EjectGroupMemberReply Low 346 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ GroupData Single
+ { GroupID LLUUID }
+ }
+ {
+ EjectData Single
+ { Success BOOL }
+ }
+}
+
+// LeaveGroupRequest
+// viewer -> simulator -> dataserver
+// reliable
+{
+ LeaveGroupRequest Low 347 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ GroupData Single
+ { GroupID LLUUID }
+ }
+}
+
+// LeaveGroupReply
+// dataserver -> simulator -> viewer
+{
+ LeaveGroupReply Low 348 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ GroupData Single
+ { GroupID LLUUID }
+ { Success BOOL }
+ }
+}
+
+// InviteGroupRequest
+// viewer -> simulator -> dataserver
+// reliable
+{
+ InviteGroupRequest Low 349 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID } // UUID of inviting agent
+ { SessionID LLUUID }
+ }
+ {
+ GroupData Single
+ { GroupID LLUUID }
+ }
+ {
+ InviteData Variable
+ { InviteeID LLUUID }
+ { RoleID LLUUID }
+ }
+}
+
+// InviteGroupResponse
+// simulator -> dataserver
+// reliable
+{
+ InviteGroupResponse Low 350 Trusted Unencoded
+ {
+ InviteData Single
+ { AgentID LLUUID }
+ { InviteeID LLUUID }
+ { GroupID LLUUID }
+ { RoleID LLUUID }
+ { MembershipFee S32 }
+ }
+ {
+ GroupData Single
+ { GroupLimit S32 } // Extra block for the agent's group limit
+ }
+}
+
+// GroupProfileRequest
+// viewer-> simulator -> dataserver
+// reliable
+{
+ GroupProfileRequest Low 351 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ GroupData Single
+ { GroupID LLUUID }
+ }
+}
+
+// GroupProfileReply
+// dataserver -> simulator -> viewer
+// reliable
+{
+ GroupProfileReply Low 352 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ GroupData Single
+ { GroupID LLUUID }
+ { Name Variable 1 } // string
+ { Charter Variable 2 } // string
+ { ShowInList BOOL }
+ { MemberTitle Variable 1 } // string
+ { PowersMask U64 }
+ { InsigniaID LLUUID }
+ { FounderID LLUUID }
+ { MembershipFee S32 }
+ { OpenEnrollment BOOL }
+ { Money S32 }
+ { GroupMembershipCount S32 }
+ { GroupRolesCount S32 }
+ { AllowPublish BOOL }
+ { MaturePublish BOOL }
+ { OwnerRole LLUUID }
+ }
+}
+
+// CurrentInterval = 0 => this period (week, day, etc.)
+// CurrentInterval = 1 => last period
+// viewer -> simulator -> dataserver
+// reliable
+{
+ GroupAccountSummaryRequest Low 353 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ MoneyData Single
+ { RequestID LLUUID }
+ { IntervalDays S32 }
+ { CurrentInterval S32 }
+ }
+}
+
+
+// dataserver -> simulator -> viewer
+// Reliable
+{
+ GroupAccountSummaryReply Low 354 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ MoneyData Single
+ { RequestID LLUUID }
+ { IntervalDays S32 }
+ { CurrentInterval S32 }
+ { StartDate Variable 1 } // string
+ { Balance S32 }
+ { TotalCredits S32 }
+ { TotalDebits S32 }
+ { ObjectTaxCurrent S32 }
+ { LightTaxCurrent S32 }
+ { LandTaxCurrent S32 }
+ { GroupTaxCurrent S32 }
+ { ParcelDirFeeCurrent S32 }
+ { ObjectTaxEstimate S32 }
+ { LightTaxEstimate S32 }
+ { LandTaxEstimate S32 }
+ { GroupTaxEstimate S32 }
+ { ParcelDirFeeEstimate S32 }
+ { NonExemptMembers S32 }
+ { LastTaxDate Variable 1 } // string
+ { TaxDate Variable 1 } // string
+ }
+}
+
+
+// Reliable
+{
+ GroupAccountDetailsRequest Low 355 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ MoneyData Single
+ { RequestID LLUUID }
+ { IntervalDays S32 }
+ { CurrentInterval S32 }
+ }
+}
+
+// Reliable
+{
+ GroupAccountDetailsReply Low 356 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ MoneyData Single
+ { RequestID LLUUID }
+ { IntervalDays S32 }
+ { CurrentInterval S32 }
+ { StartDate Variable 1 } // string
+ }
+ {
+ HistoryData Variable
+ { Description Variable 1 } // string
+ { Amount S32 }
+ }
+}
+
+
+// Reliable
+{
+ GroupAccountTransactionsRequest Low 357 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ MoneyData Single
+ { RequestID LLUUID }
+ { IntervalDays S32 }
+ { CurrentInterval S32 }
+ }
+}
+
+// Reliable
+{
+ GroupAccountTransactionsReply Low 358 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ MoneyData Single
+ { RequestID LLUUID }
+ { IntervalDays S32 }
+ { CurrentInterval S32 }
+ { StartDate Variable 1 } // string
+ }
+ {
+ HistoryData Variable
+ { Time Variable 1 } // string
+ { User Variable 1 } // string
+ { Type S32 }
+ { Item Variable 1 } // string
+ { Amount S32 }
+ }
+}
+
+// GroupActiveProposalsRequest
+// viewer -> simulator -> dataserver
+//reliable
+{
+ GroupActiveProposalsRequest Low 359 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ GroupData Single
+ { GroupID LLUUID }
+ }
+ {
+ TransactionData Single
+ { TransactionID LLUUID }
+ }
+}
+
+// GroupActiveProposalItemReply
+// dataserver -> simulator -> viewer
+// reliable
+{
+ GroupActiveProposalItemReply Low 360 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ TransactionData Single
+ { TransactionID LLUUID }
+ { TotalNumItems U32 }
+ }
+ {
+ ProposalData Variable
+ { VoteID LLUUID }
+ { VoteInitiator LLUUID }
+ { TerseDateID Variable 1 } // string
+ { StartDateTime Variable 1 } // string
+ { EndDateTime Variable 1 } // string
+ { AlreadyVoted BOOL }
+ { VoteCast Variable 1 } // string
+ { Majority F32 }
+ { Quorum S32 }
+ { ProposalText Variable 1 } // string
+ }
+}
+
+// GroupVoteHistoryRequest
+// viewer -> simulator -> dataserver
+//reliable
+{
+ GroupVoteHistoryRequest Low 361 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ GroupData Single
+ { GroupID LLUUID }
+ }
+ {
+ TransactionData Single
+ { TransactionID LLUUID }
+ }
+}
+
+// GroupVoteHistoryItemReply
+// dataserver -> simulator -> viewer
+// reliable
+{
+ GroupVoteHistoryItemReply Low 362 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ TransactionData Single
+ { TransactionID LLUUID }
+ { TotalNumItems U32 }
+ }
+ {
+ HistoryItemData Single
+ { VoteID LLUUID }
+ { TerseDateID Variable 1 } // string
+ { StartDateTime Variable 1 } // string
+ { EndDateTime Variable 1 } // string
+ { VoteInitiator LLUUID }
+ { VoteType Variable 1 } // string
+ { VoteResult Variable 1 } // string
+ { Majority F32 }
+ { Quorum S32 }
+ { ProposalText Variable 2 } // string
+ }
+ {
+ VoteItem Variable
+ { CandidateID LLUUID }
+ { VoteCast Variable 1 } // string
+ { NumVotes S32 }
+ }
+}
+
+// StartGroupProposal
+// viewer -> simulator -> dataserver
+// reliable
+{
+ StartGroupProposal Low 363 NotTrusted Zerocoded UDPDeprecated
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ProposalData Single
+ { GroupID LLUUID }
+ { Quorum S32 }
+ { Majority F32 }
+ { Duration S32 } // seconds
+ { ProposalText Variable 1 } // string
+ }
+}
+
+// GroupProposalBallot
+// viewer -> simulator -> dataserver
+// reliable
+{
+ GroupProposalBallot Low 364 NotTrusted Unencoded UDPDeprecated
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ProposalData Single
+ { ProposalID LLUUID }
+ { GroupID LLUUID }
+ { VoteCast Variable 1 } // string
+ }
+}
+
+// TallyVotes userserver -> dataserver
+// reliable
+{
+ TallyVotes Low 365 Trusted Unencoded
+}
+
+
+
+// GroupMembersRequest
+// get the group members
+// simulator -> dataserver
+// reliable
+{
+ GroupMembersRequest Low 366 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ GroupData Single
+ { GroupID LLUUID }
+ { RequestID LLUUID }
+ }
+}
+
+// GroupMembersReply
+// list of uuids for the group members
+// dataserver -> simulator
+// reliable
+{
+ GroupMembersReply Low 367 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ GroupData Single
+ { GroupID LLUUID }
+ { RequestID LLUUID }
+ { MemberCount S32 }
+ }
+ {
+ MemberData Variable
+ { AgentID LLUUID }
+ { Contribution S32 }
+ { OnlineStatus Variable 1 } // string
+ { AgentPowers U64 }
+ { Title Variable 1 } // string
+ { IsOwner BOOL }
+ }
+}
+
+// used to switch an agent's currently active group.
+// viewer -> simulator -> dataserver -> AgentDataUpdate...
+{
+ ActivateGroup Low 368 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupID LLUUID }
+ }
+}
+
+// viewer -> simulator -> dataserver
+{
+ SetGroupContribution Low 369 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { GroupID LLUUID }
+ { Contribution S32 }
+ }
+}
+
+// viewer -> simulator -> dataserver
+{
+ SetGroupAcceptNotices Low 370 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Data Single
+ { GroupID LLUUID }
+ { AcceptNotices BOOL }
+ }
+ {
+ NewData Single
+ { ListInProfile BOOL }
+ }
+}
+
+// GroupRoleDataRequest
+// viewer -> simulator -> dataserver
+{
+ GroupRoleDataRequest Low 371 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ GroupData Single
+ { GroupID LLUUID }
+ { RequestID LLUUID }
+ }
+}
+
+
+// GroupRoleDataReply
+// All role data for this group
+// dataserver -> simulator -> agent
+{
+ GroupRoleDataReply Low 372 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ GroupData Single
+ { GroupID LLUUID }
+ { RequestID LLUUID }
+ { RoleCount S32 }
+ }
+ {
+ RoleData Variable
+ { RoleID LLUUID }
+ { Name Variable 1 }
+ { Title Variable 1 }
+ { Description Variable 1 }
+ { Powers U64 }
+ { Members U32 }
+ }
+}
+
+// GroupRoleMembersRequest
+// viewer -> simulator -> dataserver
+{
+ GroupRoleMembersRequest Low 373 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ GroupData Single
+ { GroupID LLUUID }
+ { RequestID LLUUID }
+ }
+}
+
+// GroupRoleMembersReply
+// All role::member pairs for this group.
+// dataserver -> simulator -> agent
+{
+ GroupRoleMembersReply Low 374 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { GroupID LLUUID }
+ { RequestID LLUUID }
+ { TotalPairs U32 }
+ }
+ {
+ MemberData Variable
+ { RoleID LLUUID }
+ { MemberID LLUUID }
+ }
+}
+
+// GroupTitlesRequest
+// viewer -> simulator -> dataserver
+{
+ GroupTitlesRequest Low 375 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupID LLUUID }
+ { RequestID LLUUID }
+ }
+}
+
+
+// GroupTitlesReply
+// dataserver -> simulator -> viewer
+{
+ GroupTitlesReply Low 376 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { GroupID LLUUID }
+ { RequestID LLUUID }
+ }
+ {
+ GroupData Variable
+ { Title Variable 1 } // string
+ { RoleID LLUUID }
+ { Selected BOOL }
+ }
+}
+
+// GroupTitleUpdate
+// viewer -> simulator -> dataserver
+{
+ GroupTitleUpdate Low 377 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupID LLUUID }
+ { TitleRoleID LLUUID }
+ }
+}
+
+// GroupRoleUpdate
+// viewer -> simulator -> dataserver
+{
+ GroupRoleUpdate Low 378 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupID LLUUID }
+ }
+ {
+ RoleData Variable
+ { RoleID LLUUID }
+ { Name Variable 1 }
+ { Description Variable 1 }
+ { Title Variable 1 }
+ { Powers U64 }
+ { UpdateType U8 }
+ }
+}
+
+
+
+// Request the members of the live help group needed for requesting agent.
+// userserver -> dataserver
+{
+ LiveHelpGroupRequest Low 379 Trusted Unencoded
+ {
+ RequestData Single
+ { RequestID LLUUID }
+ { AgentID LLUUID }
+ }
+}
+
+// Send down the group
+// dataserver -> userserver
+{
+ LiveHelpGroupReply Low 380 Trusted Unencoded
+ {
+ ReplyData Single
+ { RequestID LLUUID }
+ { GroupID LLUUID }
+ { Selection Variable 1 } // selection criteria all or active
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Wearable messages
+//-----------------------------------------------------------------------------
+
+// AgentWearablesRequest
+// (a.k.a. "Tell me what the avatar is wearing.")
+// viewer -> simulator -> dataserver
+// reliable
+{
+ AgentWearablesRequest Low 381 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+}
+
+// AgentWearablesUpdate
+// (a.k.a. "Here's what your avatar should be wearing now.")
+// dataserver -> userserver -> viewer
+// reliable
+// NEVER from viewer to sim
+{
+ AgentWearablesUpdate Low 382 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { SerialNum U32 } // Increases every time the wearables change for a given agent. Used to avoid processing out of order packets.
+ }
+ {
+ WearableData Variable
+ { ItemID LLUUID }
+ { AssetID LLUUID }
+ { WearableType U8 } // LLWearable::EWearType
+ }
+}
+
+//
+// AgentIsNowWearing
+// (a.k.a. "Here's what I'm wearing now.")
+// viewer->sim->dataserver
+// reliable
+{
+ AgentIsNowWearing Low 383 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ WearableData Variable
+ { ItemID LLUUID }
+ { WearableType U8 }
+ }
+}
+
+
+// AgentCachedTexture
+// viewer queries for cached textures on dataserver (via simulator)
+// viewer -> simulator -> dataserver
+// reliable
+{
+ AgentCachedTexture Low 384 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { SerialNum S32 }
+ }
+ {
+ WearableData Variable
+ { ID LLUUID }
+ { TextureIndex U8 }
+ }
+}
+
+// AgentCachedTextureResponse
+// response to viewer queries for cached textures on dataserver (via simulator)
+// dataserver -> simulator -> viewer
+// reliable
+{
+ AgentCachedTextureResponse Low 385 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { SerialNum S32 }
+ }
+ {
+ WearableData Variable
+ { TextureID LLUUID }
+ { TextureIndex U8 }
+ { HostName Variable 1 }
+ }
+}
+
+// Request an AgentDataUpdate without changing any agent data.
+{
+ AgentDataUpdateRequest Low 386 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+}
+
+// AgentDataUpdate
+// Updates a viewer or simulator's impression of agent-specific information.
+// Used, for example, when an agent's group changes.
+// dataserver -> simulator -> viewer
+// reliable
+{
+ AgentDataUpdate Low 387 Trusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { FirstName Variable 1 } // string
+ { LastName Variable 1 } // string
+ { GroupTitle Variable 1 } // string
+ { ActiveGroupID LLUUID } // active group
+ { GroupPowers U64 }
+ { GroupName Variable 1 } // string
+ }
+}
+
+
+// GroupDataUpdate
+// This is a bunch of group data that needs to be appropriatly routed based on presence info.
+// dataserver -> simulator
+{
+ GroupDataUpdate Low 388 Trusted Zerocoded
+ {
+ AgentGroupData Variable
+ { AgentID LLUUID }
+ { GroupID LLUUID }
+ { AgentPowers U64 }
+ { GroupTitle Variable 1 }
+ }
+}
+
+// AgentGroupDataUpdate
+// Updates a viewer or simulator's impression of the groups an agent is in.
+// dataserver -> simulator -> viewer
+// reliable
+{
+ AgentGroupDataUpdate Low 389 Trusted Zerocoded UDPDeprecated
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ GroupData Variable
+ { GroupID LLUUID }
+ { GroupPowers U64 }
+ { AcceptNotices BOOL }
+ { GroupInsigniaID LLUUID }
+ { Contribution S32 }
+ { GroupName Variable 1 } // string
+ }
+}
+
+// AgentDropGroup
+// Updates the viewer / simulator that an agent is no longer part of a group
+// dataserver -> simulator -> viewer
+// dataserver -> userserver
+// reliable
+{
+ AgentDropGroup Low 390 Trusted Zerocoded UDPDeprecated
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { GroupID LLUUID }
+ }
+}
+
+// LogTextMessage
+// Asks the dataserver to log the contents of this message in the
+// chat and IM log table.
+// Sent from userserver (IM logging) and simulator (chat logging).
+{
+ LogTextMessage Low 391 Trusted Zerocoded
+ {
+ DataBlock Variable
+ { FromAgentId LLUUID }
+ { ToAgentId LLUUID }
+ { GlobalX F64 }
+ { GlobalY F64 }
+ { Time U32 } // utc seconds since epoch
+ { Message Variable 2 } // string
+ }
+}
+
+// ViewerEffect
+// Viewer side effect that's sent from one viewer, and broadcast to other agents nearby
+// viewer-->sim (single effect created by viewer)
+// sim-->viewer (multiple effects that can be seen by viewer)
+// the AgentData block used for authentication for viewer-->sim messages
+{
+ ViewerEffect Medium 17 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ Effect Variable
+ { ID LLUUID } // unique UUID of the effect
+ { AgentID LLUUID } // yes, pack AgentID again (note this block is variable)
+ { Type U8 } // Type of the effect
+ { Duration F32 } // F32 time (seconds)
+ { Color Fixed 4 } // Color4U
+ { TypeData Variable 1 } // Type specific data
+ }
+}
+
+
+// CreateTrustedCircuit
+// Sent to establish a trust relationship between two components.
+// Only sent in response to a DenyTrustedCircuit message.
+{
+ CreateTrustedCircuit Low 392 NotTrusted Unencoded
+ {
+ DataBlock Single
+ { EndPointID LLUUID }
+ { Digest Fixed 32 } // 32 hex digits == 1 MD5 Digest
+ }
+}
+
+// DenyTrustedCircuit
+// Sent :
+// - in response to failed CreateTrustedCircuit
+// - to force the remote end-point to try to establish a trusted circuit
+// - the reception of a trusted message on a non-trusted circuit
+// This allows us to re-auth a circuit if it gets closed due to timeouts or network failures.
+{
+ DenyTrustedCircuit Low 393 NotTrusted Unencoded
+ {
+ DataBlock Single
+ { EndPointID LLUUID }
+ }
+}
+
+// RequestTrustedCircuit
+// If the destination does not trust the sender, a Deny is sent back.
+{
+ RequestTrustedCircuit Low 394 Trusted Unencoded
+}
+
+
+{
+ RezSingleAttachmentFromInv Low 395 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Single
+ { ItemID LLUUID }
+ { OwnerID LLUUID }
+ { AttachmentPt U8 } // 0 for default
+ { ItemFlags U32 }
+ { GroupMask U32 }
+ { EveryoneMask U32 }
+ { NextOwnerMask U32 }
+ { Name Variable 1 }
+ { Description Variable 1 }
+ }
+}
+
+{
+ RezMultipleAttachmentsFromInv Low 396 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ HeaderData Single
+ { CompoundMsgID LLUUID } // All messages a single "compound msg" must have the same id
+ { TotalObjects U8 }
+ { FirstDetachAll BOOL }
+ }
+ {
+ ObjectData Variable // 1 to 4 of these per packet
+ { ItemID LLUUID }
+ { OwnerID LLUUID }
+ { AttachmentPt U8 } // 0 for default
+ { ItemFlags U32 }
+ { GroupMask U32 }
+ { EveryoneMask U32 }
+ { NextOwnerMask U32 }
+ { Name Variable 1 }
+ { Description Variable 1 }
+ }
+}
+
+
+{
+ DetachAttachmentIntoInv Low 397 NotTrusted Unencoded
+ {
+ ObjectData Single
+ { AgentID LLUUID }
+ { ItemID LLUUID }
+ }
+}
+
+
+// Viewer -> Sim
+// Used in "Make New Outfit"
+{
+ CreateNewOutfitAttachments Low 398 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ HeaderData Single
+ { NewFolderID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { OldItemID LLUUID }
+ { OldFolderID LLUUID }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Personal information messages
+//-----------------------------------------------------------------------------
+
+{
+ UserInfoRequest Low 399 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+}
+
+{
+ UserInfoReply Low 400 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ UserData Single
+ { IMViaEMail BOOL }
+ { DirectoryVisibility Variable 1 }
+ { EMail Variable 2 }
+ }
+}
+
+{
+ UpdateUserInfo Low 401 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ UserData Single
+ { IMViaEMail BOOL }
+ { DirectoryVisibility Variable 1 }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// System operations and maintenance
+//-----------------------------------------------------------------------------
+
+
+// spaceserver -> sim
+// tell a particular simulator to rename a parcel
+{
+ ParcelRename Low 402 Trusted Unencoded
+ {
+ ParcelData Variable
+ { ParcelID LLUUID }
+ { NewName Variable 1 } // string
+ }
+}
+
+
+// sim -> viewer
+// initiate upload. primarily used for uploading raw files.
+{
+ InitiateDownload Low 403 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ }
+ {
+ FileData Single
+ { SimFilename Variable 1 } // string
+ { ViewerFilename Variable 1 } // string
+ }
+}
+
+// Generalized system message. Each Requst has its own protocol for
+// the StringData block format and contents.
+{
+ SystemMessage Low 404 Trusted Zerocoded
+ {
+ MethodData Single
+ { Method Variable 1 }
+ { Invoice LLUUID }
+ { Digest Fixed 32 } // 32 hex digits == 1 MD5 Digest
+ }
+ {
+ ParamList Variable
+ { Parameter Variable 1 }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// map messages
+//-----------------------------------------------------------------------------
+
+// viewer -> sim
+// reliable
+// This message is sent up from the viewer to (eventually) get a list
+// of all map layers and NULL-layer sims.
+// Returns: MapLayerReply and MapBlockReply
+{
+ MapLayerRequest Low 405 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { Flags U32 }
+ { EstateID U32 } // filled in on sim
+ { Godlike BOOL } // filled in on sim
+ }
+}
+
+// sim -> viewer
+{
+ MapLayerReply Low 406 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { Flags U32 }
+ }
+ {
+ LayerData Variable
+ { Left U32 }
+ { Right U32 }
+ { Top U32 }
+ { Bottom U32 }
+ { ImageID LLUUID }
+ }
+}
+
+// viewer -> sim
+// This message is sent up from the viewer to get a list
+// of the sims in a specified region.
+// Returns: MapBlockReply
+{
+ MapBlockRequest Low 407 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { Flags U32 }
+ { EstateID U32 } // filled in on sim
+ { Godlike BOOL } // filled in on sim
+ }
+ {
+ PositionData Single
+ { MinX U16 } // in region-widths
+ { MaxX U16 } // in region-widths
+ { MinY U16 } // in region-widths
+ { MaxY U16 } // in region-widths
+ }
+}
+
+// viewer -> sim
+// This message is sent up from the viewer to get a list
+// of the sims with a given name.
+// Returns: MapBlockReply
+{
+ MapNameRequest Low 408 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { Flags U32 }
+ { EstateID U32 } // filled in on sim
+ { Godlike BOOL } // filled in on sim
+ }
+ {
+ NameData Single
+ { Name Variable 1 } // string
+ }
+}
+
+// sim -> viewer
+{
+ MapBlockReply Low 409 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { Flags U32 }
+ }
+ {
+ Data Variable
+ { X U16 } // in region-widths
+ { Y U16 } // in region-widths
+ { Name Variable 1 } // string
+ { Access U8 } // PG, mature, etc.
+ { RegionFlags U32 }
+ { WaterHeight U8 } // meters
+ { Agents U8 }
+ { MapImageID LLUUID }
+ }
+ {
+ Size Variable
+ { SizeX U16 }
+ { SizeY U16 }
+ }
+}
+
+// viewer -> sim
+// This message is sent up from the viewer to get a list
+// of the items of a particular type on the map.
+// Used for Telehubs, Agents, Events, Popular Places, etc.
+// Returns: MapBlockReply
+{
+ MapItemRequest Low 410 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { Flags U32 }
+ { EstateID U32 } // filled in on sim
+ { Godlike BOOL } // filled in on sim
+ }
+ {
+ RequestData Single
+ { ItemType U32 }
+ { RegionHandle U64 } // filled in on sim
+ }
+}
+
+// sim -> viewer
+{
+ MapItemReply Low 411 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { Flags U32 }
+ }
+ {
+ RequestData Single
+ { ItemType U32 }
+ }
+ {
+ Data Variable
+ { X U32 } // global position
+ { Y U32 } // global position
+ { ID LLUUID } // identifier id
+ { Extra S32 } // extra information
+ { Extra2 S32 } // extra information
+ { Name Variable 1 } // identifier string
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Postcard messages
+//-----------------------------------------------------------------------------
+// reliable
+{
+ SendPostcard Low 412 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { AssetID LLUUID }
+ { PosGlobal LLVector3d } // Where snapshot was taken
+ { To Variable 1 } // dest email address(es)
+ { From Variable 1 } // src email address(es)
+ { Name Variable 1 } // src name
+ { Subject Variable 1 } // mail subject
+ { Msg Variable 2 } // message text
+ { AllowPublish BOOL } // Allow publishing on the web.
+ { MaturePublish BOOL } // profile is "mature"
+ }
+}
+
+// RPC messages
+// Script on simulator requests rpc channel from rpcserver
+// simulator -> dataserver -> MySQL
+{
+ RpcChannelRequest Low 413 Trusted Unencoded
+ {
+ DataBlock Single
+ { GridX U32 }
+ { GridY U32 }
+ { TaskID LLUUID }
+ { ItemID LLUUID }
+ }
+}
+
+// RpcServer allocated a session for the script
+// ChannelID will be the NULL UUID if unable to register
+// dataserver -> simulator
+{
+ RpcChannelReply Low 414 Trusted Unencoded
+ {
+ DataBlock Single
+ { TaskID LLUUID }
+ { ItemID LLUUID }
+ { ChannelID LLUUID }
+ }
+}
+
+// Inbound RPC requests follow this path:
+// RpcScriptRequestInbound: rpcserver -> spaceserver
+// RpcScriptRequestInboundForward: spaceserver -> simulator
+// reply: simulator -> rpcserver
+{
+ RpcScriptRequestInbound Low 415 NotTrusted Unencoded
+ {
+ TargetBlock Single
+ { GridX U32 }
+ { GridY U32 }
+ }
+ {
+ DataBlock Single
+ { TaskID LLUUID }
+ { ItemID LLUUID }
+ { ChannelID LLUUID }
+ { IntValue U32 }
+ { StringValue Variable 2 } // string
+ }
+}
+
+// spaceserver -> simulator
+{
+ RpcScriptRequestInboundForward Low 416 Trusted Unencoded UDPDeprecated
+ {
+ DataBlock Single
+ { RPCServerIP IPADDR }
+ { RPCServerPort IPPORT }
+ { TaskID LLUUID }
+ { ItemID LLUUID }
+ { ChannelID LLUUID }
+ { IntValue U32 }
+ { StringValue Variable 2 } // string
+ }
+}
+
+// simulator -> rpcserver
+// Not trusted because trust establishment doesn't work here.
+{
+ RpcScriptReplyInbound Low 417 NotTrusted Unencoded
+ {
+ DataBlock Single
+ { TaskID LLUUID }
+ { ItemID LLUUID }
+ { ChannelID LLUUID }
+ { IntValue U32 }
+ { StringValue Variable 2 } // string
+ }
+}
+
+
+// ScriptMailRegistration
+// Simulator -> dataserver
+{
+ ScriptMailRegistration Low 418 Trusted Unencoded
+ {
+ DataBlock Single
+ { TargetIP Variable 1 } // String IP
+ { TargetPort IPPORT }
+ { TaskID LLUUID }
+ { Flags U32 }
+ }
+}
+
+// ParcelMediaCommandMessage
+// Sends a parcel media command
+{
+ ParcelMediaCommandMessage Low 419 Trusted Unencoded
+ {
+ CommandBlock Single
+ { Flags U32 }
+ { Command U32 }
+ { Time F32 }
+ }
+}
+
+// ParcelMediaUpdate
+// Sends a parcel media update to a single user
+// For global updates use the parcel manager.
+{
+ ParcelMediaUpdate Low 420 Trusted Unencoded
+ {
+ DataBlock Single
+ { MediaURL Variable 1 } // string
+ { MediaID LLUUID }
+ { MediaAutoScale U8 }
+ }
+ {
+ DataBlockExtended Single
+ { MediaType Variable 1 }
+ { MediaDesc Variable 1 }
+ { MediaWidth S32 }
+ { MediaHeight S32 }
+ { MediaLoop U8 }
+ }
+}
+
+// LandStatRequest
+// Sent by the viewer to request collider/script information for a parcel
+{
+ LandStatRequest Low 421 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ RequestData Single
+ { ReportType U32 }
+ { RequestFlags U32 }
+ { Filter Variable 1 }
+ { ParcelLocalID S32 }
+ }
+}
+
+// LandStatReply
+// Sent by the simulator in response to LandStatRequest
+{
+ LandStatReply Low 422 Trusted Unencoded UDPDeprecated
+ {
+ RequestData Single
+ { ReportType U32 }
+ { RequestFlags U32 }
+ { TotalObjectCount U32 }
+ }
+ {
+ ReportData Variable
+ { TaskLocalID U32 }
+ { TaskID LLUUID }
+ { LocationX F32 }
+ { LocationY F32 }
+ { LocationZ F32 }
+ { Score F32 }
+ { TaskName Variable 1 }
+ { OwnerName Variable 1 }
+ }
+}
+
+// Generic Error -- this is used for sending an error message
+// to a UDP recipient. The lowest common denominator is to at least
+// log the message. More sophisticated receivers can do something
+// smarter, for example, a money transaction failure can put up a
+// more user visible UI widget.
+{
+ Error Low 423 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID } // will forward to agentid if coming from trusted circuit
+ }
+ {
+ Data Single
+ { Code S32 } // matches http status codes
+ { Token Variable 1 } // some specific short string based message
+ { ID LLUUID } // the transactionid/uniqueid/sessionid whatever.
+ { System Variable 1 } // The hierarchical path to the system, eg, "message/handler"
+ { Message Variable 2 } // Human readable message
+ { Data Variable 2 } // Binary serialized LLSD for extra info.
+ }
+}
+
+// ObjectIncludeInSearch
+// viewer -> simulator
+{
+ ObjectIncludeInSearch Low 424 NotTrusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ ObjectData Variable
+ { ObjectLocalID U32 }
+ { IncludeInSearch BOOL }
+ }
+}
+
+
+// This message is sent from viewer -> simulator when the viewer wants
+// to rez an object out of inventory back to its position before it
+// last moved into the inventory
+{
+ RezRestoreToWorld Low 425 NotTrusted Unencoded UDPDeprecated
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ InventoryData Single
+ { ItemID LLUUID }
+ { FolderID LLUUID }
+ { CreatorID LLUUID } // permissions
+ { OwnerID LLUUID } // permissions
+ { GroupID LLUUID } // permissions
+ { BaseMask U32 } // permissions
+ { OwnerMask U32 } // permissions
+ { GroupMask U32 } // permissions
+ { EveryoneMask U32 } // permissions
+ { NextOwnerMask U32 } // permissions
+ { GroupOwned BOOL } // permissions
+ { TransactionID LLUUID }
+ { Type S8 }
+ { InvType S8 }
+ { Flags U32 }
+ { SaleType U8 }
+ { SalePrice S32 }
+ { Name Variable 1 }
+ { Description Variable 1 }
+ { CreationDate S32 }
+ { CRC U32 }
+ }
+}
+
+// Link inventory
+{
+ LinkInventoryItem Low 426 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ InventoryBlock Single
+ { CallbackID U32 } // Async Response
+ { FolderID LLUUID }
+ { TransactionID LLUUID } // Going to become TransactionID
+ { OldItemID LLUUID }
+ { Type S8 }
+ { InvType S8 }
+ { Name Variable 1 }
+ { Description Variable 1 }
+
+ }
+}
+
+// RetrieveIMsExtended - extended version of RetrieveInstantMessages,
+// used to get instant messages that were persisted out to the database while the user was offline
+// sent between the simulator and dataserver
+{
+ RetrieveIMsExtended Low 427 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { IsPremium BOOL }
+ }
+}
+
+// JoinGroupRequestExtended
+// Extends JoinGroupRequest from viewer and passed to dataserver
+// simulator -> dataserver
+// reliable
+{
+ JoinGroupRequestExtended Low 428 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupLimit S32 }
+ }
+ {
+ GroupData Single
+ { GroupID LLUUID }
+ }
+}
+
+// CreateGroupRequestExtended
+// simulator -> dataserver, extends data from CreateGroupRequest
+// reliable
+{
+ CreateGroupRequestExtended Low 429 Trusted Unencoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ { GroupLimit S32 }
+ }
+ {
+ GroupData Single
+ { Name Variable 1 } // string
+ { Charter Variable 2 } // string
+ { ShowInList BOOL }
+ { InsigniaID LLUUID }
+ { MembershipFee S32 }
+ { OpenEnrollment BOOL }
+ { AllowPublish BOOL } // whether profile is externally visible or not
+ { MaturePublish BOOL } // profile is "mature"
+ }
+}
+
+// viewer -> simulator
+// GameControlInput - input from game controller
+// The main payload of this message is split into two Variable chunks:
+//
+// AxisData = list of {Index:Value} pairs. Value is an S16 that maps to range [-1, 1]
+// ButtonData = list of indices of pressed buttons
+//
+// Any Axis ommitted from the message is assumed by the receiving Simulator to be unchanged
+// from its previously received value.
+//
+// Any Button omitted from the message is assumed by the receiving Simulator to be unpressed.
+//
+// GameControlInput messages are sent unreliably, but when input changes stop the last
+// message will be resent at a ever increasing period to make sure the server receives it.
+//
+{
+ GameControlInput High 32 NotTrusted Zerocoded
+ {
+ AgentData Single
+ { AgentID LLUUID }
+ { SessionID LLUUID }
+ }
+ {
+ AxisData Variable
+ { Index U8 }
+ { Value S16 }
+ }
+ {
+ ButtonData Variable
+ { Data Variable 1 }
+ }
+}
diff --git a/codegen/inputs/trees.xml b/codegen/inputs/trees.xml
new file mode 100644
index 0000000..213ee85
--- /dev/null
+++ b/codegen/inputs/trees.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/codegen/sources.json b/codegen/sources.json
new file mode 100644
index 0000000..93193f7
--- /dev/null
+++ b/codegen/sources.json
@@ -0,0 +1,23 @@
+{
+ "schema": 1,
+ "upstream_commit": "2aa70bb68513b39795da5d13c88f31b86e85a3ba",
+ "upstream_repository": "https://github.com/cinderblocks/libremetaverse",
+ "generators": [
+ {"id":"attentions","reference_source":"SourceGenerators/AttentionsGenerator/AttentionsGenerator.cs","sha256":"b2870ae020c42a8a6ec455363fbb70a1b3c94c814b205bad9b61609d5230da3e","license":"BSD-3-Clause","inputs":["attentions","attentions_updated"]},
+ {"id":"genepool","reference_source":"SourceGenerators/GenepoolGenerator/GenepoolGenerator.cs","sha256":"a48e914fc62efbb1bc4b2e17162121621eebd4cf03872cc226bc8a83a9230cd2","license":"BSD-3-Clause","inputs":["genepool"]},
+ {"id":"packets","reference_source":"SourceGenerators/PacketSourceGenerator/PacketSourceGenerator.cs","sha256":"8e63c0356cd0269e10521d15fbcde780cf58f821935601b4f223933930db758f","license":"BSD-3-Clause","inputs":["message_template"]},
+ {"id":"skeleton","reference_source":"SourceGenerators/SkeletonGenerator/SkeletonGenerator.cs","sha256":"6e1a5dd95b2604319cf65037c59b69a739af563e49cfb29e5db00c3d9c371d49","license":"BSD-3-Clause","inputs":["avatar_skeleton"]},
+ {"id":"trees","reference_source":"SourceGenerators/TreesGenerator/TreesGenerator.cs","sha256":"151a593ba215400361f9bf20848537a5c01bb0ab4a95b15c1e16fa4b1897f8bb","license":"BSD-3-Clause","inputs":["trees","grass"]},
+ {"id":"visual_params","reference_source":"SourceGenerators/VisualParamGenerator/VisualParamGenerator.cs","sha256":"bff0ec0f823b415e811f0c84210b3ee8d7baa65cc21de19ed19b3c26560c6dac","license":"BSD-3-Clause","inputs":["avatar_lad"],"note":"The project supplies no visualparamtemplate.cs AdditionalFile; the pinned C# generator uses its embedded template."}
+ ],
+ "inputs": [
+ {"id":"message_template","reference_path":"data/message_template.msg","vendored_path":"codegen/inputs/message_template.msg","sha256":"15e524a46a9a449ead33c26d495a292ae2e100e641a408ac66ef63b8a7a2489d","license":"BSD-3-Clause","format":"message-template"},
+ {"id":"avatar_lad","reference_path":"LibreMetaverse/linden/character/avatar_lad.xml","vendored_path":"codegen/inputs/avatar_lad.xml","sha256":"6f97a1408fa8f0ab5c09043da433c701701fe075e8a97867fcbcda207adf9eaf","license":"BSD-3-Clause","format":"xml"},
+ {"id":"avatar_skeleton","reference_path":"LibreMetaverse/linden/character/avatar_skeleton.xml","vendored_path":"codegen/inputs/avatar_skeleton.xml","sha256":"addb3cc4cd582ed4343d778e06daf90c6b77b61b4ecb4a20d4bf202c2b93908a","license":"BSD-3-Clause","format":"xml"},
+ {"id":"attentions","reference_path":"LibreMetaverse/linden/character/attentions.xml","vendored_path":"codegen/inputs/attentions.xml","sha256":"bdbc4ca02dd3bde78b86e796f7eb4ada0000e47be9a127e35d2b77f3010a20af","license":"BSD-3-Clause","format":"xml"},
+ {"id":"attentions_updated","reference_path":"LibreMetaverse/linden/character/attentionsN.xml","vendored_path":"codegen/inputs/attentionsN.xml","sha256":"80055e12a04d05ef5bb16e8c542cd6c218735f8c72f7e48317b8a34282d1ac5b","license":"BSD-3-Clause","format":"xml"},
+ {"id":"genepool","reference_path":"LibreMetaverse/linden/character/genepool.xml","vendored_path":"codegen/inputs/genepool.xml","sha256":"6fa1391cd98fddec0d7fe762343ea21e53a655a8ddd4f33af52f8a02aaa3f56d","license":"BSD-3-Clause","format":"xml"},
+ {"id":"trees","reference_path":"LibreMetaverse/linden/trees.xml","vendored_path":"codegen/inputs/trees.xml","sha256":"f54e626b00bd2c4fec9f59a574a45860f209e4440bbb02b81d27050b9df8ffba","license":"BSD-3-Clause","format":"xml"},
+ {"id":"grass","reference_path":"LibreMetaverse/linden/grass.xml","vendored_path":"codegen/inputs/grass.xml","sha256":"90015f9768afe3cfee761d04239bf9e284b2739b095b7ab8331966fa1fbfcb4e","license":"BSD-3-Clause","format":"xml"}
+ ]
+}
diff --git a/tests/red-suite-baseline.json b/tests/red-suite-baseline.json
index 2178008..3e5fb4f 100644
--- a/tests/red-suite-baseline.json
+++ b/tests/red-suite-baseline.json
@@ -146,5 +146,5 @@
"LibreMetaverse.Tests/XmlLLSDTests.cs::XmlSDTests.DeserializeUUID::test",
"LibreMetaverse.Tests/XmlLLSDTests.cs::XmlSDTests.DeserializeUndef::test"
],
- "support_passes": 134
+ "support_passes": 137
}
diff --git a/tools/codegen/Cargo.toml b/tools/codegen/Cargo.toml
new file mode 100644
index 0000000..ca8c404
--- /dev/null
+++ b/tools/codegen/Cargo.toml
@@ -0,0 +1,17 @@
+[package]
+name = "libremetaverse-codegen"
+version.workspace = true
+edition.workspace = true
+rust-version.workspace = true
+license.workspace = true
+repository.workspace = true
+description = "Deterministic native generators for pinned LibreMetaverse data"
+publish = false
+
+[dependencies]
+serde = { version = "1", features = ["derive"] }
+serde_json = "1"
+sha2 = "0.11"
+
+[lints]
+workspace = true
diff --git a/tools/codegen/src/lib.rs b/tools/codegen/src/lib.rs
new file mode 100644
index 0000000..655a644
--- /dev/null
+++ b/tools/codegen/src/lib.rs
@@ -0,0 +1,365 @@
+//! Deterministic framework shared by the `LibreMetaverse` data generators.
+
+#![allow(clippy::missing_errors_doc)] // The CLI renders the complete error at its boundary.
+#![allow(clippy::must_use_candidate)] // Generator helpers are also exercised for validation.
+
+use serde::Deserialize;
+use sha2::{Digest, Sha256};
+use std::collections::BTreeSet;
+use std::fmt;
+use std::fmt::Write as _;
+use std::fs;
+use std::path::{Component, Path, PathBuf};
+
+pub const INVENTORY_PATH: &str = "codegen/sources.json";
+pub const MANIFEST_OUTPUT: &str = "codegen/generated/source_manifest.rs";
+
+#[derive(Clone, Debug, Deserialize, Eq, PartialEq)]
+pub struct Inventory {
+ pub schema: u32,
+ pub upstream_commit: String,
+ pub upstream_repository: String,
+ pub generators: Vec,
+ pub inputs: Vec,
+}
+
+#[derive(Clone, Debug, Deserialize, Eq, PartialEq)]
+pub struct GeneratorSpec {
+ pub id: String,
+ pub reference_source: String,
+ pub sha256: String,
+ pub license: String,
+ pub inputs: Vec,
+ #[serde(default)]
+ pub note: String,
+}
+
+#[derive(Clone, Debug, Deserialize, Eq, PartialEq)]
+pub struct InputSpec {
+ pub id: String,
+ pub reference_path: String,
+ pub vendored_path: String,
+ pub sha256: String,
+ pub license: String,
+ pub format: String,
+}
+
+#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
+pub enum Severity {
+ Error,
+ Warning,
+}
+
+#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
+pub struct Diagnostic {
+ pub code: &'static str,
+ pub severity: Severity,
+ pub path: String,
+ pub line: usize,
+ pub column: usize,
+ pub message: String,
+}
+
+impl fmt::Display for Diagnostic {
+ fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
+ let severity = match self.severity {
+ Severity::Error => "error",
+ Severity::Warning => "warning",
+ };
+ write!(
+ formatter,
+ "{}:{}:{}: {severity}[{}]: {}",
+ self.path, self.line, self.column, self.code, self.message
+ )
+ }
+}
+
+pub fn workspace_root() -> PathBuf {
+ Path::new(env!("CARGO_MANIFEST_DIR")).join("../..")
+}
+
+pub fn normalize_text(path: &str, bytes: &[u8]) -> Result {
+ let bytes = bytes.strip_prefix(&[0xef, 0xbb, 0xbf]).unwrap_or(bytes);
+ let text = std::str::from_utf8(bytes).map_err(|error| {
+ let valid = &bytes[..error.valid_up_to()];
+ let (line, column) = line_column(valid);
+ Diagnostic {
+ code: "CG001",
+ severity: Severity::Error,
+ path: path.replace('\\', "/"),
+ line,
+ column,
+ message: "input is not valid UTF-8".to_owned(),
+ }
+ })?;
+ if let Some(position) = text.as_bytes().iter().position(|byte| *byte == 0) {
+ let prefix = &text.as_bytes()[..position];
+ let (line, column) = line_column(prefix);
+ return Err(Diagnostic {
+ code: "CG002",
+ severity: Severity::Error,
+ path: path.replace('\\', "/"),
+ line,
+ column,
+ message: "input contains a NUL byte".to_owned(),
+ });
+ }
+ Ok(text.replace("\r\n", "\n").replace('\r', "\n"))
+}
+
+fn line_column(bytes: &[u8]) -> (usize, usize) {
+ let mut line = 1;
+ let mut column = 1;
+ for byte in bytes {
+ if *byte == b'\n' {
+ line += 1;
+ column = 1;
+ } else {
+ column += 1;
+ }
+ }
+ (line, column)
+}
+
+pub fn generated_rust(generator: &str, sources: &[&InputSpec], body: &str) -> Vec {
+ let mut output = String::new();
+ output.push_str("// @generated by libremetaverse-codegen; DO NOT EDIT.\n");
+ output.push_str("// Regenerate: cargo run -p libremetaverse-codegen -- generate\n");
+ let _ = writeln!(output, "// Generator: {generator}");
+ for source in sources {
+ let _ = writeln!(
+ output,
+ "// Source: {} sha256={} license={}",
+ source.vendored_path, source.sha256, source.license
+ );
+ }
+ output.push('\n');
+ output.push_str(body.trim_end());
+ output.push('\n');
+ output.into_bytes()
+}
+
+pub fn load_inventory(root: &Path) -> Result {
+ let path = root.join(INVENTORY_PATH);
+ let bytes = fs::read(&path).map_err(|error| format!("{}: {error}", path.display()))?;
+ let inventory: Inventory =
+ serde_json::from_slice(&bytes).map_err(|error| format!("{}: {error}", path.display()))?;
+ validate_inventory(&inventory)?;
+ Ok(inventory)
+}
+
+fn validate_inventory(inventory: &Inventory) -> Result<(), String> {
+ if inventory.schema != 1 || inventory.upstream_commit.len() != 40 {
+ return Err("unsupported or malformed source inventory header".to_owned());
+ }
+ let mut input_ids = BTreeSet::new();
+ for input in &inventory.inputs {
+ validate_relative(&input.reference_path)?;
+ validate_relative(&input.vendored_path)?;
+ validate_hash(&input.sha256)?;
+ if input.license != "BSD-3-Clause" || !input_ids.insert(&input.id) {
+ return Err(format!("invalid or duplicate input {}", input.id));
+ }
+ }
+ let mut generator_ids = BTreeSet::new();
+ for generator in &inventory.generators {
+ validate_relative(&generator.reference_source)?;
+ validate_hash(&generator.sha256)?;
+ if generator.license != "BSD-3-Clause" || !generator_ids.insert(&generator.id) {
+ return Err(format!("invalid or duplicate generator {}", generator.id));
+ }
+ for input in &generator.inputs {
+ if !input_ids.contains(input) {
+ return Err(format!(
+ "generator {} references unknown input {input}",
+ generator.id
+ ));
+ }
+ }
+ }
+ Ok(())
+}
+
+fn validate_relative(value: &str) -> Result<(), String> {
+ let path = Path::new(value);
+ if path.is_absolute()
+ || path
+ .components()
+ .any(|part| !matches!(part, Component::Normal(_)))
+ {
+ return Err(format!("unsafe inventory path {value}"));
+ }
+ Ok(())
+}
+
+fn validate_hash(value: &str) -> Result<(), String> {
+ if value.len() == 64 && value.bytes().all(|byte| byte.is_ascii_hexdigit()) {
+ Ok(())
+ } else {
+ Err(format!("invalid SHA-256 {value}"))
+ }
+}
+
+fn sha256(bytes: &[u8]) -> String {
+ const HEX: &[u8; 16] = b"0123456789abcdef";
+ let mut output = String::with_capacity(64);
+ for byte in Sha256::digest(bytes) {
+ output.push(char::from(HEX[usize::from(byte >> 4)]));
+ output.push(char::from(HEX[usize::from(byte & 0x0f)]));
+ }
+ output
+}
+
+pub fn verify_inputs(root: &Path, inventory: &Inventory) -> Result<(), String> {
+ for input in &inventory.inputs {
+ let path = root.join(&input.vendored_path);
+ let bytes = fs::read(&path).map_err(|error| format!("{}: {error}", path.display()))?;
+ let actual = sha256(&bytes);
+ if actual != input.sha256 {
+ return Err(format!(
+ "{}: SHA-256 mismatch: expected {}, found {actual}",
+ path.display(),
+ input.sha256
+ ));
+ }
+ normalize_text(&input.vendored_path, &bytes).map_err(|error| error.to_string())?;
+ }
+ Ok(())
+}
+
+pub fn vendor_inputs(root: &Path, reference: &Path) -> Result<(), String> {
+ let inventory = load_inventory(root)?;
+ for generator in &inventory.generators {
+ let source = reference.join(&generator.reference_source);
+ let bytes = fs::read(&source).map_err(|error| format!("{}: {error}", source.display()))?;
+ let actual = sha256(&bytes);
+ if actual != generator.sha256 {
+ return Err(format!(
+ "{}: pinned generator SHA-256 mismatch: expected {}, found {actual}",
+ source.display(),
+ generator.sha256
+ ));
+ }
+ }
+ let mut snapshots = Vec::with_capacity(inventory.inputs.len());
+ for input in &inventory.inputs {
+ let source = reference.join(&input.reference_path);
+ let bytes = fs::read(&source).map_err(|error| format!("{}: {error}", source.display()))?;
+ let actual = sha256(&bytes);
+ if actual != input.sha256 {
+ return Err(format!(
+ "{}: pinned SHA-256 mismatch: expected {}, found {actual}",
+ source.display(),
+ input.sha256
+ ));
+ }
+ snapshots.push((root.join(&input.vendored_path), bytes));
+ }
+ for (target, bytes) in snapshots {
+ fs::create_dir_all(target.parent().ok_or("vendored input has no parent")?)
+ .map_err(|error| error.to_string())?;
+ fs::write(&target, bytes).map_err(|error| format!("{}: {error}", target.display()))?;
+ }
+ Ok(())
+}
+
+pub fn source_manifest_bytes(root: &Path) -> Result, String> {
+ let inventory = load_inventory(root)?;
+ verify_inputs(root, &inventory)?;
+ let mut inputs: Vec<&InputSpec> = inventory.inputs.iter().collect();
+ inputs.sort_by_key(|input| &input.id);
+ let mut generators: Vec<&GeneratorSpec> = inventory.generators.iter().collect();
+ generators.sort_by_key(|generator| &generator.id);
+ let mut body = String::new();
+ let _ = writeln!(
+ body,
+ "pub const UPSTREAM_COMMIT: &str = {:?};",
+ inventory.upstream_commit
+ );
+ let _ = writeln!(
+ body,
+ "pub const UPSTREAM_REPOSITORY: &str = {:?};",
+ inventory.upstream_repository
+ );
+ body.push_str("pub const SOURCES: &[(&str, &str, &str, &str)] = &[\n");
+ for input in &inputs {
+ let _ = writeln!(
+ body,
+ " ({:?}, {:?}, {:?}, {:?}),",
+ input.id, input.vendored_path, input.sha256, input.license
+ );
+ }
+ body.push_str("];\n");
+ body.push_str("pub const GENERATORS: &[(&str, &str, &str, &str)] = &[\n");
+ for generator in generators {
+ let _ = writeln!(
+ body,
+ " ({:?}, {:?}, {:?}, {:?}),",
+ generator.id, generator.reference_source, generator.sha256, generator.license
+ );
+ }
+ body.push_str("];\n");
+ Ok(generated_rust("source-manifest", &inputs, &body))
+}
+
+pub fn regenerate(root: &Path, check: bool) -> Result<(), String> {
+ let expected = source_manifest_bytes(root)?;
+ let path = root.join(MANIFEST_OUTPUT);
+ if check {
+ let actual = fs::read(&path).map_err(|error| format!("{}: {error}", path.display()))?;
+ if actual != expected {
+ return Err(format!(
+ "{} is stale; run the regeneration command",
+ path.display()
+ ));
+ }
+ } else {
+ fs::create_dir_all(path.parent().ok_or("generated output has no parent")?)
+ .map_err(|error| error.to_string())?;
+ fs::write(&path, expected).map_err(|error| format!("{}: {error}", path.display()))?;
+ }
+ Ok(())
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn checked_in_inputs_and_manifest_are_current() {
+ let root = workspace_root();
+ let first = source_manifest_bytes(&root).expect("first deterministic generation");
+ let second = source_manifest_bytes(&root).expect("second deterministic generation");
+ assert_eq!(first, second);
+ regenerate(&root, true).expect("checked-in manifest");
+ }
+
+ #[test]
+ fn text_normalization_and_diagnostics_are_stable() {
+ assert_eq!(
+ normalize_text("a\\b.xml", b"\xef\xbb\xbfa\r\nb\r").unwrap(),
+ "a\nb\n"
+ );
+ let error = normalize_text("a\\b.xml", b"one\n\0two").unwrap_err();
+ assert_eq!(
+ error.to_string(),
+ "a/b.xml:2:1: error[CG002]: input contains a NUL byte"
+ );
+ }
+
+ #[test]
+ fn inventory_rejects_unsafe_paths_hashes_and_unknown_inputs() {
+ let root = workspace_root();
+ let mut inventory = load_inventory(&root).expect("pinned inventory");
+ inventory.inputs[0].vendored_path = "../escape".to_owned();
+ assert!(validate_inventory(&inventory).is_err());
+
+ let mut inventory = load_inventory(&root).expect("pinned inventory");
+ inventory.generators[0].sha256 = "not-a-hash".to_owned();
+ assert!(validate_inventory(&inventory).is_err());
+
+ let mut inventory = load_inventory(&root).expect("pinned inventory");
+ inventory.generators[0].inputs.push("missing".to_owned());
+ assert!(validate_inventory(&inventory).is_err());
+ }
+}
diff --git a/tools/codegen/src/main.rs b/tools/codegen/src/main.rs
new file mode 100644
index 0000000..71dc2d8
--- /dev/null
+++ b/tools/codegen/src/main.rs
@@ -0,0 +1,19 @@
+use libremetaverse_codegen::{regenerate, vendor_inputs, workspace_root};
+use std::path::Path;
+
+fn main() {
+ let arguments: Vec = std::env::args().skip(1).collect();
+ let root = workspace_root();
+ let result = match arguments.as_slice() {
+ [command] if command == "generate" => regenerate(&root, false),
+ [command] if command == "check" => regenerate(&root, true),
+ [command, reference] if command == "vendor" => vendor_inputs(&root, Path::new(reference)),
+ _ => Err(
+ "usage: libremetaverse-codegen ".to_owned(),
+ ),
+ };
+ if let Err(error) = result {
+ eprintln!("{error}");
+ std::process::exit(2);
+ }
+}