Implement object manager vertical slice (#69)
All checks were successful
Native code generation / deterministic (push) Successful in 14m47s
Imaging and meshing gate / native (push) Successful in 5m5s
Native Rust workspace compile / compile (push) Successful in 5m5s

This commit is contained in:
2026-08-10 14:32:46 +00:00
parent 43820f6bd1
commit 13f85bfa34
9 changed files with 3954 additions and 690 deletions

View File

@@ -209,6 +209,22 @@ NATIVE_TYPES = {
"T:LibreMetaverse.Primitive.TextureEntry": "crate::object_model::PrimitiveTextureEntry",
"T:LibreMetaverse.Primitive.TextureEntryFace": "crate::object_model::PrimitiveTextureEntryFace",
"T:LibreMetaverse.Materials.LegacyMaterial": "crate::object_model::LegacyMaterial",
"T:LibreMetaverse.ObjectMediaEventArgs": "crate::object_material::ObjectMediaEventArgs",
"T:LibreMetaverse.AvatarSitChangedEventArgs": "crate::object_manager::AvatarSitChangedEventArgs",
"T:LibreMetaverse.AvatarUpdateEventArgs": "crate::object_manager::AvatarUpdateEventArgs",
"T:LibreMetaverse.KillObjectEventArgs": "crate::object_manager::KillObjectEventArgs",
"T:LibreMetaverse.KillObjectsEventArgs": "crate::object_manager::KillObjectsEventArgs",
"T:LibreMetaverse.ObjectAnimationEventArgs": "crate::object_manager::ObjectAnimationEventArgs",
"T:LibreMetaverse.ObjectDataBlockUpdateEventArgs": "crate::object_manager::ObjectDataBlockUpdateEventArgs",
"T:LibreMetaverse.ObjectMovementUpdate": "crate::object_manager::ObjectMovementUpdate",
"T:LibreMetaverse.ObjectPropertiesEventArgs": "crate::object_manager::ObjectPropertiesEventArgs",
"T:LibreMetaverse.ObjectPropertiesFamilyEventArgs": "crate::object_manager::ObjectPropertiesFamilyEventArgs",
"T:LibreMetaverse.ObjectPropertiesUpdatedEventArgs": "crate::object_manager::ObjectPropertiesUpdatedEventArgs",
"T:LibreMetaverse.ParticleUpdateEventArgs": "crate::object_manager::ParticleUpdateEventArgs",
"T:LibreMetaverse.PayPriceReplyEventArgs": "crate::object_manager::PayPriceReplyEventArgs",
"T:LibreMetaverse.PhysicsPropertiesEventArgs": "crate::object_manager::PhysicsPropertiesEventArgs",
"T:LibreMetaverse.PrimEventArgs": "crate::object_manager::PrimEventArgs",
"T:LibreMetaverse.TerseObjectUpdateEventArgs": "crate::object_manager::TerseObjectUpdateEventArgs",
"T:LibreMetaverse.ArchetypeParam": "crate::genepool_catalog::ArchetypeParam",
"T:LibreMetaverse.AttentionData": "crate::attention_catalog::AttentionData",
"T:LibreMetaverse.AttentionSet": "crate::attention_catalog::AttentionSet",
@@ -342,6 +358,34 @@ NATIVE_DECLARATIONS = {
}
NATIVE_MEMBER_BODIES = {
"E:LibreMetaverse.ObjectManager.AvatarSitChanged":
"self.native_subscribe_avatar_sit_changed(handler)",
"E:LibreMetaverse.ObjectManager.AvatarUpdate":
"self.native_subscribe_avatar_update(handler)",
"E:LibreMetaverse.ObjectManager.KillObject":
"self.native_subscribe_kill_object(handler)",
"E:LibreMetaverse.ObjectManager.KillObjects":
"self.native_subscribe_kill_objects(handler)",
"E:LibreMetaverse.ObjectManager.ObjectAnimation":
"self.native_subscribe_object_animation(handler)",
"E:LibreMetaverse.ObjectManager.ObjectDataBlockUpdate":
"self.native_subscribe_object_data_block_update(handler)",
"E:LibreMetaverse.ObjectManager.ObjectProperties":
"self.native_subscribe_object_properties(handler)",
"E:LibreMetaverse.ObjectManager.ObjectPropertiesFamily":
"self.native_subscribe_object_properties_family(handler)",
"E:LibreMetaverse.ObjectManager.ObjectPropertiesUpdated":
"self.native_subscribe_object_properties_updated(handler)",
"E:LibreMetaverse.ObjectManager.ObjectUpdate":
"self.native_subscribe_object_update(handler)",
"E:LibreMetaverse.ObjectManager.ParticleUpdate":
"self.native_subscribe_particle_update(handler)",
"E:LibreMetaverse.ObjectManager.PayPriceReply":
"self.native_subscribe_pay_price_reply(handler)",
"E:LibreMetaverse.ObjectManager.PhysicsProperties":
"self.native_subscribe_physics_properties(handler)",
"E:LibreMetaverse.ObjectManager.TerseObjectUpdate":
"self.native_subscribe_terse_object_update(handler)",
"M:LibreMetaverse.Helpers.TEGlowByte(System.Single)":
"Ok(crate::object_model::te_glow_byte(glow))",
"M:LibreMetaverse.Helpers.TEGlowFloat(System.Byte[],System.Int32)":
@@ -909,9 +953,9 @@ NATIVE_MEMBER_BODIES = {
"P:LibreMetaverse.GridClient.Assets#set":
"self.native_set_assets(value)",
"P:LibreMetaverse.GridClient.Objects":
"crate::object_material::ObjectManager::native_new(Some(std::sync::Arc::new(self.clone()))).unwrap_or_else(|_| panic!(\"failed to construct ObjectManager\"))",
"self.native_objects().unwrap_or_else(|_| panic!(\"failed to construct ObjectManager\"))",
"P:LibreMetaverse.GridClient.Objects#set":
"{ let _ = value; }",
"self.native_set_objects(value)",
"P:LibreMetaverse.GridClient.Inventory":
"self.native_inventory().unwrap_or_else(|_| panic!(\"failed to construct InventoryManager\"))",
"P:LibreMetaverse.GridClient.Inventory#set":
@@ -954,6 +998,130 @@ NATIVE_MEMBER_BODIES = {
"crate::inventory_ais::InventoryAISClient::native_new(client)",
"M:LibreMetaverse.ObjectManager.#ctor(LibreMetaverse.GridClient)":
"crate::object_material::ObjectManager::native_new(client)",
"M:LibreMetaverse.ObjectManager.CleanupObjectTracking":
"{ self.native_cleanup_tracking(); Ok(()) }",
"M:LibreMetaverse.ObjectManager.Dispose":
"{ self.native_dispose(); Ok(()) }",
"M:LibreMetaverse.ObjectManager.RequestObject(LibreMetaverse.Simulator,System.UInt32)":
"self.native_request_objects(simulator, vec![local_id])",
"M:LibreMetaverse.ObjectManager.RequestObjects(LibreMetaverse.Simulator,System.Collections.Generic.List{System.UInt32})":
"self.native_request_objects(simulator, local_i_ds)",
"M:LibreMetaverse.ObjectManager.SelectObject(LibreMetaverse.Simulator,System.UInt32)":
"self.native_select_objects(simulator, vec![local_id], true)",
"M:LibreMetaverse.ObjectManager.SelectObject(LibreMetaverse.Simulator,System.UInt32,System.Boolean)":
"self.native_select_objects(simulator, vec![local_id], automatic_deselect)",
"M:LibreMetaverse.ObjectManager.SelectObjects(LibreMetaverse.Simulator,System.UInt32[])":
"self.native_select_objects(simulator, local_i_ds, true)",
"M:LibreMetaverse.ObjectManager.SelectObjects(LibreMetaverse.Simulator,System.UInt32[],System.Boolean)":
"self.native_select_objects(simulator, local_i_ds, automatic_deselect)",
"M:LibreMetaverse.ObjectManager.DeselectObject(LibreMetaverse.Simulator,System.UInt32)":
"self.native_deselect_objects(simulator, vec![local_id])",
"M:LibreMetaverse.ObjectManager.DeselectObjects(LibreMetaverse.Simulator,System.UInt32[])":
"self.native_deselect_objects(simulator, local_i_ds)",
"M:LibreMetaverse.ObjectManager.LinkPrims(LibreMetaverse.Simulator,System.Collections.Generic.List{System.UInt32})":
"self.native_link_objects(simulator, local_i_ds, true)",
"M:LibreMetaverse.ObjectManager.DelinkPrims(LibreMetaverse.Simulator,System.Collections.Generic.List{System.UInt32})":
"self.native_link_objects(simulator, local_i_ds, false)",
"M:LibreMetaverse.ObjectManager.RequestPayPrice(LibreMetaverse.Simulator,LibreMetaverse.UUID)":
"self.native_request_pay_price(simulator, object_id)",
"M:LibreMetaverse.ObjectManager.RequestObjectPropertiesFamily(LibreMetaverse.Simulator,LibreMetaverse.UUID)":
"self.native_request_properties_family(simulator, object_id, true)",
"M:LibreMetaverse.ObjectManager.RequestObjectPropertiesFamily(LibreMetaverse.Simulator,LibreMetaverse.UUID,System.Boolean)":
"self.native_request_properties_family(simulator, object_id, reliable)",
"M:LibreMetaverse.ObjectManager.SetName(LibreMetaverse.Simulator,System.UInt32,System.String)":
"self.native_set_names(simulator, vec![local_id], vec![name])",
"M:LibreMetaverse.ObjectManager.SetNames(LibreMetaverse.Simulator,System.UInt32[],System.String[])":
"self.native_set_names(simulator, local_i_ds, names)",
"M:LibreMetaverse.ObjectManager.SetDescription(LibreMetaverse.Simulator,System.UInt32,System.String)":
"self.native_set_descriptions(simulator, vec![local_id], vec![description])",
"M:LibreMetaverse.ObjectManager.SetDescriptions(LibreMetaverse.Simulator,System.UInt32[],System.String[])":
"self.native_set_descriptions(simulator, local_i_ds, descriptions)",
"M:LibreMetaverse.ObjectManager.UpdateObject(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Vector3,LibreMetaverse.UpdateType)":
"self.native_update_vector(simulator, local_id, data, type_)",
"M:LibreMetaverse.ObjectManager.SetPosition(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Vector3)":
"self.native_update_vector(simulator, local_id, position, crate::UpdateType(crate::UpdateType::POSITION.0 | crate::UpdateType::LINKED.0))",
"M:LibreMetaverse.ObjectManager.SetPosition(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Vector3,System.Boolean)":
"self.native_update_vector(simulator, local_id, position, crate::UpdateType(crate::UpdateType::POSITION.0 | if child_only { 0 } else { crate::UpdateType::LINKED.0 }))",
"M:LibreMetaverse.ObjectManager.SetScale(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Vector3,System.Boolean,System.Boolean)":
"self.native_update_vector(simulator, local_id, scale, crate::UpdateType(crate::UpdateType::SCALE.0 | if child_only { 0 } else { crate::UpdateType::LINKED.0 } | if uniform { crate::UpdateType::UNIFORM.0 } else { 0 }))",
"M:LibreMetaverse.ObjectManager.SetRotation(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Quaternion)":
"self.native_update_rotation(simulator, local_id, rotation, false)",
"M:LibreMetaverse.ObjectManager.SetRotation(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Quaternion,System.Boolean)":
"self.native_update_rotation(simulator, local_id, quat, child_only)",
"M:LibreMetaverse.ObjectManager.GetPrimitive(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.UUID,System.Boolean)":
"self.native_get_primitive(simulator, local_id, full_id, create_if_missing)",
"M:LibreMetaverse.ObjectManager.TrackObjectInSimulator(LibreMetaverse.UUID,LibreMetaverse.Simulator)":
"{ self.native_track(object_id, sim); Ok(()) }",
"M:LibreMetaverse.ObjectManager.UntrackObjectInSimulator(LibreMetaverse.UUID,LibreMetaverse.Simulator)":
"{ self.native_untrack(object_id, &sim); Ok(()) }",
"M:LibreMetaverse.ObjectManager.GetSimulatorsForObject(LibreMetaverse.UUID)":
"Ok(self.native_simulators_for(object_id))",
"M:LibreMetaverse.ObjectManager.IsNearBorder(LibreMetaverse.Vector3,System.UInt32,System.UInt32,System.Single)":
"crate::object_material::ObjectManager::native_is_near_border(position, region_size_x, region_size_y, threshold)",
"M:LibreMetaverse.ObjectManager.BuyObject(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.SaleType,System.Int32,LibreMetaverse.UUID,LibreMetaverse.UUID)":
"self.native_buy_object(simulator, local_id, sale_type, price, group_id, category_id)",
"M:LibreMetaverse.ObjectManager.AttachObject(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.AttachmentPoint,LibreMetaverse.Quaternion)":
"self.native_attach(simulator, local_id, attach_point, rotation)",
"M:LibreMetaverse.ObjectManager.DropObject(LibreMetaverse.Simulator,System.UInt32)":
"self.native_attachment_action(simulator, vec![local_id], true)",
"M:LibreMetaverse.ObjectManager.DetachObjects(LibreMetaverse.Simulator,System.Collections.Generic.List{System.UInt32})":
"self.native_attachment_action(simulator, local_i_ds, false)",
"M:LibreMetaverse.ObjectManager.SetObjectsGroup(LibreMetaverse.Simulator,System.Collections.Generic.List{System.UInt32},LibreMetaverse.UUID)":
"self.native_set_group(simulator, local_ids, group_id)",
"M:LibreMetaverse.ObjectManager.SetPermissions(LibreMetaverse.Simulator,System.Collections.Generic.List{System.UInt32},LibreMetaverse.PermissionWho,LibreMetaverse.PermissionMask,System.Boolean)":
"self.native_set_permissions(simulator, local_i_ds, who, permissions, set)",
"M:LibreMetaverse.ObjectManager.DeedObject(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.UUID)":
"self.native_deed_objects(simulator, vec![local_id], group_owner)",
"M:LibreMetaverse.ObjectManager.DeedObjects(LibreMetaverse.Simulator,System.Collections.Generic.List{System.UInt32},LibreMetaverse.UUID)":
"self.native_deed_objects(simulator, local_i_ds, group_owner)",
"M:LibreMetaverse.ObjectManager.SetSaleInfo(LibreMetaverse.Simulator,System.Collections.Generic.List{System.UInt32},LibreMetaverse.SaleType,System.Int32)":
"self.native_set_sale_info(simulator, local_i_ds, sale_type, price)",
"M:LibreMetaverse.ObjectManager.SetSaleInfo(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.SaleType,System.Int32)":
"self.native_set_sale_info(simulator, vec![local_id], sale_type, price)",
"M:LibreMetaverse.ObjectManager.SetFlags(LibreMetaverse.Simulator,System.UInt32,System.Boolean,System.Boolean,System.Boolean,System.Boolean)":
"self.native_set_flags(simulator, local_id, physical, temporary, phantom, casts_shadow, libremetaverse_types::PhysicsShapeType::Prim, 1000.0, 0.6, 0.5, 1.0)",
"M:LibreMetaverse.ObjectManager.SetFlags(LibreMetaverse.Simulator,System.UInt32,System.Boolean,System.Boolean,System.Boolean,System.Boolean,LibreMetaverse.PhysicsShapeType,System.Single,System.Single,System.Single,System.Single)":
"self.native_set_flags(simulator, local_id, physical, temporary, phantom, casts_shadow, physics_type, density, friction, restitution, gravity_multiplier)",
"M:LibreMetaverse.ObjectManager.ClickObjectAsync(LibreMetaverse.Simulator,System.UInt32,System.Threading.CancellationToken)":
"self.native_click_object(simulator, local_id, libremetaverse_types::Vector3::zero(), libremetaverse_types::Vector3::zero(), 0, libremetaverse_types::Vector3::zero(), libremetaverse_types::Vector3::zero(), libremetaverse_types::Vector3::zero(), cancellation_token).await",
"M:LibreMetaverse.ObjectManager.ClickObjectAsync(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Vector3,LibreMetaverse.Vector3,System.Int32,LibreMetaverse.Vector3,LibreMetaverse.Vector3,LibreMetaverse.Vector3,System.Threading.CancellationToken)":
"self.native_click_object(simulator, local_id, uv_coord, st_coord, face_index, position, normal, binormal, cancellation_token).await",
"M:LibreMetaverse.ObjectManager.AddPrim(LibreMetaverse.Simulator,LibreMetaverse.Primitive.ConstructionData,LibreMetaverse.UUID,LibreMetaverse.Vector3,LibreMetaverse.Vector3,LibreMetaverse.Quaternion)":
"self.native_add_prim(simulator, prim, group_id, position, scale, rotation, libremetaverse_types::PrimFlags::CREATE_SELECTED)",
"M:LibreMetaverse.ObjectManager.AddPrim(LibreMetaverse.Simulator,LibreMetaverse.Primitive.ConstructionData,LibreMetaverse.UUID,LibreMetaverse.Vector3,LibreMetaverse.Vector3,LibreMetaverse.Quaternion,LibreMetaverse.PrimFlags)":
"self.native_add_prim(simulator, prim, group_id, position, scale, rotation, create_flags)",
"M:LibreMetaverse.ObjectManager.AddTree(LibreMetaverse.Simulator,LibreMetaverse.Vector3,LibreMetaverse.Quaternion,LibreMetaverse.Vector3,LibreMetaverse.Tree,LibreMetaverse.UUID,System.Boolean)":
"self.native_add_foliage(simulator, scale, rotation, position, tree_type as u8, group_owner, if new_tree { libremetaverse_types::PCode::NewTree } else { libremetaverse_types::PCode::Tree })",
"M:LibreMetaverse.ObjectManager.AddGrass(LibreMetaverse.Simulator,LibreMetaverse.Vector3,LibreMetaverse.Quaternion,LibreMetaverse.Vector3,LibreMetaverse.Grass,LibreMetaverse.UUID)":
"self.native_add_foliage(simulator, scale, rotation, position, grass_type as u8, group_owner, libremetaverse_types::PCode::Grass)",
"M:LibreMetaverse.ObjectManager.BuildBasicShape(LibreMetaverse.PrimType)":
"crate::object_material::ObjectManager::native_basic_shape(type_)",
"M:LibreMetaverse.ObjectManager.SetTextures(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Primitive.TextureEntry)":
"self.native_set_textures(simulator, local_id, textures, String::new())",
"M:LibreMetaverse.ObjectManager.SetTextures(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Primitive.TextureEntry,System.String)":
"self.native_set_textures(simulator, local_id, textures, media_url)",
"M:LibreMetaverse.ObjectManager.SetLight(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Primitive.LightData)":
"{ let in_use = light.intensity != 0.0; let data = light.get_bytes()?; self.native_set_extra_param(simulator, local_id, libremetaverse_types::ExtraParamType::LIGHT, in_use, data) }",
"M:LibreMetaverse.ObjectManager.SetFlexible(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Primitive.FlexibleData)":
"{ let data = flexible.get_bytes()?; self.native_set_extra_param(simulator, local_id, libremetaverse_types::ExtraParamType::FLEXIBLE, true, data) }",
"M:LibreMetaverse.ObjectManager.SetSculpt(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Primitive.SculptData)":
"self.native_set_sculpt(simulator, local_id, sculpt)",
"M:LibreMetaverse.ObjectManager.SetExtraParamOff(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.ExtraParamType)":
"self.native_set_extra_param(simulator, local_id, type_, false, Vec::new())",
"M:LibreMetaverse.ObjectManager.SetShape(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Primitive.ConstructionData)":
"self.native_set_shape(simulator, local_id, prim)",
"M:LibreMetaverse.ObjectManager.SetMaterial(LibreMetaverse.Simulator,System.UInt32,LibreMetaverse.Material)":
"self.native_set_material(simulator, local_id, material)",
"M:LibreMetaverse.ObjectManager.NavigateObjectMediaAsync(LibreMetaverse.UUID,System.Int32,System.String,LibreMetaverse.Simulator,System.Threading.CancellationToken)":
"self.native_navigate_object_media(prim_id, face, new_url, sim, cancellation_token).await",
"M:LibreMetaverse.ObjectManager.UpdateObjectMediaAsync(LibreMetaverse.UUID,LibreMetaverse.MediaEntry[],LibreMetaverse.Simulator,System.Threading.CancellationToken)":
"self.native_update_object_media(prim_id, face_media, sim, cancellation_token).await",
"M:LibreMetaverse.ObjectManager.RequestObjectMediaAsync(LibreMetaverse.UUID,LibreMetaverse.Simulator,System.Threading.CancellationToken)":
"self.native_request_object_media(prim_id, sim, cancellation_token).await",
"M:LibreMetaverse.ObjectManager.RequestMaterialsAsync(LibreMetaverse.Simulator,System.Threading.CancellationToken)":
"self.native_request_materials(sim, None, cancellation_token).await",
"M:LibreMetaverse.ObjectManager.RequestMaterialsAsync(LibreMetaverse.Simulator,System.Collections.Generic.IEnumerable{LibreMetaverse.UUID},System.Threading.CancellationToken)":
"self.native_request_materials(sim, Some(materials.collect()), cancellation_token).await",
"M:LibreMetaverse.ObjectManager.SendMaterialUpdatesAsync(LibreMetaverse.Simulator,System.Collections.Generic.IEnumerable{LibreMetaverse.GLTFMaterialUpdate},System.Threading.CancellationToken)":
"self.native_send_material_updates(sim, updates, cancellation_token).await",
"M:LibreMetaverse.ObjectManager.SetMaterialOverrideAsync(LibreMetaverse.Simulator,LibreMetaverse.UUID,System.Int32,LibreMetaverse.Assets.AssetMaterial,System.Threading.CancellationToken)":
@@ -2427,6 +2595,11 @@ PRIVATE_LAYOUTS = {
"T:LibreMetaverse.StructuredData.OSDUri": [("value", "libremetaverse_types::compat::Uri")],
}
VALUE_DERIVES = {
"T:LibreMetaverse.Avatar": "Clone",
"T:LibreMetaverse.Avatar.Attachment": "Clone",
"T:LibreMetaverse.Avatar.AvatarProperties": "Clone",
"T:LibreMetaverse.Avatar.Interests": "Clone",
"T:LibreMetaverse.Avatar.Statistics": "Clone",
"T:LibreMetaverse.AgentSettings": "Clone, Debug, Eq, PartialEq",
"T:LibreMetaverse.AppearanceManager.WearableData": "Clone, Debug",
"T:LibreMetaverse.AssetCacheSettings": "Clone, Debug, Eq, PartialEq",
@@ -2437,6 +2610,8 @@ VALUE_DERIVES = {
"T:LibreMetaverse.InventoryBase": "Clone, Debug",
"T:LibreMetaverse.InventoryFolder": "Clone, Debug",
"T:LibreMetaverse.Matrix4": "Clone, Copy, Debug",
"T:LibreMetaverse.NameValue": "Clone, Debug",
"T:LibreMetaverse.Packets.ObjectUpdatePacket.ObjectDataBlock": "Clone, Debug",
"T:LibreMetaverse.Quaternion": "Clone, Copy, Debug",
"T:LibreMetaverse.PacketSettings": "Clone, Debug, Eq, PartialEq",
"T:LibreMetaverse.ParcelSettings": "Clone, Debug, Eq, PartialEq",

View File

@@ -1014,6 +1014,7 @@ def validate_generated_shims() -> None:
"crate::message_decoder::",
"crate::NameValue {",
"crate::object_material::",
"crate::object_manager::",
"crate::object_model::",
"crate::notation::",
"crate::packet_catalog::",