diff --git a/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs index ed7951de0..952a9e0fe 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestChannel.cs @@ -1,13 +1,11 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Model = Discord.API.Channel; namespace Discord.Rest { - [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public abstract class RestChannel : RestEntity, IChannel, IUpdateable { internal RestChannel(BaseDiscordClient discord, ulong id) diff --git a/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs index aaa514075..e549eb87d 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestDMChannel.cs @@ -76,7 +76,6 @@ namespace Discord.Rest public override string ToString() => $"@{Recipient}"; private string DebuggerDisplay => $"@{Recipient} ({Id}, DM)"; - //IDMChannel IUser IDMChannel.Recipient => Recipient; diff --git a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs index e4b9de950..0ceadfa5a 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestGroupChannel.cs @@ -86,6 +86,9 @@ namespace Discord.Rest public IDisposable EnterTypingState() => ChannelHelper.EnterTypingState(this, Discord); + public override string ToString() => Name; + private string DebuggerDisplay => $"{Name} ({Id}, Group)"; + //ISocketPrivateChannel IReadOnlyCollection IRestPrivateChannel.Recipients => Recipients; diff --git a/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs index ed5dc45af..bb706fd07 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs @@ -2,14 +2,12 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; -using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Model = Discord.API.Channel; namespace Discord.Rest { - [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public abstract class RestGuildChannel : RestChannel, IGuildChannel, IUpdateable { private ImmutableArray _overwrites; @@ -117,7 +115,9 @@ namespace Discord.Rest => await ChannelHelper.GetInvitesAsync(this, Discord); public async Task CreateInviteAsync(int? maxAge = 3600, int? maxUses = null, bool isTemporary = true) => await ChannelHelper.CreateInviteAsync(this, Discord, maxAge, maxUses, isTemporary); - + + public override string ToString() => Name; + //IGuildChannel async Task> IGuildChannel.GetInvitesAsync() => await GetInvitesAsync(); diff --git a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs index fdbc2ab98..3511a2c3d 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestTextChannel.cs @@ -1,7 +1,6 @@ using Discord.API.Rest; using System; using System.Collections.Generic; -using System.Collections.Immutable; using System.Diagnostics; using System.IO; using System.Linq; @@ -67,6 +66,8 @@ namespace Discord.Rest public IDisposable EnterTypingState() => ChannelHelper.EnterTypingState(this, Discord); + private string DebuggerDisplay => $"{Name} ({Id}, Text)"; + //IGuildChannel async Task IGuildChannel.GetUserAsync(ulong id, CacheMode mode) { diff --git a/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs b/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs index 3c91cdb30..02eab4776 100644 --- a/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs +++ b/src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs @@ -2,7 +2,6 @@ using Discord.Audio; using System; using System.Collections.Generic; -using System.Collections.Immutable; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; @@ -37,6 +36,8 @@ namespace Discord.Rest public Task ModifyAsync(Action func) => ChannelHelper.ModifyAsync(this, Discord, func); + private string DebuggerDisplay => $"{Name} ({Id}, Voice)"; + //IVoiceChannel Task IVoiceChannel.ConnectAsync() { throw new NotSupportedException(); } diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestBan.cs b/src/Discord.Net.Rest/Entities/Guilds/RestBan.cs index d28856d6d..104bec903 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestBan.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestBan.cs @@ -22,6 +22,7 @@ namespace Discord.Rest public override string ToString() => User.ToString(); private string DebuggerDisplay => $"{User}: {Reason}"; + //IBan IUser IBan.User => User; } } diff --git a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs index b0f7c6fff..8f5d269e5 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs @@ -171,6 +171,9 @@ namespace Discord.Rest public Task PruneUsersAsync(int days = 30, bool simulate = false) => GuildHelper.PruneUsersAsync(this, Discord, days, simulate); + public override string ToString() => Name; + private string DebuggerDisplay => $"{Name} ({Id})"; + //IGuild bool IGuild.Available => Available; IAudioClient IGuild.AudioClient => null; diff --git a/src/Discord.Net.Rest/Entities/Invites/RestInviteMetadata.cs b/src/Discord.Net.Rest/Entities/Invites/RestInviteMetadata.cs index 131211a39..cd1a66311 100644 --- a/src/Discord.Net.Rest/Entities/Invites/RestInviteMetadata.cs +++ b/src/Discord.Net.Rest/Entities/Invites/RestInviteMetadata.cs @@ -4,7 +4,6 @@ using Model = Discord.API.InviteMetadata; namespace Discord.Rest { - [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestInviteMetadata : RestInvite, IInviteMetadata { private long _createdAtTicks; diff --git a/src/Discord.Net.Rest/Entities/Messages/RestAttachment.cs b/src/Discord.Net.Rest/Entities/Messages/RestAttachment.cs index 3d9492f2e..5d31558c8 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestAttachment.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestAttachment.cs @@ -1,8 +1,9 @@ -using Model = Discord.API.Attachment; +using System.Diagnostics; +using Model = Discord.API.Attachment; namespace Discord { - //TODO: Rename to Attachment? + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestAttachment : IAttachment { public ulong Id { get; } @@ -29,5 +30,8 @@ namespace Discord model.Height.IsSpecified ? model.Height.Value : (int?)null, model.Width.IsSpecified ? model.Width.Value : (int?)null); } + + public override string ToString() => Filename; + private string DebuggerDisplay => $"{Filename} ({Size} bytes)"; } } diff --git a/src/Discord.Net.Rest/Entities/Messages/RestEmbed.cs b/src/Discord.Net.Rest/Entities/Messages/RestEmbed.cs index bc7b09faf..32856ebb6 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestEmbed.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestEmbed.cs @@ -1,7 +1,9 @@ -using Model = Discord.API.Embed; +using System.Diagnostics; +using Model = Discord.API.Embed; namespace Discord { + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestEmbed : IEmbed { public string Description { get; } @@ -26,5 +28,8 @@ namespace Discord model.Provider.IsSpecified ? EmbedProvider.Create(model.Provider.Value) : (EmbedProvider?)null, model.Thumbnail.IsSpecified ? EmbedThumbnail.Create(model.Thumbnail.Value) : (EmbedThumbnail?)null); } + + public override string ToString() => Title; + private string DebuggerDisplay => $"{Title} ({Type})"; } } diff --git a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs index 660cdadf3..d2d5d722f 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestMessage.cs @@ -1,13 +1,11 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; -using System.Diagnostics; using System.Threading.Tasks; using Model = Discord.API.Message; namespace Discord.Rest { - [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public abstract class RestMessage : RestEntity, IMessage, IUpdateable { private long _timestampTicks; @@ -56,6 +54,8 @@ namespace Discord.Rest Update(model); } + public override string ToString() => Content; + MessageType IMessage.Type => MessageType.Default; } } diff --git a/src/Discord.Net.Rest/Entities/Messages/RestSystemMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestSystemMessage.cs index 9cef3f479..7c62b4217 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestSystemMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestSystemMessage.cs @@ -24,5 +24,7 @@ namespace Discord.Rest Type = model.Type; } + + private string DebuggerDisplay => $"{Author}: {Content} ({Id}, {Type})"; } } diff --git a/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs b/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs index a588126e4..a8cc928a5 100644 --- a/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs +++ b/src/Discord.Net.Rest/Entities/Messages/RestUserMessage.cs @@ -130,5 +130,7 @@ namespace Discord.Rest text = MentionsHelper.ResolveEveryoneMentions(text, everyoneHandling); return text; } + + private string DebuggerDisplay => $"{Author}: {Content} ({Id}{(Attachments.Count > 0 ? $", {Attachments.Count} Attachments" : "")}"; } } diff --git a/src/Discord.Net.Rest/Entities/RestApplication.cs b/src/Discord.Net.Rest/Entities/RestApplication.cs index e0b119381..26456c79c 100644 --- a/src/Discord.Net.Rest/Entities/RestApplication.cs +++ b/src/Discord.Net.Rest/Entities/RestApplication.cs @@ -1,9 +1,11 @@ using System; +using System.Diagnostics; using System.Threading.Tasks; using Model = Discord.API.Application; namespace Discord.Rest { + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class RestApplication : RestEntity, IApplication { protected string _iconId; @@ -27,7 +29,6 @@ namespace Discord.Rest entity.Update(model); return entity; } - internal void Update(Model model) { Description = model.Description; @@ -45,5 +46,8 @@ namespace Discord.Rest throw new InvalidOperationException("Unable to update this object from a different application token."); Update(response); } + + public override string ToString() => Name; + private string DebuggerDisplay => $"{Name} ({Id})"; } } diff --git a/src/Discord.Net.Rest/Entities/Roles/RestRole.cs b/src/Discord.Net.Rest/Entities/Roles/RestRole.cs index 35d4a14f5..1f8dd0f67 100644 --- a/src/Discord.Net.Rest/Entities/Roles/RestRole.cs +++ b/src/Discord.Net.Rest/Entities/Roles/RestRole.cs @@ -46,6 +46,9 @@ namespace Discord.Rest public Task DeleteAsync() => RoleHelper.DeleteAsync(this, Discord); + public override string ToString() => Name; + private string DebuggerDisplay => $"{Name} ({Id})"; + //IRole IGuild IRole.Guild => Guild; } diff --git a/src/Discord.Net.Rest/Entities/Users/RestConnection.cs b/src/Discord.Net.Rest/Entities/Users/RestConnection.cs index a369edd96..2ee1e0e7d 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestConnection.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestConnection.cs @@ -30,6 +30,6 @@ namespace Discord } public override string ToString() => Name; - private string DebuggerDisplay => $"{Name} ({Id}, Type = {Type}{(IsRevoked ? ", Revoked" : "")})"; + private string DebuggerDisplay => $"{Name} ({Id}, {Type}{(IsRevoked ? ", Revoked" : "")})"; } } diff --git a/src/Discord.Net.Rest/Entities/Users/RestUser.cs b/src/Discord.Net.Rest/Entities/Users/RestUser.cs index b4d957f3c..34cb9437b 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestUser.cs @@ -46,6 +46,10 @@ namespace Discord.Rest public Task CreateDMChannelAsync() => UserHelper.CreateDMChannelAsync(this, Discord); + public override string ToString() => $"{Username}#{Discriminator}"; + internal string DebuggerDisplay => $"{Username}#{Discriminator} (Id{(IsBot ? ", Bot" : "")})"; + + //IUser Task IUser.GetDMChannelAsync(CacheMode mode) => Task.FromResult(null); async Task IUser.CreateDMChannelAsync() diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs index 3c169d0dd..f64fe811b 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketMessage.cs @@ -6,7 +6,6 @@ using Model = Discord.API.Message; namespace Discord.WebSocket { - [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public abstract class SocketMessage : SocketEntity, IMessage { private long _timestampTicks; @@ -49,7 +48,8 @@ namespace Discord.WebSocket if (model.Content.IsSpecified) Content = model.Content.Value; } - + + public override string ToString() => Content; internal SocketMessage Clone() => MemberwiseClone() as SocketMessage; //IMessage diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketSystemMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketSystemMessage.cs index 87d9a19c6..7678bb412 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketSystemMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketSystemMessage.cs @@ -1,7 +1,9 @@ -using Model = Discord.API.Message; +using System.Diagnostics; +using Model = Discord.API.Message; namespace Discord.WebSocket { + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] internal class SocketSystemMessage : SocketMessage, ISystemMessage { public MessageType Type { get; private set; } @@ -22,8 +24,7 @@ namespace Discord.WebSocket Type = model.Type; } - - public override string ToString() => Content; + private string DebuggerDisplay => $"{Author}: {Content} ({Id}, {Type})"; internal new SocketSystemMessage Clone() => MemberwiseClone() as SocketSystemMessage; } diff --git a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs index a7c8059ef..ec26c7dc5 100644 --- a/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs +++ b/src/Discord.Net.WebSocket/Entities/Messages/SocketUserMessage.cs @@ -3,11 +3,13 @@ using Discord.Rest; using System; using System.Collections.Generic; using System.Collections.Immutable; +using System.Diagnostics; using System.Threading.Tasks; using Model = Discord.API.Message; namespace Discord.WebSocket { + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketUserMessage : SocketMessage, IUserMessage { private bool _isMentioningEveryone, _isTTS, _isPinned; @@ -131,7 +133,6 @@ namespace Discord.WebSocket return text; } - public override string ToString() => Content; private string DebuggerDisplay => $"{Author}: {Content} ({Id}{(Attachments.Count > 0 ? $", {Attachments.Count} Attachments" : "")}"; internal new SocketUserMessage Clone() => MemberwiseClone() as SocketUserMessage; } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs index f54fcaa73..f0b23543e 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGlobalUser.cs @@ -1,7 +1,9 @@ -using Model = Discord.API.User; +using System.Diagnostics; +using Model = Discord.API.User; namespace Discord.WebSocket { + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] internal class SocketGlobalUser : SocketUser { public override bool IsBot { get; internal set; } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs index 01d473a00..b99019c2c 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs @@ -3,12 +3,14 @@ using Discord.Rest; using System; using System.Collections.Generic; using System.Collections.Immutable; +using System.Diagnostics; using System.Threading.Tasks; using Model = Discord.API.GuildMember; using PresenceModel = Discord.API.Presence; namespace Discord.WebSocket { + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketGuildUser : SocketUser, IGuildUser { private long? _joinedAtTicks; diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketPresence.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketPresence.cs index edfe67e3f..8dfae8d49 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketPresence.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketPresence.cs @@ -1,8 +1,10 @@ -using Model = Discord.API.Presence; +using System.Diagnostics; +using Model = Discord.API.Presence; namespace Discord.WebSocket { //TODO: C#7 Candidate for record type + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public struct SocketPresence : IPresence { public Game? Game { get; } @@ -18,6 +20,9 @@ namespace Discord.WebSocket return new SocketPresence(model.Game != null ? Discord.Game.Create(model.Game) : (Game?)null, model.Status); } + public override string ToString() => Status.ToString(); + internal string DebuggerDisplay => $"{Status}{(Game != null ? $", {Game.Value.Name} ({Game.Value.StreamType})" : "")}"; + internal SocketPresence Clone() => this; } } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs index e859d7c0a..21578de41 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketSelfUser.cs @@ -1,11 +1,13 @@ using Discord.API.Rest; using Discord.Rest; using System; +using System.Diagnostics; using System.Threading.Tasks; using Model = Discord.API.User; namespace Discord.WebSocket { + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketSelfUser : SocketUser, ISelfUser { public string Email { get; private set; } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketSimpleUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketSimpleUser.cs index be2b279fc..a45a68703 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketSimpleUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketSimpleUser.cs @@ -1,9 +1,11 @@ using System; +using System.Diagnostics; using Model = Discord.API.User; using PresenceModel = Discord.API.Presence; namespace Discord.WebSocket { + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public class SocketSimpleUser : SocketUser { public override bool IsBot { get; internal set; } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs index a9c419cf2..3f4b6426b 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs @@ -44,7 +44,7 @@ namespace Discord.WebSocket => UserHelper.CreateDMChannelAsync(this, Discord); public override string ToString() => $"{Username}#{Discriminator}"; - private string DebuggerDisplay => $"{Username}#{Discriminator} (Id{(IsBot ? ", Bot" : "")})"; + internal string DebuggerDisplay => $"{Username}#{Discriminator} (Id{(IsBot ? ", Bot" : "")})"; internal SocketUser Clone() => MemberwiseClone() as SocketUser; //IUser diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketVoiceState.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketVoiceState.cs index 39d8e3ae3..ed4036362 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketVoiceState.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketVoiceState.cs @@ -1,15 +1,17 @@ using System; +using System.Diagnostics; using Model = Discord.API.VoiceState; namespace Discord.WebSocket { //TODO: C#7 Candidate for record type + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public struct SocketVoiceState : IVoiceState { [Flags] private enum Flags : byte { - None = 0x00, + Normal = 0x00, Suppressed = 0x01, Muted = 0x02, Deafened = 0x04, @@ -33,7 +35,7 @@ namespace Discord.WebSocket VoiceChannel = voiceChannel; VoiceSessionId = sessionId; - Flags voiceStates = Flags.None; + Flags voiceStates = Flags.Normal; if (isSelfMuted) voiceStates |= Flags.SelfMuted; if (isSelfDeafened) @@ -47,6 +49,8 @@ namespace Discord.WebSocket return new SocketVoiceState(voiceChannel, model.SessionId, model.SelfMute, model.SelfDeaf, model.Suppress); } + public override string ToString() => VoiceChannel?.Name ?? "Unknown"; + internal string DebuggerDisplay => $"{VoiceChannel?.Name ?? "Unknown"} ({_voiceStates})"; internal SocketVoiceState Clone() => this; IVoiceChannel IVoiceState.VoiceChannel => VoiceChannel;