diff --git a/CapyKit/Attributes/EnumerationAttribute.cs b/CapyKit/Attributes/EnumerationAttribute.cs index 47b6eaa..13e7ca3 100644 --- a/CapyKit/Attributes/EnumerationAttribute.cs +++ b/CapyKit/Attributes/EnumerationAttribute.cs @@ -1,43 +1,36 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace CapyKit.Attributes; -namespace CapyKit.Attributes +/// +/// Custom attribute class for decorating enumeration fields with additional data. +/// +/// +/// Generic type parameter allowing for arbitrary declarations and assignments of meaning. +/// +[AttributeUsage(AttributeTargets.Field)] +public abstract class EnumerationAttribute : Attribute { - /// - /// Custom attribute class for decorating enumeration fields with additional data. - /// - /// - /// Generic type parameter allowing for arbitrary declarations and assignments of meaning. - /// - [AttributeUsage(AttributeTargets.Field)] - public abstract class EnumerationAttribute : Attribute + #region Constructors + + /// Gets the value of the enumeration represented by this attribute. + /// + /// Initializes a new instance of the class with a + /// specified value. + /// + protected EnumerationAttribute(T value) { - #region Properties - - /// - /// Initializes a new instance of the class with a - /// specified value. - /// - /// The value. - public T Value { get; private set; } - - #endregion - - #region Constructors - - /// Gets the value of the enumeration represented by this attribute. - /// - /// Initializes a new instance of the class with a - /// specified value. - /// - protected EnumerationAttribute(T value) - { - this.Value = value; - } - - #endregion + this.Value = value; } -} + + #endregion + + #region Properties + + /// + /// Initializes a new instance of the class with a + /// specified value. + /// + /// The value. + public T Value { get; private set; } + + #endregion +} \ No newline at end of file diff --git a/CapyKit/Attributes/EnumerationDescriptionAttribute.cs b/CapyKit/Attributes/EnumerationDescriptionAttribute.cs index 4b626fc..f862b90 100644 --- a/CapyKit/Attributes/EnumerationDescriptionAttribute.cs +++ b/CapyKit/Attributes/EnumerationDescriptionAttribute.cs @@ -1,25 +1,18 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace CapyKit.Attributes; -namespace CapyKit.Attributes +/// An attribute class for decorating enumeration fields with a description. +/// +[AttributeUsage(AttributeTargets.Field)] +public class EnumerationDescriptionAttribute : EnumerationAttribute { - /// An attribute class for decorating enumeration fields with a description. - /// - [AttributeUsage(AttributeTargets.Field)] - public class EnumerationDescriptionAttribute : EnumerationAttribute + /// + /// Initializes a new instance of the class with + /// the specified description. + /// + /// The description of the enumeration value. + public EnumerationDescriptionAttribute(string description) + : base(description) { - /// - /// Initializes a new instance of the class with - /// the specified description. - /// - /// The description of the enumeration value. - public EnumerationDescriptionAttribute(string description) - : base(description) - { - // - } + // } -} +} \ No newline at end of file diff --git a/CapyKit/Attributes/EnumerationIconAttribute.cs b/CapyKit/Attributes/EnumerationIconAttribute.cs index 55b7409..0605f71 100644 --- a/CapyKit/Attributes/EnumerationIconAttribute.cs +++ b/CapyKit/Attributes/EnumerationIconAttribute.cs @@ -1,17 +1,17 @@ namespace CapyKit.Attributes; -/// Attribute describing the associated font-awesome icon of an parameter. +/// Attribute describing the associated font-awesome icon of an parameter. [AttributeUsage(AttributeTargets.Field)] public class EnumerationIconAttribute : Attribute { - /// Gets or sets the description of the enumeration. - /// The description. - public string Icon { get; private set; } - /// Constructor. /// The icon associated with the enumeration. public EnumerationIconAttribute(string icon) { this.Icon = icon; } + + /// Gets or sets the description of the enumeration. + /// The description. + public string Icon { get; private set; } } \ No newline at end of file diff --git a/CapyKit/Attributes/ParameterAcceptedValuesAttribute.cs b/CapyKit/Attributes/ParameterAcceptedValuesAttribute.cs index 6b3fdb0..8a772b5 100644 --- a/CapyKit/Attributes/ParameterAcceptedValuesAttribute.cs +++ b/CapyKit/Attributes/ParameterAcceptedValuesAttribute.cs @@ -4,14 +4,6 @@ namespace CapyKit.Attributes; /// Accepted values are stored as discreet values similar to an enumeration. Ranges are not supported. public class ParameterAcceptedValuesAttribute : Attribute { - #region Properties - - /// Gets or sets the accepted values. - /// The accepted values. - public IEnumerable AcceptedValues { get; private set; } - - #endregion Properties - #region Constructors /// Constructor. @@ -22,4 +14,12 @@ public class ParameterAcceptedValuesAttribute : Attribute } #endregion Constructors + + #region Properties + + /// Gets or sets the accepted values. + /// The accepted values. + public IEnumerable AcceptedValues { get; private set; } + + #endregion Properties } \ No newline at end of file diff --git a/CapyKit/Attributes/ParameterAttribute.cs b/CapyKit/Attributes/ParameterAttribute.cs index e2dc68b..d3890b5 100644 --- a/CapyKit/Attributes/ParameterAttribute.cs +++ b/CapyKit/Attributes/ParameterAttribute.cs @@ -13,13 +13,15 @@ public class ParameterAttribute : Attribute #region Properties /// - /// Gets or sets the name parameter as passed in a POST method from the Browser. This can be hardcoded at the class level. + /// Gets or sets the name parameter as passed in a POST method from the Browser. This can be hardcoded at the class + /// level. /// /// The name of the parameter. public string ParameterName { get; private set; } /// - /// Gets the description of the parameter. This serves as a human-readable explanation or label for the parameter's purpose or usage. + /// Gets the description of the parameter. This serves as a human-readable explanation or label for the parameter's + /// purpose or usage. /// /// The description text of the parameter. public string Description { get; private set; } @@ -48,8 +50,10 @@ public class ParameterAttribute : Attribute /// Constructor. /// The name of the system. - /// Name of the resource that contains the description of - /// the parameter. + /// + /// Name of the resource that contains the description of + /// the parameter. + /// public ParameterAttribute(string systemName, string description) { this.ParameterName = systemName; @@ -60,8 +64,10 @@ public class ParameterAttribute : Attribute /// Constructor. /// The name of the system. - /// Name of the resource that contains the description of - /// the parameter. + /// + /// Name of the resource that contains the description of + /// the parameter. + /// /// The FontAwesome icon name. public ParameterAttribute(string systemName, string description, string iconName) { @@ -73,8 +79,10 @@ public class ParameterAttribute : Attribute /// Constructor. /// The name of the system. - /// Name of the resource that contains the description of - /// the parameter. + /// + /// Name of the resource that contains the description of + /// the parameter. + /// /// The FontAwesome icon name. /// The ordinal position. public ParameterAttribute(string systemName, string description, string iconName, int ordinal) @@ -87,8 +95,10 @@ public class ParameterAttribute : Attribute /// Constructor. /// The name of the system. - /// Name of the resource that contains the description of - /// the parameter. + /// + /// Name of the resource that contains the description of + /// the parameter. + /// /// The ordinal position. public ParameterAttribute(string systemName, string description, int ordinal) { diff --git a/CapyKit/Attributes/ValueFormatAttribute.cs b/CapyKit/Attributes/ValueFormatAttribute.cs index 67c7ebc..0a88e29 100644 --- a/CapyKit/Attributes/ValueFormatAttribute.cs +++ b/CapyKit/Attributes/ValueFormatAttribute.cs @@ -1,58 +1,51 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace CapyKit.Attributes; -namespace CapyKit.Attributes +/// +/// Custom attribute for formatting values in a specific way. +/// +[AttributeUsage(AttributeTargets.Property)] +public class ValueFormatAttribute : Attribute { - /// - /// Custom attribute for formatting values in a specific way. - /// - [AttributeUsage(AttributeTargets.Property)] - public class ValueFormatAttribute : Attribute + #region Properties + + /// Gets or sets the format to use for formatting the value. + /// The format string used to format the value. + public string Format { get; } + + #endregion Properties + + #region Methods + + /// Gets a parameterized formatted string for the specified index. + /// (Optional) Zero-based index of the item in the string to format. + /// A formatted string with the specified index and format. + public string GetFormatParameterizedString(int index = 0) { - #region Properties - - /// Gets or sets the format to use for formatting the value. - /// The format string used to format the value. - public string Format { get; private set; } - - #endregion Properties - - #region Constructors - - /// - /// Default constructor. Initializes a new instance of the - /// class with an empty format string. - /// - public ValueFormatAttribute() - { - this.Format = string.Empty; - } - - /// - /// Constructor. Initializes a new instance of the class with - /// the specified format string. - /// - /// The format string used to format the value. - public ValueFormatAttribute(string format) - { - this.Format = format; - } - - #endregion Constructors - - #region Methods - - /// Gets a parameterized formatted string for the specified index. - /// (Optional) Zero-based index of the item in the string to format. - /// A formatted string with the specified index and format. - public string GetFormatParameterizedString(int index = 0) - { - return "{" + index + ":" + this.Format + "}"; - } - - #endregion Methods + return "{" + index + ":" + this.Format + "}"; } -} + + #endregion Methods + + #region Constructors + + /// + /// Default constructor. Initializes a new instance of the + /// class with an empty format string. + /// + public ValueFormatAttribute() + { + this.Format = string.Empty; + } + + /// + /// Constructor. Initializes a new instance of the class with + /// the specified format string. + /// + /// The format string used to format the value. + public ValueFormatAttribute(string format) + { + this.Format = format; + } + + #endregion Constructors +} \ No newline at end of file diff --git a/CapyKit/CapyEvent.cs b/CapyKit/CapyEvent.cs index 843ba1c..5fec7c5 100644 --- a/CapyKit/CapyEvent.cs +++ b/CapyKit/CapyEvent.cs @@ -1,223 +1,224 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Text; -using System.Threading.Tasks; +using System.Runtime.CompilerServices; using CapyKit.Attributes; -using CapyKit.Extensions; -namespace CapyKit +namespace CapyKit; + +/// +/// The CapyEventReporter class is responsible for managing event subscriptions and emissions within CapyKit. +/// +/// +/// Because consumers of CapyKit may have varied ways of handling logging, the +/// provides +/// a way for subscribers to recieve events for various "events" within the library. These can be thought of as +/// a logging solution for CapyKit. Consumers are free to treat these events however they see fit. +/// +public static class CapyEventReporter { + #region Members + /// - /// The CapyEventReporter class is responsible for managing event subscriptions and emissions within CapyKit. + /// A dictionary storing event handlers and their corresponding origins for each subscription level. + /// + private static readonly Dictionary> subscribers = new(); + + /// A hash set storing unique identifiers for events intended to only be emitted once. + /// + private static readonly HashSet uniqueIdentifiers = new(); + + #endregion + + #region Methods + + /// + /// Subscribes the specified event handler to the event with the given subscription level and + /// origin. /// /// - /// Because consumers of CapyKit may have varied ways of handling logging, the provides - /// a way for subscribers to recieve events for various "events" within the library. These can be thought of as - /// a logging solution for CapyKit. Consumers are free to treat these events however they see fit. + /// If there is no existing list for the given subscription level, a new list is created and + /// added to the dictionary. /// - public static class CapyEventReporter + /// The event handler to subscribe. + /// The severity level of the event to subscribe to. + /// + /// (Optional) The name of the method or class where the subscription is made. + /// + public static void Subscribe(CapyEventHandler callback, EventLevel subscriptionLevel, + [CallerMemberName] string origin = null) { - #region Members - - /// - /// A dictionary storing event handlers and their corresponding origins for each subscription level. - /// - private static Dictionary> subscribers = new Dictionary>(); - - /// A hash set storing unique identifiers for events intended to only be emitted once. - /// - private static HashSet uniqueIdentifiers = new HashSet(); - - #endregion - - #region Methods - - /// - /// Subscribes the specified event handler to the event with the given subscription level and - /// origin. - /// - /// - /// If there is no existing list for the given subscription level, a new list is created and - /// added to the dictionary. - /// - /// The event handler to subscribe. - /// The severity level of the event to subscribe to. - /// - /// (Optional) The name of the method or class where the subscription is made. - /// - public static void Subscribe(CapyEventHandler callback, EventLevel subscriptionLevel, [CallerMemberName] string origin = null) + if (!CapyEventReporter.subscribers.ContainsKey(subscriptionLevel)) { - if (!subscribers.ContainsKey(subscriptionLevel)) - { - subscribers.Add(subscriptionLevel, new List<(CapyEventHandler Handler, string origin)>()); - } - - subscribers[subscriptionLevel].Add((callback, origin ?? "[Unknown]")); + CapyEventReporter.subscribers.Add(subscriptionLevel, new List<(CapyEventHandler Handler, string origin)>()); } - /// - /// Unsubscribes the specified event handler from the event with the given origin. - /// - /// The event handler to unsubscribe. - /// - /// The name of the method or class where the subscription was made. - /// - public static void Unsubscribe(CapyEventHandler callback, string origin) - { - foreach (var value in Enum.GetValues(typeof(EventLevel))) - { - if (value is EventLevel) - { - subscribers[(EventLevel)value].RemoveAll(c => c.Handler == callback && c.origin == origin); - } - } - } - - /// Emits an event with the given severity level, message, and method name. - /// - /// In order to allow for efficient calling member access via - /// , it is suggested that is defined explicitly for formatted messages. - /// - /// The severity level of the event. - /// - /// The message describing the reason for the event. String formatting for - /// is accepted. - /// - /// - /// (Optional) The name of the method where the event was raised. - /// - /// - /// A variable-length parameters list containing arguments for formatting the message. - /// - /// - /// - /// CapyEventReporter.EmitEvent(EventLevel.Error, "Could not find the description for {0}.", args: new[] { enumeration }); - /// - /// - /// - public static void EmitEvent(EventLevel eventLevel, string message, [CallerMemberName] string method = null, params object[] args) - { - if (!subscribers.ContainsKey(eventLevel)) - { - return; - } - - var formattedMessage = string.Format(message, args); - - var capyEventArgs = new CapyEventArgs(eventLevel, formattedMessage, method); - - foreach (var subscriber in subscribers[eventLevel]) - { - subscriber.Handler(capyEventArgs); - } - } - - /// - /// Emits an event with the given severity level, message, unique identifier, and method name one - /// time. - /// - /// - /// This method is similar to - /// , but requires a unique identifier (such as a ) to prevent duplicate - /// emissions. - /// - /// The severity level of the event. - /// - /// The message describing the reason for the event. String formatting for - /// is accepted. - /// - /// A unique identifier for the event emission. - /// - /// (Optional) The name of the method where the event was raised. - /// - /// - /// A variable-length parameters list containing arguments for formatting the message. - /// - /// - /// - public static void EmitEventOnce(EventLevel eventLevel, string message, string uniqueIdentifier, [CallerMemberName] string method = null, params object[] args) - { - if(uniqueIdentifiers.Contains(uniqueIdentifier)) - { - return; - } - - uniqueIdentifiers.Add(uniqueIdentifier); - EmitEvent(eventLevel, message, method: method, args: args); - } - - #endregion + CapyEventReporter.subscribers[subscriptionLevel].Add((callback, origin ?? "[Unknown]")); } /// - /// A delegate representing an event handler that accepts a instance. + /// Unsubscribes the specified event handler from the event with the given origin. /// - /// The CapyEventArgs instance containing event data. - public delegate void CapyEventHandler(CapyEventArgs e); - - /// - /// The CapyEventArgs class represents an event argument instance with event level, message, and - /// method name information. - /// - public class CapyEventArgs : EventArgs + /// The event handler to unsubscribe. + /// + /// The name of the method or class where the subscription was made. + /// + public static void Unsubscribe(CapyEventHandler callback, string origin) { - #region Properties - - /// - /// Gets the severity level of the event. - /// - public EventLevel Level { get; private set; } - - /// - /// Gets the message describing the reason for the event. - /// - public string Message { get; private set; } - - /// - /// Gets the name of the method where the event was raised. - /// - public string MethodName { get; private set; } - - #endregion - - #region Constructor - - /// - /// Initializes a new instance of the CapyEventArgs class with the specified event level, message, and method name. - /// - /// The severity level of the event. - /// A descriptive message explaining the reason for the event. - /// The name of the method where the event was raised. - public CapyEventArgs(EventLevel level, string message, string method = null) + foreach (var value in Enum.GetValues(typeof(EventLevel))) { - this.Level = level; - this.Message = message; - this.MethodName = method ?? "[Unknown]"; + if (value is EventLevel) + { + CapyEventReporter.subscribers[(EventLevel)value] + .RemoveAll(c => c.Handler == callback && c.origin == origin); + } + } + } + + /// Emits an event with the given severity level, message, and method name. + /// + /// In order to allow for efficient calling member access via + /// , it is suggested that is defined explicitly for formatted messages. + /// + /// The severity level of the event. + /// + /// The message describing the reason for the event. String formatting for + /// is accepted. + /// + /// + /// (Optional) The name of the method where the event was raised. + /// + /// + /// A variable-length parameters list containing arguments for formatting the message. + /// + /// + /// + /// CapyEventReporter.EmitEvent(EventLevel.Error, "Could not find the description for {0}.", args: new[] { enumeration }); + /// + /// + /// + public static void EmitEvent(EventLevel eventLevel, string message, [CallerMemberName] string method = null, + params object[] args) + { + if (!CapyEventReporter.subscribers.ContainsKey(eventLevel)) + { + return; } - #endregion + var formattedMessage = string.Format(message, args); + + var capyEventArgs = new CapyEventArgs(eventLevel, formattedMessage, method); + + foreach (var subscriber in CapyEventReporter.subscribers[eventLevel]) + { + subscriber.Handler(capyEventArgs); + } } - - /// Enumeration representing different event level severity values. - public enum EventLevel + /// + /// Emits an event with the given severity level, message, unique identifier, and method name one + /// time. + /// + /// + /// This method is similar to + /// , but requires a unique identifier (such as a ) to prevent duplicate + /// emissions. + /// + /// The severity level of the event. + /// + /// The message describing the reason for the event. String formatting for + /// is accepted. + /// + /// A unique identifier for the event emission. + /// + /// (Optional) The name of the method where the event was raised. + /// + /// + /// A variable-length parameters list containing arguments for formatting the message. + /// + /// + /// + public static void EmitEventOnce(EventLevel eventLevel, string message, string uniqueIdentifier, + [CallerMemberName] string method = null, params object[] args) { - /// Represents a critical error that requires immediate attention. - [EnumerationDescription("Represents a critical error that requires immediate attention.")] - Critical = 0, - /// Represents an error that prevents the normal execution of the application. - [EnumerationDescription("Represents an error that prevents the normal execution of the application.")] - Error = 1, - /// Represents a warning indicating a non-critical issue that should be addressed. - [EnumerationDescription("Represents a warning indicating a non-critical issue that should be addressed.")] - Warning = 2, - /// Represents informational messages that provide useful context to the consumer. - [EnumerationDescription("Represents informational messages that provide useful context to the consumer.")] - Information = 3, - /// Represents detailed messages that are typically used for debugging purposes. - [EnumerationDescription("Represents detailed messages that are typically used for debugging purposes.")] - Debug = 4 + if (CapyEventReporter.uniqueIdentifiers.Contains(uniqueIdentifier)) + { + return; + } + + CapyEventReporter.uniqueIdentifiers.Add(uniqueIdentifier); + EmitEvent(eventLevel, message, method, args); } + + #endregion } + +/// +/// A delegate representing an event handler that accepts a instance. +/// +/// The CapyEventArgs instance containing event data. +public delegate void CapyEventHandler(CapyEventArgs e); + +/// +/// The CapyEventArgs class represents an event argument instance with event level, message, and +/// method name information. +/// +public class CapyEventArgs : EventArgs +{ + #region Constructor + + /// + /// Initializes a new instance of the CapyEventArgs class with the specified event level, message, and method name. + /// + /// The severity level of the event. + /// A descriptive message explaining the reason for the event. + /// The name of the method where the event was raised. + public CapyEventArgs(EventLevel level, string message, string method = null) + { + this.Level = level; + this.Message = message; + this.MethodName = method ?? "[Unknown]"; + } + + #endregion + + #region Properties + + /// + /// Gets the severity level of the event. + /// + public EventLevel Level { get; private set; } + + /// + /// Gets the message describing the reason for the event. + /// + public string Message { get; private set; } + + /// + /// Gets the name of the method where the event was raised. + /// + public string MethodName { get; private set; } + + #endregion +} + +/// Enumeration representing different event level severity values. +public enum EventLevel +{ + /// Represents a critical error that requires immediate attention. + [EnumerationDescription("Represents a critical error that requires immediate attention.")] + Critical = 0, + + /// Represents an error that prevents the normal execution of the application. + [EnumerationDescription("Represents an error that prevents the normal execution of the application.")] + Error = 1, + + /// Represents a warning indicating a non-critical issue that should be addressed. + [EnumerationDescription("Represents a warning indicating a non-critical issue that should be addressed.")] + Warning = 2, + + /// Represents informational messages that provide useful context to the consumer. + [EnumerationDescription("Represents informational messages that provide useful context to the consumer.")] + Information = 3, + + /// Represents detailed messages that are typically used for debugging purposes. + [EnumerationDescription("Represents detailed messages that are typically used for debugging purposes.")] + Debug = 4 +} \ No newline at end of file diff --git a/CapyKit/CapyKit.csproj b/CapyKit/CapyKit.csproj index a3020e6..40fac37 100644 --- a/CapyKit/CapyKit.csproj +++ b/CapyKit/CapyKit.csproj @@ -1,21 +1,21 @@  - - net8.0 - enable - enable - True - README.md - 1.0.4 - + + net8.0 + enable + enable + True + README.md + 1.0.4 + - - - True - \ - - + + + True + \ + + - + diff --git a/CapyKit/EncryptedValue.cs b/CapyKit/EncryptedValue.cs index 20d49a5..1a09df5 100644 --- a/CapyKit/EncryptedValue.cs +++ b/CapyKit/EncryptedValue.cs @@ -1,30 +1,23 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace CapyKit; -namespace CapyKit +/// +/// Holds a value that has been encrypted. +/// +/// +public class EncryptedValue { + #region Properties + /// - /// Holds a value that has been encrypted. + /// The encrypted value. /// - /// - public class EncryptedValue - { - #region Members + public T Value { get; set; } - // + #endregion - #endregion + #region Members - #region Properties + // - /// - /// The encrypted value. - /// - public T Value { get; set; } - - #endregion - } -} + #endregion +} \ No newline at end of file diff --git a/CapyKit/Enumerations/MeasurementSystem.cs b/CapyKit/Enumerations/MeasurementSystem.cs index 333930d..5b0deaf 100644 --- a/CapyKit/Enumerations/MeasurementSystem.cs +++ b/CapyKit/Enumerations/MeasurementSystem.cs @@ -1,20 +1,13 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace CapyKit.Enumerations; -namespace CapyKit.Enumerations +/// +/// An enumeration representing different measurement systems. +/// +public enum MeasurementSystem { - /// - /// An enumeration representing different measurement systems. - /// - public enum MeasurementSystem - { - /// The imperial measurement system. - Imperial = 0, + /// The imperial measurement system. + Imperial = 0, - /// The metric measurement system. - Metric = 1 - } -} + /// The metric measurement system. + Metric = 1 +} \ No newline at end of file diff --git a/CapyKit/Extensions/EnumerationExtensions.cs b/CapyKit/Extensions/EnumerationExtensions.cs index 1fc4308..6b338d3 100644 --- a/CapyKit/Extensions/EnumerationExtensions.cs +++ b/CapyKit/Extensions/EnumerationExtensions.cs @@ -1,94 +1,91 @@ -using CapyKit.Attributes; +using System.Reflection; +using CapyKit.Attributes; using CapyKit.Helpers; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -namespace CapyKit.Extensions +namespace CapyKit.Extensions; + +/// Provides static extentions methods for providing additional functionality for types. +public static class EnumerationExtensions { - /// Provides static extentions methods for providing additional functionality for types. - public static class EnumerationExtensions + #region Methods + + /// + /// A extension method that parses a string into an enumeration. + /// + /// Generic type parameter. + /// The enumeration to act on. + /// The value. + /// A T. + public static T Parse(this T enumeration, string value) where T : Enum { - #region Methods - - /// - /// A extension method that parses a string into an enumeration. - /// - /// Generic type parameter. - /// The enumeration to act on. - /// The value. - /// A T. - public static T Parse(this T enumeration, string value) where T : Enum - { - return (T)Enum.Parse(typeof(T), value); - } - - /// - /// A extension method that parses a string into an enumeration. - /// - /// Generic type parameter. - /// The enumeration to act on. - /// The string value of the . - /// True to ignore case. - /// A T. - public static T Parse(this T enumeration, string value, bool ignoreCase) where T : Enum - { - return (T)Enum.Parse(typeof(T), value, ignoreCase); - } - - /// - /// An extension method that gets an integer value representing the enumation. - /// - /// The enumeration to act on. - /// The integer value of the enumeration. - public static int GetValue(this Enum enumeration) - { - return (int)Convert.ChangeType(enumeration, TypeCode.Int32); - } - - /// An extension method that gets a name. - /// The enumeration to act on. - /// The name of the enumeration. - public static string GetName(this Enum enumeration) - { - return Enum.GetName(enumeration.GetType(), enumeration) ?? "[Unknown]"; - } - - /// An extension method that gets a human readable name. - /// The enumeration to act on. - /// The human readable name of the enumeration. - public static string GetPrettyName(this Enum enumeration) - { - return LanguageHelper.CamelCaseToHumanReadable(GetName(enumeration)); - } - - /// An extension method that gets a description. - /// The enumeration to act on. - /// - /// The description if available, otherwise the string representation of the enumeration. - /// - public static string GetDescription(this Enum enumeration) - { - var memInfo = enumeration.GetType().GetMember(enumeration.GetName()); - if (memInfo.Any()) - { - var attribute = memInfo.First().GetCustomAttribute(typeof(EnumerationDescriptionAttribute)) as EnumerationDescriptionAttribute; - if (attribute == null) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "Could not find the description for {0}.", args: new[] { enumeration }); - } - else - { - return attribute.Value; - } - } - - return enumeration.ToString(); - } - - #endregion Methods + return (T)Enum.Parse(typeof(T), value); } -} + + /// + /// A extension method that parses a string into an enumeration. + /// + /// Generic type parameter. + /// The enumeration to act on. + /// The string value of the . + /// True to ignore case. + /// A T. + public static T Parse(this T enumeration, string value, bool ignoreCase) where T : Enum + { + return (T)Enum.Parse(typeof(T), value, ignoreCase); + } + + /// + /// An extension method that gets an integer value representing the enumation. + /// + /// The enumeration to act on. + /// The integer value of the enumeration. + public static int GetValue(this Enum enumeration) + { + return (int)Convert.ChangeType(enumeration, TypeCode.Int32); + } + + /// An extension method that gets a name. + /// The enumeration to act on. + /// The name of the enumeration. + public static string GetName(this Enum enumeration) + { + return Enum.GetName(enumeration.GetType(), enumeration) ?? "[Unknown]"; + } + + /// An extension method that gets a human readable name. + /// The enumeration to act on. + /// The human readable name of the enumeration. + public static string GetPrettyName(this Enum enumeration) + { + return LanguageHelper.CamelCaseToHumanReadable(enumeration.GetName()); + } + + /// An extension method that gets a description. + /// The enumeration to act on. + /// + /// The description if available, otherwise the string representation of the enumeration. + /// + public static string GetDescription(this Enum enumeration) + { + var memInfo = enumeration.GetType().GetMember(enumeration.GetName()); + if (memInfo.Any()) + { + var attribute = + memInfo.First().GetCustomAttribute(typeof(EnumerationDescriptionAttribute)) as + EnumerationDescriptionAttribute; + if (attribute == null) + { + CapyEventReporter.EmitEvent(EventLevel.Error, "Could not find the description for {0}.", + args: new[] { enumeration }); + } + else + { + return attribute.Value; + } + } + + return enumeration.ToString(); + } + + #endregion Methods +} \ No newline at end of file diff --git a/CapyKit/Extensions/LINQExtentions.cs b/CapyKit/Extensions/LINQExtentions.cs index 3a20094..fdca52f 100644 --- a/CapyKit/Extensions/LINQExtentions.cs +++ b/CapyKit/Extensions/LINQExtentions.cs @@ -1,260 +1,266 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Text; -using System.Threading.Tasks; +using System.Linq.Expressions; -namespace CapyKit.Extensions +namespace CapyKit.Extensions; + +/// +/// Provides static extension methods for performing common LINQ operations on and +/// collections. +/// +public static class LINQExtensions { - /// Provides static extension methods for performing common LINQ operations on and collections. - public static class LINQExtensions + /// + /// Filters out items matching a from the collection. + /// + /// Generic type parameter. + /// The source to act on. + /// The predicate. + /// + /// An enumerator that allows foreach to be used to process remove in this collection. + /// + public static IEnumerable Filter(this IEnumerable source, Func predicate) { - /// - /// Filters out items matching a from the collection. - /// - /// Generic type parameter. - /// The source to act on. - /// The predicate. - /// - /// An enumerator that allows foreach to be used to process remove in this collection. - /// - public static IEnumerable Filter(this IEnumerable source, Func predicate) + return source.Where(item => !predicate(item)); + } + + /// + /// Filters out items matching a from the collection. + /// + /// Generic type parameter. + /// The source to act on. + /// The predicate. + /// + /// An enumerator that allows foreach to be used to process remove in this collection. + /// + public static IQueryable Filter(this IQueryable source, Expression> predicate) + { + if (predicate.Parameters.Count > 1) { - return source.Where(item => !predicate(item)); + CapyEventReporter.EmitEvent(EventLevel.Warning, + "More than one parameter was found in the predicate, which could result in unexpected behavior."); } - /// - /// Filters out items matching a from the collection. - /// - /// Generic type parameter. - /// The source to act on. - /// The predicate. - /// - /// An enumerator that allows foreach to be used to process remove in this collection. - /// - public static IQueryable Filter(this IQueryable source, System.Linq.Expressions.Expression> predicate) + var parameter = predicate.Parameters.FirstOrDefault(); + var negatedPredicate = Expression.Not(predicate); + var lamda = Expression.Lambda>(negatedPredicate, parameter); + + return source.Where(lamda); + } + + /// + /// Get a page of items from a collection, skipping pages of + /// items per page. + /// + /// This method uses natural numbering starting at page 1. + /// + /// Thrown when is less than 1 or if + /// is less than + /// 1. + /// + /// Generic type parameter. + /// The source to act on. + /// The page number to retrieve. + /// Number of items per page. + /// + /// An enumerator that allows foreach to be used to process page in this collection. + /// + public static IEnumerable Page(this IEnumerable source, int pageNumber, int pageSize) + { + if (pageNumber < 1) { - if(predicate.Parameters.Count > 1) - { - CapyEventReporter.EmitEvent(EventLevel.Warning, "More than one parameter was found in the predicate, which could result in unexpected behavior."); - } - - var parameter = predicate.Parameters.FirstOrDefault(); - var negatedPredicate = Expression.Not(predicate); - var lamda = Expression.Lambda>(negatedPredicate, parameter); - - return source.Where(lamda); + CapyEventReporter.EmitEvent(EventLevel.Error, "pageNumber is out of range. [{0}]", + args: new[] { pageNumber }); + throw new ArgumentOutOfRangeException("pageNumber"); } - /// - /// Get a page of items from a collection, skipping pages of - /// items per page. - /// - /// This method uses natural numbering starting at page 1. - /// - /// Thrown when is less than 1 or if - /// is less than - /// 1. - /// - /// Generic type parameter. - /// The source to act on. - /// The page number to retrieve. - /// Number of items per page. - /// - /// An enumerator that allows foreach to be used to process page in this collection. - /// - public static IEnumerable Page(this IEnumerable source, int pageNumber, int pageSize) + if (pageSize < 1) { - if (pageNumber < 1) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "pageNumber is out of range. [{0}]", args: new[] { pageNumber }); - throw new ArgumentOutOfRangeException("pageNumber"); - } - - if (pageSize < 1) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "pageSize is out of range. [{0}]", args: new[] { pageSize }); - throw new ArgumentOutOfRangeException("pageSize"); - } - - return source.Skip((pageNumber - 1) * pageSize).Take(pageSize); + CapyEventReporter.EmitEvent(EventLevel.Error, "pageSize is out of range. [{0}]", args: new[] { pageSize }); + throw new ArgumentOutOfRangeException("pageSize"); } - /// - /// Get a page of items from a collection, skipping pages of - /// items per page. - /// - /// This method uses natural numbering starting at page 1. - /// - /// Thrown when is less than 1 or if - /// is less than - /// 1. - /// - /// Generic type parameter. - /// The source to act on. - /// The page number to retrieve. - /// . - /// - /// An enumerator that allows foreach to be used to process page in this collection. - /// - public static IQueryable Page(this IQueryable source, int pageNumber, int pageSize) + return source.Skip((pageNumber - 1) * pageSize).Take(pageSize); + } + + /// + /// Get a page of items from a collection, skipping pages of + /// items per page. + /// + /// This method uses natural numbering starting at page 1. + /// + /// Thrown when is less than 1 or if + /// is less than + /// 1. + /// + /// Generic type parameter. + /// The source to act on. + /// The page number to retrieve. + /// . + /// + /// An enumerator that allows foreach to be used to process page in this collection. + /// + public static IQueryable Page(this IQueryable source, int pageNumber, int pageSize) + { + if (pageNumber < 1) { - if (pageNumber < 1) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "pageNumber is out of range. [{0}]", args: new[] { pageNumber }); - throw new ArgumentOutOfRangeException("pageNumber"); - } - - if (pageSize < 1) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "pageSize is out of range. [{0}]", args: new[] { pageSize }); - throw new ArgumentOutOfRangeException("pageSize"); - } - - return source.Skip((pageNumber - 1) * pageSize).Take(pageSize); + CapyEventReporter.EmitEvent(EventLevel.Error, "pageNumber is out of range. [{0}]", + args: new[] { pageNumber }); + throw new ArgumentOutOfRangeException("pageNumber"); } - /// - /// The number of pages of size in the given collection. - /// - /// - /// Thrown when is less than 1. - /// - /// Generic type parameter. - /// The source to act on. - /// Size of the page. - /// An int. - public static int PageCount(this IEnumerable source, int pageSize) + if (pageSize < 1) { - if (pageSize < 1) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "pageSize is out of range. [{0}]", args: new[] { pageSize }); - throw new ArgumentOutOfRangeException("pageSize"); - } - - var ceiling = Math.Ceiling(Convert.ToDouble(source.Count()) / pageSize); - return Convert.ToInt32(ceiling); + CapyEventReporter.EmitEvent(EventLevel.Error, "pageSize is out of range. [{0}]", args: new[] { pageSize }); + throw new ArgumentOutOfRangeException("pageSize"); } - /// - /// The number of pages of size in the given collection. - /// - /// - /// Thrown when is less than 1. - /// - /// Generic type parameter. - /// The source to act on. - /// Size of the page. - /// An int. - public static int PageCount(this IQueryable source, int pageSize) - { - if (pageSize < 1) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "pageSize is out of range. [{0}]", args: new[] { pageSize }); - throw new ArgumentOutOfRangeException("pageSize"); - } + return source.Skip((pageNumber - 1) * pageSize).Take(pageSize); + } - var ceiling = Math.Ceiling(Convert.ToDouble(source.Count()) / pageSize); - return Convert.ToInt32(ceiling); + /// + /// The number of pages of size in the given collection. + /// + /// + /// Thrown when is less than 1. + /// + /// Generic type parameter. + /// The source to act on. + /// Size of the page. + /// An int. + public static int PageCount(this IEnumerable source, int pageSize) + { + if (pageSize < 1) + { + CapyEventReporter.EmitEvent(EventLevel.Error, "pageSize is out of range. [{0}]", args: new[] { pageSize }); + throw new ArgumentOutOfRangeException("pageSize"); } - /// An IQueryable<T> extension method that left outer join. - /// Generic type parameter. - /// Generic type parameter. - /// Type of the key. - /// Type of the r. - /// The source to act on. - /// The inner. - /// The outer selector. - /// The inner selector. - /// The result selector. - /// (Optional) The default generator. - /// An IQueryable<R> - public static IQueryable LeftOuterJoin(this IQueryable source, IQueryable inner, Expression> outerSelector, Expression> innerSelector, Func, R> resultSelector, Func defaultGenerator = null) + var ceiling = Math.Ceiling(Convert.ToDouble(source.Count()) / pageSize); + return Convert.ToInt32(ceiling); + } + + /// + /// The number of pages of size in the given collection. + /// + /// + /// Thrown when is less than 1. + /// + /// Generic type parameter. + /// The source to act on. + /// Size of the page. + /// An int. + public static int PageCount(this IQueryable source, int pageSize) + { + if (pageSize < 1) { - Func, R> resultOrDefaultSelector = (i, o) => - { - if (defaultGenerator == null) - { - defaultGenerator = (t) => default(U); - } - - if (!o.Any()) - { - return resultSelector(i, new[] { defaultGenerator(i) }); - } - - return resultSelector(i, o); - }; - - return source.LeftOuterJoin(inner, outerSelector, innerSelector, (a, b) => resultSelector(a, b)); + CapyEventReporter.EmitEvent(EventLevel.Error, "pageSize is out of range. [{0}]", args: new[] { pageSize }); + throw new ArgumentOutOfRangeException("pageSize"); } - /// An IQueryable<T> extension method that left outer join. - /// Generic type parameter. - /// Generic type parameter. - /// Type of the key. - /// Type of the r. - /// The source to act on. - /// The inner. - /// The outer selector. - /// The inner selector. - /// The result selector. - /// An IQueryable<R> - private static IQueryable LeftOuterJoin(this IQueryable source, IQueryable inner, Expression> outerSelector, Expression> innerSelector, Expression, R>> resultSelector) - { - return source.GroupJoin(inner, outerSelector, innerSelector, resultSelector); - } + var ceiling = Math.Ceiling(Convert.ToDouble(source.Count()) / pageSize); + return Convert.ToInt32(ceiling); + } - /// An IEnumable<T> extension method that left outer join. - /// Generic type parameter. - /// Generic type parameter. - /// Type of the key. - /// Type of the r. - /// The source to act on. - /// The inner. - /// The outer selector. - /// The inner selector. - /// The result selector. - /// (Optional) The default generator. - /// - /// An enumerator that allows foreach to be used to process left outter join in this collection. - /// - public static IEnumerable LeftOuterJoin(this IEnumerable source, IEnumerable inner, Func outerSelector, Func innerSelector, Func, R> resultSelector, Func defaultGenerator = null) + /// An IQueryable<T> extension method that left outer join. + /// Generic type parameter. + /// Generic type parameter. + /// Type of the key. + /// Type of the r. + /// The source to act on. + /// The inner. + /// The outer selector. + /// The inner selector. + /// The result selector. + /// (Optional) The default generator. + /// An IQueryable<R> + public static IQueryable LeftOuterJoin(this IQueryable source, IQueryable inner, + Expression> outerSelector, Expression> innerSelector, + Func, R> resultSelector, Func defaultGenerator = null) + { + Func, R> resultOrDefaultSelector = (i, o) => { - var combined = source.GroupJoin(inner, outerSelector, innerSelector, (i, o) => new { inner = i, outer = o }); - if (defaultGenerator == null) { - defaultGenerator = (t) => default(U); + defaultGenerator = t => default; } - return combined.Select(anon => + if (!o.Any()) { - if (!anon.outer.Any()) - { - return resultSelector(anon.inner, new[] { defaultGenerator(anon.inner) }); - } + return resultSelector(i, new[] { defaultGenerator(i) }); + } - return resultSelector(anon.inner, anon.outer); - }); - } + return resultSelector(i, o); + }; - /// - /// Enumerates distinct items in this collection as defined by the key . - /// - /// Generic type parameter of the parent object. - /// Generic type parameter property value. - /// The items to act on. - /// The property. - /// - /// An enumerator that allows foreach to be used to process distinct items in this collection. - /// - public static IEnumerable Distinct(this IEnumerable items, Func property) - { - var propertyComparer = new PropertyComparer(property); - return items.Distinct(propertyComparer); - } + return source.LeftOuterJoin(inner, outerSelector, innerSelector, (a, b) => resultSelector(a, b)); } -} + + /// An IQueryable<T> extension method that left outer join. + /// Generic type parameter. + /// Generic type parameter. + /// Type of the key. + /// Type of the r. + /// The source to act on. + /// The inner. + /// The outer selector. + /// The inner selector. + /// The result selector. + /// An IQueryable<R> + private static IQueryable LeftOuterJoin(this IQueryable source, IQueryable inner, + Expression> outerSelector, Expression> innerSelector, + Expression, R>> resultSelector) + { + return source.GroupJoin(inner, outerSelector, innerSelector, resultSelector); + } + + /// An IEnumable<T> extension method that left outer join. + /// Generic type parameter. + /// Generic type parameter. + /// Type of the key. + /// Type of the r. + /// The source to act on. + /// The inner. + /// The outer selector. + /// The inner selector. + /// The result selector. + /// (Optional) The default generator. + /// + /// An enumerator that allows foreach to be used to process left outter join in this collection. + /// + public static IEnumerable LeftOuterJoin(this IEnumerable source, IEnumerable inner, + Func outerSelector, Func innerSelector, Func, R> resultSelector, + Func defaultGenerator = null) + { + var combined = source.GroupJoin(inner, outerSelector, innerSelector, (i, o) => new { inner = i, outer = o }); + + if (defaultGenerator == null) + { + defaultGenerator = t => default; + } + + return combined.Select(anon => + { + if (!anon.outer.Any()) + { + return resultSelector(anon.inner, new[] { defaultGenerator(anon.inner) }); + } + + return resultSelector(anon.inner, anon.outer); + }); + } + + /// + /// Enumerates distinct items in this collection as defined by the key . + /// + /// Generic type parameter of the parent object. + /// Generic type parameter property value. + /// The items to act on. + /// The property. + /// + /// An enumerator that allows foreach to be used to process distinct items in this collection. + /// + public static IEnumerable Distinct(this IEnumerable items, Func property) + { + var propertyComparer = new PropertyComparer(property); + return items.Distinct(propertyComparer); + } +} \ No newline at end of file diff --git a/CapyKit/Extensions/ObjectExtensions.cs b/CapyKit/Extensions/ObjectExtensions.cs index 8cd041e..5263ddb 100644 --- a/CapyKit/Extensions/ObjectExtensions.cs +++ b/CapyKit/Extensions/ObjectExtensions.cs @@ -1,52 +1,47 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace CapyKit.Extensions; -namespace CapyKit.Extensions +/// An class containing extenstions that apply to any object type. +public static class ObjectExtensions { - /// An class containing extenstions that apply to any object type. - public static class ObjectExtensions + /// + /// An object extension method that updates the properties of a given + /// object with the values from a given object. + /// + /// Generic type parameter. + /// The target object to act on. + /// Source for the new property values. + public static void UpdateProperties(this T target, T source) { - /// - /// An object extension method that updates the properties of a given - /// object with the values from a given object. - /// - /// Generic type parameter. - /// The target object to act on. - /// Source for the new property values. - public static void UpdateProperties(this T target, T source) + var properties = typeof(T).GetProperties(); + foreach (var prop in properties) { - var properties = typeof(T).GetProperties(); - foreach (var prop in properties) + if (prop.CanWrite) { - if (prop.CanWrite) - { - prop.SetValue(target, prop.GetValue(source)); - } - } - } - - /// - /// An object extension method that updates the properties of a given - /// object with the values from a given object. - /// - /// The target object to act on. - /// Source for the new property values. - public static void UpdateProperties(this object target, object source) - { - var targetProperties = target.GetType().GetProperties(); - var sourceProperties = source.GetType().GetProperties(); - var matchingProperties = targetProperties.Join(sourceProperties, outer => new { outer.Name, outer.PropertyType }, inner => new { inner.Name, inner.PropertyType }, (outer, inner) => new { Target = outer, Source = inner }); - - foreach (var propertyMatch in matchingProperties) - { - if(propertyMatch.Target.CanWrite) - { - propertyMatch.Target.SetValue(target, propertyMatch.Source.GetValue(source)); - } + prop.SetValue(target, prop.GetValue(source)); } } } -} + + /// + /// An object extension method that updates the properties of a given + /// object with the values from a given object. + /// + /// The target object to act on. + /// Source for the new property values. + public static void UpdateProperties(this object target, object source) + { + var targetProperties = target.GetType().GetProperties(); + var sourceProperties = source.GetType().GetProperties(); + var matchingProperties = targetProperties.Join(sourceProperties, + outer => new { outer.Name, outer.PropertyType }, inner => new { inner.Name, inner.PropertyType }, + (outer, inner) => new { Target = outer, Source = inner }); + + foreach (var propertyMatch in matchingProperties) + { + if (propertyMatch.Target.CanWrite) + { + propertyMatch.Target.SetValue(target, propertyMatch.Source.GetValue(source)); + } + } + } +} \ No newline at end of file diff --git a/CapyKit/Extensions/StringExtensions.cs b/CapyKit/Extensions/StringExtensions.cs index 57b4bbf..737f425 100644 --- a/CapyKit/Extensions/StringExtensions.cs +++ b/CapyKit/Extensions/StringExtensions.cs @@ -1,56 +1,49 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace CapyKit.Extensions; -namespace CapyKit.Extensions +/// Provides static extentions methods for providing additional functionality for types. +public static class StringExtensions { - /// Provides static extentions methods for providing additional functionality for types. - public static class StringExtensions + #region Members + + // + + #endregion Members + + #region Methods + + /// Replaces a null or empty string with a specified replacement string. + /// The original string. + /// The replacement string. + /// + /// The original string if not null or empty, otherwise the replacement string. + /// + /// + public static string IfNullOrEmpty(this string value, string replacement) { - #region Members - - // - - #endregion Members - - #region Methods - - /// Replaces a null or empty string with a specified replacement string. - /// The original string. - /// The replacement string. - /// - /// The original string if not null or empty, otherwise the replacement string. - /// - /// - public static string IfNullOrEmpty(this string value, string replacement) + if (string.IsNullOrEmpty(value)) { - if (string.IsNullOrEmpty(value)) - { - return replacement; - } - - return value; + return replacement; } - /// Replaces a null or whitespace string with a specified replacement string. - /// The original string. - /// The replacement string. - /// - /// The original string if not null or whitespace, otherwise the replacement string. - /// - /// - public static string IfNullOrWhiteSpace(this string value, string replacement) - { - if (string.IsNullOrWhiteSpace(value)) - { - return replacement; - } - - return value; - } - - #endregion Methods + return value; } -} + + /// Replaces a null or whitespace string with a specified replacement string. + /// The original string. + /// The replacement string. + /// + /// The original string if not null or whitespace, otherwise the replacement string. + /// + /// + public static string IfNullOrWhiteSpace(this string value, string replacement) + { + if (string.IsNullOrWhiteSpace(value)) + { + return replacement; + } + + return value; + } + + #endregion Methods +} \ No newline at end of file diff --git a/CapyKit/Helpers/CalculationHelper.cs b/CapyKit/Helpers/CalculationHelper.cs index 63e667f..a6b37e5 100644 --- a/CapyKit/Helpers/CalculationHelper.cs +++ b/CapyKit/Helpers/CalculationHelper.cs @@ -1,160 +1,159 @@ -using CapyKit.Enumerations; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Cryptography; +using System.Security.Cryptography; using System.Text; -using System.Threading.Tasks; +using CapyKit.Enumerations; -namespace CapyKit.Helpers +namespace CapyKit.Helpers; + +/// Static class providing helper methods for various calculations. +public static class CalculationHelper { - /// Static class providing helper methods for various calculations. - public static class CalculationHelper + #region Members + + /// The earth's radius in kilometers. + public const int EARTH_RADIUS_KILOMETERS = 6371; + + /// Ratio of miles per kilometer . + public const double MILES_PER_KILOMETER = 0.621371; + + /// The valid hexidecimal characters. + private const string chars = "0123456789ABCDEF"; + + #endregion Members + + #region Methods + + /// + /// Calculates the hash of a given string using an value as the first 32 bits. + /// + /// The string to be hashed. + /// The calculated hash. + /// + /// This method is used for a quick and consistent hash function. It should not be considered + /// cryptographically sound or used in security contexts. + /// + public static int CalculateHash(string str) { - #region Members + var md5Hasher = MD5.Create(); + var md5Hash = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(str)); + var hash = BitConverter.ToInt32(md5Hash, 0); - /// The earth's radius in kilometers. - public const int EARTH_RADIUS_KILOMETERS = 6371; - - /// Ratio of miles per kilometer . - public const double MILES_PER_KILOMETER = 0.621371; - - /// The valid hexidecimal characters. - private const string chars = "0123456789ABCDEF"; - - #endregion Members - - #region Methods - - /// - /// Calculates the hash of a given string using an value as the first 32 bits. - /// - /// The string to be hashed. - /// The calculated hash. - /// - /// This method is used for a quick and consistent hash function. It should not be considered - /// cryptographically sound or used in security contexts. - /// - public static int CalculateHash(string str) - { - MD5 md5Hasher = MD5.Create(); - var md5Hash = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(str)); - var hash = BitConverter.ToInt32(md5Hash, 0); - - return hash; - } - - /// Calculates the hexadecimal hash. - /// The string to be hashed. - /// The calculated 16 character hexadecimal hash. - public static string CalculateHexHash(string str) - { - byte[] bytes = Encoding.UTF8.GetBytes(str); - - MD5 md5Hasher = MD5.Create(); - byte[] hash = md5Hasher.ComputeHash(bytes); - - char[] hash2 = new char[16]; - - // Note that here we are wasting bits of hash! - // But it isn't really important, because hash.Length == 32 - for (int i = 0; i < hash2.Length; i++) - { - hash2[i] = CalculationHelper.chars[hash[i] % CalculationHelper.chars.Length]; - } - - return new string(hash2); - } - - /// - /// Gets the distance between two points on earth using the haversine formula. - /// - /// The latitude origin. - /// The longitude origin. - /// The latitude destination. - /// The longitude destination. - /// (Optional) The measurement system. - /// The distance. - /// - /// Uses the haversine formula - /// to calculate the "as-the-crow-flies" distance between two points on earth. - /// - /// - public static decimal GetDistance(decimal latitudeOrigin, decimal longitudeOrigin, decimal latitudeDestination, decimal longitudeDestination, MeasurementSystem measurementSystem = MeasurementSystem.Imperial) - { - double latitudeOriginalDouble = Convert.ToDouble(latitudeOrigin); - double longitudeOriginDouble = Convert.ToDouble(longitudeOrigin); - double latitudeDestinationDouble = Convert.ToDouble(latitudeDestination); - double longitudeDestinationDouble = Convert.ToDouble(longitudeDestination); - - var result = GetDistance(latitudeOriginalDouble, longitudeOriginDouble, latitudeDestinationDouble, longitudeDestinationDouble, measurementSystem); - - return Convert.ToDecimal(result); - } - - /// Gets the distance between two points on earth using the haversine formula. - /// The latitude of the origin. - /// The longitude of the origin. - /// The latitude destination. - /// The longitude destination. - /// (Optional) The measurement system. - /// The distance. - /// - /// Uses the haversine formula - /// to calculate the "as-the-crow-flies" distance between two points on earth. - /// - public static double GetDistance(double latitudeOrigin, double longitudeOrigin, double latitudeDestination, double longitudeDestination, MeasurementSystem measurementSystem = MeasurementSystem.Imperial) - { - var thetaLatitude = DegreesToRadians(latitudeOrigin); - var thetaLongitude = DegreesToRadians(longitudeOrigin); - var deltaLatitude = DegreesToRadians(latitudeDestination - latitudeOrigin); - var deltaLongitude = DegreesToRadians(longitudeDestination - longitudeOrigin); - - var haversineTheta = Math.Sin(deltaLatitude / 2) * Math.Sin(deltaLatitude / 2) + Math.Cos(thetaLatitude) * Math.Cos(thetaLongitude) * Math.Sin(deltaLongitude / 2) * Math.Sin(deltaLongitude / 2); - var angularDistance = 2 * Math.Atan2(Math.Sqrt(haversineTheta), Math.Sqrt(1 - haversineTheta)); - - var distance = EARTH_RADIUS_KILOMETERS * angularDistance; - - if (measurementSystem == MeasurementSystem.Imperial) - { - return KilometersToMiles(distance); - } - - return distance; - } - - /// Converts kilometers to miles. - /// The value in kilometers. - /// The value in miles. - public static double KilometersToMiles(double kilometers) - { - return kilometers * MILES_PER_KILOMETER; - } - - /// Converts miles to kilometers. - /// The value in miles. - /// The value in kilometers. - public static double MilesToKilometers(double miles) - { - return miles / MILES_PER_KILOMETER; - } - - /// Convers degrees to radians. - /// The degree value. - /// The value as radians. - public static double DegreesToRadians(double degrees) - { - return degrees * Math.PI / 180.0; - } - - /// Converts radians to degrees. - /// The radian value. - /// The value as degrees. - public static double RadiansToDegrees(double radians) - { - return radians * 180.0 / Math.PI; - } - - #endregion Methods + return hash; } -} + + /// Calculates the hexadecimal hash. + /// The string to be hashed. + /// The calculated 16 character hexadecimal hash. + public static string CalculateHexHash(string str) + { + var bytes = Encoding.UTF8.GetBytes(str); + + var md5Hasher = MD5.Create(); + var hash = md5Hasher.ComputeHash(bytes); + + var hash2 = new char[16]; + + // Note that here we are wasting bits of hash! + // But it isn't really important, because hash.Length == 32 + for (var i = 0; i < hash2.Length; i++) + { + hash2[i] = CalculationHelper.chars[hash[i] % CalculationHelper.chars.Length]; + } + + return new string(hash2); + } + + /// + /// Gets the distance between two points on earth using the haversine formula. + /// + /// The latitude origin. + /// The longitude origin. + /// The latitude destination. + /// The longitude destination. + /// (Optional) The measurement system. + /// The distance. + /// + /// Uses the haversine formula + /// to calculate the "as-the-crow-flies" distance between two points on earth. + /// + /// + public static decimal GetDistance(decimal latitudeOrigin, decimal longitudeOrigin, decimal latitudeDestination, + decimal longitudeDestination, MeasurementSystem measurementSystem = MeasurementSystem.Imperial) + { + var latitudeOriginalDouble = Convert.ToDouble(latitudeOrigin); + var longitudeOriginDouble = Convert.ToDouble(longitudeOrigin); + var latitudeDestinationDouble = Convert.ToDouble(latitudeDestination); + var longitudeDestinationDouble = Convert.ToDouble(longitudeDestination); + + var result = GetDistance(latitudeOriginalDouble, longitudeOriginDouble, latitudeDestinationDouble, + longitudeDestinationDouble, measurementSystem); + + return Convert.ToDecimal(result); + } + + /// Gets the distance between two points on earth using the haversine formula. + /// The latitude of the origin. + /// The longitude of the origin. + /// The latitude destination. + /// The longitude destination. + /// (Optional) The measurement system. + /// The distance. + /// + /// Uses the haversine formula + /// to calculate the "as-the-crow-flies" distance between two points on earth. + /// + public static double GetDistance(double latitudeOrigin, double longitudeOrigin, double latitudeDestination, + double longitudeDestination, MeasurementSystem measurementSystem = MeasurementSystem.Imperial) + { + var thetaLatitude = DegreesToRadians(latitudeOrigin); + var thetaLongitude = DegreesToRadians(longitudeOrigin); + var deltaLatitude = DegreesToRadians(latitudeDestination - latitudeOrigin); + var deltaLongitude = DegreesToRadians(longitudeDestination - longitudeOrigin); + + var haversineTheta = Math.Sin(deltaLatitude / 2) * Math.Sin(deltaLatitude / 2) + Math.Cos(thetaLatitude) * + Math.Cos(thetaLongitude) * Math.Sin(deltaLongitude / 2) * Math.Sin(deltaLongitude / 2); + var angularDistance = 2 * Math.Atan2(Math.Sqrt(haversineTheta), Math.Sqrt(1 - haversineTheta)); + + var distance = CalculationHelper.EARTH_RADIUS_KILOMETERS * angularDistance; + + if (measurementSystem == MeasurementSystem.Imperial) + { + return KilometersToMiles(distance); + } + + return distance; + } + + /// Converts kilometers to miles. + /// The value in kilometers. + /// The value in miles. + public static double KilometersToMiles(double kilometers) + { + return kilometers * CalculationHelper.MILES_PER_KILOMETER; + } + + /// Converts miles to kilometers. + /// The value in miles. + /// The value in kilometers. + public static double MilesToKilometers(double miles) + { + return miles / CalculationHelper.MILES_PER_KILOMETER; + } + + /// Convers degrees to radians. + /// The degree value. + /// The value as radians. + public static double DegreesToRadians(double degrees) + { + return degrees * Math.PI / 180.0; + } + + /// Converts radians to degrees. + /// The radian value. + /// The value as degrees. + public static double RadiansToDegrees(double radians) + { + return radians * 180.0 / Math.PI; + } + + #endregion Methods +} \ No newline at end of file diff --git a/CapyKit/Helpers/CompressionHelper.cs b/CapyKit/Helpers/CompressionHelper.cs index b995d67..78569c6 100644 --- a/CapyKit/Helpers/CompressionHelper.cs +++ b/CapyKit/Helpers/CompressionHelper.cs @@ -1,106 +1,102 @@ -using System; -using System.Collections.Generic; -using System.IO.Compression; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.IO.Compression; -namespace CapyKit.Helpers +namespace CapyKit.Helpers; + +/// A class that contains methods for managing data compression. +public static class CompressionHelper { - /// A class that contains methods for managing data compression. - public static class CompressionHelper + #region Members + + // + + #endregion Members + + #region Methods + + /// Compresses a given object using the gzip algorithm. + /// The object. + /// A byte array representing the compressed object in gzip format. + public static byte[] Compress(object obj) { - #region Members + var bytes = SerializationHelper.SerializeToBytes(obj); - // - - #endregion Members - - #region Methods - - /// Compresses a given object using the gzip algorithm. - /// The object. - /// A byte array representing the compressed object in gzip format. - public static byte[] Compress(object obj) + try { - var bytes = SerializationHelper.SerializeToBytes(obj); - - try + using (var inputStream = new MemoryStream(bytes)) + using (var outputStream = new MemoryStream()) { - using (var inputStream = new MemoryStream(bytes)) - using (var outputStream = new MemoryStream()) + using (var gzipStream = new GZipStream(outputStream, CompressionMode.Compress)) { - using (var gzipStream = new GZipStream(outputStream, CompressionMode.Compress)) - { - inputStream.Position = 0; - inputStream.CopyTo(gzipStream); - gzipStream.Flush(); - } - return outputStream.ToArray(); + inputStream.Position = 0; + inputStream.CopyTo(gzipStream); + gzipStream.Flush(); } - } - catch (Exception ex) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "Could not compress the object."); - throw; + + return outputStream.ToArray(); } } - - /// Compresses a given object to a string using base64 encoding of gzip format. - /// The object. - /// A string in base64 encoding. - public static string CompressToString(object obj) + catch (Exception ex) { - var bytes = Compress(obj); - return Convert.ToBase64String(bytes); + CapyEventReporter.EmitEvent(EventLevel.Error, "Could not compress the object."); + throw; } - - /// Decompresses a given base64 encoded string of gzip format. - /// Generic type parameter. - /// The base64 encoded gzip string. - /// A typed object. - public static T Decompress(string encodedString) - { - var bytes = Convert.FromBase64String(encodedString); - return Decompress(bytes); - } - - /// Decompresses a given compressed gzip byte stream. - /// Generic type parameter. - /// The compressed byte stream. - /// A typed object. - public static T Decompress(byte[] byteStream) - { - try - { - using (var inputStream = new MemoryStream(byteStream)) - using (var outputStream = new MemoryStream()) - { - using (var gzipStream = new GZipStream(inputStream, CompressionMode.Decompress)) - { - gzipStream.CopyTo(outputStream); - } - var bytes = outputStream.ToArray(); - return SerializationHelper.Deserialize(bytes); - } - } - catch (Exception ex) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "Could not decompress the deflated object."); - throw; - } - } - - /// Decompresses the given base64 string in gzip format. - /// The compressed string. - /// A decomressed string. - public static string DecompressToString(string compressed) - { - var bytes = Convert.FromBase64String(compressed); - - return Decompress(bytes); - } - - #endregion Methods } -} + + /// Compresses a given object to a string using base64 encoding of gzip format. + /// The object. + /// A string in base64 encoding. + public static string CompressToString(object obj) + { + var bytes = Compress(obj); + return Convert.ToBase64String(bytes); + } + + /// Decompresses a given base64 encoded string of gzip format. + /// Generic type parameter. + /// The base64 encoded gzip string. + /// A typed object. + public static T Decompress(string encodedString) + { + var bytes = Convert.FromBase64String(encodedString); + return Decompress(bytes); + } + + /// Decompresses a given compressed gzip byte stream. + /// Generic type parameter. + /// The compressed byte stream. + /// A typed object. + public static T Decompress(byte[] byteStream) + { + try + { + using (var inputStream = new MemoryStream(byteStream)) + using (var outputStream = new MemoryStream()) + { + using (var gzipStream = new GZipStream(inputStream, CompressionMode.Decompress)) + { + gzipStream.CopyTo(outputStream); + } + + var bytes = outputStream.ToArray(); + return SerializationHelper.Deserialize(bytes); + } + } + catch (Exception ex) + { + CapyEventReporter.EmitEvent(EventLevel.Error, "Could not decompress the deflated object."); + throw; + } + } + + /// Decompresses the given base64 string in gzip format. + /// The compressed string. + /// A decomressed string. + public static string DecompressToString(string compressed) + { + var bytes = Convert.FromBase64String(compressed); + + return Decompress(bytes); + } + + #endregion Methods +} \ No newline at end of file diff --git a/CapyKit/Helpers/EncryptionHelper.cs b/CapyKit/Helpers/EncryptionHelper.cs index b82dcd0..9604145 100644 --- a/CapyKit/Helpers/EncryptionHelper.cs +++ b/CapyKit/Helpers/EncryptionHelper.cs @@ -1,44 +1,36 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices.ObjectiveC; -using System.Text; -using System.Threading.Tasks; +namespace CapyKit.Helpers; -namespace CapyKit.Helpers +public class EncryptionHelper { - public class EncryptionHelper + #region Members + + private string encryptionKey; + + #endregion + + #region Constructors + + public EncryptionHelper(string encryptionKey) { - #region Members - - private string encryptionKey; - - #endregion - - #region Constructors - - public EncryptionHelper(string encryptionKey) - { - this.encryptionKey = encryptionKey; - } - - #endregion + this.encryptionKey = encryptionKey; } - public interface IEncryptionAlgorithm - { - #region Properties - - string AlgorithmName { get; } - - #endregion - - #region Methods - - EncryptedValue Encrypt(object obj, params object[] args); - - T Decrypt(EncryptedValue encryptedValue, params object[] args); - - #endregion - } + #endregion } + +public interface IEncryptionAlgorithm +{ + #region Properties + + string AlgorithmName { get; } + + #endregion + + #region Methods + + EncryptedValue Encrypt(object obj, params object[] args); + + T Decrypt(EncryptedValue encryptedValue, params object[] args); + + #endregion +} \ No newline at end of file diff --git a/CapyKit/Helpers/EnumerationHelper.cs b/CapyKit/Helpers/EnumerationHelper.cs index 5017a8d..b56e6d7 100644 --- a/CapyKit/Helpers/EnumerationHelper.cs +++ b/CapyKit/Helpers/EnumerationHelper.cs @@ -2,7 +2,7 @@ using CapyKit.Extensions; namespace CapyKit.Helpers; -/// A class that contains methods for managing objects. +/// A class that contains methods for managing objects. public static class EnumerationHelper { #region Methods @@ -18,7 +18,7 @@ public static class EnumerationHelper return (T)(object)value; } - return default(T); + return default; } /// Gets enumeration value from a string value. @@ -39,16 +39,16 @@ public static class EnumerationHelper } } - return default(T); + return default; } /// - /// An Enum extension method that deconstructs the given enumeration into a dictionary of its - /// integer value and its name. + /// An Enum extension method that deconstructs the given enumeration into a dictionary of its + /// integer value and its name. /// /// Generic type parameter. /// - /// An enumerator that allows foreach to be used to process deconstruct in this collection. + /// An enumerator that allows foreach to be used to process deconstruct in this collection. /// public static IEnumerable Deconstruct() where T : struct, Enum { @@ -62,13 +62,13 @@ public static class EnumerationHelper } /// - /// An Enum extension method that deconstructs the given enumeration into a dictionary of its - /// integer value and its name. + /// An Enum extension method that deconstructs the given enumeration into a dictionary of its + /// integer value and its name. /// /// Generic type parameter. /// The enumeration to act on. /// - /// An enumerator that allows foreach to be used to process deconstruct in this collection. + /// An enumerator that allows foreach to be used to process deconstruct in this collection. /// public static IEnumerable Deconstruct(this T enumeration) where T : struct, Enum { @@ -78,8 +78,8 @@ public static class EnumerationHelper /// An Enum extension method that deconstruct non default. /// Generic type parameter. /// - /// An enumerator that allows foreach to be used to process deconstruct non default in this - /// collection. + /// An enumerator that allows foreach to be used to process deconstruct non default in this + /// collection. /// public static IEnumerable DeconstructNonDefault() where T : struct, Enum { @@ -90,8 +90,8 @@ public static class EnumerationHelper /// Generic type parameter. /// The enumeration to act on. /// - /// An enumerator that allows foreach to be used to process deconstruct non default in this - /// collection. + /// An enumerator that allows foreach to be used to process deconstruct non default in this + /// collection. /// public static IEnumerable DeconstructNonDefault(this T enumeration) where T : struct, Enum { diff --git a/CapyKit/Helpers/KeyHelper.cs b/CapyKit/Helpers/KeyHelper.cs index 486fb93..8f0411d 100644 --- a/CapyKit/Helpers/KeyHelper.cs +++ b/CapyKit/Helpers/KeyHelper.cs @@ -1,225 +1,238 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using System.Security.Cryptography; +using System.Security.Cryptography; using System.Text; -using System.Net; -namespace CapyKit.Helpers +namespace CapyKit.Helpers; + +/// A class that contains methods for managing key creation and validation against a master key. +public class KeyHelper { - /// A class that contains methods for managing key creation and validation against a master key. - public class KeyHelper + /// The master key accessor function. + private Func masterKeyAccessor; + + /// Number of parts accessor function. + private Func numPartsAccessor; + + /// The salt size accessor function. + private Func saltSizeAccessor; + + /// Sets the master key. + /// The accessor function. + public void SetMasterKeyAccessor(Func accessor) { - /// The master key accessor function. - private Func masterKeyAccessor; - /// The salt size accessor function. - private Func saltSizeAccessor; - /// Number of parts accessor function. - private Func numPartsAccessor; + this.masterKeyAccessor = accessor; + } - /// Sets the master key. - /// The accessor function. - public void SetMasterKeyAccessor(Func accessor) + /// Gets the master key. + /// + /// Thrown when the requested operation is invalid. + /// + /// An array of byte. + public byte[] GetMasterKey() + { + if (this.masterKeyAccessor == null) { - this.masterKeyAccessor = accessor; + var errorMessage = "Master key accessor not set."; + CapyEventReporter.EmitEvent(EventLevel.Error, errorMessage); + throw new InvalidOperationException(errorMessage); } - /// Gets the master key. - /// - /// Thrown when the requested operation is invalid. - /// - /// An array of byte. - public byte[] GetMasterKey() + return this.masterKeyAccessor(); + } + + /// Sets the salt size (in bytes). Default is 4. + /// The accessor function. + public void SetSaltSizeAccessor(Func accessor) + { + this.saltSizeAccessor = accessor; + } + + /// Gets the salt size. + /// The salt size. + public int GetSaltSize() + { + return this.saltSizeAccessor != null ? this.saltSizeAccessor() : 4; + } + + /// Set and get the number of parts for the formatted key. Default is 2. + /// The accessor function. + public void SetNumPartsAccessor(Func accessor) + { + this.numPartsAccessor = accessor; + } + + /// Gets the number parts. + /// + /// Thrown when one or more arguments have unsupported or illegal values. + /// + /// The number parts. + public int GetNumParts() + { + var parts = this.numPartsAccessor != null ? this.numPartsAccessor() : 2; + if (parts < 2) { - if (this.masterKeyAccessor == null) - { - var errorMessage = "Master key accessor not set."; - CapyEventReporter.EmitEvent(EventLevel.Error, errorMessage); - throw new InvalidOperationException(errorMessage); - } - return this.masterKeyAccessor(); + var errorMessage = "Number of parts must be 2 or more."; + CapyEventReporter.EmitEvent(EventLevel.Error, errorMessage); + throw new ArgumentException(errorMessage); } - /// Sets the salt size (in bytes). Default is 4. - /// The accessor function. - public void SetSaltSizeAccessor(Func accessor) + return parts; + } + + /// + /// Computes an HMAC-SHA256 over the salt using the master key and truncates it to the same + /// number of bytes as the salt. + /// + /// The salt. + /// The calculated signature. + private byte[] ComputeSignature(byte[] salt) + { + var masterKey = GetMasterKey(); + using (var hmac = new HMACSHA256(masterKey)) { - this.saltSizeAccessor = accessor; - } - - /// Gets the salt size. - /// The salt size. - public int GetSaltSize() - { - return this.saltSizeAccessor != null ? this.saltSizeAccessor() : 4; - } - - /// Set and get the number of parts for the formatted key. Default is 2. - /// The accessor function. - public void SetNumPartsAccessor(Func accessor) - { - this.numPartsAccessor = accessor; - } - - /// Gets the number parts. - /// - /// Thrown when one or more arguments have unsupported or illegal values. - /// - /// The number parts. - public int GetNumParts() - { - int parts = this.numPartsAccessor != null ? this.numPartsAccessor() : 2; - if (parts < 2) - { - var errorMessage = "Number of parts must be 2 or more."; - CapyEventReporter.EmitEvent(EventLevel.Error, errorMessage); - throw new ArgumentException(errorMessage); - } - return parts; - } - - /// - /// Computes an HMAC-SHA256 over the salt using the master key and truncates it to the same - /// number of bytes as the salt. - /// - /// The salt. - /// The calculated signature. - private byte[] ComputeSignature(byte[] salt) - { - byte[] masterKey = GetMasterKey(); - using (var hmac = new HMACSHA256(masterKey)) - { - byte[] hash = hmac.ComputeHash(salt); - int sigLength = salt.Length; - byte[] signature = new byte[sigLength]; - Array.Copy(hash, signature, sigLength); - return signature; - } - } - - /// Converts a byte array to a hex string. - /// The bytes. - /// A string. - private string BytesToHex(byte[] bytes) - { - StringBuilder sb = new StringBuilder(bytes.Length * 2); - foreach (var b in bytes) - { - sb.Append(b.ToString("X2")); - } - return sb.ToString(); - } - - /// Converts a hex string back to a byte array. - /// - /// Thrown when one or more arguments have unsupported or illegal values. - /// - /// The hexadecimal. - /// A byte[]. - private byte[] HexToBytes(string hex) - { - if (hex.Length % 2 != 0) - { - var errorMessage = "Invalid hex string."; - CapyEventReporter.EmitEvent(EventLevel.Error, errorMessage); - throw new ArgumentException(errorMessage); - } - byte[] bytes = new byte[hex.Length / 2]; - for (int i = 0; i < hex.Length; i += 2) - { - bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16); - } - return bytes; - } - - /// - /// Formats the given hex string into the desired number of parts (separated by dashes). - /// - /// The hexadecimal. - /// The formatted key. - private string FormatKey(string hex) - { - int parts = GetNumParts(); - int totalLength = hex.Length; - int baseLength = totalLength / parts; - int remainder = totalLength % parts; - - StringBuilder formatted = new StringBuilder(); - int currentIndex = 0; - for (int i = 0; i < parts; i++) - { - // Distribute any extra characters across the first few groups. - int groupLength = baseLength + (i < remainder ? 1 : 0); - formatted.Append(hex.Substring(currentIndex, groupLength)); - currentIndex += groupLength; - if (i < parts - 1) - formatted.Append("-"); - } - return formatted.ToString(); - } - - /// Generates a random key. - /// The key. - public string GenerateKey() - { - int saltSize = GetSaltSize(); - byte[] salt = new byte[saltSize]; - using (var rng = RandomNumberGenerator.Create()) - { - rng.GetBytes(salt); - } - - byte[] signature = ComputeSignature(salt); - string saltHex = BytesToHex(salt); - string signatureHex = BytesToHex(signature); - string combinedHex = saltHex + signatureHex; - return FormatKey(combinedHex); - } - - /// Validates the provided key. - /// The provided key. - /// True if it succeeds, false if it fails. - /// - /// - /// - public bool ValidateKey(string providedKey) - { - if (string.IsNullOrWhiteSpace(providedKey)) - return false; - - // Remove dashes. - string cleanedKey = providedKey.Replace("-", ""); - int saltSize = GetSaltSize(); - int expectedTotalHexLength = 4 * saltSize; // salt (2*saltSize) + signature (2*saltSize) - if (cleanedKey.Length != expectedTotalHexLength) - return false; - - string saltHex = cleanedKey.Substring(0, 2 * saltSize); - string signatureHex = cleanedKey.Substring(2 * saltSize); - - byte[] salt; - byte[] providedSignature; - try - { - salt = HexToBytes(saltHex); - providedSignature = HexToBytes(signatureHex); - } - catch - { - return false; - } - - byte[] expectedSignature = ComputeSignature(salt); - if (expectedSignature.Length != providedSignature.Length) - return false; - - for (int i = 0; i < expectedSignature.Length; i++) - { - if (expectedSignature[i] != providedSignature[i]) - return false; - } - return true; + var hash = hmac.ComputeHash(salt); + var sigLength = salt.Length; + var signature = new byte[sigLength]; + Array.Copy(hash, signature, sigLength); + return signature; } } -} + + /// Converts a byte array to a hex string. + /// The bytes. + /// A string. + private string BytesToHex(byte[] bytes) + { + var sb = new StringBuilder(bytes.Length * 2); + foreach (var b in bytes) + { + sb.Append(b.ToString("X2")); + } + + return sb.ToString(); + } + + /// Converts a hex string back to a byte array. + /// + /// Thrown when one or more arguments have unsupported or illegal values. + /// + /// The hexadecimal. + /// A byte[]. + private byte[] HexToBytes(string hex) + { + if (hex.Length % 2 != 0) + { + var errorMessage = "Invalid hex string."; + CapyEventReporter.EmitEvent(EventLevel.Error, errorMessage); + throw new ArgumentException(errorMessage); + } + + var bytes = new byte[hex.Length / 2]; + for (var i = 0; i < hex.Length; i += 2) + { + bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16); + } + + return bytes; + } + + /// + /// Formats the given hex string into the desired number of parts (separated by dashes). + /// + /// The hexadecimal. + /// The formatted key. + private string FormatKey(string hex) + { + var parts = GetNumParts(); + var totalLength = hex.Length; + var baseLength = totalLength / parts; + var remainder = totalLength % parts; + + var formatted = new StringBuilder(); + var currentIndex = 0; + for (var i = 0; i < parts; i++) + { + // Distribute any extra characters across the first few groups. + var groupLength = baseLength + (i < remainder ? 1 : 0); + formatted.Append(hex.Substring(currentIndex, groupLength)); + currentIndex += groupLength; + if (i < parts - 1) + { + formatted.Append("-"); + } + } + + return formatted.ToString(); + } + + /// Generates a random key. + /// The key. + public string GenerateKey() + { + var saltSize = GetSaltSize(); + var salt = new byte[saltSize]; + using (var rng = RandomNumberGenerator.Create()) + { + rng.GetBytes(salt); + } + + var signature = ComputeSignature(salt); + var saltHex = BytesToHex(salt); + var signatureHex = BytesToHex(signature); + var combinedHex = saltHex + signatureHex; + return FormatKey(combinedHex); + } + + /// Validates the provided key. + /// The provided key. + /// True if it succeeds, false if it fails. + /// + /// + /// + public bool ValidateKey(string providedKey) + { + if (string.IsNullOrWhiteSpace(providedKey)) + { + return false; + } + + // Remove dashes. + var cleanedKey = providedKey.Replace("-", ""); + var saltSize = GetSaltSize(); + var expectedTotalHexLength = 4 * saltSize; // salt (2*saltSize) + signature (2*saltSize) + if (cleanedKey.Length != expectedTotalHexLength) + { + return false; + } + + var saltHex = cleanedKey.Substring(0, 2 * saltSize); + var signatureHex = cleanedKey.Substring(2 * saltSize); + + byte[] salt; + byte[] providedSignature; + try + { + salt = HexToBytes(saltHex); + providedSignature = HexToBytes(signatureHex); + } + catch + { + return false; + } + + var expectedSignature = ComputeSignature(salt); + if (expectedSignature.Length != providedSignature.Length) + { + return false; + } + + for (var i = 0; i < expectedSignature.Length; i++) + { + if (expectedSignature[i] != providedSignature[i]) + { + return false; + } + } + + return true; + } +} \ No newline at end of file diff --git a/CapyKit/Helpers/LanguageHelper.cs b/CapyKit/Helpers/LanguageHelper.cs index b8e13a9..6af24bc 100644 --- a/CapyKit/Helpers/LanguageHelper.cs +++ b/CapyKit/Helpers/LanguageHelper.cs @@ -1,33 +1,28 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; +using System.Text.RegularExpressions; -namespace CapyKit.Helpers +namespace CapyKit.Helpers; + +/// +/// Helper class for handling text transformations. +/// +public class LanguageHelper { - /// - /// Helper class for handling text transformations. - /// - public class LanguageHelper + #region Methods + + /// Converts camel case text to human readable text. + /// + /// Camel case is a naming convention for identifiers in which the first letter of each word is + /// capitalized. + /// + /// The value. + /// A string in human readable format. + public static string CamelCaseToHumanReadable(string value) { - #region Methods + var regex = new Regex(@"(?<=[A-Z])(?=[A-Z][a-z]) | (?<=[^A-Z])(?=[A-Z]) | (?<=[A-Za-z])(?=[^A-Za-z])", + RegexOptions.IgnorePatternWhitespace); - /// Converts camel case text to human readable text. - /// - /// Camel case is a naming convention for identifiers in which the first letter of each word is - /// capitalized. - /// - /// The value. - /// A string in human readable format. - public static string CamelCaseToHumanReadable(string value) - { - var regex = new Regex(@"(?<=[A-Z])(?=[A-Z][a-z]) | (?<=[^A-Z])(?=[A-Z]) | (?<=[A-Za-z])(?=[^A-Za-z])", RegexOptions.IgnorePatternWhitespace); - - return regex.Replace(value, " "); - } - - #endregion + return regex.Replace(value, " "); } -} + + #endregion +} \ No newline at end of file diff --git a/CapyKit/Helpers/PropertyHelper.cs b/CapyKit/Helpers/PropertyHelper.cs index 694b5ac..94a85bd 100644 --- a/CapyKit/Helpers/PropertyHelper.cs +++ b/CapyKit/Helpers/PropertyHelper.cs @@ -9,8 +9,8 @@ namespace CapyKit.Helpers; public static class PropertyHelper { /// - /// Gets the reflected value of an instanced - /// object. + /// Gets the reflected value of an instanced + /// object. /// /// Type of the property. /// The instanced object. @@ -22,12 +22,12 @@ public static class PropertyHelper } /// - /// Gets the reflected of an instanced - /// object. + /// Gets the reflected of an instanced + /// object. /// /// The instanced object. /// Name of the property. - /// The reflected . + /// The reflected . public static PropertyInfo GetProperty(T obj, string propertyName) { if (obj == null) @@ -40,7 +40,10 @@ public static class PropertyHelper .FirstOrDefault(); } - /// Gets the reflected value of an instanced object property value as described by a . + /// + /// Gets the reflected value of an instanced object + /// property value as described by a . + /// /// Type of the property. /// The instanced object. /// The property selector function that identifies the property. @@ -51,16 +54,18 @@ public static class PropertyHelper } /// - /// Gets the reflected of an object as - /// described by a . + /// Gets the reflected of an object as + /// described by a . /// - /// Thrown when the does - /// not return a - /// of type - /// . + /// + /// Thrown when the does + /// not return a + /// of type + /// . + /// /// Type of the property. /// The property selector function that identifies the property. - /// The reflected . + /// The reflected . public static PropertyInfo GetProperty(Expression> selector) { Expression body = selector; @@ -82,7 +87,7 @@ public static class PropertyHelper } /// - /// Gets an attribute from a given property. + /// Gets an attribute from a given property. /// /// Type of the property. /// The property selector function that identifies the property. @@ -94,7 +99,7 @@ public static class PropertyHelper } /// - /// Gets a attribute from the given property. + /// Gets a attribute from the given property. /// /// Type of the property. /// The property selector function that identifies the property. @@ -105,7 +110,7 @@ public static class PropertyHelper } /// - /// Gets a attribute from the given property. + /// Gets a attribute from the given property. /// /// Type of the property. /// The property selector function that identifies the property. @@ -115,11 +120,11 @@ public static class PropertyHelper return GetPropertyCustomAttribute(selector); } - /// Gets custom from a given property. + /// Gets custom from a given property. /// Type of the attribute. /// Type of the property. /// The property selector function that identifies the property. - /// The custom of the property. + /// The custom of the property. public static TAttribute GetPropertyCustomAttribute(Expression> selector) where TAttribute : Attribute { diff --git a/CapyKit/Helpers/SecurityHelper.cs b/CapyKit/Helpers/SecurityHelper.cs index af929e4..bce011c 100644 --- a/CapyKit/Helpers/SecurityHelper.cs +++ b/CapyKit/Helpers/SecurityHelper.cs @@ -1,485 +1,488 @@ -using CapyKit.Attributes; -using CapyKit.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection.Metadata.Ecma335; -using System.Security.Cryptography; +using System.Security.Cryptography; using System.Text; -using System.Threading.Tasks; +using CapyKit.Attributes; -namespace CapyKit.Helpers +namespace CapyKit.Helpers; + +/// A class that contains methods for managing secure data processing and cryptography. +public class SecurityHelper { - /// A class that contains methods for managing secure data processing and cryptography. - public class SecurityHelper + #region Members + + /// A string of all the lower case characters. + internal const string LOWER_CASE_CHARACTERS = "abcdefghijklmnopqrstuvwxyz"; + + /// A string of all the upper case characters. + internal const string UPPER_CASE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + /// A string of all the numeric characters. + internal const string NUMBER_CHARACTERS = "0123456789"; + + /// A string of the most common non-alphanumeric characters. + internal const string SPECIAL_CHARACTERS = "!@#$%&?+-_"; + + #endregion Members + + #region Methods + + public static bool CompareHashedPassword(Password existingPassword, string password, string salt, + params object[] args) + where T : IPasswordAlgorithm { - #region Members + return CompareHashedPassword(Convert.ToBase64String(existingPassword.Hash), password, salt, args); + } - /// A string of all the lower case characters. - internal const string LOWER_CASE_CHARACTERS = "abcdefghijklmnopqrstuvwxyz"; + /// + /// Compares an unencrypted with a stored, encrypted . + /// This method uses the specified password algorithm type to retrieve the hashed version + /// of the and then compares it with the . + /// + /// The type of the password hashing algorithm. + /// The existing, encrypted password. + /// The unencrypted password to be compared. + /// The salt value used in password hashing. + /// Additional arguments required for constructing the password algorithm instance. + /// + /// if hash comparison succeeds, if it fails. + /// + public static bool CompareHashedPassword(Password existingPassword, string password, byte[] salt, + params object[] args) + where T : IPasswordAlgorithm + { + return CompareHashedPassword(existingPassword.Hash, password, salt, args); + } - /// A string of all the upper case characters. - internal const string UPPER_CASE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - - /// A string of all the numeric characters. - internal const string NUMBER_CHARACTERS = "0123456789"; - - /// A string of the most common non-alphanumeric characters. - internal const string SPECIAL_CHARACTERS = "!@#$%&?+-_"; - - #endregion Members - - #region Methods - - public static bool CompareHashedPassword(Password existingPassword, string password, string salt, - params object[] args) - where T : IPasswordAlgorithm + /// + /// Compares a plaintext password with a persisted Base64-encoded hash and salt. + /// + /// The password hashing algorithm. + /// The Base64-encoded persisted hash. + /// The plaintext password to verify. + /// The Base64-encoded persisted salt. + /// Arguments used to construct the password algorithm. + /// when the password matches the persisted hash. + public static bool CompareHashedPassword(string storedHash, string password, string salt, + params object[] args) + where T : IPasswordAlgorithm + { + if (string.IsNullOrWhiteSpace(storedHash) || string.IsNullOrEmpty(password) || + string.IsNullOrWhiteSpace(salt)) { - return CompareHashedPassword(Convert.ToBase64String(existingPassword.Hash), password, salt, args); + return false; } - /// - /// Compares an unencrypted with a stored, encrypted . - /// This method uses the specified password algorithm type to retrieve the hashed version - /// of the and then compares it with the . - /// - /// The type of the password hashing algorithm. - /// The existing, encrypted password. - /// The unencrypted password to be compared. - /// The salt value used in password hashing. - /// Additional arguments required for constructing the password algorithm instance. - /// - /// if hash comparison succeeds, if it fails. - /// - public static bool CompareHashedPassword(Password existingPassword, string password, byte[] salt, - params object[] args) - where T : IPasswordAlgorithm + try { - return CompareHashedPassword(existingPassword.Hash, password, salt, args); + return CompareHashedPassword(Convert.FromBase64String(storedHash), password, + Convert.FromBase64String(salt), args); + } + catch (FormatException) + { + return false; + } + } + + /// + /// Compares a hashed password with a plaintext password by using a specified hashing algorithm + /// . + /// This method requires the existing hash, the plaintext password to compare, and the associated salt value. + /// + /// The type of the password hashing algorithm implementing . + /// The stored hash of the password as a byte array. + /// The plaintext password to verify. + /// The salt used during the password hashing process as a byte array. + /// Optional arguments required for constructing the password hashing algorithm instance. + /// + /// if the hashed password matches the stored hash, otherwise. + /// + public static bool CompareHashedPassword(byte[] storedHash, string password, byte[] salt, + params object[] args) + where T : IPasswordAlgorithm + { + if (storedHash == null || storedHash.Length == 0 || string.IsNullOrEmpty(password) || salt == null || + salt.Length == 0) + { + return false; } - /// - /// Compares a plaintext password with a persisted Base64-encoded hash and salt. - /// - /// The password hashing algorithm. - /// The Base64-encoded persisted hash. - /// The plaintext password to verify. - /// The Base64-encoded persisted salt. - /// Arguments used to construct the password algorithm. - /// when the password matches the persisted hash. - public static bool CompareHashedPassword(string storedHash, string password, string salt, - params object[] args) - where T : IPasswordAlgorithm + var candidatePassword = GetPassword(password, salt, args); + return candidatePassword is not null && candidatePassword.Hash.Length == storedHash.Length && + CryptographicOperations.FixedTimeEquals(storedHash, candidatePassword.Hash); + } + + public static bool CompareHashedPassword(Password existingPassword, string password, string salt, + IPasswordAlgorithm algorithm, params object[] args) + { + var saltBytes = Convert.FromBase64String(salt); + + return CompareHashedPassword(existingPassword, password, saltBytes, algorithm, args); + } + + /// + /// Compares an unencrypted with a stored, encrypted . + /// This method uses the specified password hashing algorithm of type to hash the + /// + /// and then compares it with the . + /// + /// The type of the password hashing algorithm, implementing . + /// The stored, encrypted password to compare against. + /// The plain text password to be compared. + /// The salt value used for hashing the plain text password. + /// Optional additional arguments required for initializing the password hashing algorithm. + /// + /// if the password hashes match, otherwise . + /// + public static bool CompareHashedPassword(Password existingPassword, string password, byte[] salt, + IPasswordAlgorithm algorithm, params object[] args) + { + var algorithmType = algorithm.GetType(); + + var providedPassword = typeof(SecurityHelper) + .GetMethod("GetPassword", new[] { typeof(string), typeof(byte[]), typeof(object[]) }) + ?.MakeGenericMethod(algorithmType) + ?.Invoke(null, new object[] { password, salt, args }); + + return existingPassword.Equals(providedPassword); + } + + /// + /// Produces a deterministic SHA-256 digest for an opaque secret that must be looked up + /// without persisting the raw value. + /// + /// The raw opaque secret. + /// The Base64-encoded digest. + public static string HashOpaqueSecret(string secret) + { + ArgumentException.ThrowIfNullOrWhiteSpace(secret); + return Convert.ToBase64String(SHA256.HashData(Encoding.UTF8.GetBytes(secret))); + } + + /// + /// Retrieves a object using the specified password and generates a random salt value. + /// Then it uses that salt to call the overloaded method with + /// the given password and + /// the generated salt as arguments. + /// + /// The type of implementation to use. + /// The plaintext password to be hashed. + /// + /// Optional constructor arguments for the implementation + /// instance. + /// + /// + /// A new object with the given password and a randomly generated salt, as well as an + /// instance of created using any optional constructor arguments provided. + /// + /// + public static Password GetPassword(string password, int saltSize, params object[] args) + where T : IPasswordAlgorithm + { + var salt = GetRandomBytes(saltSize); + return GetPassword(password, salt, args); + } + + /// + /// Retrieves a object using the specified password, salt, and optional + /// constructor arguments. + /// + /// + /// This method uses reflection to find a constructor for the specified password algorithm type ( + /// ). + /// It emits an error event if a suitable constructor is not found or if there is an error invoking the constructor. + /// + /// + /// The type of implementation to use. + /// + /// The plaintext password to be hashed. + /// + /// A random value used as an additional input to the one-way function that hashes data, a + /// password or passphrase. This is used to make each output different for the same input + /// thus adding security. + /// + /// + /// Optional constructor arguments for the implementation + /// instance. + /// + /// + /// A new object with the given password and salt, as well as an instance + /// of created using the provided constructor arguments. + /// + public static Password GetPassword(string password, byte[] salt, params object[] args) + where T : IPasswordAlgorithm + { + //var allArgs = args.Prepend(salt).Prepend(password).ToArray(); // Prepend in reverse order so that password precedes salt. + var argTypes = args.Select(arg => arg.GetType()).ToArray(); + var algorithmConstructor = typeof(T).GetConstructor(argTypes); + if (algorithmConstructor == null) { - if (string.IsNullOrWhiteSpace(storedHash) || string.IsNullOrEmpty(password) || - string.IsNullOrWhiteSpace(salt)) - { - return false; - } - - try - { - return CompareHashedPassword(Convert.FromBase64String(storedHash), password, - Convert.FromBase64String(salt), args); - } - catch (FormatException) - { - return false; - } - } - - /// - /// Compares a hashed password with a plaintext password by using a specified hashing algorithm . - /// This method requires the existing hash, the plaintext password to compare, and the associated salt value. - /// - /// The type of the password hashing algorithm implementing . - /// The stored hash of the password as a byte array. - /// The plaintext password to verify. - /// The salt used during the password hashing process as a byte array. - /// Optional arguments required for constructing the password hashing algorithm instance. - /// - /// if the hashed password matches the stored hash, otherwise. - /// - public static bool CompareHashedPassword(byte[] storedHash, string password, byte[] salt, - params object[] args) - where T : IPasswordAlgorithm - { - if (storedHash == null || storedHash.Length == 0 || string.IsNullOrEmpty(password) || salt == null || - salt.Length == 0) - { - return false; - } - - var candidatePassword = GetPassword(password, salt, args); - return candidatePassword is not null && candidatePassword.Hash.Length == storedHash.Length && - CryptographicOperations.FixedTimeEquals(storedHash, candidatePassword.Hash); - } - - public static bool CompareHashedPassword(Password existingPassword, string password, string salt, - IPasswordAlgorithm algorithm, params object[] args) - { - var saltBytes = Convert.FromBase64String(salt); - - return CompareHashedPassword(existingPassword, password, saltBytes, algorithm, args); - } - - /// - /// Compares an unencrypted with a stored, encrypted . - /// This method uses the specified password hashing algorithm of type to hash the - /// and then compares it with the . - /// - /// The type of the password hashing algorithm, implementing . - /// The stored, encrypted password to compare against. - /// The plain text password to be compared. - /// The salt value used for hashing the plain text password. - /// Optional additional arguments required for initializing the password hashing algorithm. - /// - /// if the password hashes match, otherwise . - /// - public static bool CompareHashedPassword(Password existingPassword, string password, byte[] salt, - IPasswordAlgorithm algorithm, params object[] args) - { - var algorithmType = algorithm.GetType(); - - var providedPassword = typeof(SecurityHelper) - .GetMethod("GetPassword", new Type[] { typeof(string), typeof(byte[]), typeof(object[]) }) - ?.MakeGenericMethod(algorithmType) - ?.Invoke(null, new object[] { password, salt, args }); - - return existingPassword.Equals(providedPassword); - } - - /// - /// Produces a deterministic SHA-256 digest for an opaque secret that must be looked up - /// without persisting the raw value. - /// - /// The raw opaque secret. - /// The Base64-encoded digest. - public static string HashOpaqueSecret(string secret) - { - ArgumentException.ThrowIfNullOrWhiteSpace(secret); - return Convert.ToBase64String(SHA256.HashData(Encoding.UTF8.GetBytes(secret))); - } - - /// - /// Retrieves a object using the specified password and generates a random salt value. - /// Then it uses that salt to call the overloaded method with the given password and - /// the generated salt as arguments. - /// - /// The type of implementation to use. - /// The plaintext password to be hashed. - /// - /// Optional constructor arguments for the implementation - /// instance. - /// - /// - /// A new object with the given password and a randomly generated salt, as well as an - /// instance of created using any optional constructor arguments provided. - /// - /// - public static Password GetPassword(string password, int saltSize, params object[] args) - where T : IPasswordAlgorithm - { - var salt = GetRandomBytes(saltSize); - return GetPassword(password, salt, args); - } - - /// - /// Retrieves a object using the specified password, salt, and optional - /// constructor arguments. - /// - /// - /// This method uses reflection to find a constructor for the specified password algorithm type (). - /// It emits an error event if a suitable constructor is not found or if there is an error invoking the constructor. - /// - /// - /// The type of implementation to use. - /// - /// The plaintext password to be hashed. - /// - /// A random value used as an additional input to the one-way function that hashes data, a - /// password or passphrase. This is used to make each output different for the same input - /// thus adding security. - /// - /// - /// Optional constructor arguments for the implementation - /// instance. - /// - /// - /// A new object with the given password and salt, as well as an instance - /// of created using the provided constructor arguments. - /// - public static Password GetPassword(string password, byte[] salt, params object[] args) - where T : IPasswordAlgorithm - { - //var allArgs = args.Prepend(salt).Prepend(password).ToArray(); // Prepend in reverse order so that password precedes salt. - var argTypes = args.Select(arg => arg.GetType()).ToArray(); - var algorithmConstructor = typeof(T).GetConstructor(argTypes); - if (algorithmConstructor == null) - { - CapyEventReporter.EmitEvent(EventLevel.Error, - "Cannot find a constructor for {0} that matches the given arguments: {1}", - args: new[] - { - typeof(T).Name, - string.Join(",", argTypes.Select(arg => arg.Name)) - }); - return default(Password); - } - - var passwordInstance = (T)algorithmConstructor.Invoke(args); - - if (passwordInstance == null) - { - CapyEventReporter.EmitEvent(EventLevel.Error, - "There was an error invoking the constructor for {0} with the given arguments: {1}", - args: new[] - { - typeof(T).Name, - string.Join(",", args) - }); - return default(Password); - } - - return new Password(password, salt, passwordInstance, args); - } - - /// - /// Generates a new object using the PBKDF2 algorithm with the provided - /// and . - /// - /// - /// This method uses the PBKDF2 (Password-Based Key Derivation Function 2) algorithm to generate - /// a new password hash. The algorithm iteratively applies a pseudorandom function to the - /// password and salt, which increases the security of the resulting hash. - /// - /// The clear text password to be hashed. - /// - /// A random value used to add an additional layer of security to the generated hash. - /// - /// - /// A new object containing the hashed password and salt. - /// - public static Password Pbkdf2(string password, byte[] salt) - { - var pwd = new Password(password, salt, Password.Pbkdf2Algorithm); - - return pwd; - } - - /// - /// Generates a new object using the PBKDF2 algorithm with the provided . - /// This overload of the method generates a random salt value for added security. - /// - /// - /// This method uses the PBKDF2 (Password-Based Key Derivation Function 2) algorithm to generate - /// a new password hash. The algorithm iteratively applies a pseudorandom function to the - /// password and salt, which increases the security of the resulting hash. In this overload, - /// a random salt value is generated using method. - /// - /// The clear text password to be hashed. - /// - /// A new object containing the hashed password and a randomly generated salt. - /// - public static Password Pbkdf2(string password, int saltSize) - { - var salt = SecurityHelper.GetRandomBytes(saltSize); - var pwd = new Password(password, salt, Password.Pbkdf2Algorithm); - - return pwd; - } - - /// Gets a cryptographically strong random password. - /// The length of the password to generate. - /// - /// An array of enumeration values representing the desired - /// character sets. - /// - /// The password. - public static string GetRandomPassword(int length, params ValidCharacterCollection[] validCharacters) - { - if (validCharacters.Length == 0) - { - CapyEventReporter.EmitEvent(EventLevel.Warning, - "No valid characters were provided, so all valid caharacters will be assumed."); - validCharacters = new[] + CapyEventReporter.EmitEvent(EventLevel.Error, + "Cannot find a constructor for {0} that matches the given arguments: {1}", + args: new[] { - ValidCharacterCollection.Lowercase, - ValidCharacterCollection.Uppercase, - ValidCharacterCollection.Numbers, - ValidCharacterCollection.Special - }; - } - - return GetRandomString(length, validCharacters); + typeof(T).Name, + string.Join(",", argTypes.Select(arg => arg.Name)) + }); + return default; } - /// Compares two session identifiers. - /// The first session identifier. - /// The second session identifier. - /// - /// if comparison succeeds, if not. - /// - public static bool CompareSessionID(string first, string second) + var passwordInstance = (T)algorithmConstructor.Invoke(args); + + if (passwordInstance == null) { - if (string.IsNullOrEmpty(first) || string.IsNullOrEmpty(second)) + CapyEventReporter.EmitEvent(EventLevel.Error, + "There was an error invoking the constructor for {0} with the given arguments: {1}", + args: new[] + { + typeof(T).Name, + string.Join(",", args) + }); + return default; + } + + return new Password(password, salt, passwordInstance, args); + } + + /// + /// Generates a new object using the PBKDF2 algorithm with the provided + /// + /// and . + /// + /// + /// This method uses the PBKDF2 (Password-Based Key Derivation Function 2) algorithm to generate + /// a new password hash. The algorithm iteratively applies a pseudorandom function to the + /// password and salt, which increases the security of the resulting hash. + /// + /// The clear text password to be hashed. + /// + /// A random value used to add an additional layer of security to the generated hash. + /// + /// + /// A new object containing the hashed password and salt. + /// + public static Password Pbkdf2(string password, byte[] salt) + { + var pwd = new Password(password, salt, Password.Pbkdf2Algorithm); + + return pwd; + } + + /// + /// Generates a new object using the PBKDF2 algorithm with the provided + /// . + /// This overload of the method generates a random salt value for added security. + /// + /// + /// This method uses the PBKDF2 (Password-Based Key Derivation Function 2) algorithm to generate + /// a new password hash. The algorithm iteratively applies a pseudorandom function to the + /// password and salt, which increases the security of the resulting hash. In this overload, + /// a random salt value is generated using method. + /// + /// The clear text password to be hashed. + /// + /// A new object containing the hashed password and a randomly generated salt. + /// + public static Password Pbkdf2(string password, int saltSize) + { + var salt = GetRandomBytes(saltSize); + var pwd = new Password(password, salt, Password.Pbkdf2Algorithm); + + return pwd; + } + + /// Gets a cryptographically strong random password. + /// The length of the password to generate. + /// + /// An array of enumeration values representing the desired + /// character sets. + /// + /// The password. + public static string GetRandomPassword(int length, params ValidCharacterCollection[] validCharacters) + { + if (validCharacters.Length == 0) + { + CapyEventReporter.EmitEvent(EventLevel.Warning, + "No valid characters were provided, so all valid caharacters will be assumed."); + validCharacters = new[] { - return CompareStrings(first, second); - } - - return CompareStrings(first.Trim(), second.Trim()); - } - - /// - /// A convenience method to generate a random string of the specified length using all character sets. - /// - /// The desired length of the generated random string. - /// - /// - public static string GetRandomString(int length) - { - return GetRandomString(length, ValidCharacterCollection.Lowercase, ValidCharacterCollection.Uppercase, ValidCharacterCollection.Numbers, - ValidCharacterCollection.Special); + ValidCharacterCollection.Special + }; } - /// Gets a cryptographically strong random string using the character values found in . - /// The length of the string to create. - /// The random string. - public static string GetRandomString(int length, params ValidCharacterCollection[] validChars) - { - var buffer = new StringBuilder(length); - var randomNumberBuffer = - new byte[length * 3]; // Overprovision the buffer so we can discard a small percentage. - var validCharacters = GetValidCharacterComposition(validChars); - var validByteUpperLimit = - (256 / validCharacters.Length) * validCharacters.Length - - 1; // Maintains equal distribution of valid characters. + return GetRandomString(length, validCharacters); + } - using (var rng = RandomNumberGenerator.Create()) + /// Compares two session identifiers. + /// The first session identifier. + /// The second session identifier. + /// + /// if comparison succeeds, if not. + /// + public static bool CompareSessionID(string first, string second) + { + if (string.IsNullOrEmpty(first) || string.IsNullOrEmpty(second)) + { + return CompareStrings(first, second); + } + + return CompareStrings(first.Trim(), second.Trim()); + } + + /// + /// A convenience method to generate a random string of the specified length using all character sets. + /// + /// The desired length of the generated random string. + /// + /// + public static string GetRandomString(int length) + { + return GetRandomString(length, + ValidCharacterCollection.Lowercase, + ValidCharacterCollection.Uppercase, + ValidCharacterCollection.Numbers, + ValidCharacterCollection.Special); + } + + /// + /// Gets a cryptographically strong random string using the character values found in + /// . + /// + /// The length of the string to create. + /// The random string. + public static string GetRandomString(int length, params ValidCharacterCollection[] validChars) + { + var buffer = new StringBuilder(length); + var randomNumberBuffer = + new byte[length * 3]; // Overprovision the buffer so we can discard a small percentage. + var validCharacters = GetValidCharacterComposition(validChars); + var validByteUpperLimit = + 256 / validCharacters.Length * validCharacters.Length - + 1; // Maintains equal distribution of valid characters. + + using (var rng = RandomNumberGenerator.Create()) + { + while (buffer.Length < length) { - while (buffer.Length < length) + rng.GetBytes(randomNumberBuffer); + foreach (var b in randomNumberBuffer) { - rng.GetBytes(randomNumberBuffer); - foreach (byte b in randomNumberBuffer) + if (b <= validByteUpperLimit) { - if (b <= validByteUpperLimit) + var index = b % validCharacters.Length; + buffer.Append(validCharacters[index]); + if (buffer.Length == length) { - int index = b % validCharacters.Length; - buffer.Append(validCharacters[index]); - if (buffer.Length == length) - { - break; - } + break; } } } } - - return buffer.ToString(); } + return buffer.ToString(); + } - /// Generates a new byte array of the specified length with random values. - /// The desired length of the generated byte array. - /// A new byte array of the specified length filled with random values. - public static byte[] GetRandomBytes(int length) + + /// Generates a new byte array of the specified length with random values. + /// The desired length of the generated byte array. + /// A new byte array of the specified length filled with random values. + public static byte[] GetRandomBytes(int length) + { + if (length <= 0) { - if (length <= 0) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "Length must be greater than 0."); - return GetRandomBytes(16); - } - - var buffer = new byte[length]; - using (var rng = RandomNumberGenerator.Create()) - { - rng.GetBytes(buffer); - } - - return buffer; + CapyEventReporter.EmitEvent(EventLevel.Error, "Length must be greater than 0."); + return GetRandomBytes(16); } - /// - /// Static method that returns a valid character composition based on the given ValidCharacterCollection parameters. - /// - /// An array of ValidCharacterCollection enumeration values representing the desired character sets. - /// A string containing all the characters from the specified character sets. - public static string GetValidCharacterComposition(params ValidCharacterCollection[] validCharacters) + var buffer = new byte[length]; + using (var rng = RandomNumberGenerator.Create()) { - var composition = new StringBuilder(); - foreach (var c in validCharacters) - { - switch (c) - { - case ValidCharacterCollection.Lowercase: - composition.Append(SecurityHelper.LOWER_CASE_CHARACTERS); - break; - case ValidCharacterCollection.Uppercase: - composition.Append(SecurityHelper.UPPER_CASE_CHARACTERS); - break; - case ValidCharacterCollection.Numbers: - composition.Append(SecurityHelper.NUMBER_CHARACTERS); - break; - case ValidCharacterCollection.Special: - composition.Append(SecurityHelper.SPECIAL_CHARACTERS); - break; - default: - break; - } - } - - return composition.ToString(); + rng.GetBytes(buffer); } - /// Compare two strings as case sensative. - /// The first string. - /// The second string. - /// - /// if the comparison succeeds, if not. - /// - /// - /// This method is a proxy for using - /// with the - /// StringComparison set to . - /// - private static bool CompareStrings(string first, string second) - { - return string.Compare(first, second, StringComparison.Ordinal) == 0; - } - - #endregion Methods + return buffer; } /// - /// An enumeration that defines the types of characters that can be included in a random string. + /// Static method that returns a valid character composition based on the given ValidCharacterCollection parameters. /// - public enum ValidCharacterCollection + /// + /// An array of ValidCharacterCollection enumeration values representing the desired + /// character sets. + /// + /// A string containing all the characters from the specified character sets. + public static string GetValidCharacterComposition(params ValidCharacterCollection[] validCharacters) { - /// - /// Indicates that lower case characters should be included in the random string. - /// - [EnumerationDescriptionAttribute(SecurityHelper.LOWER_CASE_CHARACTERS)] - Lowercase, + var composition = new StringBuilder(); + foreach (var c in validCharacters) + { + switch (c) + { + case ValidCharacterCollection.Lowercase: + composition.Append(SecurityHelper.LOWER_CASE_CHARACTERS); + break; + case ValidCharacterCollection.Uppercase: + composition.Append(SecurityHelper.UPPER_CASE_CHARACTERS); + break; + case ValidCharacterCollection.Numbers: + composition.Append(SecurityHelper.NUMBER_CHARACTERS); + break; + case ValidCharacterCollection.Special: + composition.Append(SecurityHelper.SPECIAL_CHARACTERS); + break; + } + } - /// - /// Indicates that upper case characters should be included in the random string. - /// - [EnumerationDescriptionAttribute(SecurityHelper.UPPER_CASE_CHARACTERS)] - Uppercase, - - /// - /// Indicates that numeric characters should be included in the random string. - /// - [EnumerationDescriptionAttribute(SecurityHelper.NUMBER_CHARACTERS)] - Numbers, - - /// - /// Indicates that special characters should be included in the random string. - /// - [EnumerationDescriptionAttribute(SecurityHelper.SPECIAL_CHARACTERS)] - Special, + return composition.ToString(); } + + /// Compare two strings as case sensative. + /// The first string. + /// The second string. + /// + /// if the comparison succeeds, if not. + /// + /// + /// This method is a proxy for using + /// with the + /// StringComparison set to . + /// + private static bool CompareStrings(string first, string second) + { + return string.Compare(first, second, StringComparison.Ordinal) == 0; + } + + #endregion Methods +} + +/// +/// An enumeration that defines the types of characters that can be included in a random string. +/// +public enum ValidCharacterCollection +{ + /// + /// Indicates that lower case characters should be included in the random string. + /// + [EnumerationDescriptionAttribute(SecurityHelper.LOWER_CASE_CHARACTERS)] + Lowercase, + + /// + /// Indicates that upper case characters should be included in the random string. + /// + [EnumerationDescriptionAttribute(SecurityHelper.UPPER_CASE_CHARACTERS)] + Uppercase, + + /// + /// Indicates that numeric characters should be included in the random string. + /// + [EnumerationDescriptionAttribute(SecurityHelper.NUMBER_CHARACTERS)] + Numbers, + + /// + /// Indicates that special characters should be included in the random string. + /// + [EnumerationDescriptionAttribute(SecurityHelper.SPECIAL_CHARACTERS)] + Special } \ No newline at end of file diff --git a/CapyKit/Helpers/SerializationHelper.cs b/CapyKit/Helpers/SerializationHelper.cs index b1bb378..8b836a2 100644 --- a/CapyKit/Helpers/SerializationHelper.cs +++ b/CapyKit/Helpers/SerializationHelper.cs @@ -1,105 +1,102 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Runtime.Serialization; -using System.Runtime.Serialization.Formatters.Binary; -using System.Text; -using System.Text.Json; -using System.Threading.Tasks; +using System.Text.Json; -namespace CapyKit.Helpers +namespace CapyKit.Helpers; + +public static class SerializationHelper { - public static class SerializationHelper + #region Members + + // + + #endregion Members + + #region Methods + + /// Serializes an object to a byte array. + /// The object. + /// A JSON encoded string. + public static byte[] SerializeToBytes(object obj) { - #region Members - - // - - #endregion Members - - #region Methods - - /// Serializes an object to a byte array. - /// The object. - /// A JSON encoded string. - public static byte[] SerializeToBytes(object obj) - { - return JsonSerializer.SerializeToUtf8Bytes(obj); - } - - /// Serializes an object to a JSON encoded string. - /// The object. - /// A JSON encoded string. - public static string SerializeToString(object obj) - { - return JsonSerializer.Serialize(obj); - } - - /// Deserializes an object to a given type. - /// Thrown when the format of the byte array is incorrect. - /// Generic type parameter. - /// The byte array representing a object. - /// A object. - public static T Deserialize(byte[] bytes) - { - var stream = new MemoryStream(bytes); - - return Deserialize(stream); - } - - /// Deserializes an object to a given type. - /// - /// Thrown when the format of an input is incorrect. - /// - /// Generic type parameter. - /// The steam. - /// A object. - public static T Deserialize(Stream stream) - { - try - { - var obj = JsonSerializer.Deserialize(stream); - - if(obj == null) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "The deserialized object was null."); - throw new ArgumentNullException(nameof(stream)); - } - - return (T)obj; - } - catch (JsonException ex) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "JSON formatting error detected during deserialization of byte array for {0}.", args: new[] { typeof(T).Name }); - throw new FormatException(string.Format("JSON formatting error detected during deserialization of byte array for {0}.", typeof(T).Name), ex); - } - catch (Exception ex) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "Could not deserialize object of type {0}.", args: new[] { typeof(T).Name }); - throw; - } - } - - /// Deserializes a JSON encoded string to the given . - /// Generic type parameter. - /// The JSON encoded string representing a object. - /// A object. - public static T Deserialize(string str) - { - if (typeof(T) == typeof(string)) - { - return (T)Convert.ChangeType(str, typeof(T)); - } - else if(string.IsNullOrWhiteSpace(str)) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "Could not deserialize an empty string."); - return default(T); - } - - return JsonSerializer.Deserialize(str); - } - - #endregion Methods + return JsonSerializer.SerializeToUtf8Bytes(obj); } -} + + /// Serializes an object to a JSON encoded string. + /// The object. + /// A JSON encoded string. + public static string SerializeToString(object obj) + { + return JsonSerializer.Serialize(obj); + } + + /// Deserializes an object to a given type. + /// Thrown when the format of the byte array is incorrect. + /// Generic type parameter. + /// The byte array representing a object. + /// A object. + public static T Deserialize(byte[] bytes) + { + var stream = new MemoryStream(bytes); + + return Deserialize(stream); + } + + /// Deserializes an object to a given type. + /// + /// Thrown when the format of an input is incorrect. + /// + /// Generic type parameter. + /// The steam. + /// A object. + public static T Deserialize(Stream stream) + { + try + { + var obj = JsonSerializer.Deserialize(stream); + + if (obj == null) + { + CapyEventReporter.EmitEvent(EventLevel.Error, "The deserialized object was null."); + throw new ArgumentNullException(nameof(stream)); + } + + return (T)obj; + } + catch (JsonException ex) + { + CapyEventReporter.EmitEvent(EventLevel.Error, + "JSON formatting error detected during deserialization of byte array for {0}.", + args: new[] { typeof(T).Name }); + throw new FormatException( + string.Format("JSON formatting error detected during deserialization of byte array for {0}.", + typeof(T).Name), ex); + } + catch (Exception ex) + { + CapyEventReporter.EmitEvent(EventLevel.Error, "Could not deserialize object of type {0}.", + args: new[] { typeof(T).Name }); + throw; + } + } + + /// Deserializes a JSON encoded string to the given . + /// Generic type parameter. + /// The JSON encoded string representing a object. + /// A object. + public static T Deserialize(string str) + { + if (typeof(T) == typeof(string)) + { + return (T)Convert.ChangeType(str, typeof(T)); + } + + if (string.IsNullOrWhiteSpace(str)) + { + CapyEventReporter.EmitEvent(EventLevel.Error, "Could not deserialize an empty string."); + return default; + } + + return JsonSerializer.Deserialize(str); + } + + #endregion Methods +} \ No newline at end of file diff --git a/CapyKit/Helpers/SettingsHelper.cs b/CapyKit/Helpers/SettingsHelper.cs index 762b2e0..dc2488a 100644 --- a/CapyKit/Helpers/SettingsHelper.cs +++ b/CapyKit/Helpers/SettingsHelper.cs @@ -1,135 +1,128 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace CapyKit.Helpers; -namespace CapyKit.Helpers +/// +/// Static class containing helper methods for retrieving and setting application settings. +/// +/// +/// The specific means of accessing and storing the settings are determined by the consumer, +/// allowing for flexibility in various environments such as App.config or Web.config +/// . +/// +/// +/// This example demonstrates how to set up the SettingsHelper class with custom accessor and +/// detector methods that read from an App.config file. The setup is done at the beginning of the +/// application execution, before any other usage of the helper methods. +/// +/// public int main(string[] args) +/// { +/// // Set up SettingsHelper with custom accessor and detector methods +/// Func<string, object> accessor = (key) => +/// { +/// Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); +/// return config.AppSettings.Settings[key].Value; +/// }; +/// +/// Func<string, bool> detector = (key) => +/// { +/// Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); +/// return config.AppSettings.Settings.AllKeys.Contains(key); +/// }; +/// +/// SettingsHelper.SetAccessorMethod(accessor); +/// SettingsHelper.SetDetectorMethod(detector); +/// +/// // Use the helper to retrieve and set settings +/// SettingsHelper.SetApplicationSetting<int>("MySettingKey", 42); +/// int newSetting = SettingsHelper.GetApplicationSetting<int>("MySettingKey"); +/// Console.WriteLine("New setting: {0}", newSetting); +/// +/// int mySetting = SettingsHelper.GetApplicationSetting<int>("MySettingKey"); +/// Console.WriteLine("Retrieved setting: {0}", mySetting); +/// } +/// +/// +public static class SettingsHelper { + #region Members + /// - /// Static class containing helper methods for retrieving and setting application settings. + /// Private delegate function that retrieves a setting with the given key. /// - /// - /// The specific means of accessing and storing the settings are determined by the consumer, - /// allowing for flexibility in various environments such as App.config or Web.config - /// . - /// - /// - /// This example demonstrates how to set up the SettingsHelper class with custom accessor and - /// detector methods that read from an App.config file. The setup is done at the beginning of the - /// application execution, before any other usage of the helper methods. - /// - /// public int main(string[] args) - /// { - /// // Set up SettingsHelper with custom accessor and detector methods - /// Func<string, object> accessor = (key) => - /// { - /// Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); - /// return config.AppSettings.Settings[key].Value; - /// }; - /// - /// Func<string, bool> detector = (key) => - /// { - /// Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); - /// return config.AppSettings.Settings.AllKeys.Contains(key); - /// }; - /// - /// SettingsHelper.SetAccessorMethod(accessor); - /// SettingsHelper.SetDetectorMethod(detector); - /// - /// // Use the helper to retrieve and set settings - /// SettingsHelper.SetApplicationSetting<int>("MySettingKey", 42); - /// int newSetting = SettingsHelper.GetApplicationSetting<int>("MySettingKey"); - /// Console.WriteLine("New setting: {0}", newSetting); - /// - /// int mySetting = SettingsHelper.GetApplicationSetting<int>("MySettingKey"); - /// Console.WriteLine("Retrieved setting: {0}", mySetting); - /// } - /// - /// - public static class SettingsHelper + private static Func accessor = key => default; + + /// + /// Private delegate function that detects if a setting with a given key exists. Returns + /// if the setting exists, if not. + /// + private static Func detector = key => false; + + #endregion Members + + #region Methods + + /// + /// Retrieves a setting with the given key. + /// + /// The type of the setting to be retrieved. + /// The name of the setting to retrieve. + /// The value of the setting as an uncast . + public static T GetApplicationSetting(string settingName) { - #region Members - - /// - /// Private delegate function that retrieves a setting with the given key. - /// - private static Func accessor = (key) => default(object); - - /// - /// Private delegate function that detects if a setting with a given key exists. Returns - /// if the setting exists, if not. - /// - private static Func detector = (key) => false; - - #endregion Members - - #region Methods - - /// - /// Retrieves a setting with the given key. - /// - /// The type of the setting to be retrieved. - /// The name of the setting to retrieve. - /// The value of the setting as an uncast . - public static T GetApplicationSetting(string settingName) + if (SettingsHelper.detector(settingName)) { - if (SettingsHelper.detector(settingName)) + var result = Convert.ChangeType(SettingsHelper.accessor(settingName), typeof(T)); + if (result is T) { - var result = Convert.ChangeType(SettingsHelper.accessor(settingName), typeof(T)); - if (result is T) - { - return (T)result; - } - - return default(T); + return (T)result; } - return default(T); + return default; } - /// Sets the function used to retrieve application settings. - /// - /// Thrown when one or more required arguments are null. - /// - /// The new function used to retrieve application settings. - public static void SetAccessorMethod(Func accessor) - { - if (accessor != null) - { - SettingsHelper.accessor = accessor; - } - else - { - var error = "Cannot set the ApplicationSettingsHelper accessor method to a null function."; - CapyEventReporter.EmitEvent(EventLevel.Error, error); - throw new ArgumentNullException(error); - } - } - - /// - /// Sets the function used to detect if an application setting with a given key exists. - /// - /// - /// Thrown when one or more required arguments are null. - /// - /// - /// The new function used to detect if an application setting exists. - /// - public static void SetDetectorMethod(Func detector) - { - if (detector != null) - { - SettingsHelper.detector = detector; - } - else - { - var error = "Cannot set the ApplicationSettingsHelper detector method to a null function."; - CapyEventReporter.EmitEvent(EventLevel.Error, error); - throw new ArgumentNullException(error); - } - } - - #endregion Methods + return default; } -} + + /// Sets the function used to retrieve application settings. + /// + /// Thrown when one or more required arguments are null. + /// + /// The new function used to retrieve application settings. + public static void SetAccessorMethod(Func accessor) + { + if (accessor != null) + { + SettingsHelper.accessor = accessor; + } + else + { + var error = "Cannot set the ApplicationSettingsHelper accessor method to a null function."; + CapyEventReporter.EmitEvent(EventLevel.Error, error); + throw new ArgumentNullException(error); + } + } + + /// + /// Sets the function used to detect if an application setting with a given key exists. + /// + /// + /// Thrown when one or more required arguments are null. + /// + /// + /// The new function used to detect if an application setting exists. + /// + public static void SetDetectorMethod(Func detector) + { + if (detector != null) + { + SettingsHelper.detector = detector; + } + else + { + var error = "Cannot set the ApplicationSettingsHelper detector method to a null function."; + CapyEventReporter.EmitEvent(EventLevel.Error, error); + throw new ArgumentNullException(error); + } + } + + #endregion Methods +} \ No newline at end of file diff --git a/CapyKit/NamedColor.cs b/CapyKit/NamedColor.cs index d1bd767..39f48e9 100644 --- a/CapyKit/NamedColor.cs +++ b/CapyKit/NamedColor.cs @@ -1,1916 +1,2856 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace CapyKit; -namespace CapyKit +/// +/// Enum representing a set of named colors with their corresponding HEX values. These colors are +/// inspired by the XKCD color palette (Link). +/// +public enum NamedColor { - /// - /// Enum representing a set of named colors with their corresponding HEX values. These colors are - /// inspired by the XKCD color palette (Link). - /// - public enum NamedColor - { - /// A color described as Cloudy Blue with a HEX value of #ACC2D9. - CloudyBlue = 0xACC2D9, - /// A color described as Dark Pastel Green with a HEX value of #56AE57. - DarkPastelGreen = 0x56AE57, - /// A color described as Dust with a HEX value of #B2996E. - Dust = 0xB2996E, - /// A color described as Electric Lime with a HEX value of #A8FF04. - ElectricLime = 0xA8FF04, - /// A color described as Fresh Green with a HEX value of #69D84F. - FreshGreen = 0x69D84F, - /// A color described as Light Eggplant with a HEX value of #894585. - LightEggplant = 0x894585, - /// A color described as Nasty Green with a HEX value of #70B23F. - NastyGreen = 0x70B23F, - /// A color described as Really Light Blue with a HEX value of #D4FFFF. - ReallyLightBlue = 0xD4FFFF, - /// A color described as Tea with a HEX value of #65AB7C. - Tea = 0x65AB7C, - /// A color described as Warm Purple with a HEX value of #952E8F. - WarmPurple = 0x952E8F, - /// A color described as Yellowish Tan with a HEX value of #FCFC81. - YellowishTan = 0xFCFC81, - /// A color described as Cement with a HEX value of #A5A391. - Cement = 0xA5A391, - /// A color described as Dark Grass Green with a HEX value of #388004. - DarkGrassGreen = 0x388004, - /// A color described as Dusty Teal with a HEX value of #4C9085. - DustyTeal = 0x4C9085, - /// A color described as Grey Teal with a HEX value of #5E9B8A. - GreyTeal = 0x5E9B8A, - /// A color described as Macaroni And Cheese with a HEX value of #EFB435. - MacaroniAndCheese = 0xEFB435, - /// A color described as Pinkish Tan with a HEX value of #D99B82. - PinkishTan = 0xD99B82, - /// A color described as Spruce with a HEX value of #0A5F38. - Spruce = 0x0A5F38, - /// A color described as Strong Blue with a HEX value of #0C06F7. - StrongBlue = 0x0C06F7, - /// A color described as Toxic Green with a HEX value of #61DE2A. - ToxicGreen = 0x61DE2A, - /// A color described as Windows Blue with a HEX value of #3778BF. - WindowsBlue = 0x3778BF, - /// A color described as Blue Blue with a HEX value of #2242C7. - BlueBlue = 0x2242C7, - /// A color described as Blue With A Hint Of Purple with a HEX value of #533CC6. - BlueWithAHintOfPurple = 0x533CC6, - /// A color described as Booger with a HEX value of #9BB53C. - Booger = 0x9BB53C, - /// A color described as Bright Sea Green with a HEX value of #05FFA6. - BrightSeaGreen = 0x05FFA6, - /// A color described as Dark Green Blue with a HEX value of #1F6357. - DarkGreenBlue = 0x1F6357, - /// A color described as Deep Turquoise with a HEX value of #017374. - DeepTurquoise = 0x017374, - /// A color described as Green Teal with a HEX value of #0CB577. - GreenTeal = 0x0CB577, - /// A color described as Strong Pink with a HEX value of #FF0789. - StrongPink = 0xFF0789, - /// A color described as Bland with a HEX value of #AFA88B. - Bland = 0xAFA88B, - /// A color described as Deep Aqua with a HEX value of #08787F. - DeepAqua = 0x08787F, - /// A color described as Lavender Pink with a HEX value of #DD85D7. - LavenderPink = 0xDD85D7, - /// A color described as Light Moss Green with a HEX value of #A6C875. - LightMossGreen = 0xA6C875, - /// A color described as Light Seafoam Green with a HEX value of #A7FFB5. - LightSeafoamGreen = 0xA7FFB5, - /// A color described as Olive Yellow with a HEX value of #C2B709. - OliveYellow = 0xC2B709, - /// A color described as Pig Pink with a HEX value of #E78EA5. - PigPink = 0xE78EA5, - /// A color described as Deep Lilac with a HEX value of #966EBD. - DeepLilac = 0x966EBD, - /// A color described as Desert with a HEX value of #CCAD60. - Desert = 0xCCAD60, - /// A color described as Dusty Lavender with a HEX value of #AC86A8. - DustyLavender = 0xAC86A8, - /// A color described as Purpley Grey with a HEX value of #947E94. - PurpleyGrey = 0x947E94, - /// A color described as Purply with a HEX value of #983FB2. - Purply = 0x983FB2, - /// A color described as Candy Pink with a HEX value of #FF63E9. - CandyPink = 0xFF63E9, - /// A color described as Light Pastel Green with a HEX value of #B2FBA5. - LightPastelGreen = 0xB2FBA5, - /// A color described as Boring Green with a HEX value of #63B365. - BoringGreen = 0x63B365, - /// A color described as Kiwi Green with a HEX value of #8EE53F. - KiwiGreen = 0x8EE53F, - /// A color described as Light Grey Green with a HEX value of #B7E1A1. - LightGreyGreen = 0xB7E1A1, - /// A color described as Orange Pink with a HEX value of #FF6F52. - OrangePink = 0xFF6F52, - /// A color described as Tea Green with a HEX value of #BDF8A3. - TeaGreen = 0xBDF8A3, - /// A color described as Very Light Brown with a HEX value of #D3B683. - VeryLightBrown = 0xD3B683, - /// A color described as Egg Shell with a HEX value of #FFFCC4. - EggShell = 0xFFFCC4, - /// A color described as Eggplant Purple with a HEX value of #430541. - EggplantPurple = 0x430541, - /// A color described as Powder Pink with a HEX value of #FFB2D0. - PowderPink = 0xFFB2D0, - /// A color described as Reddish Grey with a HEX value of #997570. - ReddishGrey = 0x997570, - /// A color described as Baby Shit Brown with a HEX value of #AD900D. - BabyShitBrown = 0xAD900D, - /// A color described as Liliac with a HEX value of #C48EFD. - Liliac = 0xC48EFD, - /// A color described as Stormy Blue with a HEX value of #507B9C. - StormyBlue = 0x507B9C, - /// A color described as Ugly Brown with a HEX value of #7D7103. - UglyBrown = 0x7D7103, - /// A color described as Custard with a HEX value of #FFFD78. - Custard = 0xFFFD78, - /// A color described as Darkish Pink with a HEX value of #DA467D. - DarkishPink = 0xDA467D, - /// A color described as Deep Brown with a HEX value of #410200. - DeepBrown = 0x410200, - /// A color described as Greenish Beige with a HEX value of #C9D179. - GreenishBeige = 0xC9D179, - /// A color described as Manilla with a HEX value of #FFFA86. - Manilla = 0xFFFA86, - /// A color described as Off Blue with a HEX value of #5684AE. - OffBlue = 0x5684AE, - /// A color described as Battleship Grey with a HEX value of #6B7C85. - BattleshipGrey = 0x6B7C85, - /// A color described as Browny Green with a HEX value of #6F6C0A. - BrownyGreen = 0x6F6C0A, - /// A color described as Bruise with a HEX value of #7E4071. - Bruise = 0x7E4071, - /// A color described as Kelley Green with a HEX value of #009337. - KelleyGreen = 0x009337, - /// A color described as Sickly Yellow with a HEX value of #D0E429. - SicklyYellow = 0xD0E429, - /// A color described as Sunny Yellow with a HEX value of #FFF917. - SunnyYellow = 0xFFF917, - /// A color described as Azul with a HEX value of #1D5DEC. - Azul = 0x1D5DEC, - /// A color described as Darkgreen with a HEX value of #054907. - Darkgreen = 0x054907, - /// A color described as Green/Yellow with a HEX value of #B5CE08. - GreenYellow = 0xB5CE08, - /// A color described as Lichen with a HEX value of #8FB67B. - Lichen = 0x8FB67B, - /// A color described as Light Light Green with a HEX value of #C8FFB0. - LightLightGreen = 0xC8FFB0, - /// A color described as Pale Gold with a HEX value of #FDDE6C. - PaleGold = 0xFDDE6C, - /// A color described as Sun Yellow with a HEX value of #FFDF22. - SunYellow = 0xFFDF22, - /// A color described as Tan Green with a HEX value of #A9BE70. - TanGreen = 0xA9BE70, - /// A color described as Burple with a HEX value of #6832E3. - Burple = 0x6832E3, - /// A color described as Butterscotch with a HEX value of #FDB147. - Butterscotch = 0xFDB147, - /// A color described as Toupe with a HEX value of #C7AC7D. - Toupe = 0xC7AC7D, - /// A color described as Dark Cream with a HEX value of #FFF39A. - DarkCream = 0xFFF39A, - /// A color described as Indian Red with a HEX value of #850E04. - IndianRed = 0x850E04, - /// A color described as Light Lavendar with a HEX value of #EFC0FE. - LightLavendar = 0xEFC0FE, - /// A color described as Poison Green with a HEX value of #40FD14. - PoisonGreen = 0x40FD14, - /// A color described as Baby Puke Green with a HEX value of #B6C406. - BabyPukeGreen = 0xB6C406, - /// A color described as Bright Yellow Green with a HEX value of #9DFF00. - BrightYellowGreen = 0x9DFF00, - /// A color described as Charcoal Grey with a HEX value of #3C4142. - CharcoalGrey = 0x3C4142, - /// A color described as Squash with a HEX value of #F2AB15. - Squash = 0xF2AB15, - /// A color described as Cinnamon with a HEX value of #AC4F06. - Cinnamon = 0xAC4F06, - /// A color described as Light Pea Green with a HEX value of #C4FE82. - LightPeaGreen = 0xC4FE82, - /// A color described as Radioactive Green with a HEX value of #2CFA1F. - RadioactiveGreen = 0x2CFA1F, - /// A color described as Raw Sienna with a HEX value of #9A6200. - RawSienna = 0x9A6200, - /// A color described as Baby Purple with a HEX value of #CA9BF7. - BabyPurple = 0xCA9BF7, - /// A color described as Cocoa with a HEX value of #875F42. - Cocoa = 0x875F42, - /// A color described as Light Royal Blue with a HEX value of #3A2EFE. - LightRoyalBlue = 0x3A2EFE, - /// A color described as Orangeish with a HEX value of #FD8D49. - Orangeish = 0xFD8D49, - /// A color described as Rust Brown with a HEX value of #8B3103. - RustBrown = 0x8B3103, - /// A color described as Sand Brown with a HEX value of #CBA560. - SandBrown = 0xCBA560, - /// A color described as Swamp with a HEX value of #698339. - Swamp = 0x698339, - /// A color described as Tealish Green with a HEX value of #0CDC73. - TealishGreen = 0x0CDC73, - /// A color described as Burnt Siena with a HEX value of #B75203. - BurntSiena = 0xB75203, - /// A color described as Camo with a HEX value of #7F8F4E. - Camo = 0x7F8F4E, - /// A color described as Dusk Blue with a HEX value of #26538D. - DuskBlue = 0x26538D, - /// A color described as Fern with a HEX value of #63A950. - Fern = 0x63A950, - /// A color described as Old Rose with a HEX value of #C87F89. - OldRose = 0xC87F89, - /// A color described as Pale Light Green with a HEX value of #B1FC99. - PaleLightGreen = 0xB1FC99, - /// A color described as Peachy Pink with a HEX value of #FF9A8A. - PeachyPink = 0xFF9A8A, - /// A color described as Rosy Pink with a HEX value of #F6688E. - RosyPink = 0xF6688E, - /// A color described as Light Bluish Green with a HEX value of #76FDA8. - LightBluishGreen = 0x76FDA8, - /// A color described as Light Bright Green with a HEX value of #53FE5C. - LightBrightGreen = 0x53FE5C, - /// A color described as Light Neon Green with a HEX value of #4EFD54. - LightNeonGreen = 0x4EFD54, - /// A color described as Light Seafoam with a HEX value of #A0FEBF. - LightSeafoam = 0xA0FEBF, - /// A color described as Tiffany Blue with a HEX value of #7BF2DA. - TiffanyBlue = 0x7BF2DA, - /// A color described as Washed Out Green with a HEX value of #BCF5A6. - WashedOutGreen = 0xBCF5A6, - /// A color described as Browny Orange with a HEX value of #CA6B02. - BrownyOrange = 0xCA6B02, - /// A color described as Nice Blue with a HEX value of #107AB0. - NiceBlue = 0x107AB0, - /// A color described as Sapphire with a HEX value of #2138AB. - Sapphire = 0x2138AB, - /// A color described as Greyish Teal with a HEX value of #719F91. - GreyishTeal = 0x719F91, - /// A color described as Orangey Yellow with a HEX value of #FDB915. - OrangeyYellow = 0xFDB915, - /// A color described as Parchment with a HEX value of #FEFCAF. - Parchment = 0xFEFCAF, - /// A color described as Straw with a HEX value of #FCF679. - Straw = 0xFCF679, - /// A color described as Very Dark Brown with a HEX value of #1D0200. - VeryDarkBrown = 0x1D0200, - /// A color described as Terracota with a HEX value of #CB6843. - Terracota = 0xCB6843, - /// A color described as Ugly Blue with a HEX value of #31668A. - UglyBlue = 0x31668A, - /// A color described as Clear Blue with a HEX value of #247AFD. - ClearBlue = 0x247AFD, - /// A color described as Creme with a HEX value of #FFFFB6. - Creme = 0xFFFFB6, - /// A color described as Foam Green with a HEX value of #90FDA9. - FoamGreen = 0x90FDA9, - /// A color described as Grey/Green with a HEX value of #86A17D. - GreyGreen = 0x86A17D, - /// A color described as Light Gold with a HEX value of #FDDC5C. - LightGold = 0xFDDC5C, - /// A color described as Seafoam Blue with a HEX value of #78D1B6. - SeafoamBlue = 0x78D1B6, - /// A color described as Topaz with a HEX value of #13BBAF. - Topaz = 0x13BBAF, - /// A color described as Violet Pink with a HEX value of #FB5FFC. - VioletPink = 0xFB5FFC, - /// A color described as Wintergreen with a HEX value of #20F986. - Wintergreen = 0x20F986, - /// A color described as Yellow Tan with a HEX value of #FFE36E. - YellowTan = 0xFFE36E, - /// A color described as Dark Fuchsia with a HEX value of #9D0759. - DarkFuchsia = 0x9D0759, - /// A color described as Indigo Blue with a HEX value of #3A18B1. - IndigoBlue = 0x3A18B1, - /// A color described as Light Yellowish Green with a HEX value of #C2FF89. - LightYellowishGreen = 0xC2FF89, - /// A color described as Pale Magenta with a HEX value of #D767AD. - PaleMagenta = 0xD767AD, - /// A color described as Rich Purple with a HEX value of #720058. - RichPurple = 0x720058, - /// A color described as Sunflower Yellow with a HEX value of #FFDA03. - SunflowerYellow = 0xFFDA03, - /// A color described as Green/Blue with a HEX value of #01C08D. - GreenBlue = 0x01C08D, - /// A color described as Leather with a HEX value of #AC7434. - Leather = 0xAC7434, - /// A color described as Racing Green with a HEX value of #014600. - RacingGreen = 0x014600, - /// A color described as Vivid Purple with a HEX value of #9900FA. - VividPurple = 0x9900FA, - /// A color described as Dark Royal Blue with a HEX value of #02066F. - DarkRoyalBlue = 0x02066F, - /// A color described as Hazel with a HEX value of #8E7618. - Hazel = 0x8E7618, - /// A color described as Muted Pink with a HEX value of #D1768F. - MutedPink = 0xD1768F, - /// A color described as Booger Green with a HEX value of #96B403. - BoogerGreen = 0x96B403, - /// A color described as Canary with a HEX value of #FDFF63. - Canary = 0xFDFF63, - /// A color described as Cool Grey with a HEX value of #95A3A6. - CoolGrey = 0x95A3A6, - /// A color described as Dark Taupe with a HEX value of #7F684E. - DarkTaupe = 0x7F684E, - /// A color described as Darkish Purple with a HEX value of #751973. - DarkishPurple = 0x751973, - /// A color described as True Green with a HEX value of #089404. - TrueGreen = 0x089404, - /// A color described as Coral Pink with a HEX value of #FF6163. - CoralPink = 0xFF6163, - /// A color described as Dark Sage with a HEX value of #598556. - DarkSage = 0x598556, - /// A color described as Dark Slate Blue with a HEX value of #214761. - DarkSlateBlue = 0x214761, - /// A color described as Flat Blue with a HEX value of #3C73A8. - FlatBlue = 0x3C73A8, - /// A color described as Mushroom with a HEX value of #BA9E88. - Mushroom = 0xBA9E88, - /// A color described as Rich Blue with a HEX value of #021BF9. - RichBlue = 0x021BF9, - /// A color described as Dirty Purple with a HEX value of #734A65. - DirtyPurple = 0x734A65, - /// A color described as Greenblue with a HEX value of #23C48B. - Greenblue = 0x23C48B, - /// A color described as Icky Green with a HEX value of #8FAE22. - IckyGreen = 0x8FAE22, - /// A color described as Light Khaki with a HEX value of #E6F2A2. - LightKhaki = 0xE6F2A2, - /// A color described as Warm Blue with a HEX value of #4B57DB. - WarmBlue = 0x4B57DB, - /// A color described as Dark Hot Pink with a HEX value of #D90166. - DarkHotPink = 0xD90166, - /// A color described as Deep Sea Blue with a HEX value of #015482. - DeepSeaBlue = 0x015482, - /// A color described as Carmine with a HEX value of #9D0216. - Carmine = 0x9D0216, - /// A color described as Dark Yellow Green with a HEX value of #728F02. - DarkYellowGreen = 0x728F02, - /// A color described as Pale Peach with a HEX value of #FFE5AD. - PalePeach = 0xFFE5AD, - /// A color described as Plum Purple with a HEX value of #4E0550. - PlumPurple = 0x4E0550, - /// A color described as Golden Rod with a HEX value of #F9BC08. - GoldenRod = 0xF9BC08, - /// A color described as Neon Red with a HEX value of #FF073A. - NeonRed = 0xFF073A, - /// A color described as Old Pink with a HEX value of #C77986. - OldPink = 0xC77986, - /// A color described as Very Pale Blue with a HEX value of #D6FFFE. - VeryPaleBlue = 0xD6FFFE, - /// A color described as Blood Orange with a HEX value of #FE4B03. - BloodOrange = 0xFE4B03, - /// A color described as Grapefruit with a HEX value of #FD5956. - Grapefruit = 0xFD5956, - /// A color described as Sand Yellow with a HEX value of #FCE166. - SandYellow = 0xFCE166, - /// A color described as Clay Brown with a HEX value of #B2713D. - ClayBrown = 0xB2713D, - /// A color described as Dark Blue Grey with a HEX value of #1F3B4D. - DarkBlueGrey = 0x1F3B4D, - /// A color described as Flat Green with a HEX value of #699D4C. - FlatGreen = 0x699D4C, - /// A color described as Light Green Blue with a HEX value of #56FCA2. - LightGreenBlue = 0x56FCA2, - /// A color described as Warm Pink with a HEX value of #FB5581. - WarmPink = 0xFB5581, - /// A color described as Dodger Blue with a HEX value of #3E82FC. - DodgerBlue = 0x3E82FC, - /// A color described as Gross Green with a HEX value of #A0BF16. - GrossGreen = 0xA0BF16, - /// A color described as Ice with a HEX value of #D6FFFA. - Ice = 0xD6FFFA, - /// A color described as Metallic Blue with a HEX value of #4F738E. - MetallicBlue = 0x4F738E, - /// A color described as Pale Salmon with a HEX value of #FFB19A. - PaleSalmon = 0xFFB19A, - /// A color described as Sap Green with a HEX value of #5C8B15. - SapGreen = 0x5C8B15, - /// A color described as Algae with a HEX value of #54AC68. - Algae = 0x54AC68, - /// A color described as Bluey Grey with a HEX value of #89A0B0. - BlueyGrey = 0x89A0B0, - /// A color described as Greeny Grey with a HEX value of #7EA07A. - GreenyGrey = 0x7EA07A, - /// A color described as Highlighter Green with a HEX value of #1BFC06. - HighlighterGreen = 0x1BFC06, - /// A color described as Light Light Blue with a HEX value of #CAFFFB. - LightLightBlue = 0xCAFFFB, - /// A color described as Light Mint with a HEX value of #B6FFBB. - LightMint = 0xB6FFBB, - /// A color described as Raw Umber with a HEX value of #A75E09. - RawUmber = 0xA75E09, - /// A color described as Vivid Blue with a HEX value of #152EFF. - VividBlue = 0x152EFF, - /// A color described as Deep Lavender with a HEX value of #8D5EB7. - DeepLavender = 0x8D5EB7, - /// A color described as Dull Teal with a HEX value of #5F9E8F. - DullTeal = 0x5F9E8F, - /// A color described as Light Greenish Blue with a HEX value of #63F7B4. - LightGreenishBlue = 0x63F7B4, - /// A color described as Mud Green with a HEX value of #606602. - MudGreen = 0x606602, - /// A color described as Pinky with a HEX value of #FC86AA. - Pinky = 0xFC86AA, - /// A color described as Red Wine with a HEX value of #8C0034. - RedWine = 0x8C0034, - /// A color described as Shit Green with a HEX value of #758000. - ShitGreen = 0x758000, - /// A color described as Tan Brown with a HEX value of #AB7E4C. - TanBrown = 0xAB7E4C, - /// A color described as Darkblue with a HEX value of #030764. - Darkblue = 0x030764, - /// A color described as Rosa with a HEX value of #FE86A4. - Rosa = 0xFE86A4, - /// A color described as Lipstick with a HEX value of #D5174E. - Lipstick = 0xD5174E, - /// A color described as Pale Mauve with a HEX value of #FED0FC. - PaleMauve = 0xFED0FC, - /// A color described as Claret with a HEX value of #680018. - Claret = 0x680018, - /// A color described as Dandelion with a HEX value of #FEDF08. - Dandelion = 0xFEDF08, - /// A color described as Orangered with a HEX value of #FE420F. - Orangered = 0xFE420F, - /// A color described as Poop Green with a HEX value of #6F7C00. - PoopGreen = 0x6F7C00, - /// A color described as Ruby with a HEX value of #CA0147. - Ruby = 0xCA0147, - /// A color described as Dark with a HEX value of #1B2431. - Dark = 0x1B2431, - /// A color described as Greenish Turquoise with a HEX value of #00FBB0. - GreenishTurquoise = 0x00FBB0, - /// A color described as Pastel Red with a HEX value of #DB5856. - PastelRed = 0xDB5856, - /// A color described as Piss Yellow with a HEX value of #DDD618. - PissYellow = 0xDDD618, - /// A color described as Bright Cyan with a HEX value of #41FDFE. - BrightCyan = 0x41FDFE, - /// A color described as Dark Coral with a HEX value of #CF524E. - DarkCoral = 0xCF524E, - /// A color described as Algae Green with a HEX value of #21C36F. - AlgaeGreen = 0x21C36F, - /// A color described as Darkish Red with a HEX value of #A90308. - DarkishRed = 0xA90308, - /// A color described as Reddy Brown with a HEX value of #6E1005. - ReddyBrown = 0x6E1005, - /// A color described as Blush Pink with a HEX value of #FE828C. - BlushPink = 0xFE828C, - /// A color described as Camouflage Green with a HEX value of #4B6113. - CamouflageGreen = 0x4B6113, - /// A color described as Lawn Green with a HEX value of #4DA409. - LawnGreen = 0x4DA409, - /// A color described as Putty with a HEX value of #BEAE8A. - Putty = 0xBEAE8A, - /// A color described as Vibrant Blue with a HEX value of #0339F8. - VibrantBlue = 0x0339F8, - /// A color described as Dark Sand with a HEX value of #A88F59. - DarkSand = 0xA88F59, - /// A color described as Purple/Blue with a HEX value of #5D21D0. - PurpleBlue = 0x5D21D0, - /// A color described as Saffron with a HEX value of #FEB209. - Saffron = 0xFEB209, - /// A color described as Twilight with a HEX value of #4E518B. - Twilight = 0x4E518B, - /// A color described as Warm Brown with a HEX value of #964E02. - WarmBrown = 0x964E02, - /// A color described as Bluegrey with a HEX value of #85A3B2. - Bluegrey = 0x85A3B2, - /// A color described as Bubble Gum Pink with a HEX value of #FF69AF. - BubbleGumPink = 0xFF69AF, - /// A color described as Duck Egg Blue with a HEX value of #C3FBF4. - DuckEggBlue = 0xC3FBF4, - /// A color described as Greenish Cyan with a HEX value of #2AFEB7. - GreenishCyan = 0x2AFEB7, - /// A color described as Petrol with a HEX value of #005F6A. - Petrol = 0x005F6A, - /// A color described as Royal with a HEX value of #0C1793. - Royal = 0x0C1793, - /// A color described as Butter with a HEX value of #FFFF81. - Butter = 0xFFFF81, - /// A color described as Dusty Orange with a HEX value of #F0833A. - DustyOrange = 0xF0833A, - /// A color described as Off Yellow with a HEX value of #F1F33F. - OffYellow = 0xF1F33F, - /// A color described as Pale Olive Green with a HEX value of #B1D27B. - PaleOliveGreen = 0xB1D27B, - /// A color described as Orangish with a HEX value of #FC824A. - Orangish = 0xFC824A, - /// A color described as Leaf with a HEX value of #71AA34. - Leaf = 0x71AA34, - /// A color described as Light Blue Grey with a HEX value of #B7C9E2. - LightBlueGrey = 0xB7C9E2, - /// A color described as Dried Blood with a HEX value of #4B0101. - DriedBlood = 0x4B0101, - /// A color described as Lightish Purple with a HEX value of #A552E6. - LightishPurple = 0xA552E6, - /// A color described as Rusty Red with a HEX value of #AF2F0D. - RustyRed = 0xAF2F0D, - /// A color described as Lavender Blue with a HEX value of #8B88F8. - LavenderBlue = 0x8B88F8, - /// A color described as Light Grass Green with a HEX value of #9AF764. - LightGrassGreen = 0x9AF764, - /// A color described as Light Mint Green with a HEX value of #A6FBB2. - LightMintGreen = 0xA6FBB2, - /// A color described as Sunflower with a HEX value of #FFC512. - Sunflower = 0xFFC512, - /// A color described as Velvet with a HEX value of #750851. - Velvet = 0x750851, - /// A color described as Brick Orange with a HEX value of #C14A09. - BrickOrange = 0xC14A09, - /// A color described as Lightish Red with a HEX value of #FE2F4A. - LightishRed = 0xFE2F4A, - /// A color described as Pure Blue with a HEX value of #0203E2. - PureBlue = 0x0203E2, - /// A color described as Twilight Blue with a HEX value of #0A437A. - TwilightBlue = 0x0A437A, - /// A color described as Violet Red with a HEX value of #A50055. - VioletRed = 0xA50055, - /// A color described as Yellowy Brown with a HEX value of #AE8B0C. - YellowyBrown = 0xAE8B0C, - /// A color described as Carnation with a HEX value of #FD798F. - Carnation = 0xFD798F, - /// A color described as Muddy Yellow with a HEX value of #BFAC05. - MuddyYellow = 0xBFAC05, - /// A color described as Dark Seafoam Green with a HEX value of #3EAF76. - DarkSeafoamGreen = 0x3EAF76, - /// A color described as Deep Rose with a HEX value of #C74767. - DeepRose = 0xC74767, - /// A color described as Dusty Red with a HEX value of #B9484E. - DustyRed = 0xB9484E, - /// A color described as Grey/Blue with a HEX value of #647D8E. - GreyBlue = 0x647D8E, - /// A color described as Lemon Lime with a HEX value of #BFFE28. - LemonLime = 0xBFFE28, - /// A color described as Purple/Pink with a HEX value of #D725DE. - PurplePink = 0xD725DE, - /// A color described as Brown Yellow with a HEX value of #B29705. - BrownYellow = 0xB29705, - /// A color described as Purple Brown with a HEX value of #673A3F. - PurpleBrown = 0x673A3F, - /// A color described as Wisteria with a HEX value of #A87DC2. - Wisteria = 0xA87DC2, - /// A color described as Banana Yellow with a HEX value of #FAFE4B. - BananaYellow = 0xFAFE4B, - /// A color described as Lipstick Red with a HEX value of #C0022F. - LipstickRed = 0xC0022F, - /// A color described as Water Blue with a HEX value of #0E87CC. - WaterBlue = 0x0E87CC, - /// A color described as Brown Grey with a HEX value of #8D8468. - BrownGrey = 0x8D8468, - /// A color described as Vibrant Purple with a HEX value of #AD03DE. - VibrantPurple = 0xAD03DE, - /// A color described as Baby Green with a HEX value of #8CFF9E. - BabyGreen = 0x8CFF9E, - /// A color described as Barf Green with a HEX value of #94AC02. - BarfGreen = 0x94AC02, - /// A color described as Eggshell Blue with a HEX value of #C4FFF7. - EggshellBlue = 0xC4FFF7, - /// A color described as Sandy Yellow with a HEX value of #FDEE73. - SandyYellow = 0xFDEE73, - /// A color described as Cool Green with a HEX value of #33B864. - CoolGreen = 0x33B864, - /// A color described as Pale with a HEX value of #FFF9D0. - Pale = 0xFFF9D0, - /// A color described as Blue/Grey with a HEX value of #758DA3. - BlueGrey = 0x758DA3, - /// A color described as Hot Magenta with a HEX value of #F504C9. - HotMagenta = 0xF504C9, - /// A color described as Greyblue with a HEX value of #77A1B5. - Greyblue = 0x77A1B5, - /// A color described as Purpley with a HEX value of #8756E4. - Purpley = 0x8756E4, - /// A color described as Baby Shit Green with a HEX value of #889717. - BabyShitGreen = 0x889717, - /// A color described as Brownish Pink with a HEX value of #C27E79. - BrownishPink = 0xC27E79, - /// A color described as Dark Aquamarine with a HEX value of #017371. - DarkAquamarine = 0x017371, - /// A color described as Diarrhea with a HEX value of #9F8303. - Diarrhea = 0x9F8303, - /// A color described as Light Mustard with a HEX value of #F7D560. - LightMustard = 0xF7D560, - /// A color described as Pale Sky Blue with a HEX value of #BDF6FE. - PaleSkyBlue = 0xBDF6FE, - /// A color described as Turtle Green with a HEX value of #75B84F. - TurtleGreen = 0x75B84F, - /// A color described as Bright Olive with a HEX value of #9CBB04. - BrightOlive = 0x9CBB04, - /// A color described as Dark Grey Blue with a HEX value of #29465B. - DarkGreyBlue = 0x29465B, - /// A color described as Greeny Brown with a HEX value of #696006. - GreenyBrown = 0x696006, - /// A color described as Lemon Green with a HEX value of #ADF802. - LemonGreen = 0xADF802, - /// A color described as Light Periwinkle with a HEX value of #C1C6FC. - LightPeriwinkle = 0xC1C6FC, - /// A color described as Seaweed Green with a HEX value of #35AD6B. - SeaweedGreen = 0x35AD6B, - /// A color described as Sunshine Yellow with a HEX value of #FFFD37. - SunshineYellow = 0xFFFD37, - /// A color described as Ugly Purple with a HEX value of #A442A0. - UglyPurple = 0xA442A0, - /// A color described as Medium Pink with a HEX value of #F36196. - MediumPink = 0xF36196, - /// A color described as Puke Brown with a HEX value of #947706. - PukeBrown = 0x947706, - /// A color described as Very Light Pink with a HEX value of #FFF4F2. - VeryLightPink = 0xFFF4F2, - /// A color described as Viridian with a HEX value of #1E9167. - Viridian = 0x1E9167, - /// A color described as Bile with a HEX value of #B5C306. - Bile = 0xB5C306, - /// A color described as Faded Yellow with a HEX value of #FEFF7F. - FadedYellow = 0xFEFF7F, - /// A color described as Very Pale Green with a HEX value of #CFFDBC. - VeryPaleGreen = 0xCFFDBC, - /// A color described as Vibrant Green with a HEX value of #0ADD08. - VibrantGreen = 0x0ADD08, - /// A color described as Bright Lime with a HEX value of #87FD05. - BrightLime = 0x87FD05, - /// A color described as Spearmint with a HEX value of #1EF876. - Spearmint = 0x1EF876, - /// A color described as Light Aquamarine with a HEX value of #7BFDC7. - LightAquamarine = 0x7BFDC7, - /// A color described as Light Sage with a HEX value of #BCECAC. - LightSage = 0xBCECAC, - /// A color described as Yellowgreen with a HEX value of #BBF90F. - Yellowgreen = 0xBBF90F, - /// A color described as Baby Poo with a HEX value of #AB9004. - BabyPoo = 0xAB9004, - /// A color described as Dark Seafoam with a HEX value of #1FB57A. - DarkSeafoam = 0x1FB57A, - /// A color described as Deep Teal with a HEX value of #00555A. - DeepTeal = 0x00555A, - /// A color described as Heather with a HEX value of #A484AC. - Heather = 0xA484AC, - /// A color described as Rust Orange with a HEX value of #C45508. - RustOrange = 0xC45508, - /// A color described as Dirty Blue with a HEX value of #3F829D. - DirtyBlue = 0x3F829D, - /// A color described as Fern Green with a HEX value of #548D44. - FernGreen = 0x548D44, - /// A color described as Bright Lilac with a HEX value of #C95EFB. - BrightLilac = 0xC95EFB, - /// A color described as Weird Green with a HEX value of #3AE57F. - WeirdGreen = 0x3AE57F, - /// A color described as Peacock Blue with a HEX value of #016795. - PeacockBlue = 0x016795, - /// A color described as Avocado Green with a HEX value of #87A922. - AvocadoGreen = 0x87A922, - /// A color described as Faded Orange with a HEX value of #F0944D. - FadedOrange = 0xF0944D, - /// A color described as Grape Purple with a HEX value of #5D1451. - GrapePurple = 0x5D1451, - /// A color described as Hot Green with a HEX value of #25FF29. - HotGreen = 0x25FF29, - /// A color described as Lime Yellow with a HEX value of #D0FE1D. - LimeYellow = 0xD0FE1D, - /// A color described as Mango with a HEX value of #FFA62B. - Mango = 0xFFA62B, - /// A color described as Shamrock with a HEX value of #01B44C. - Shamrock = 0x01B44C, - /// A color described as Bubblegum with a HEX value of #FF6CB5. - Bubblegum = 0xFF6CB5, - /// A color described as Purplish Brown with a HEX value of #6B4247. - PurplishBrown = 0x6B4247, - /// A color described as Vomit Yellow with a HEX value of #C7C10C. - VomitYellow = 0xC7C10C, - /// A color described as Pale Cyan with a HEX value of #B7FFFA. - PaleCyan = 0xB7FFFA, - /// A color described as Key Lime with a HEX value of #AEFF6E. - KeyLime = 0xAEFF6E, - /// A color described as Tomato Red with a HEX value of #EC2D01. - TomatoRed = 0xEC2D01, - /// A color described as Lightgreen with a HEX value of #76FF7B. - Lightgreen = 0x76FF7B, - /// A color described as Merlot with a HEX value of #730039. - Merlot = 0x730039, - /// A color described as Night Blue with a HEX value of #040348. - NightBlue = 0x040348, - /// A color described as Purpleish Pink with a HEX value of #DF4EC8. - PurpleishPink = 0xDF4EC8, - /// A color described as Apple with a HEX value of #6ECB3C. - Apple = 0x6ECB3C, - /// A color described as Baby Poop Green with a HEX value of #8F9805. - BabyPoopGreen = 0x8F9805, - /// A color described as Green Apple with a HEX value of #5EDC1F. - GreenApple = 0x5EDC1F, - /// A color described as Heliotrope with a HEX value of #D94FF5. - Heliotrope = 0xD94FF5, - /// A color described as Yellow/Green with a HEX value of #C8FD3D. - YellowGreen = 0xC8FD3D, - /// A color described as Almost Black with a HEX value of #070D0D. - AlmostBlack = 0x070D0D, - /// A color described as Cool Blue with a HEX value of #4984B8. - CoolBlue = 0x4984B8, - /// A color described as Leafy Green with a HEX value of #51B73B. - LeafyGreen = 0x51B73B, - /// A color described as Mustard Brown with a HEX value of #AC7E04. - MustardBrown = 0xAC7E04, - /// A color described as Dusk with a HEX value of #4E5481. - Dusk = 0x4E5481, - /// A color described as Dull Brown with a HEX value of #876E4B. - DullBrown = 0x876E4B, - /// A color described as Frog Green with a HEX value of #58BC08. - FrogGreen = 0x58BC08, - /// A color described as Vivid Green with a HEX value of #2FEF10. - VividGreen = 0x2FEF10, - /// A color described as Bright Light Green with a HEX value of #2DFE54. - BrightLightGreen = 0x2DFE54, - /// A color described as Fluro Green with a HEX value of #0AFF02. - FluroGreen = 0x0AFF02, - /// A color described as Kiwi with a HEX value of #9CEF43. - Kiwi = 0x9CEF43, - /// A color described as Seaweed with a HEX value of #18D17B. - Seaweed = 0x18D17B, - /// A color described as Navy Green with a HEX value of #35530A. - NavyGreen = 0x35530A, - /// A color described as Ultramarine Blue with a HEX value of #1805DB. - UltramarineBlue = 0x1805DB, - /// A color described as Iris with a HEX value of #6258C4. - Iris = 0x6258C4, - /// A color described as Pastel Orange with a HEX value of #FF964F. - PastelOrange = 0xFF964F, - /// A color described as Yellowish Orange with a HEX value of #FFAB0F. - YellowishOrange = 0xFFAB0F, - /// A color described as Perrywinkle with a HEX value of #8F8CE7. - Perrywinkle = 0x8F8CE7, - /// A color described as Tealish with a HEX value of #24BCA8. - Tealish = 0x24BCA8, - /// A color described as Dark Plum with a HEX value of #3F012C. - DarkPlum = 0x3F012C, - /// A color described as Pear with a HEX value of #CBF85F. - Pear = 0xCBF85F, - /// A color described as Pinkish Orange with a HEX value of #FF724C. - PinkishOrange = 0xFF724C, - /// A color described as Midnight Purple with a HEX value of #280137. - MidnightPurple = 0x280137, - /// A color described as Light Urple with a HEX value of #B36FF6. - LightUrple = 0xB36FF6, - /// A color described as Dark Mint with a HEX value of #48C072. - DarkMint = 0x48C072, - /// A color described as Greenish Tan with a HEX value of #BCCB7A. - GreenishTan = 0xBCCB7A, - /// A color described as Light Burgundy with a HEX value of #A8415B. - LightBurgundy = 0xA8415B, - /// A color described as Turquoise Blue with a HEX value of #06B1C4. - TurquoiseBlue = 0x06B1C4, - /// A color described as Ugly Pink with a HEX value of #CD7584. - UglyPink = 0xCD7584, - /// A color described as Sandy with a HEX value of #F1DA7A. - Sandy = 0xF1DA7A, - /// A color described as Electric Pink with a HEX value of #FF0490. - ElectricPink = 0xFF0490, - /// A color described as Muted Purple with a HEX value of #805B87. - MutedPurple = 0x805B87, - /// A color described as Mid Green with a HEX value of #50A747. - MidGreen = 0x50A747, - /// A color described as Greyish with a HEX value of #A8A495. - Greyish = 0xA8A495, - /// A color described as Neon Yellow with a HEX value of #CFFF04. - NeonYellow = 0xCFFF04, - /// A color described as Banana with a HEX value of #FFFF7E. - Banana = 0xFFFF7E, - /// A color described as Carnation Pink with a HEX value of #FF7FA7. - CarnationPink = 0xFF7FA7, - /// A color described as Tomato with a HEX value of #EF4026. - Tomato = 0xEF4026, - /// A color described as Sea with a HEX value of #3C9992. - Sea = 0x3C9992, - /// A color described as Muddy Brown with a HEX value of #886806. - MuddyBrown = 0x886806, - /// A color described as Turquoise Green with a HEX value of #04F489. - TurquoiseGreen = 0x04F489, - /// A color described as Buff with a HEX value of #FEF69E. - Buff = 0xFEF69E, - /// A color described as Fawn with a HEX value of #CFAF7B. - Fawn = 0xCFAF7B, - /// A color described as Muted Blue with a HEX value of #3B719F. - MutedBlue = 0x3B719F, - /// A color described as Pale Rose with a HEX value of #FDC1C5. - PaleRose = 0xFDC1C5, - /// A color described as Dark Mint Green with a HEX value of #20C073. - DarkMintGreen = 0x20C073, - /// A color described as Amethyst with a HEX value of #9B5FC0. - Amethyst = 0x9B5FC0, - /// A color described as Blue/Green with a HEX value of #0F9B8E. - BlueGreen = 0x0F9B8E, - /// A color described as Chestnut with a HEX value of #742802. - Chestnut = 0x742802, - /// A color described as Sick Green with a HEX value of #9DB92C. - SickGreen = 0x9DB92C, - /// A color described as Pea with a HEX value of #A4BF20. - Pea = 0xA4BF20, - /// A color described as Rusty Orange with a HEX value of #CD5909. - RustyOrange = 0xCD5909, - /// A color described as Stone with a HEX value of #ADA587. - Stone = 0xADA587, - /// A color described as Rose Red with a HEX value of #BE013C. - RoseRed = 0xBE013C, - /// A color described as Pale Aqua with a HEX value of #B8FFEB. - PaleAqua = 0xB8FFEB, - /// A color described as Deep Orange with a HEX value of #DC4D01. - DeepOrange = 0xDC4D01, - /// A color described as Earth with a HEX value of #A2653E. - Earth = 0xA2653E, - /// A color described as Mossy Green with a HEX value of #638B27. - MossyGreen = 0x638B27, - /// A color described as Grassy Green with a HEX value of #419C03. - GrassyGreen = 0x419C03, - /// A color described as Pale Lime Green with a HEX value of #B1FF65. - PaleLimeGreen = 0xB1FF65, - /// A color described as Light Grey Blue with a HEX value of #9DBCD4. - LightGreyBlue = 0x9DBCD4, - /// A color described as Pale Grey with a HEX value of #FDFDFE. - PaleGrey = 0xFDFDFE, - /// A color described as Asparagus with a HEX value of #77AB56. - Asparagus = 0x77AB56, - /// A color described as Blueberry with a HEX value of #464196. - Blueberry = 0x464196, - /// A color described as Purple Red with a HEX value of #990147. - PurpleRed = 0x990147, - /// A color described as Pale Lime with a HEX value of #BEFD73. - PaleLime = 0xBEFD73, - /// A color described as Greenish Teal with a HEX value of #32BF84. - GreenishTeal = 0x32BF84, - /// A color described as Caramel with a HEX value of #AF6F09. - Caramel = 0xAF6F09, - /// A color described as Deep Magenta with a HEX value of #A0025C. - DeepMagenta = 0xA0025C, - /// A color described as Light Peach with a HEX value of #FFD8B1. - LightPeach = 0xFFD8B1, - /// A color described as Milk Chocolate with a HEX value of #7F4E1E. - MilkChocolate = 0x7F4E1E, - /// A color described as Ocher with a HEX value of #BF9B0C. - Ocher = 0xBF9B0C, - /// A color described as Off Green with a HEX value of #6BA353. - OffGreen = 0x6BA353, - /// A color described as Purply Pink with a HEX value of #F075E6. - PurplyPink = 0xF075E6, - /// A color described as Lightblue with a HEX value of #7BC8F6. - Lightblue = 0x7BC8F6, - /// A color described as Dusky Blue with a HEX value of #475F94. - DuskyBlue = 0x475F94, - /// A color described as Golden with a HEX value of #F5BF03. - Golden = 0xF5BF03, - /// A color described as Light Beige with a HEX value of #FFFEB6. - LightBeige = 0xFFFEB6, - /// A color described as Butter Yellow with a HEX value of #FFFD74. - ButterYellow = 0xFFFD74, - /// A color described as Dusky Purple with a HEX value of #895B7B. - DuskyPurple = 0x895B7B, - /// A color described as French Blue with a HEX value of #436BAD. - FrenchBlue = 0x436BAD, - /// A color described as Ugly Yellow with a HEX value of #D0C101. - UglyYellow = 0xD0C101, - /// A color described as Greeny Yellow with a HEX value of #C6F808. - GreenyYellow = 0xC6F808, - /// A color described as Orangish Red with a HEX value of #F43605. - OrangishRed = 0xF43605, - /// A color described as Shamrock Green with a HEX value of #02C14D. - ShamrockGreen = 0x02C14D, - /// A color described as Orangish Brown with a HEX value of #B25F03. - OrangishBrown = 0xB25F03, - /// A color described as Tree Green with a HEX value of #2A7E19. - TreeGreen = 0x2A7E19, - /// A color described as Deep Violet with a HEX value of #490648. - DeepViolet = 0x490648, - /// A color described as Gunmetal with a HEX value of #536267. - Gunmetal = 0x536267, - /// A color described as Blue/Purple with a HEX value of #5A06EF. - BluePurple = 0x5A06EF, - /// A color described as Cherry with a HEX value of #CF0234. - Cherry = 0xCF0234, - /// A color described as Sandy Brown with a HEX value of #C4A661. - SandyBrown = 0xC4A661, - /// A color described as Warm Grey with a HEX value of #978A84. - WarmGrey = 0x978A84, - /// A color described as Dark Indigo with a HEX value of #1F0954. - DarkIndigo = 0x1F0954, - /// A color described as Midnight with a HEX value of #03012D. - Midnight = 0x03012D, - /// A color described as Bluey Green with a HEX value of #2BB179. - BlueyGreen = 0x2BB179, - /// A color described as Grey Pink with a HEX value of #C3909B. - GreyPink = 0xC3909B, - /// A color described as Soft Purple with a HEX value of #A66FB5. - SoftPurple = 0xA66FB5, - /// A color described as Blood with a HEX value of #770001. - Blood = 0x770001, - /// A color described as Brown Red with a HEX value of #922B05. - BrownRed = 0x922B05, - /// A color described as Medium Grey with a HEX value of #7D7F7C. - MediumGrey = 0x7D7F7C, - /// A color described as Berry with a HEX value of #990F4B. - Berry = 0x990F4B, - /// A color described as Poo with a HEX value of #8F7303. - Poo = 0x8F7303, - /// A color described as Purpley Pink with a HEX value of #C83CB9. - PurpleyPink = 0xC83CB9, - /// A color described as Light Salmon with a HEX value of #FEA993. - LightSalmon = 0xFEA993, - /// A color described as Snot with a HEX value of #ACBB0D. - Snot = 0xACBB0D, - /// A color described as Easter Purple with a HEX value of #C071FE. - EasterPurple = 0xC071FE, - /// A color described as Light Yellow Green with a HEX value of #CCFD7F. - LightYellowGreen = 0xCCFD7F, - /// A color described as Dark Navy Blue with a HEX value of #00022E. - DarkNavyBlue = 0x00022E, - /// A color described as Drab with a HEX value of #828344. - Drab = 0x828344, - /// A color described as Light Rose with a HEX value of #FFC5CB. - LightRose = 0xFFC5CB, - /// A color described as Rouge with a HEX value of #AB1239. - Rouge = 0xAB1239, - /// A color described as Purplish Red with a HEX value of #B0054B. - PurplishRed = 0xB0054B, - /// A color described as Slime Green with a HEX value of #99CC04. - SlimeGreen = 0x99CC04, - /// A color described as Baby Poop with a HEX value of #937C00. - BabyPoop = 0x937C00, - /// A color described as Irish Green with a HEX value of #019529. - IrishGreen = 0x019529, - /// A color described as Pink/Purple with a HEX value of #EF1DE7. - PinkPurple = 0xEF1DE7, - /// A color described as Dark Navy with a HEX value of #000435. - DarkNavy = 0x000435, - /// A color described as Greeny Blue with a HEX value of #42B395. - GreenyBlue = 0x42B395, - /// A color described as Light Plum with a HEX value of #9D5783. - LightPlum = 0x9D5783, - /// A color described as Pinkish Grey with a HEX value of #C8ACA9. - PinkishGrey = 0xC8ACA9, - /// A color described as Dirty Orange with a HEX value of #C87606. - DirtyOrange = 0xC87606, - /// A color described as Rust Red with a HEX value of #AA2704. - RustRed = 0xAA2704, - /// A color described as Pale Lilac with a HEX value of #E4CBFF. - PaleLilac = 0xE4CBFF, - /// A color described as Orangey Red with a HEX value of #FA4224. - OrangeyRed = 0xFA4224, - /// A color described as Primary Blue with a HEX value of #0804F9. - PrimaryBlue = 0x0804F9, - /// A color described as Kermit Green with a HEX value of #5CB200. - KermitGreen = 0x5CB200, - /// A color described as Brownish Purple with a HEX value of #76424E. - BrownishPurple = 0x76424E, - /// A color described as Murky Green with a HEX value of #6C7A0E. - MurkyGreen = 0x6C7A0E, - /// A color described as Wheat with a HEX value of #FBDD7E. - Wheat = 0xFBDD7E, - /// A color described as Very Dark Purple with a HEX value of #2A0134. - VeryDarkPurple = 0x2A0134, - /// A color described as Bottle Green with a HEX value of #044A05. - BottleGreen = 0x044A05, - /// A color described as Watermelon with a HEX value of #FD4659. - Watermelon = 0xFD4659, - /// A color described as Deep Sky Blue with a HEX value of #0D75F8. - DeepSkyBlue = 0x0D75F8, - /// A color described as Fire Engine Red with a HEX value of #FE0002. - FireEngineRed = 0xFE0002, - /// A color described as Yellow Ochre with a HEX value of #CB9D06. - YellowOchre = 0xCB9D06, - /// A color described as Pumpkin Orange with a HEX value of #FB7D07. - PumpkinOrange = 0xFB7D07, - /// A color described as Pale Olive with a HEX value of #B9CC81. - PaleOlive = 0xB9CC81, - /// A color described as Light Lilac with a HEX value of #EDC8FF. - LightLilac = 0xEDC8FF, - /// A color described as Lightish Green with a HEX value of #61E160. - LightishGreen = 0x61E160, - /// A color described as Carolina Blue with a HEX value of #8AB8FE. - CarolinaBlue = 0x8AB8FE, - /// A color described as Mulberry with a HEX value of #920A4E. - Mulberry = 0x920A4E, - /// A color described as Shocking Pink with a HEX value of #FE02A2. - ShockingPink = 0xFE02A2, - /// A color described as Auburn with a HEX value of #9A3001. - Auburn = 0x9A3001, - /// A color described as Bright Lime Green with a HEX value of #65FE08. - BrightLimeGreen = 0x65FE08, - /// A color described as Celadon with a HEX value of #BEFDB7. - Celadon = 0xBEFDB7, - /// A color described as Pinkish Brown with a HEX value of #B17261. - PinkishBrown = 0xB17261, - /// A color described as Poo Brown with a HEX value of #885F01. - PooBrown = 0x885F01, - /// A color described as Bright Sky Blue with a HEX value of #02CCFE. - BrightSkyBlue = 0x02CCFE, - /// A color described as Celery with a HEX value of #C1FD95. - Celery = 0xC1FD95, - /// A color described as Dirt Brown with a HEX value of #836539. - DirtBrown = 0x836539, - /// A color described as Strawberry with a HEX value of #FB2943. - Strawberry = 0xFB2943, - /// A color described as Dark Lime with a HEX value of #84B701. - DarkLime = 0x84B701, - /// A color described as Copper with a HEX value of #B66325. - Copper = 0xB66325, - /// A color described as Medium Brown with a HEX value of #7F5112. - MediumBrown = 0x7F5112, - /// A color described as Muted Green with a HEX value of #5FA052. - MutedGreen = 0x5FA052, - /// A color described as Robin'S Egg with a HEX value of #6DEDFD. - RobinsEgg = 0x6DEDFD, - /// A color described as Bright Aqua with a HEX value of #0BF9EA. - BrightAqua = 0x0BF9EA, - /// A color described as Bright Lavender with a HEX value of #C760FF. - BrightLavender = 0xC760FF, - /// A color described as Ivory with a HEX value of #FFFFCB. - Ivory = 0xFFFFCB, - /// A color described as Very Light Purple with a HEX value of #F6CEFC. - VeryLightPurple = 0xF6CEFC, - /// A color described as Light Navy with a HEX value of #155084. - LightNavy = 0x155084, - /// A color described as Pink Red with a HEX value of #F5054F. - PinkRed = 0xF5054F, - /// A color described as Olive Brown with a HEX value of #645403. - OliveBrown = 0x645403, - /// A color described as Poop Brown with a HEX value of #7A5901. - PoopBrown = 0x7A5901, - /// A color described as Mustard Green with a HEX value of #A8B504. - MustardGreen = 0xA8B504, - /// A color described as Ocean Green with a HEX value of #3D9973. - OceanGreen = 0x3D9973, - /// A color described as Very Dark Blue with a HEX value of #000133. - VeryDarkBlue = 0x000133, - /// A color described as Dusty Green with a HEX value of #76A973. - DustyGreen = 0x76A973, - /// A color described as Light Navy Blue with a HEX value of #2E5A88. - LightNavyBlue = 0x2E5A88, - /// A color described as Minty Green with a HEX value of #0BF77D. - MintyGreen = 0x0BF77D, - /// A color described as Adobe with a HEX value of #BD6C48. - Adobe = 0xBD6C48, - /// A color described as Barney with a HEX value of #AC1DB8. - Barney = 0xAC1DB8, - /// A color described as Jade Green with a HEX value of #2BAF6A. - JadeGreen = 0x2BAF6A, - /// A color described as Bright Light Blue with a HEX value of #26F7FD. - BrightLightBlue = 0x26F7FD, - /// A color described as Light Lime with a HEX value of #AEFD6C. - LightLime = 0xAEFD6C, - /// A color described as Dark Khaki with a HEX value of #9B8F55. - DarkKhaki = 0x9B8F55, - /// A color described as Orange Yellow with a HEX value of #FFAD01. - OrangeYellow = 0xFFAD01, - /// A color described as Ocre with a HEX value of #C69C04. - Ocre = 0xC69C04, - /// A color described as Maize with a HEX value of #F4D054. - Maize = 0xF4D054, - /// A color described as Faded Pink with a HEX value of #DE9DAC. - FadedPink = 0xDE9DAC, - /// A color described as British Racing Green with a HEX value of #05480D. - BritishRacingGreen = 0x05480D, - /// A color described as Sandstone with a HEX value of #C9AE74. - Sandstone = 0xC9AE74, - /// A color described as Mud Brown with a HEX value of #60460F. - MudBrown = 0x60460F, - /// A color described as Light Sea Green with a HEX value of #98F6B0. - LightSeaGreen = 0x98F6B0, - /// A color described as Robin Egg Blue with a HEX value of #8AF1FE. - RobinEggBlue = 0x8AF1FE, - /// A color described as Aqua Marine with a HEX value of #2EE8BB. - AquaMarine = 0x2EE8BB, - /// A color described as Dark Sea Green with a HEX value of #11875D. - DarkSeaGreen = 0x11875D, - /// A color described as Soft Pink with a HEX value of #FDB0C0. - SoftPink = 0xFDB0C0, - /// A color described as Orangey Brown with a HEX value of #B16002. - OrangeyBrown = 0xB16002, - /// A color described as Cherry Red with a HEX value of #F7022A. - CherryRed = 0xF7022A, - /// A color described as Burnt Yellow with a HEX value of #D5AB09. - BurntYellow = 0xD5AB09, - /// A color described as Brownish Grey with a HEX value of #86775F. - BrownishGrey = 0x86775F, - /// A color described as Camel with a HEX value of #C69F59. - Camel = 0xC69F59, - /// A color described as Purplish Grey with a HEX value of #7A687F. - PurplishGrey = 0x7A687F, - /// A color described as Marine with a HEX value of #042E60. - Marine = 0x042E60, - /// A color described as Greyish Pink with a HEX value of #C88D94. - GreyishPink = 0xC88D94, - /// A color described as Pale Turquoise with a HEX value of #A5FBD5. - PaleTurquoise = 0xA5FBD5, - /// A color described as Pastel Yellow with a HEX value of #FFFE71. - PastelYellow = 0xFFFE71, - /// A color described as Bluey Purple with a HEX value of #6241C7. - BlueyPurple = 0x6241C7, - /// A color described as Canary Yellow with a HEX value of #FFFE40. - CanaryYellow = 0xFFFE40, - /// A color described as Faded Red with a HEX value of #D3494E. - FadedRed = 0xD3494E, - /// A color described as Sepia with a HEX value of #985E2B. - Sepia = 0x985E2B, - /// A color described as Coffee with a HEX value of #A6814C. - Coffee = 0xA6814C, - /// A color described as Bright Magenta with a HEX value of #FF08E8. - BrightMagenta = 0xFF08E8, - /// A color described as Mocha with a HEX value of #9D7651. - Mocha = 0x9D7651, - /// A color described as Ecru with a HEX value of #FEFFCA. - Ecru = 0xFEFFCA, - /// A color described as Purpleish with a HEX value of #98568D. - Purpleish = 0x98568D, - /// A color described as Cranberry with a HEX value of #9E003A. - Cranberry = 0x9E003A, - /// A color described as Darkish Green with a HEX value of #287C37. - DarkishGreen = 0x287C37, - /// A color described as Brown Orange with a HEX value of #B96902. - BrownOrange = 0xB96902, - /// A color described as Dusky Rose with a HEX value of #BA6873. - DuskyRose = 0xBA6873, - /// A color described as Melon with a HEX value of #FF7855. - Melon = 0xFF7855, - /// A color described as Sickly Green with a HEX value of #94B21C. - SicklyGreen = 0x94B21C, - /// A color described as Silver with a HEX value of #C5C9C7. - Silver = 0xC5C9C7, - /// A color described as Purply Blue with a HEX value of #661AEE. - PurplyBlue = 0x661AEE, - /// A color described as Purpleish Blue with a HEX value of #6140EF. - PurpleishBlue = 0x6140EF, - /// A color described as Hospital Green with a HEX value of #9BE5AA. - HospitalGreen = 0x9BE5AA, - /// A color described as Shit Brown with a HEX value of #7B5804. - ShitBrown = 0x7B5804, - /// A color described as Mid Blue with a HEX value of #276AB3. - MidBlue = 0x276AB3, - /// A color described as Amber with a HEX value of #FEB308. - Amber = 0xFEB308, - /// A color described as Easter Green with a HEX value of #8CFD7E. - EasterGreen = 0x8CFD7E, - /// A color described as Soft Blue with a HEX value of #6488EA. - SoftBlue = 0x6488EA, - /// A color described as Cerulean Blue with a HEX value of #056EEE. - CeruleanBlue = 0x056EEE, - /// A color described as Golden Brown with a HEX value of #B27A01. - GoldenBrown = 0xB27A01, - /// A color described as Bright Turquoise with a HEX value of #0FFEF9. - BrightTurquoise = 0x0FFEF9, - /// A color described as Red Pink with a HEX value of #FA2A55. - RedPink = 0xFA2A55, - /// A color described as Red Purple with a HEX value of #820747. - RedPurple = 0x820747, - /// A color described as Greyish Brown with a HEX value of #7A6A4F. - GreyishBrown = 0x7A6A4F, - /// A color described as Vermillion with a HEX value of #F4320C. - Vermillion = 0xF4320C, - /// A color described as Russet with a HEX value of #A13905. - Russet = 0xA13905, - /// A color described as Steel Grey with a HEX value of #6F828A. - SteelGrey = 0x6F828A, - /// A color described as Lighter Purple with a HEX value of #A55AF4. - LighterPurple = 0xA55AF4, - /// A color described as Bright Violet with a HEX value of #AD0AFD. - BrightViolet = 0xAD0AFD, - /// A color described as Prussian Blue with a HEX value of #004577. - PrussianBlue = 0x004577, - /// A color described as Slate Green with a HEX value of #658D6D. - SlateGreen = 0x658D6D, - /// A color described as Dirty Pink with a HEX value of #CA7B80. - DirtyPink = 0xCA7B80, - /// A color described as Dark Blue Green with a HEX value of #005249. - DarkBlueGreen = 0x005249, - /// A color described as Pine with a HEX value of #2B5D34. - Pine = 0x2B5D34, - /// A color described as Yellowy Green with a HEX value of #BFF128. - YellowyGreen = 0xBFF128, - /// A color described as Dark Gold with a HEX value of #B59410. - DarkGold = 0xB59410, - /// A color described as Bluish with a HEX value of #2976BB. - Bluish = 0x2976BB, - /// A color described as Darkish Blue with a HEX value of #014182. - DarkishBlue = 0x014182, - /// A color described as Dull Red with a HEX value of #BB3F3F. - DullRed = 0xBB3F3F, - /// A color described as Pinky Red with a HEX value of #FC2647. - PinkyRed = 0xFC2647, - /// A color described as Bronze with a HEX value of #A87900. - Bronze = 0xA87900, - /// A color described as Pale Teal with a HEX value of #82CBB2. - PaleTeal = 0x82CBB2, - /// A color described as Military Green with a HEX value of #667C3E. - MilitaryGreen = 0x667C3E, - /// A color described as Barbie Pink with a HEX value of #FE46A5. - BarbiePink = 0xFE46A5, - /// A color described as Bubblegum Pink with a HEX value of #FE83CC. - BubblegumPink = 0xFE83CC, - /// A color described as Pea Soup Green with a HEX value of #94A617. - PeaSoupGreen = 0x94A617, - /// A color described as Dark Mustard with a HEX value of #A88905. - DarkMustard = 0xA88905, - /// A color described as Shit with a HEX value of #7F5F00. - Shit = 0x7F5F00, - /// A color described as Medium Purple with a HEX value of #9E43A2. - MediumPurple = 0x9E43A2, - /// A color described as Very Dark Green with a HEX value of #062E03. - VeryDarkGreen = 0x062E03, - /// A color described as Dirt with a HEX value of #8A6E45. - Dirt = 0x8A6E45, - /// A color described as Dusky Pink with a HEX value of #CC7A8B. - DuskyPink = 0xCC7A8B, - /// A color described as Red Violet with a HEX value of #9E0168. - RedViolet = 0x9E0168, - /// A color described as Lemon Yellow with a HEX value of #FDFF38. - LemonYellow = 0xFDFF38, - /// A color described as Pistachio with a HEX value of #C0FA8B. - Pistachio = 0xC0FA8B, - /// A color described as Dull Yellow with a HEX value of #EEDC5B. - DullYellow = 0xEEDC5B, - /// A color described as Dark Lime Green with a HEX value of #7EBD01. - DarkLimeGreen = 0x7EBD01, - /// A color described as Denim Blue with a HEX value of #3B5B92. - DenimBlue = 0x3B5B92, - /// A color described as Teal Blue with a HEX value of #01889F. - TealBlue = 0x01889F, - /// A color described as Lightish Blue with a HEX value of #3D7AFD. - LightishBlue = 0x3D7AFD, - /// A color described as Purpley Blue with a HEX value of #5F34E7. - PurpleyBlue = 0x5F34E7, - /// A color described as Light Indigo with a HEX value of #6D5ACF. - LightIndigo = 0x6D5ACF, - /// A color described as Swamp Green with a HEX value of #748500. - SwampGreen = 0x748500, - /// A color described as Brown Green with a HEX value of #706C11. - BrownGreen = 0x706C11, - /// A color described as Dark Maroon with a HEX value of #3C0008. - DarkMaroon = 0x3C0008, - /// A color described as Hot Purple with a HEX value of #CB00F5. - HotPurple = 0xCB00F5, - /// A color described as Dark Forest Green with a HEX value of #002D04. - DarkForestGreen = 0x002D04, - /// A color described as Faded Blue with a HEX value of #658CBB. - FadedBlue = 0x658CBB, - /// A color described as Drab Green with a HEX value of #749551. - DrabGreen = 0x749551, - /// A color described as Light Lime Green with a HEX value of #B9FF66. - LightLimeGreen = 0xB9FF66, - /// A color described as Snot Green with a HEX value of #9DC100. - SnotGreen = 0x9DC100, - /// A color described as Yellowish with a HEX value of #FAEE66. - Yellowish = 0xFAEE66, - /// A color described as Light Blue Green with a HEX value of #7EFBB3. - LightBlueGreen = 0x7EFBB3, - /// A color described as Bordeaux with a HEX value of #7B002C. - Bordeaux = 0x7B002C, - /// A color described as Light Mauve with a HEX value of #C292A1. - LightMauve = 0xC292A1, - /// A color described as Ocean with a HEX value of #017B92. - Ocean = 0x017B92, - /// A color described as Marigold with a HEX value of #FCC006. - Marigold = 0xFCC006, - /// A color described as Muddy Green with a HEX value of #657432. - MuddyGreen = 0x657432, - /// A color described as Dull Orange with a HEX value of #D8863B. - DullOrange = 0xD8863B, - /// A color described as Steel with a HEX value of #738595. - Steel = 0x738595, - /// A color described as Electric Purple with a HEX value of #AA23FF. - ElectricPurple = 0xAA23FF, - /// A color described as Fluorescent Green with a HEX value of #08FF08. - FluorescentGreen = 0x08FF08, - /// A color described as Yellowish Brown with a HEX value of #9B7A01. - YellowishBrown = 0x9B7A01, - /// A color described as Blush with a HEX value of #F29E8E. - Blush = 0xF29E8E, - /// A color described as Soft Green with a HEX value of #6FC276. - SoftGreen = 0x6FC276, - /// A color described as Bright Orange with a HEX value of #FF5B00. - BrightOrange = 0xFF5B00, - /// A color described as Lemon with a HEX value of #FDFF52. - Lemon = 0xFDFF52, - /// A color described as Purple Grey with a HEX value of #866F85. - PurpleGrey = 0x866F85, - /// A color described as Acid Green with a HEX value of #8FFE09. - AcidGreen = 0x8FFE09, - /// A color described as Pale Lavender with a HEX value of #EECFFE. - PaleLavender = 0xEECFFE, - /// A color described as Violet Blue with a HEX value of #510AC9. - VioletBlue = 0x510AC9, - /// A color described as Light Forest Green with a HEX value of #4F9153. - LightForestGreen = 0x4F9153, - /// A color described as Burnt Red with a HEX value of #9F2305. - BurntRed = 0x9F2305, - /// A color described as Khaki Green with a HEX value of #728639. - KhakiGreen = 0x728639, - /// A color described as Cerise with a HEX value of #DE0C62. - Cerise = 0xDE0C62, - /// A color described as Faded Purple with a HEX value of #916E99. - FadedPurple = 0x916E99, - /// A color described as Apricot with a HEX value of #FFB16D. - Apricot = 0xFFB16D, - /// A color described as Dark Olive Green with a HEX value of #3C4D03. - DarkOliveGreen = 0x3C4D03, - /// A color described as Grey Brown with a HEX value of #7F7053. - GreyBrown = 0x7F7053, - /// A color described as Green Grey with a HEX value of #77926F. - GreenGrey = 0x77926F, - /// A color described as True Blue with a HEX value of #010FCC. - TrueBlue = 0x010FCC, - /// A color described as Pale Violet with a HEX value of #CEAEFA. - PaleViolet = 0xCEAEFA, - /// A color described as Periwinkle Blue with a HEX value of #8F99FB. - PeriwinkleBlue = 0x8F99FB, - /// A color described as Light Sky Blue with a HEX value of #C6FCFF. - LightSkyBlue = 0xC6FCFF, - /// A color described as Blurple with a HEX value of #5539CC. - Blurple = 0x5539CC, - /// A color described as Green Brown with a HEX value of #544E03. - GreenBrown = 0x544E03, - /// A color described as Bluegreen with a HEX value of #017A79. - Bluegreen = 0x017A79, - /// A color described as Bright Teal with a HEX value of #01F9C6. - BrightTeal = 0x01F9C6, - /// A color described as Brownish Yellow with a HEX value of #C9B003. - BrownishYellow = 0xC9B003, - /// A color described as Pea Soup with a HEX value of #929901. - PeaSoup = 0x929901, - /// A color described as Forest with a HEX value of #0B5509. - Forest = 0x0B5509, - /// A color described as Barney Purple with a HEX value of #A00498. - BarneyPurple = 0xA00498, - /// A color described as Ultramarine with a HEX value of #2000B1. - Ultramarine = 0x2000B1, - /// A color described as Purplish with a HEX value of #94568C. - Purplish = 0x94568C, - /// A color described as Puke Yellow with a HEX value of #C2BE0E. - PukeYellow = 0xC2BE0E, - /// A color described as Bluish Grey with a HEX value of #748B97. - BluishGrey = 0x748B97, - /// A color described as Dark Periwinkle with a HEX value of #665FD1. - DarkPeriwinkle = 0x665FD1, - /// A color described as Dark Lilac with a HEX value of #9C6DA5. - DarkLilac = 0x9C6DA5, - /// A color described as Reddish with a HEX value of #C44240. - Reddish = 0xC44240, - /// A color described as Light Maroon with a HEX value of #A24857. - LightMaroon = 0xA24857, - /// A color described as Dusty Purple with a HEX value of #825F87. - DustyPurple = 0x825F87, - /// A color described as Terra Cotta with a HEX value of #C9643B. - TerraCotta = 0xC9643B, - /// A color described as Avocado with a HEX value of #90B134. - Avocado = 0x90B134, - /// A color described as Marine Blue with a HEX value of #01386A. - MarineBlue = 0x01386A, - /// A color described as Teal Green with a HEX value of #25A36F. - TealGreen = 0x25A36F, - /// A color described as Slate Grey with a HEX value of #59656D. - SlateGrey = 0x59656D, - /// A color described as Lighter Green with a HEX value of #75FD63. - LighterGreen = 0x75FD63, - /// A color described as Electric Green with a HEX value of #21FC0D. - ElectricGreen = 0x21FC0D, - /// A color described as Dusty Blue with a HEX value of #5A86AD. - DustyBlue = 0x5A86AD, - /// A color described as Golden Yellow with a HEX value of #FEC615. - GoldenYellow = 0xFEC615, - /// A color described as Bright Yellow with a HEX value of #FFFD01. - BrightYellow = 0xFFFD01, - /// A color described as Light Lavender with a HEX value of #DFC5FE. - LightLavender = 0xDFC5FE, - /// A color described as Umber with a HEX value of #B26400. - Umber = 0xB26400, - /// A color described as Poop with a HEX value of #7F5E00. - Poop = 0x7F5E00, - /// A color described as Dark Peach with a HEX value of #DE7E5D. - DarkPeach = 0xDE7E5D, - /// A color described as Jungle Green with a HEX value of #048243. - JungleGreen = 0x048243, - /// A color described as Eggshell with a HEX value of #FFFFD4. - Eggshell = 0xFFFFD4, - /// A color described as Denim with a HEX value of #3B638C. - Denim = 0x3B638C, - /// A color described as Yellow Brown with a HEX value of #B79400. - YellowBrown = 0xB79400, - /// A color described as Dull Purple with a HEX value of #84597E. - DullPurple = 0x84597E, - /// A color described as Chocolate Brown with a HEX value of #411900. - ChocolateBrown = 0x411900, - /// A color described as Wine Red with a HEX value of #7B0323. - WineRed = 0x7B0323, - /// A color described as Neon Blue with a HEX value of #04D9FF. - NeonBlue = 0x04D9FF, - /// A color described as Dirty Green with a HEX value of #667E2C. - DirtyGreen = 0x667E2C, - /// A color described as Light Tan with a HEX value of #FBEEAC. - LightTan = 0xFBEEAC, - /// A color described as Ice Blue with a HEX value of #D7FFFE. - IceBlue = 0xD7FFFE, - /// A color described as Cadet Blue with a HEX value of #4E7496. - CadetBlue = 0x4E7496, - /// A color described as Dark Mauve with a HEX value of #874C62. - DarkMauve = 0x874C62, - /// A color described as Very Light Blue with a HEX value of #D5FFFF. - VeryLightBlue = 0xD5FFFF, - /// A color described as Grey Purple with a HEX value of #826D8C. - GreyPurple = 0x826D8C, - /// A color described as Pastel Pink with a HEX value of #FFBACD. - PastelPink = 0xFFBACD, - /// A color described as Very Light Green with a HEX value of #D1FFBD. - VeryLightGreen = 0xD1FFBD, - /// A color described as Dark Sky Blue with a HEX value of #448EE4. - DarkSkyBlue = 0x448EE4, - /// A color described as Evergreen with a HEX value of #05472A. - Evergreen = 0x05472A, - /// A color described as Dull Pink with a HEX value of #D5869D. - DullPink = 0xD5869D, - /// A color described as Aubergine with a HEX value of #3D0734. - Aubergine = 0x3D0734, - /// A color described as Mahogany with a HEX value of #4A0100. - Mahogany = 0x4A0100, - /// A color described as Reddish Orange with a HEX value of #F8481C. - ReddishOrange = 0xF8481C, - /// A color described as Deep Green with a HEX value of #02590F. - DeepGreen = 0x02590F, - /// A color described as Vomit Green with a HEX value of #89A203. - VomitGreen = 0x89A203, - /// A color described as Purple Pink with a HEX value of #E03FD8. - PurplePinkAlternate = 0xE03FD8, - /// A color described as Dusty Pink with a HEX value of #D58A94. - DustyPink = 0xD58A94, - /// A color described as Faded Green with a HEX value of #7BB274. - FadedGreen = 0x7BB274, - /// A color described as Camo Green with a HEX value of #526525. - CamoGreen = 0x526525, - /// A color described as Pinky Purple with a HEX value of #C94CBE. - PinkyPurple = 0xC94CBE, - /// A color described as Pink Purple with a HEX value of #DB4BDA. - PinkPurpleAlternate = 0xDB4BDA, - /// A color described as Brownish Red with a HEX value of #9E3623. - BrownishRed = 0x9E3623, - /// A color described as Dark Rose with a HEX value of #B5485D. - DarkRose = 0xB5485D, - /// A color described as Mud with a HEX value of #735C12. - Mud = 0x735C12, - /// A color described as Brownish with a HEX value of #9C6D57. - Brownish = 0x9C6D57, - /// A color described as Emerald Green with a HEX value of #028F1E. - EmeraldGreen = 0x028F1E, - /// A color described as Pale Brown with a HEX value of #B1916E. - PaleBrown = 0xB1916E, - /// A color described as Dull Blue with a HEX value of #49759C. - DullBlue = 0x49759C, - /// A color described as Burnt Umber with a HEX value of #A0450E. - BurntUmber = 0xA0450E, - /// A color described as Medium Green with a HEX value of #39AD48. - MediumGreen = 0x39AD48, - /// A color described as Clay with a HEX value of #B66A50. - Clay = 0xB66A50, - /// A color described as Light Aqua with a HEX value of #8CFFDB. - LightAqua = 0x8CFFDB, - /// A color described as Light Olive Green with a HEX value of #A4BE5C. - LightOliveGreen = 0xA4BE5C, - /// A color described as Brownish Orange with a HEX value of #CB7723. - BrownishOrange = 0xCB7723, - /// A color described as Dark Aqua with a HEX value of #05696B. - DarkAqua = 0x05696B, - /// A color described as Purplish Pink with a HEX value of #CE5DAE. - PurplishPink = 0xCE5DAE, - /// A color described as Dark Salmon with a HEX value of #C85A53. - DarkSalmon = 0xC85A53, - /// A color described as Greenish Grey with a HEX value of #96AE8D. - GreenishGrey = 0x96AE8D, - /// A color described as Jade with a HEX value of #1FA774. - Jade = 0x1FA774, - /// A color described as Ugly Green with a HEX value of #7A9703. - UglyGreen = 0x7A9703, - /// A color described as Dark Beige with a HEX value of #AC9362. - DarkBeige = 0xAC9362, - /// A color described as Emerald with a HEX value of #01A049. - Emerald = 0x01A049, - /// A color described as Pale Red with a HEX value of #D9544D. - PaleRed = 0xD9544D, - /// A color described as Light Magenta with a HEX value of #FA5FF7. - LightMagenta = 0xFA5FF7, - /// A color described as Sky with a HEX value of #82CAFC. - Sky = 0x82CAFC, - /// A color described as Light Cyan with a HEX value of #ACFFFC. - LightCyan = 0xACFFFC, - /// A color described as Yellow Orange with a HEX value of #FCB001. - YellowOrange = 0xFCB001, - /// A color described as Reddish Purple with a HEX value of #910951. - ReddishPurple = 0x910951, - /// A color described as Reddish Pink with a HEX value of #FE2C54. - ReddishPink = 0xFE2C54, - /// A color described as Orchid with a HEX value of #C875C4. - Orchid = 0xC875C4, - /// A color described as Dirty Yellow with a HEX value of #CDC50A. - DirtyYellow = 0xCDC50A, - /// A color described as Orange Red with a HEX value of #FD411E. - OrangeRed = 0xFD411E, - /// A color described as Deep Red with a HEX value of #9A0200. - DeepRed = 0x9A0200, - /// A color described as Orange Brown with a HEX value of #BE6400. - OrangeBrown = 0xBE6400, - /// A color described as Cobalt Blue with a HEX value of #030AA7. - CobaltBlue = 0x030AA7, - /// A color described as Neon Pink with a HEX value of #FE019A. - NeonPink = 0xFE019A, - /// A color described as Rose Pink with a HEX value of #F7879A. - RosePink = 0xF7879A, - /// A color described as Greyish Purple with a HEX value of #887191. - GreyishPurple = 0x887191, - /// A color described as Raspberry with a HEX value of #B00149. - Raspberry = 0xB00149, - /// A color described as Aqua Green with a HEX value of #12E193. - AquaGreen = 0x12E193, - /// A color described as Salmon Pink with a HEX value of #FE7B7C. - SalmonPink = 0xFE7B7C, - /// A color described as Tangerine with a HEX value of #FF9408. - Tangerine = 0xFF9408, - /// A color described as Brownish Green with a HEX value of #6A6E09. - BrownishGreen = 0x6A6E09, - /// A color described as Red Brown with a HEX value of #8B2E16. - RedBrown = 0x8B2E16, - /// A color described as Greenish Brown with a HEX value of #696112. - GreenishBrown = 0x696112, - /// A color described as Pumpkin with a HEX value of #E17701. - Pumpkin = 0xE17701, - /// A color described as Pine Green with a HEX value of #0A481E. - PineGreen = 0x0A481E, - /// A color described as Charcoal with a HEX value of #343837. - Charcoal = 0x343837, - /// A color described as Baby Pink with a HEX value of #FFB7CE. - BabyPink = 0xFFB7CE, - /// A color described as Cornflower with a HEX value of #6A79F7. - Cornflower = 0x6A79F7, - /// A color described as Blue Violet with a HEX value of #5D06E9. - BlueViolet = 0x5D06E9, - /// A color described as Chocolate with a HEX value of #3D1C02. - Chocolate = 0x3D1C02, - /// A color described as Greyish Green with a HEX value of #82A67D. - GreyishGreen = 0x82A67D, - /// A color described as Scarlet with a HEX value of #BE0119. - Scarlet = 0xBE0119, - /// A color described as Green Yellow with a HEX value of #C9FF27. - GreenYellowAlternate = 0xC9FF27, - /// A color described as Dark Olive with a HEX value of #373E02. - DarkOlive = 0x373E02, - /// A color described as Sienna with a HEX value of #A9561E. - Sienna = 0xA9561E, - /// A color described as Pastel Purple with a HEX value of #CAA0FF. - PastelPurple = 0xCAA0FF, - /// A color described as Terracotta with a HEX value of #CA6641. - Terracotta = 0xCA6641, - /// A color described as Aqua Blue with a HEX value of #02D8E9. - AquaBlue = 0x02D8E9, - /// A color described as Sage Green with a HEX value of #88B378. - SageGreen = 0x88B378, - /// A color described as Blood Red with a HEX value of #980002. - BloodRed = 0x980002, - /// A color described as Deep Pink with a HEX value of #CB0162. - DeepPink = 0xCB0162, - /// A color described as Grass with a HEX value of #5CAC2D. - Grass = 0x5CAC2D, - /// A color described as Moss with a HEX value of #769958. - Moss = 0x769958, - /// A color described as Pastel Blue with a HEX value of #A2BFFE. - PastelBlue = 0xA2BFFE, - /// A color described as Bluish Green with a HEX value of #10A674. - BluishGreen = 0x10A674, - /// A color described as Green Blue with a HEX value of #06B48B. - GreenBlueAlternate = 0x06B48B, - /// A color described as Dark Tan with a HEX value of #AF884A. - DarkTan = 0xAF884A, - /// A color described as Greenish Blue with a HEX value of #0B8B87. - GreenishBlue = 0x0B8B87, - /// A color described as Pale Orange with a HEX value of #FFA756. - PaleOrange = 0xFFA756, - /// A color described as Vomit with a HEX value of #A2A415. - Vomit = 0xA2A415, - /// A color described as Forrest Green with a HEX value of #154406. - ForrestGreen = 0x154406, - /// A color described as Dark Lavender with a HEX value of #856798. - DarkLavender = 0x856798, - /// A color described as Dark Violet with a HEX value of #34013F. - DarkViolet = 0x34013F, - /// A color described as Purple Blue with a HEX value of #632DE9. - PurpleBlueAlternate = 0x632DE9, - /// A color described as Dark Cyan with a HEX value of #0A888A. - DarkCyan = 0x0A888A, - /// A color described as Olive Drab with a HEX value of #6F7632. - OliveDrab = 0x6F7632, - /// A color described as Pinkish with a HEX value of #D46A7E. - Pinkish = 0xD46A7E, - /// A color described as Cobalt with a HEX value of #1E488F. - Cobalt = 0x1E488F, - /// A color described as Neon Purple with a HEX value of #BC13FE. - NeonPurple = 0xBC13FE, - /// A color described as Light Turquoise with a HEX value of #7EF4CC. - LightTurquoise = 0x7EF4CC, - /// A color described as Apple Green with a HEX value of #76CD26. - AppleGreen = 0x76CD26, - /// A color described as Dull Green with a HEX value of #74A662. - DullGreen = 0x74A662, - /// A color described as Wine with a HEX value of #80013F. - Wine = 0x80013F, - /// A color described as Powder Blue with a HEX value of #B1D1FC. - PowderBlue = 0xB1D1FC, - /// A color described as Off White with a HEX value of #FFFFE4. - OffWhite = 0xFFFFE4, - /// A color described as Electric Blue with a HEX value of #0652FF. - ElectricBlue = 0x0652FF, - /// A color described as Dark Turquoise with a HEX value of #045C5A. - DarkTurquoise = 0x045C5A, - /// A color described as Blue Purple with a HEX value of #5729CE. - BluePurpleAlternate = 0x5729CE, - /// A color described as Azure with a HEX value of #069AF3. - Azure = 0x069AF3, - /// A color described as Bright Red with a HEX value of #FF000D. - BrightRed = 0xFF000D, - /// A color described as Pinkish Red with a HEX value of #F10C45. - PinkishRed = 0xF10C45, - /// A color described as Cornflower Blue with a HEX value of #5170D7. - CornflowerBlue = 0x5170D7, - /// A color described as Light Olive with a HEX value of #ACBF69. - LightOlive = 0xACBF69, - /// A color described as Grape with a HEX value of #6C3461. - Grape = 0x6C3461, - /// A color described as Greyish Blue with a HEX value of #5E819D. - GreyishBlue = 0x5E819D, - /// A color described as Purplish Blue with a HEX value of #601EF9. - PurplishBlue = 0x601EF9, - /// A color described as Yellowish Green with a HEX value of #B0DD16. - YellowishGreen = 0xB0DD16, - /// A color described as Greenish Yellow with a HEX value of #CDFD02. - GreenishYellow = 0xCDFD02, - /// A color described as Medium Blue with a HEX value of #2C6FBB. - MediumBlue = 0x2C6FBB, - /// A color described as Dusty Rose with a HEX value of #C0737A. - DustyRose = 0xC0737A, - /// A color described as Light Violet with a HEX value of #D6B4FC. - LightViolet = 0xD6B4FC, - /// A color described as Midnight Blue with a HEX value of #020035. - MidnightBlue = 0x020035, - /// A color described as Bluish Purple with a HEX value of #703BE7. - BluishPurple = 0x703BE7, - /// A color described as Red Orange with a HEX value of #FD3C06. - RedOrange = 0xFD3C06, - /// A color described as Dark Magenta with a HEX value of #960056. - DarkMagenta = 0x960056, - /// A color described as Greenish with a HEX value of #40A368. - Greenish = 0x40A368, - /// A color described as Ocean Blue with a HEX value of #03719C. - OceanBlue = 0x03719C, - /// A color described as Coral with a HEX value of #FC5A50. - Coral = 0xFC5A50, - /// A color described as Cream with a HEX value of #FFFFC2. - Cream = 0xFFFFC2, - /// A color described as Reddish Brown with a HEX value of #7F2B0A. - ReddishBrown = 0x7F2B0A, - /// A color described as Burnt Sienna with a HEX value of #B04E0F. - BurntSienna = 0xB04E0F, - /// A color described as Brick with a HEX value of #A03623. - Brick = 0xA03623, - /// A color described as Sage with a HEX value of #87AE73. - Sage = 0x87AE73, - /// A color described as Grey Green with a HEX value of #789B73. - GreyGreenAlternate = 0x789B73, - /// A color described as White with a HEX value of #FFFFFF. - White = 0xFFFFFF, - /// A color described as Robin'S Egg Blue with a HEX value of #98EFF9. - RobinsEggBlue = 0x98EFF9, - /// A color described as Moss Green with a HEX value of #658B38. - MossGreen = 0x658B38, - /// A color described as Steel Blue with a HEX value of #5A7D9A. - SteelBlue = 0x5A7D9A, - /// A color described as Eggplant with a HEX value of #380835. - Eggplant = 0x380835, - /// A color described as Light Yellow with a HEX value of #FFFE7A. - LightYellow = 0xFFFE7A, - /// A color described as Leaf Green with a HEX value of #5CA904. - LeafGreen = 0x5CA904, - /// A color described as Light Grey with a HEX value of #D8DCD6. - LightGrey = 0xD8DCD6, - /// A color described as Puke with a HEX value of #A5A502. - Puke = 0xA5A502, - /// A color described as Pinkish Purple with a HEX value of #D648D7. - PinkishPurple = 0xD648D7, - /// A color described as Sea Blue with a HEX value of #047495. - SeaBlue = 0x047495, - /// A color described as Pale Purple with a HEX value of #B790D4. - PalePurple = 0xB790D4, - /// A color described as Slate Blue with a HEX value of #5B7C99. - SlateBlue = 0x5B7C99, - /// A color described as Blue Grey with a HEX value of #607C8E. - BlueGreyAlternate = 0x607C8E, - /// A color described as Hunter Green with a HEX value of #0B4008. - HunterGreen = 0x0B4008, - /// A color described as Fuchsia with a HEX value of #ED0DD9. - Fuchsia = 0xED0DD9, - /// A color described as Crimson with a HEX value of #8C000F. - Crimson = 0x8C000F, - /// A color described as Pale Yellow with a HEX value of #FFFF84. - PaleYellow = 0xFFFF84, - /// A color described as Ochre with a HEX value of #BF9005. - Ochre = 0xBF9005, - /// A color described as Mustard Yellow with a HEX value of #D2BD0A. - MustardYellow = 0xD2BD0A, - /// A color described as Light Red with a HEX value of #FF474C. - LightRed = 0xFF474C, - /// A color described as Cerulean with a HEX value of #0485D1. - Cerulean = 0x0485D1, - /// A color described as Pale Pink with a HEX value of #FFCFDC. - PalePink = 0xFFCFDC, - /// A color described as Deep Blue with a HEX value of #040273. - DeepBlue = 0x040273, - /// A color described as Rust with a HEX value of #A83C09. - Rust = 0xA83C09, - /// A color described as Light Teal with a HEX value of #90E4C1. - LightTeal = 0x90E4C1, - /// A color described as Slate with a HEX value of #516572. - Slate = 0x516572, - /// A color described as Goldenrod with a HEX value of #FAC205. - Goldenrod = 0xFAC205, - /// A color described as Dark Yellow with a HEX value of #D5B60A. - DarkYellow = 0xD5B60A, - /// A color described as Dark Grey with a HEX value of #363737. - DarkGrey = 0x363737, - /// A color described as Army Green with a HEX value of #4B5D16. - ArmyGreen = 0x4B5D16, - /// A color described as Grey Blue with a HEX value of #6B8BA4. - GreyBlueAlternate = 0x6B8BA4, - /// A color described as Seafoam with a HEX value of #80F9AD. - Seafoam = 0x80F9AD, - /// A color described as Puce with a HEX value of #A57E52. - Puce = 0xA57E52, - /// A color described as Spring Green with a HEX value of #A9F971. - SpringGreen = 0xA9F971, - /// A color described as Dark Orange with a HEX value of #C65102. - DarkOrange = 0xC65102, - /// A color described as Sand with a HEX value of #E2CA76. - Sand = 0xE2CA76, - /// A color described as Pastel Green with a HEX value of #B0FF9D. - PastelGreen = 0xB0FF9D, - /// A color described as Mint with a HEX value of #9FFEB0. - Mint = 0x9FFEB0, - /// A color described as Light Orange with a HEX value of #FDAA48. - LightOrange = 0xFDAA48, - /// A color described as Bright Pink with a HEX value of #FE01B1. - BrightPink = 0xFE01B1, - /// A color described as Chartreuse with a HEX value of #C1F80A. - Chartreuse = 0xC1F80A, - /// A color described as Deep Purple with a HEX value of #36013F. - DeepPurple = 0x36013F, - /// A color described as Dark Brown with a HEX value of #341C02. - DarkBrown = 0x341C02, - /// A color described as Taupe with a HEX value of #B9A281. - Taupe = 0xB9A281, - /// A color described as Pea Green with a HEX value of #8EAB12. - PeaGreen = 0x8EAB12, - /// A color described as Puke Green with a HEX value of #9AAE07. - PukeGreen = 0x9AAE07, - /// A color described as Kelly Green with a HEX value of #02AB2E. - KellyGreen = 0x02AB2E, - /// A color described as Seafoam Green with a HEX value of #7AF9AB. - SeafoamGreen = 0x7AF9AB, - /// A color described as Blue Green with a HEX value of #137E6D. - BlueGreenAlternate = 0x137E6D, - /// A color described as Khaki with a HEX value of #AAA662. - Khaki = 0xAAA662, - /// A color described as Burgundy with a HEX value of #610023. - Burgundy = 0x610023, - /// A color described as Dark Teal with a HEX value of #014D4E. - DarkTeal = 0x014D4E, - /// A color described as Brick Red with a HEX value of #8F1402. - BrickRed = 0x8F1402, - /// A color described as Royal Purple with a HEX value of #4B006E. - RoyalPurple = 0x4B006E, - /// A color described as Plum with a HEX value of #580F41. - Plum = 0x580F41, - /// A color described as Mint Green with a HEX value of #8FFF9F. - MintGreen = 0x8FFF9F, - /// A color described as Gold with a HEX value of #DBB40C. - Gold = 0xDBB40C, - /// A color described as Baby Blue with a HEX value of #A2CFFE. - BabyBlue = 0xA2CFFE, - /// A color described as Yellow Green with a HEX value of #C0FB2D. - YellowGreenAlternate = 0xC0FB2D, - /// A color described as Bright Purple with a HEX value of #BE03FD. - BrightPurple = 0xBE03FD, - /// A color described as Dark Red with a HEX value of #840000. - DarkRed = 0x840000, - /// A color described as Pale Blue with a HEX value of #D0FEFE. - PaleBlue = 0xD0FEFE, - /// A color described as Grass Green with a HEX value of #3F9B0B. - GrassGreen = 0x3F9B0B, - /// A color described as Navy with a HEX value of #01153E. - Navy = 0x01153E, - /// A color described as Aquamarine with a HEX value of #04D8B2. - Aquamarine = 0x04D8B2, - /// A color described as Burnt Orange with a HEX value of #C04E01. - BurntOrange = 0xC04E01, - /// A color described as Neon Green with a HEX value of #0CFF0C. - NeonGreen = 0x0CFF0C, - /// A color described as Bright Blue with a HEX value of #0165FC. - BrightBlue = 0x0165FC, - /// A color described as Rose with a HEX value of #CF6275. - Rose = 0xCF6275, - /// A color described as Light Pink with a HEX value of #FFD1DF. - LightPink = 0xFFD1DF, - /// A color described as Mustard with a HEX value of #CEB301. - Mustard = 0xCEB301, - /// A color described as Indigo with a HEX value of #380282. - Indigo = 0x380282, - /// A color described as Lime with a HEX value of #AAFF32. - Lime = 0xAAFF32, - /// A color described as Sea Green with a HEX value of #53FCA1. - SeaGreen = 0x53FCA1, - /// A color described as Periwinkle with a HEX value of #8E82FE. - Periwinkle = 0x8E82FE, - /// A color described as Dark Pink with a HEX value of #CB416B. - DarkPink = 0xCB416B, - /// A color described as Olive Green with a HEX value of #677A04. - OliveGreen = 0x677A04, - /// A color described as Peach with a HEX value of #FFB07C. - Peach = 0xFFB07C, - /// A color described as Pale Green with a HEX value of #C7FDB5. - PaleGreen = 0xC7FDB5, - /// A color described as Light Brown with a HEX value of #AD8150. - LightBrown = 0xAD8150, - /// A color described as Hot Pink with a HEX value of #FF028D. - HotPink = 0xFF028D, - /// A color described as Black with a HEX value of #000000. - Black = 0x000000, - /// A color described as Lilac with a HEX value of #CEA2FD. - Lilac = 0xCEA2FD, - /// A color described as Navy Blue with a HEX value of #001146. - NavyBlue = 0x001146, - /// A color described as Royal Blue with a HEX value of #0504AA. - RoyalBlue = 0x0504AA, - /// A color described as Beige with a HEX value of #E6DAA6. - Beige = 0xE6DAA6, - /// A color described as Salmon with a HEX value of #FF796C. - Salmon = 0xFF796C, - /// A color described as Olive with a HEX value of #6E750E. - Olive = 0x6E750E, - /// A color described as Maroon with a HEX value of #650021. - Maroon = 0x650021, - /// A color described as Bright Green with a HEX value of #01FF07. - BrightGreen = 0x01FF07, - /// A color described as Dark Purple with a HEX value of #35063E. - DarkPurple = 0x35063E, - /// A color described as Mauve with a HEX value of #AE7181. - Mauve = 0xAE7181, - /// A color described as Forest Green with a HEX value of #06470C. - ForestGreen = 0x06470C, - /// A color described as Aqua with a HEX value of #13EAC9. - Aqua = 0x13EAC9, - /// A color described as Cyan with a HEX value of #00FFFF. - Cyan = 0x00FFFF, - /// A color described as Tan with a HEX value of #D1B26F. - Tan = 0xD1B26F, - /// A color described as Dark Blue with a HEX value of #00035B. - DarkBlue = 0x00035B, - /// A color described as Lavender with a HEX value of #C79FEF. - Lavender = 0xC79FEF, - /// A color described as Turquoise with a HEX value of #06C2AC. - Turquoise = 0x06C2AC, - /// A color described as Dark Green with a HEX value of #033500. - DarkGreen = 0x033500, - /// A color described as Violet with a HEX value of #9A0EEA. - Violet = 0x9A0EEA, - /// A color described as Light Purple with a HEX value of #BF77F6. - LightPurple = 0xBF77F6, - /// A color described as Lime Green with a HEX value of #89FE05. - LimeGreen = 0x89FE05, - /// A color described as Grey with a HEX value of #929591. - Grey = 0x929591, - /// A color described as Sky Blue with a HEX value of #75BBFD. - SkyBlue = 0x75BBFD, - /// A color described as Yellow with a HEX value of #FFFF14. - Yellow = 0xFFFF14, - /// A color described as Magenta with a HEX value of #C20078. - Magenta = 0xC20078, - /// A color described as Light Green with a HEX value of #96F97B. - LightGreen = 0x96F97B, - /// A color described as Orange with a HEX value of #F97306. - Orange = 0xF97306, - /// A color described as Teal with a HEX value of #029386. - Teal = 0x029386, - /// A color described as Light Blue with a HEX value of #95D0FC. - LightBlue = 0x95D0FC, - /// A color described as Red with a HEX value of #E50000. - Red = 0xE50000, - /// A color described as Brown with a HEX value of #653700. - Brown = 0x653700, - /// A color described as Pink with a HEX value of #FF81C0. - Pink = 0xFF81C0, - /// A color described as Blue with a HEX value of #0343DF. - Blue = 0x0343DF, - /// A color described as Green with a HEX value of #15B01A. - Green = 0x15B01A, - /// A color described as Purple with a HEX value of #7E1E9C. - Purple = 0x7E1E9C, - Purple2 = 0x7E1E9C, + /// A color described as Cloudy Blue with a HEX value of #ACC2D9. + CloudyBlue = 0xACC2D9, - } -} + /// A color described as Dark Pastel Green with a HEX value of #56AE57. + DarkPastelGreen = 0x56AE57, + + /// A color described as Dust with a HEX value of #B2996E. + Dust = 0xB2996E, + + /// A color described as Electric Lime with a HEX value of #A8FF04. + ElectricLime = 0xA8FF04, + + /// A color described as Fresh Green with a HEX value of #69D84F. + FreshGreen = 0x69D84F, + + /// A color described as Light Eggplant with a HEX value of #894585. + LightEggplant = 0x894585, + + /// A color described as Nasty Green with a HEX value of #70B23F. + NastyGreen = 0x70B23F, + + /// A color described as Really Light Blue with a HEX value of #D4FFFF. + ReallyLightBlue = 0xD4FFFF, + + /// A color described as Tea with a HEX value of #65AB7C. + Tea = 0x65AB7C, + + /// A color described as Warm Purple with a HEX value of #952E8F. + WarmPurple = 0x952E8F, + + /// A color described as Yellowish Tan with a HEX value of #FCFC81. + YellowishTan = 0xFCFC81, + + /// A color described as Cement with a HEX value of #A5A391. + Cement = 0xA5A391, + + /// A color described as Dark Grass Green with a HEX value of #388004. + DarkGrassGreen = 0x388004, + + /// A color described as Dusty Teal with a HEX value of #4C9085. + DustyTeal = 0x4C9085, + + /// A color described as Grey Teal with a HEX value of #5E9B8A. + GreyTeal = 0x5E9B8A, + + /// A color described as Macaroni And Cheese with a HEX value of #EFB435. + MacaroniAndCheese = 0xEFB435, + + /// A color described as Pinkish Tan with a HEX value of #D99B82. + PinkishTan = 0xD99B82, + + /// A color described as Spruce with a HEX value of #0A5F38. + Spruce = 0x0A5F38, + + /// A color described as Strong Blue with a HEX value of #0C06F7. + StrongBlue = 0x0C06F7, + + /// A color described as Toxic Green with a HEX value of #61DE2A. + ToxicGreen = 0x61DE2A, + + /// A color described as Windows Blue with a HEX value of #3778BF. + WindowsBlue = 0x3778BF, + + /// A color described as Blue Blue with a HEX value of #2242C7. + BlueBlue = 0x2242C7, + + /// A color described as Blue With A Hint Of Purple with a HEX value of #533CC6. + BlueWithAHintOfPurple = 0x533CC6, + + /// A color described as Booger with a HEX value of #9BB53C. + Booger = 0x9BB53C, + + /// A color described as Bright Sea Green with a HEX value of #05FFA6. + BrightSeaGreen = 0x05FFA6, + + /// A color described as Dark Green Blue with a HEX value of #1F6357. + DarkGreenBlue = 0x1F6357, + + /// A color described as Deep Turquoise with a HEX value of #017374. + DeepTurquoise = 0x017374, + + /// A color described as Green Teal with a HEX value of #0CB577. + GreenTeal = 0x0CB577, + + /// A color described as Strong Pink with a HEX value of #FF0789. + StrongPink = 0xFF0789, + + /// A color described as Bland with a HEX value of #AFA88B. + Bland = 0xAFA88B, + + /// A color described as Deep Aqua with a HEX value of #08787F. + DeepAqua = 0x08787F, + + /// A color described as Lavender Pink with a HEX value of #DD85D7. + LavenderPink = 0xDD85D7, + + /// A color described as Light Moss Green with a HEX value of #A6C875. + LightMossGreen = 0xA6C875, + + /// A color described as Light Seafoam Green with a HEX value of #A7FFB5. + LightSeafoamGreen = 0xA7FFB5, + + /// A color described as Olive Yellow with a HEX value of #C2B709. + OliveYellow = 0xC2B709, + + /// A color described as Pig Pink with a HEX value of #E78EA5. + PigPink = 0xE78EA5, + + /// A color described as Deep Lilac with a HEX value of #966EBD. + DeepLilac = 0x966EBD, + + /// A color described as Desert with a HEX value of #CCAD60. + Desert = 0xCCAD60, + + /// A color described as Dusty Lavender with a HEX value of #AC86A8. + DustyLavender = 0xAC86A8, + + /// A color described as Purpley Grey with a HEX value of #947E94. + PurpleyGrey = 0x947E94, + + /// A color described as Purply with a HEX value of #983FB2. + Purply = 0x983FB2, + + /// A color described as Candy Pink with a HEX value of #FF63E9. + CandyPink = 0xFF63E9, + + /// A color described as Light Pastel Green with a HEX value of #B2FBA5. + LightPastelGreen = 0xB2FBA5, + + /// A color described as Boring Green with a HEX value of #63B365. + BoringGreen = 0x63B365, + + /// A color described as Kiwi Green with a HEX value of #8EE53F. + KiwiGreen = 0x8EE53F, + + /// A color described as Light Grey Green with a HEX value of #B7E1A1. + LightGreyGreen = 0xB7E1A1, + + /// A color described as Orange Pink with a HEX value of #FF6F52. + OrangePink = 0xFF6F52, + + /// A color described as Tea Green with a HEX value of #BDF8A3. + TeaGreen = 0xBDF8A3, + + /// A color described as Very Light Brown with a HEX value of #D3B683. + VeryLightBrown = 0xD3B683, + + /// A color described as Egg Shell with a HEX value of #FFFCC4. + EggShell = 0xFFFCC4, + + /// A color described as Eggplant Purple with a HEX value of #430541. + EggplantPurple = 0x430541, + + /// A color described as Powder Pink with a HEX value of #FFB2D0. + PowderPink = 0xFFB2D0, + + /// A color described as Reddish Grey with a HEX value of #997570. + ReddishGrey = 0x997570, + + /// A color described as Baby Shit Brown with a HEX value of #AD900D. + BabyShitBrown = 0xAD900D, + + /// A color described as Liliac with a HEX value of #C48EFD. + Liliac = 0xC48EFD, + + /// A color described as Stormy Blue with a HEX value of #507B9C. + StormyBlue = 0x507B9C, + + /// A color described as Ugly Brown with a HEX value of #7D7103. + UglyBrown = 0x7D7103, + + /// A color described as Custard with a HEX value of #FFFD78. + Custard = 0xFFFD78, + + /// A color described as Darkish Pink with a HEX value of #DA467D. + DarkishPink = 0xDA467D, + + /// A color described as Deep Brown with a HEX value of #410200. + DeepBrown = 0x410200, + + /// A color described as Greenish Beige with a HEX value of #C9D179. + GreenishBeige = 0xC9D179, + + /// A color described as Manilla with a HEX value of #FFFA86. + Manilla = 0xFFFA86, + + /// A color described as Off Blue with a HEX value of #5684AE. + OffBlue = 0x5684AE, + + /// A color described as Battleship Grey with a HEX value of #6B7C85. + BattleshipGrey = 0x6B7C85, + + /// A color described as Browny Green with a HEX value of #6F6C0A. + BrownyGreen = 0x6F6C0A, + + /// A color described as Bruise with a HEX value of #7E4071. + Bruise = 0x7E4071, + + /// A color described as Kelley Green with a HEX value of #009337. + KelleyGreen = 0x009337, + + /// A color described as Sickly Yellow with a HEX value of #D0E429. + SicklyYellow = 0xD0E429, + + /// A color described as Sunny Yellow with a HEX value of #FFF917. + SunnyYellow = 0xFFF917, + + /// A color described as Azul with a HEX value of #1D5DEC. + Azul = 0x1D5DEC, + + /// A color described as Darkgreen with a HEX value of #054907. + Darkgreen = 0x054907, + + /// A color described as Green/Yellow with a HEX value of #B5CE08. + GreenYellow = 0xB5CE08, + + /// A color described as Lichen with a HEX value of #8FB67B. + Lichen = 0x8FB67B, + + /// A color described as Light Light Green with a HEX value of #C8FFB0. + LightLightGreen = 0xC8FFB0, + + /// A color described as Pale Gold with a HEX value of #FDDE6C. + PaleGold = 0xFDDE6C, + + /// A color described as Sun Yellow with a HEX value of #FFDF22. + SunYellow = 0xFFDF22, + + /// A color described as Tan Green with a HEX value of #A9BE70. + TanGreen = 0xA9BE70, + + /// A color described as Burple with a HEX value of #6832E3. + Burple = 0x6832E3, + + /// A color described as Butterscotch with a HEX value of #FDB147. + Butterscotch = 0xFDB147, + + /// A color described as Toupe with a HEX value of #C7AC7D. + Toupe = 0xC7AC7D, + + /// A color described as Dark Cream with a HEX value of #FFF39A. + DarkCream = 0xFFF39A, + + /// A color described as Indian Red with a HEX value of #850E04. + IndianRed = 0x850E04, + + /// A color described as Light Lavendar with a HEX value of #EFC0FE. + LightLavendar = 0xEFC0FE, + + /// A color described as Poison Green with a HEX value of #40FD14. + PoisonGreen = 0x40FD14, + + /// A color described as Baby Puke Green with a HEX value of #B6C406. + BabyPukeGreen = 0xB6C406, + + /// A color described as Bright Yellow Green with a HEX value of #9DFF00. + BrightYellowGreen = 0x9DFF00, + + /// A color described as Charcoal Grey with a HEX value of #3C4142. + CharcoalGrey = 0x3C4142, + + /// A color described as Squash with a HEX value of #F2AB15. + Squash = 0xF2AB15, + + /// A color described as Cinnamon with a HEX value of #AC4F06. + Cinnamon = 0xAC4F06, + + /// A color described as Light Pea Green with a HEX value of #C4FE82. + LightPeaGreen = 0xC4FE82, + + /// A color described as Radioactive Green with a HEX value of #2CFA1F. + RadioactiveGreen = 0x2CFA1F, + + /// A color described as Raw Sienna with a HEX value of #9A6200. + RawSienna = 0x9A6200, + + /// A color described as Baby Purple with a HEX value of #CA9BF7. + BabyPurple = 0xCA9BF7, + + /// A color described as Cocoa with a HEX value of #875F42. + Cocoa = 0x875F42, + + /// A color described as Light Royal Blue with a HEX value of #3A2EFE. + LightRoyalBlue = 0x3A2EFE, + + /// A color described as Orangeish with a HEX value of #FD8D49. + Orangeish = 0xFD8D49, + + /// A color described as Rust Brown with a HEX value of #8B3103. + RustBrown = 0x8B3103, + + /// A color described as Sand Brown with a HEX value of #CBA560. + SandBrown = 0xCBA560, + + /// A color described as Swamp with a HEX value of #698339. + Swamp = 0x698339, + + /// A color described as Tealish Green with a HEX value of #0CDC73. + TealishGreen = 0x0CDC73, + + /// A color described as Burnt Siena with a HEX value of #B75203. + BurntSiena = 0xB75203, + + /// A color described as Camo with a HEX value of #7F8F4E. + Camo = 0x7F8F4E, + + /// A color described as Dusk Blue with a HEX value of #26538D. + DuskBlue = 0x26538D, + + /// A color described as Fern with a HEX value of #63A950. + Fern = 0x63A950, + + /// A color described as Old Rose with a HEX value of #C87F89. + OldRose = 0xC87F89, + + /// A color described as Pale Light Green with a HEX value of #B1FC99. + PaleLightGreen = 0xB1FC99, + + /// A color described as Peachy Pink with a HEX value of #FF9A8A. + PeachyPink = 0xFF9A8A, + + /// A color described as Rosy Pink with a HEX value of #F6688E. + RosyPink = 0xF6688E, + + /// A color described as Light Bluish Green with a HEX value of #76FDA8. + LightBluishGreen = 0x76FDA8, + + /// A color described as Light Bright Green with a HEX value of #53FE5C. + LightBrightGreen = 0x53FE5C, + + /// A color described as Light Neon Green with a HEX value of #4EFD54. + LightNeonGreen = 0x4EFD54, + + /// A color described as Light Seafoam with a HEX value of #A0FEBF. + LightSeafoam = 0xA0FEBF, + + /// A color described as Tiffany Blue with a HEX value of #7BF2DA. + TiffanyBlue = 0x7BF2DA, + + /// A color described as Washed Out Green with a HEX value of #BCF5A6. + WashedOutGreen = 0xBCF5A6, + + /// A color described as Browny Orange with a HEX value of #CA6B02. + BrownyOrange = 0xCA6B02, + + /// A color described as Nice Blue with a HEX value of #107AB0. + NiceBlue = 0x107AB0, + + /// A color described as Sapphire with a HEX value of #2138AB. + Sapphire = 0x2138AB, + + /// A color described as Greyish Teal with a HEX value of #719F91. + GreyishTeal = 0x719F91, + + /// A color described as Orangey Yellow with a HEX value of #FDB915. + OrangeyYellow = 0xFDB915, + + /// A color described as Parchment with a HEX value of #FEFCAF. + Parchment = 0xFEFCAF, + + /// A color described as Straw with a HEX value of #FCF679. + Straw = 0xFCF679, + + /// A color described as Very Dark Brown with a HEX value of #1D0200. + VeryDarkBrown = 0x1D0200, + + /// A color described as Terracota with a HEX value of #CB6843. + Terracota = 0xCB6843, + + /// A color described as Ugly Blue with a HEX value of #31668A. + UglyBlue = 0x31668A, + + /// A color described as Clear Blue with a HEX value of #247AFD. + ClearBlue = 0x247AFD, + + /// A color described as Creme with a HEX value of #FFFFB6. + Creme = 0xFFFFB6, + + /// A color described as Foam Green with a HEX value of #90FDA9. + FoamGreen = 0x90FDA9, + + /// A color described as Grey/Green with a HEX value of #86A17D. + GreyGreen = 0x86A17D, + + /// A color described as Light Gold with a HEX value of #FDDC5C. + LightGold = 0xFDDC5C, + + /// A color described as Seafoam Blue with a HEX value of #78D1B6. + SeafoamBlue = 0x78D1B6, + + /// A color described as Topaz with a HEX value of #13BBAF. + Topaz = 0x13BBAF, + + /// A color described as Violet Pink with a HEX value of #FB5FFC. + VioletPink = 0xFB5FFC, + + /// A color described as Wintergreen with a HEX value of #20F986. + Wintergreen = 0x20F986, + + /// A color described as Yellow Tan with a HEX value of #FFE36E. + YellowTan = 0xFFE36E, + + /// A color described as Dark Fuchsia with a HEX value of #9D0759. + DarkFuchsia = 0x9D0759, + + /// A color described as Indigo Blue with a HEX value of #3A18B1. + IndigoBlue = 0x3A18B1, + + /// A color described as Light Yellowish Green with a HEX value of #C2FF89. + LightYellowishGreen = 0xC2FF89, + + /// A color described as Pale Magenta with a HEX value of #D767AD. + PaleMagenta = 0xD767AD, + + /// A color described as Rich Purple with a HEX value of #720058. + RichPurple = 0x720058, + + /// A color described as Sunflower Yellow with a HEX value of #FFDA03. + SunflowerYellow = 0xFFDA03, + + /// A color described as Green/Blue with a HEX value of #01C08D. + GreenBlue = 0x01C08D, + + /// A color described as Leather with a HEX value of #AC7434. + Leather = 0xAC7434, + + /// A color described as Racing Green with a HEX value of #014600. + RacingGreen = 0x014600, + + /// A color described as Vivid Purple with a HEX value of #9900FA. + VividPurple = 0x9900FA, + + /// A color described as Dark Royal Blue with a HEX value of #02066F. + DarkRoyalBlue = 0x02066F, + + /// A color described as Hazel with a HEX value of #8E7618. + Hazel = 0x8E7618, + + /// A color described as Muted Pink with a HEX value of #D1768F. + MutedPink = 0xD1768F, + + /// A color described as Booger Green with a HEX value of #96B403. + BoogerGreen = 0x96B403, + + /// A color described as Canary with a HEX value of #FDFF63. + Canary = 0xFDFF63, + + /// A color described as Cool Grey with a HEX value of #95A3A6. + CoolGrey = 0x95A3A6, + + /// A color described as Dark Taupe with a HEX value of #7F684E. + DarkTaupe = 0x7F684E, + + /// A color described as Darkish Purple with a HEX value of #751973. + DarkishPurple = 0x751973, + + /// A color described as True Green with a HEX value of #089404. + TrueGreen = 0x089404, + + /// A color described as Coral Pink with a HEX value of #FF6163. + CoralPink = 0xFF6163, + + /// A color described as Dark Sage with a HEX value of #598556. + DarkSage = 0x598556, + + /// A color described as Dark Slate Blue with a HEX value of #214761. + DarkSlateBlue = 0x214761, + + /// A color described as Flat Blue with a HEX value of #3C73A8. + FlatBlue = 0x3C73A8, + + /// A color described as Mushroom with a HEX value of #BA9E88. + Mushroom = 0xBA9E88, + + /// A color described as Rich Blue with a HEX value of #021BF9. + RichBlue = 0x021BF9, + + /// A color described as Dirty Purple with a HEX value of #734A65. + DirtyPurple = 0x734A65, + + /// A color described as Greenblue with a HEX value of #23C48B. + Greenblue = 0x23C48B, + + /// A color described as Icky Green with a HEX value of #8FAE22. + IckyGreen = 0x8FAE22, + + /// A color described as Light Khaki with a HEX value of #E6F2A2. + LightKhaki = 0xE6F2A2, + + /// A color described as Warm Blue with a HEX value of #4B57DB. + WarmBlue = 0x4B57DB, + + /// A color described as Dark Hot Pink with a HEX value of #D90166. + DarkHotPink = 0xD90166, + + /// A color described as Deep Sea Blue with a HEX value of #015482. + DeepSeaBlue = 0x015482, + + /// A color described as Carmine with a HEX value of #9D0216. + Carmine = 0x9D0216, + + /// A color described as Dark Yellow Green with a HEX value of #728F02. + DarkYellowGreen = 0x728F02, + + /// A color described as Pale Peach with a HEX value of #FFE5AD. + PalePeach = 0xFFE5AD, + + /// A color described as Plum Purple with a HEX value of #4E0550. + PlumPurple = 0x4E0550, + + /// A color described as Golden Rod with a HEX value of #F9BC08. + GoldenRod = 0xF9BC08, + + /// A color described as Neon Red with a HEX value of #FF073A. + NeonRed = 0xFF073A, + + /// A color described as Old Pink with a HEX value of #C77986. + OldPink = 0xC77986, + + /// A color described as Very Pale Blue with a HEX value of #D6FFFE. + VeryPaleBlue = 0xD6FFFE, + + /// A color described as Blood Orange with a HEX value of #FE4B03. + BloodOrange = 0xFE4B03, + + /// A color described as Grapefruit with a HEX value of #FD5956. + Grapefruit = 0xFD5956, + + /// A color described as Sand Yellow with a HEX value of #FCE166. + SandYellow = 0xFCE166, + + /// A color described as Clay Brown with a HEX value of #B2713D. + ClayBrown = 0xB2713D, + + /// A color described as Dark Blue Grey with a HEX value of #1F3B4D. + DarkBlueGrey = 0x1F3B4D, + + /// A color described as Flat Green with a HEX value of #699D4C. + FlatGreen = 0x699D4C, + + /// A color described as Light Green Blue with a HEX value of #56FCA2. + LightGreenBlue = 0x56FCA2, + + /// A color described as Warm Pink with a HEX value of #FB5581. + WarmPink = 0xFB5581, + + /// A color described as Dodger Blue with a HEX value of #3E82FC. + DodgerBlue = 0x3E82FC, + + /// A color described as Gross Green with a HEX value of #A0BF16. + GrossGreen = 0xA0BF16, + + /// A color described as Ice with a HEX value of #D6FFFA. + Ice = 0xD6FFFA, + + /// A color described as Metallic Blue with a HEX value of #4F738E. + MetallicBlue = 0x4F738E, + + /// A color described as Pale Salmon with a HEX value of #FFB19A. + PaleSalmon = 0xFFB19A, + + /// A color described as Sap Green with a HEX value of #5C8B15. + SapGreen = 0x5C8B15, + + /// A color described as Algae with a HEX value of #54AC68. + Algae = 0x54AC68, + + /// A color described as Bluey Grey with a HEX value of #89A0B0. + BlueyGrey = 0x89A0B0, + + /// A color described as Greeny Grey with a HEX value of #7EA07A. + GreenyGrey = 0x7EA07A, + + /// A color described as Highlighter Green with a HEX value of #1BFC06. + HighlighterGreen = 0x1BFC06, + + /// A color described as Light Light Blue with a HEX value of #CAFFFB. + LightLightBlue = 0xCAFFFB, + + /// A color described as Light Mint with a HEX value of #B6FFBB. + LightMint = 0xB6FFBB, + + /// A color described as Raw Umber with a HEX value of #A75E09. + RawUmber = 0xA75E09, + + /// A color described as Vivid Blue with a HEX value of #152EFF. + VividBlue = 0x152EFF, + + /// A color described as Deep Lavender with a HEX value of #8D5EB7. + DeepLavender = 0x8D5EB7, + + /// A color described as Dull Teal with a HEX value of #5F9E8F. + DullTeal = 0x5F9E8F, + + /// A color described as Light Greenish Blue with a HEX value of #63F7B4. + LightGreenishBlue = 0x63F7B4, + + /// A color described as Mud Green with a HEX value of #606602. + MudGreen = 0x606602, + + /// A color described as Pinky with a HEX value of #FC86AA. + Pinky = 0xFC86AA, + + /// A color described as Red Wine with a HEX value of #8C0034. + RedWine = 0x8C0034, + + /// A color described as Shit Green with a HEX value of #758000. + ShitGreen = 0x758000, + + /// A color described as Tan Brown with a HEX value of #AB7E4C. + TanBrown = 0xAB7E4C, + + /// A color described as Darkblue with a HEX value of #030764. + Darkblue = 0x030764, + + /// A color described as Rosa with a HEX value of #FE86A4. + Rosa = 0xFE86A4, + + /// A color described as Lipstick with a HEX value of #D5174E. + Lipstick = 0xD5174E, + + /// A color described as Pale Mauve with a HEX value of #FED0FC. + PaleMauve = 0xFED0FC, + + /// A color described as Claret with a HEX value of #680018. + Claret = 0x680018, + + /// A color described as Dandelion with a HEX value of #FEDF08. + Dandelion = 0xFEDF08, + + /// A color described as Orangered with a HEX value of #FE420F. + Orangered = 0xFE420F, + + /// A color described as Poop Green with a HEX value of #6F7C00. + PoopGreen = 0x6F7C00, + + /// A color described as Ruby with a HEX value of #CA0147. + Ruby = 0xCA0147, + + /// A color described as Dark with a HEX value of #1B2431. + Dark = 0x1B2431, + + /// A color described as Greenish Turquoise with a HEX value of #00FBB0. + GreenishTurquoise = 0x00FBB0, + + /// A color described as Pastel Red with a HEX value of #DB5856. + PastelRed = 0xDB5856, + + /// A color described as Piss Yellow with a HEX value of #DDD618. + PissYellow = 0xDDD618, + + /// A color described as Bright Cyan with a HEX value of #41FDFE. + BrightCyan = 0x41FDFE, + + /// A color described as Dark Coral with a HEX value of #CF524E. + DarkCoral = 0xCF524E, + + /// A color described as Algae Green with a HEX value of #21C36F. + AlgaeGreen = 0x21C36F, + + /// A color described as Darkish Red with a HEX value of #A90308. + DarkishRed = 0xA90308, + + /// A color described as Reddy Brown with a HEX value of #6E1005. + ReddyBrown = 0x6E1005, + + /// A color described as Blush Pink with a HEX value of #FE828C. + BlushPink = 0xFE828C, + + /// A color described as Camouflage Green with a HEX value of #4B6113. + CamouflageGreen = 0x4B6113, + + /// A color described as Lawn Green with a HEX value of #4DA409. + LawnGreen = 0x4DA409, + + /// A color described as Putty with a HEX value of #BEAE8A. + Putty = 0xBEAE8A, + + /// A color described as Vibrant Blue with a HEX value of #0339F8. + VibrantBlue = 0x0339F8, + + /// A color described as Dark Sand with a HEX value of #A88F59. + DarkSand = 0xA88F59, + + /// A color described as Purple/Blue with a HEX value of #5D21D0. + PurpleBlue = 0x5D21D0, + + /// A color described as Saffron with a HEX value of #FEB209. + Saffron = 0xFEB209, + + /// A color described as Twilight with a HEX value of #4E518B. + Twilight = 0x4E518B, + + /// A color described as Warm Brown with a HEX value of #964E02. + WarmBrown = 0x964E02, + + /// A color described as Bluegrey with a HEX value of #85A3B2. + Bluegrey = 0x85A3B2, + + /// A color described as Bubble Gum Pink with a HEX value of #FF69AF. + BubbleGumPink = 0xFF69AF, + + /// A color described as Duck Egg Blue with a HEX value of #C3FBF4. + DuckEggBlue = 0xC3FBF4, + + /// A color described as Greenish Cyan with a HEX value of #2AFEB7. + GreenishCyan = 0x2AFEB7, + + /// A color described as Petrol with a HEX value of #005F6A. + Petrol = 0x005F6A, + + /// A color described as Royal with a HEX value of #0C1793. + Royal = 0x0C1793, + + /// A color described as Butter with a HEX value of #FFFF81. + Butter = 0xFFFF81, + + /// A color described as Dusty Orange with a HEX value of #F0833A. + DustyOrange = 0xF0833A, + + /// A color described as Off Yellow with a HEX value of #F1F33F. + OffYellow = 0xF1F33F, + + /// A color described as Pale Olive Green with a HEX value of #B1D27B. + PaleOliveGreen = 0xB1D27B, + + /// A color described as Orangish with a HEX value of #FC824A. + Orangish = 0xFC824A, + + /// A color described as Leaf with a HEX value of #71AA34. + Leaf = 0x71AA34, + + /// A color described as Light Blue Grey with a HEX value of #B7C9E2. + LightBlueGrey = 0xB7C9E2, + + /// A color described as Dried Blood with a HEX value of #4B0101. + DriedBlood = 0x4B0101, + + /// A color described as Lightish Purple with a HEX value of #A552E6. + LightishPurple = 0xA552E6, + + /// A color described as Rusty Red with a HEX value of #AF2F0D. + RustyRed = 0xAF2F0D, + + /// A color described as Lavender Blue with a HEX value of #8B88F8. + LavenderBlue = 0x8B88F8, + + /// A color described as Light Grass Green with a HEX value of #9AF764. + LightGrassGreen = 0x9AF764, + + /// A color described as Light Mint Green with a HEX value of #A6FBB2. + LightMintGreen = 0xA6FBB2, + + /// A color described as Sunflower with a HEX value of #FFC512. + Sunflower = 0xFFC512, + + /// A color described as Velvet with a HEX value of #750851. + Velvet = 0x750851, + + /// A color described as Brick Orange with a HEX value of #C14A09. + BrickOrange = 0xC14A09, + + /// A color described as Lightish Red with a HEX value of #FE2F4A. + LightishRed = 0xFE2F4A, + + /// A color described as Pure Blue with a HEX value of #0203E2. + PureBlue = 0x0203E2, + + /// A color described as Twilight Blue with a HEX value of #0A437A. + TwilightBlue = 0x0A437A, + + /// A color described as Violet Red with a HEX value of #A50055. + VioletRed = 0xA50055, + + /// A color described as Yellowy Brown with a HEX value of #AE8B0C. + YellowyBrown = 0xAE8B0C, + + /// A color described as Carnation with a HEX value of #FD798F. + Carnation = 0xFD798F, + + /// A color described as Muddy Yellow with a HEX value of #BFAC05. + MuddyYellow = 0xBFAC05, + + /// A color described as Dark Seafoam Green with a HEX value of #3EAF76. + DarkSeafoamGreen = 0x3EAF76, + + /// A color described as Deep Rose with a HEX value of #C74767. + DeepRose = 0xC74767, + + /// A color described as Dusty Red with a HEX value of #B9484E. + DustyRed = 0xB9484E, + + /// A color described as Grey/Blue with a HEX value of #647D8E. + GreyBlue = 0x647D8E, + + /// A color described as Lemon Lime with a HEX value of #BFFE28. + LemonLime = 0xBFFE28, + + /// A color described as Purple/Pink with a HEX value of #D725DE. + PurplePink = 0xD725DE, + + /// A color described as Brown Yellow with a HEX value of #B29705. + BrownYellow = 0xB29705, + + /// A color described as Purple Brown with a HEX value of #673A3F. + PurpleBrown = 0x673A3F, + + /// A color described as Wisteria with a HEX value of #A87DC2. + Wisteria = 0xA87DC2, + + /// A color described as Banana Yellow with a HEX value of #FAFE4B. + BananaYellow = 0xFAFE4B, + + /// A color described as Lipstick Red with a HEX value of #C0022F. + LipstickRed = 0xC0022F, + + /// A color described as Water Blue with a HEX value of #0E87CC. + WaterBlue = 0x0E87CC, + + /// A color described as Brown Grey with a HEX value of #8D8468. + BrownGrey = 0x8D8468, + + /// A color described as Vibrant Purple with a HEX value of #AD03DE. + VibrantPurple = 0xAD03DE, + + /// A color described as Baby Green with a HEX value of #8CFF9E. + BabyGreen = 0x8CFF9E, + + /// A color described as Barf Green with a HEX value of #94AC02. + BarfGreen = 0x94AC02, + + /// A color described as Eggshell Blue with a HEX value of #C4FFF7. + EggshellBlue = 0xC4FFF7, + + /// A color described as Sandy Yellow with a HEX value of #FDEE73. + SandyYellow = 0xFDEE73, + + /// A color described as Cool Green with a HEX value of #33B864. + CoolGreen = 0x33B864, + + /// A color described as Pale with a HEX value of #FFF9D0. + Pale = 0xFFF9D0, + + /// A color described as Blue/Grey with a HEX value of #758DA3. + BlueGrey = 0x758DA3, + + /// A color described as Hot Magenta with a HEX value of #F504C9. + HotMagenta = 0xF504C9, + + /// A color described as Greyblue with a HEX value of #77A1B5. + Greyblue = 0x77A1B5, + + /// A color described as Purpley with a HEX value of #8756E4. + Purpley = 0x8756E4, + + /// A color described as Baby Shit Green with a HEX value of #889717. + BabyShitGreen = 0x889717, + + /// A color described as Brownish Pink with a HEX value of #C27E79. + BrownishPink = 0xC27E79, + + /// A color described as Dark Aquamarine with a HEX value of #017371. + DarkAquamarine = 0x017371, + + /// A color described as Diarrhea with a HEX value of #9F8303. + Diarrhea = 0x9F8303, + + /// A color described as Light Mustard with a HEX value of #F7D560. + LightMustard = 0xF7D560, + + /// A color described as Pale Sky Blue with a HEX value of #BDF6FE. + PaleSkyBlue = 0xBDF6FE, + + /// A color described as Turtle Green with a HEX value of #75B84F. + TurtleGreen = 0x75B84F, + + /// A color described as Bright Olive with a HEX value of #9CBB04. + BrightOlive = 0x9CBB04, + + /// A color described as Dark Grey Blue with a HEX value of #29465B. + DarkGreyBlue = 0x29465B, + + /// A color described as Greeny Brown with a HEX value of #696006. + GreenyBrown = 0x696006, + + /// A color described as Lemon Green with a HEX value of #ADF802. + LemonGreen = 0xADF802, + + /// A color described as Light Periwinkle with a HEX value of #C1C6FC. + LightPeriwinkle = 0xC1C6FC, + + /// A color described as Seaweed Green with a HEX value of #35AD6B. + SeaweedGreen = 0x35AD6B, + + /// A color described as Sunshine Yellow with a HEX value of #FFFD37. + SunshineYellow = 0xFFFD37, + + /// A color described as Ugly Purple with a HEX value of #A442A0. + UglyPurple = 0xA442A0, + + /// A color described as Medium Pink with a HEX value of #F36196. + MediumPink = 0xF36196, + + /// A color described as Puke Brown with a HEX value of #947706. + PukeBrown = 0x947706, + + /// A color described as Very Light Pink with a HEX value of #FFF4F2. + VeryLightPink = 0xFFF4F2, + + /// A color described as Viridian with a HEX value of #1E9167. + Viridian = 0x1E9167, + + /// A color described as Bile with a HEX value of #B5C306. + Bile = 0xB5C306, + + /// A color described as Faded Yellow with a HEX value of #FEFF7F. + FadedYellow = 0xFEFF7F, + + /// A color described as Very Pale Green with a HEX value of #CFFDBC. + VeryPaleGreen = 0xCFFDBC, + + /// A color described as Vibrant Green with a HEX value of #0ADD08. + VibrantGreen = 0x0ADD08, + + /// A color described as Bright Lime with a HEX value of #87FD05. + BrightLime = 0x87FD05, + + /// A color described as Spearmint with a HEX value of #1EF876. + Spearmint = 0x1EF876, + + /// A color described as Light Aquamarine with a HEX value of #7BFDC7. + LightAquamarine = 0x7BFDC7, + + /// A color described as Light Sage with a HEX value of #BCECAC. + LightSage = 0xBCECAC, + + /// A color described as Yellowgreen with a HEX value of #BBF90F. + Yellowgreen = 0xBBF90F, + + /// A color described as Baby Poo with a HEX value of #AB9004. + BabyPoo = 0xAB9004, + + /// A color described as Dark Seafoam with a HEX value of #1FB57A. + DarkSeafoam = 0x1FB57A, + + /// A color described as Deep Teal with a HEX value of #00555A. + DeepTeal = 0x00555A, + + /// A color described as Heather with a HEX value of #A484AC. + Heather = 0xA484AC, + + /// A color described as Rust Orange with a HEX value of #C45508. + RustOrange = 0xC45508, + + /// A color described as Dirty Blue with a HEX value of #3F829D. + DirtyBlue = 0x3F829D, + + /// A color described as Fern Green with a HEX value of #548D44. + FernGreen = 0x548D44, + + /// A color described as Bright Lilac with a HEX value of #C95EFB. + BrightLilac = 0xC95EFB, + + /// A color described as Weird Green with a HEX value of #3AE57F. + WeirdGreen = 0x3AE57F, + + /// A color described as Peacock Blue with a HEX value of #016795. + PeacockBlue = 0x016795, + + /// A color described as Avocado Green with a HEX value of #87A922. + AvocadoGreen = 0x87A922, + + /// A color described as Faded Orange with a HEX value of #F0944D. + FadedOrange = 0xF0944D, + + /// A color described as Grape Purple with a HEX value of #5D1451. + GrapePurple = 0x5D1451, + + /// A color described as Hot Green with a HEX value of #25FF29. + HotGreen = 0x25FF29, + + /// A color described as Lime Yellow with a HEX value of #D0FE1D. + LimeYellow = 0xD0FE1D, + + /// A color described as Mango with a HEX value of #FFA62B. + Mango = 0xFFA62B, + + /// A color described as Shamrock with a HEX value of #01B44C. + Shamrock = 0x01B44C, + + /// A color described as Bubblegum with a HEX value of #FF6CB5. + Bubblegum = 0xFF6CB5, + + /// A color described as Purplish Brown with a HEX value of #6B4247. + PurplishBrown = 0x6B4247, + + /// A color described as Vomit Yellow with a HEX value of #C7C10C. + VomitYellow = 0xC7C10C, + + /// A color described as Pale Cyan with a HEX value of #B7FFFA. + PaleCyan = 0xB7FFFA, + + /// A color described as Key Lime with a HEX value of #AEFF6E. + KeyLime = 0xAEFF6E, + + /// A color described as Tomato Red with a HEX value of #EC2D01. + TomatoRed = 0xEC2D01, + + /// A color described as Lightgreen with a HEX value of #76FF7B. + Lightgreen = 0x76FF7B, + + /// A color described as Merlot with a HEX value of #730039. + Merlot = 0x730039, + + /// A color described as Night Blue with a HEX value of #040348. + NightBlue = 0x040348, + + /// A color described as Purpleish Pink with a HEX value of #DF4EC8. + PurpleishPink = 0xDF4EC8, + + /// A color described as Apple with a HEX value of #6ECB3C. + Apple = 0x6ECB3C, + + /// A color described as Baby Poop Green with a HEX value of #8F9805. + BabyPoopGreen = 0x8F9805, + + /// A color described as Green Apple with a HEX value of #5EDC1F. + GreenApple = 0x5EDC1F, + + /// A color described as Heliotrope with a HEX value of #D94FF5. + Heliotrope = 0xD94FF5, + + /// A color described as Yellow/Green with a HEX value of #C8FD3D. + YellowGreen = 0xC8FD3D, + + /// A color described as Almost Black with a HEX value of #070D0D. + AlmostBlack = 0x070D0D, + + /// A color described as Cool Blue with a HEX value of #4984B8. + CoolBlue = 0x4984B8, + + /// A color described as Leafy Green with a HEX value of #51B73B. + LeafyGreen = 0x51B73B, + + /// A color described as Mustard Brown with a HEX value of #AC7E04. + MustardBrown = 0xAC7E04, + + /// A color described as Dusk with a HEX value of #4E5481. + Dusk = 0x4E5481, + + /// A color described as Dull Brown with a HEX value of #876E4B. + DullBrown = 0x876E4B, + + /// A color described as Frog Green with a HEX value of #58BC08. + FrogGreen = 0x58BC08, + + /// A color described as Vivid Green with a HEX value of #2FEF10. + VividGreen = 0x2FEF10, + + /// A color described as Bright Light Green with a HEX value of #2DFE54. + BrightLightGreen = 0x2DFE54, + + /// A color described as Fluro Green with a HEX value of #0AFF02. + FluroGreen = 0x0AFF02, + + /// A color described as Kiwi with a HEX value of #9CEF43. + Kiwi = 0x9CEF43, + + /// A color described as Seaweed with a HEX value of #18D17B. + Seaweed = 0x18D17B, + + /// A color described as Navy Green with a HEX value of #35530A. + NavyGreen = 0x35530A, + + /// A color described as Ultramarine Blue with a HEX value of #1805DB. + UltramarineBlue = 0x1805DB, + + /// A color described as Iris with a HEX value of #6258C4. + Iris = 0x6258C4, + + /// A color described as Pastel Orange with a HEX value of #FF964F. + PastelOrange = 0xFF964F, + + /// A color described as Yellowish Orange with a HEX value of #FFAB0F. + YellowishOrange = 0xFFAB0F, + + /// A color described as Perrywinkle with a HEX value of #8F8CE7. + Perrywinkle = 0x8F8CE7, + + /// A color described as Tealish with a HEX value of #24BCA8. + Tealish = 0x24BCA8, + + /// A color described as Dark Plum with a HEX value of #3F012C. + DarkPlum = 0x3F012C, + + /// A color described as Pear with a HEX value of #CBF85F. + Pear = 0xCBF85F, + + /// A color described as Pinkish Orange with a HEX value of #FF724C. + PinkishOrange = 0xFF724C, + + /// A color described as Midnight Purple with a HEX value of #280137. + MidnightPurple = 0x280137, + + /// A color described as Light Urple with a HEX value of #B36FF6. + LightUrple = 0xB36FF6, + + /// A color described as Dark Mint with a HEX value of #48C072. + DarkMint = 0x48C072, + + /// A color described as Greenish Tan with a HEX value of #BCCB7A. + GreenishTan = 0xBCCB7A, + + /// A color described as Light Burgundy with a HEX value of #A8415B. + LightBurgundy = 0xA8415B, + + /// A color described as Turquoise Blue with a HEX value of #06B1C4. + TurquoiseBlue = 0x06B1C4, + + /// A color described as Ugly Pink with a HEX value of #CD7584. + UglyPink = 0xCD7584, + + /// A color described as Sandy with a HEX value of #F1DA7A. + Sandy = 0xF1DA7A, + + /// A color described as Electric Pink with a HEX value of #FF0490. + ElectricPink = 0xFF0490, + + /// A color described as Muted Purple with a HEX value of #805B87. + MutedPurple = 0x805B87, + + /// A color described as Mid Green with a HEX value of #50A747. + MidGreen = 0x50A747, + + /// A color described as Greyish with a HEX value of #A8A495. + Greyish = 0xA8A495, + + /// A color described as Neon Yellow with a HEX value of #CFFF04. + NeonYellow = 0xCFFF04, + + /// A color described as Banana with a HEX value of #FFFF7E. + Banana = 0xFFFF7E, + + /// A color described as Carnation Pink with a HEX value of #FF7FA7. + CarnationPink = 0xFF7FA7, + + /// A color described as Tomato with a HEX value of #EF4026. + Tomato = 0xEF4026, + + /// A color described as Sea with a HEX value of #3C9992. + Sea = 0x3C9992, + + /// A color described as Muddy Brown with a HEX value of #886806. + MuddyBrown = 0x886806, + + /// A color described as Turquoise Green with a HEX value of #04F489. + TurquoiseGreen = 0x04F489, + + /// A color described as Buff with a HEX value of #FEF69E. + Buff = 0xFEF69E, + + /// A color described as Fawn with a HEX value of #CFAF7B. + Fawn = 0xCFAF7B, + + /// A color described as Muted Blue with a HEX value of #3B719F. + MutedBlue = 0x3B719F, + + /// A color described as Pale Rose with a HEX value of #FDC1C5. + PaleRose = 0xFDC1C5, + + /// A color described as Dark Mint Green with a HEX value of #20C073. + DarkMintGreen = 0x20C073, + + /// A color described as Amethyst with a HEX value of #9B5FC0. + Amethyst = 0x9B5FC0, + + /// A color described as Blue/Green with a HEX value of #0F9B8E. + BlueGreen = 0x0F9B8E, + + /// A color described as Chestnut with a HEX value of #742802. + Chestnut = 0x742802, + + /// A color described as Sick Green with a HEX value of #9DB92C. + SickGreen = 0x9DB92C, + + /// A color described as Pea with a HEX value of #A4BF20. + Pea = 0xA4BF20, + + /// A color described as Rusty Orange with a HEX value of #CD5909. + RustyOrange = 0xCD5909, + + /// A color described as Stone with a HEX value of #ADA587. + Stone = 0xADA587, + + /// A color described as Rose Red with a HEX value of #BE013C. + RoseRed = 0xBE013C, + + /// A color described as Pale Aqua with a HEX value of #B8FFEB. + PaleAqua = 0xB8FFEB, + + /// A color described as Deep Orange with a HEX value of #DC4D01. + DeepOrange = 0xDC4D01, + + /// A color described as Earth with a HEX value of #A2653E. + Earth = 0xA2653E, + + /// A color described as Mossy Green with a HEX value of #638B27. + MossyGreen = 0x638B27, + + /// A color described as Grassy Green with a HEX value of #419C03. + GrassyGreen = 0x419C03, + + /// A color described as Pale Lime Green with a HEX value of #B1FF65. + PaleLimeGreen = 0xB1FF65, + + /// A color described as Light Grey Blue with a HEX value of #9DBCD4. + LightGreyBlue = 0x9DBCD4, + + /// A color described as Pale Grey with a HEX value of #FDFDFE. + PaleGrey = 0xFDFDFE, + + /// A color described as Asparagus with a HEX value of #77AB56. + Asparagus = 0x77AB56, + + /// A color described as Blueberry with a HEX value of #464196. + Blueberry = 0x464196, + + /// A color described as Purple Red with a HEX value of #990147. + PurpleRed = 0x990147, + + /// A color described as Pale Lime with a HEX value of #BEFD73. + PaleLime = 0xBEFD73, + + /// A color described as Greenish Teal with a HEX value of #32BF84. + GreenishTeal = 0x32BF84, + + /// A color described as Caramel with a HEX value of #AF6F09. + Caramel = 0xAF6F09, + + /// A color described as Deep Magenta with a HEX value of #A0025C. + DeepMagenta = 0xA0025C, + + /// A color described as Light Peach with a HEX value of #FFD8B1. + LightPeach = 0xFFD8B1, + + /// A color described as Milk Chocolate with a HEX value of #7F4E1E. + MilkChocolate = 0x7F4E1E, + + /// A color described as Ocher with a HEX value of #BF9B0C. + Ocher = 0xBF9B0C, + + /// A color described as Off Green with a HEX value of #6BA353. + OffGreen = 0x6BA353, + + /// A color described as Purply Pink with a HEX value of #F075E6. + PurplyPink = 0xF075E6, + + /// A color described as Lightblue with a HEX value of #7BC8F6. + Lightblue = 0x7BC8F6, + + /// A color described as Dusky Blue with a HEX value of #475F94. + DuskyBlue = 0x475F94, + + /// A color described as Golden with a HEX value of #F5BF03. + Golden = 0xF5BF03, + + /// A color described as Light Beige with a HEX value of #FFFEB6. + LightBeige = 0xFFFEB6, + + /// A color described as Butter Yellow with a HEX value of #FFFD74. + ButterYellow = 0xFFFD74, + + /// A color described as Dusky Purple with a HEX value of #895B7B. + DuskyPurple = 0x895B7B, + + /// A color described as French Blue with a HEX value of #436BAD. + FrenchBlue = 0x436BAD, + + /// A color described as Ugly Yellow with a HEX value of #D0C101. + UglyYellow = 0xD0C101, + + /// A color described as Greeny Yellow with a HEX value of #C6F808. + GreenyYellow = 0xC6F808, + + /// A color described as Orangish Red with a HEX value of #F43605. + OrangishRed = 0xF43605, + + /// A color described as Shamrock Green with a HEX value of #02C14D. + ShamrockGreen = 0x02C14D, + + /// A color described as Orangish Brown with a HEX value of #B25F03. + OrangishBrown = 0xB25F03, + + /// A color described as Tree Green with a HEX value of #2A7E19. + TreeGreen = 0x2A7E19, + + /// A color described as Deep Violet with a HEX value of #490648. + DeepViolet = 0x490648, + + /// A color described as Gunmetal with a HEX value of #536267. + Gunmetal = 0x536267, + + /// A color described as Blue/Purple with a HEX value of #5A06EF. + BluePurple = 0x5A06EF, + + /// A color described as Cherry with a HEX value of #CF0234. + Cherry = 0xCF0234, + + /// A color described as Sandy Brown with a HEX value of #C4A661. + SandyBrown = 0xC4A661, + + /// A color described as Warm Grey with a HEX value of #978A84. + WarmGrey = 0x978A84, + + /// A color described as Dark Indigo with a HEX value of #1F0954. + DarkIndigo = 0x1F0954, + + /// A color described as Midnight with a HEX value of #03012D. + Midnight = 0x03012D, + + /// A color described as Bluey Green with a HEX value of #2BB179. + BlueyGreen = 0x2BB179, + + /// A color described as Grey Pink with a HEX value of #C3909B. + GreyPink = 0xC3909B, + + /// A color described as Soft Purple with a HEX value of #A66FB5. + SoftPurple = 0xA66FB5, + + /// A color described as Blood with a HEX value of #770001. + Blood = 0x770001, + + /// A color described as Brown Red with a HEX value of #922B05. + BrownRed = 0x922B05, + + /// A color described as Medium Grey with a HEX value of #7D7F7C. + MediumGrey = 0x7D7F7C, + + /// A color described as Berry with a HEX value of #990F4B. + Berry = 0x990F4B, + + /// A color described as Poo with a HEX value of #8F7303. + Poo = 0x8F7303, + + /// A color described as Purpley Pink with a HEX value of #C83CB9. + PurpleyPink = 0xC83CB9, + + /// A color described as Light Salmon with a HEX value of #FEA993. + LightSalmon = 0xFEA993, + + /// A color described as Snot with a HEX value of #ACBB0D. + Snot = 0xACBB0D, + + /// A color described as Easter Purple with a HEX value of #C071FE. + EasterPurple = 0xC071FE, + + /// A color described as Light Yellow Green with a HEX value of #CCFD7F. + LightYellowGreen = 0xCCFD7F, + + /// A color described as Dark Navy Blue with a HEX value of #00022E. + DarkNavyBlue = 0x00022E, + + /// A color described as Drab with a HEX value of #828344. + Drab = 0x828344, + + /// A color described as Light Rose with a HEX value of #FFC5CB. + LightRose = 0xFFC5CB, + + /// A color described as Rouge with a HEX value of #AB1239. + Rouge = 0xAB1239, + + /// A color described as Purplish Red with a HEX value of #B0054B. + PurplishRed = 0xB0054B, + + /// A color described as Slime Green with a HEX value of #99CC04. + SlimeGreen = 0x99CC04, + + /// A color described as Baby Poop with a HEX value of #937C00. + BabyPoop = 0x937C00, + + /// A color described as Irish Green with a HEX value of #019529. + IrishGreen = 0x019529, + + /// A color described as Pink/Purple with a HEX value of #EF1DE7. + PinkPurple = 0xEF1DE7, + + /// A color described as Dark Navy with a HEX value of #000435. + DarkNavy = 0x000435, + + /// A color described as Greeny Blue with a HEX value of #42B395. + GreenyBlue = 0x42B395, + + /// A color described as Light Plum with a HEX value of #9D5783. + LightPlum = 0x9D5783, + + /// A color described as Pinkish Grey with a HEX value of #C8ACA9. + PinkishGrey = 0xC8ACA9, + + /// A color described as Dirty Orange with a HEX value of #C87606. + DirtyOrange = 0xC87606, + + /// A color described as Rust Red with a HEX value of #AA2704. + RustRed = 0xAA2704, + + /// A color described as Pale Lilac with a HEX value of #E4CBFF. + PaleLilac = 0xE4CBFF, + + /// A color described as Orangey Red with a HEX value of #FA4224. + OrangeyRed = 0xFA4224, + + /// A color described as Primary Blue with a HEX value of #0804F9. + PrimaryBlue = 0x0804F9, + + /// A color described as Kermit Green with a HEX value of #5CB200. + KermitGreen = 0x5CB200, + + /// A color described as Brownish Purple with a HEX value of #76424E. + BrownishPurple = 0x76424E, + + /// A color described as Murky Green with a HEX value of #6C7A0E. + MurkyGreen = 0x6C7A0E, + + /// A color described as Wheat with a HEX value of #FBDD7E. + Wheat = 0xFBDD7E, + + /// A color described as Very Dark Purple with a HEX value of #2A0134. + VeryDarkPurple = 0x2A0134, + + /// A color described as Bottle Green with a HEX value of #044A05. + BottleGreen = 0x044A05, + + /// A color described as Watermelon with a HEX value of #FD4659. + Watermelon = 0xFD4659, + + /// A color described as Deep Sky Blue with a HEX value of #0D75F8. + DeepSkyBlue = 0x0D75F8, + + /// A color described as Fire Engine Red with a HEX value of #FE0002. + FireEngineRed = 0xFE0002, + + /// A color described as Yellow Ochre with a HEX value of #CB9D06. + YellowOchre = 0xCB9D06, + + /// A color described as Pumpkin Orange with a HEX value of #FB7D07. + PumpkinOrange = 0xFB7D07, + + /// A color described as Pale Olive with a HEX value of #B9CC81. + PaleOlive = 0xB9CC81, + + /// A color described as Light Lilac with a HEX value of #EDC8FF. + LightLilac = 0xEDC8FF, + + /// A color described as Lightish Green with a HEX value of #61E160. + LightishGreen = 0x61E160, + + /// A color described as Carolina Blue with a HEX value of #8AB8FE. + CarolinaBlue = 0x8AB8FE, + + /// A color described as Mulberry with a HEX value of #920A4E. + Mulberry = 0x920A4E, + + /// A color described as Shocking Pink with a HEX value of #FE02A2. + ShockingPink = 0xFE02A2, + + /// A color described as Auburn with a HEX value of #9A3001. + Auburn = 0x9A3001, + + /// A color described as Bright Lime Green with a HEX value of #65FE08. + BrightLimeGreen = 0x65FE08, + + /// A color described as Celadon with a HEX value of #BEFDB7. + Celadon = 0xBEFDB7, + + /// A color described as Pinkish Brown with a HEX value of #B17261. + PinkishBrown = 0xB17261, + + /// A color described as Poo Brown with a HEX value of #885F01. + PooBrown = 0x885F01, + + /// A color described as Bright Sky Blue with a HEX value of #02CCFE. + BrightSkyBlue = 0x02CCFE, + + /// A color described as Celery with a HEX value of #C1FD95. + Celery = 0xC1FD95, + + /// A color described as Dirt Brown with a HEX value of #836539. + DirtBrown = 0x836539, + + /// A color described as Strawberry with a HEX value of #FB2943. + Strawberry = 0xFB2943, + + /// A color described as Dark Lime with a HEX value of #84B701. + DarkLime = 0x84B701, + + /// A color described as Copper with a HEX value of #B66325. + Copper = 0xB66325, + + /// A color described as Medium Brown with a HEX value of #7F5112. + MediumBrown = 0x7F5112, + + /// A color described as Muted Green with a HEX value of #5FA052. + MutedGreen = 0x5FA052, + + /// A color described as Robin'S Egg with a HEX value of #6DEDFD. + RobinsEgg = 0x6DEDFD, + + /// A color described as Bright Aqua with a HEX value of #0BF9EA. + BrightAqua = 0x0BF9EA, + + /// A color described as Bright Lavender with a HEX value of #C760FF. + BrightLavender = 0xC760FF, + + /// A color described as Ivory with a HEX value of #FFFFCB. + Ivory = 0xFFFFCB, + + /// A color described as Very Light Purple with a HEX value of #F6CEFC. + VeryLightPurple = 0xF6CEFC, + + /// A color described as Light Navy with a HEX value of #155084. + LightNavy = 0x155084, + + /// A color described as Pink Red with a HEX value of #F5054F. + PinkRed = 0xF5054F, + + /// A color described as Olive Brown with a HEX value of #645403. + OliveBrown = 0x645403, + + /// A color described as Poop Brown with a HEX value of #7A5901. + PoopBrown = 0x7A5901, + + /// A color described as Mustard Green with a HEX value of #A8B504. + MustardGreen = 0xA8B504, + + /// A color described as Ocean Green with a HEX value of #3D9973. + OceanGreen = 0x3D9973, + + /// A color described as Very Dark Blue with a HEX value of #000133. + VeryDarkBlue = 0x000133, + + /// A color described as Dusty Green with a HEX value of #76A973. + DustyGreen = 0x76A973, + + /// A color described as Light Navy Blue with a HEX value of #2E5A88. + LightNavyBlue = 0x2E5A88, + + /// A color described as Minty Green with a HEX value of #0BF77D. + MintyGreen = 0x0BF77D, + + /// A color described as Adobe with a HEX value of #BD6C48. + Adobe = 0xBD6C48, + + /// A color described as Barney with a HEX value of #AC1DB8. + Barney = 0xAC1DB8, + + /// A color described as Jade Green with a HEX value of #2BAF6A. + JadeGreen = 0x2BAF6A, + + /// A color described as Bright Light Blue with a HEX value of #26F7FD. + BrightLightBlue = 0x26F7FD, + + /// A color described as Light Lime with a HEX value of #AEFD6C. + LightLime = 0xAEFD6C, + + /// A color described as Dark Khaki with a HEX value of #9B8F55. + DarkKhaki = 0x9B8F55, + + /// A color described as Orange Yellow with a HEX value of #FFAD01. + OrangeYellow = 0xFFAD01, + + /// A color described as Ocre with a HEX value of #C69C04. + Ocre = 0xC69C04, + + /// A color described as Maize with a HEX value of #F4D054. + Maize = 0xF4D054, + + /// A color described as Faded Pink with a HEX value of #DE9DAC. + FadedPink = 0xDE9DAC, + + /// A color described as British Racing Green with a HEX value of #05480D. + BritishRacingGreen = 0x05480D, + + /// A color described as Sandstone with a HEX value of #C9AE74. + Sandstone = 0xC9AE74, + + /// A color described as Mud Brown with a HEX value of #60460F. + MudBrown = 0x60460F, + + /// A color described as Light Sea Green with a HEX value of #98F6B0. + LightSeaGreen = 0x98F6B0, + + /// A color described as Robin Egg Blue with a HEX value of #8AF1FE. + RobinEggBlue = 0x8AF1FE, + + /// A color described as Aqua Marine with a HEX value of #2EE8BB. + AquaMarine = 0x2EE8BB, + + /// A color described as Dark Sea Green with a HEX value of #11875D. + DarkSeaGreen = 0x11875D, + + /// A color described as Soft Pink with a HEX value of #FDB0C0. + SoftPink = 0xFDB0C0, + + /// A color described as Orangey Brown with a HEX value of #B16002. + OrangeyBrown = 0xB16002, + + /// A color described as Cherry Red with a HEX value of #F7022A. + CherryRed = 0xF7022A, + + /// A color described as Burnt Yellow with a HEX value of #D5AB09. + BurntYellow = 0xD5AB09, + + /// A color described as Brownish Grey with a HEX value of #86775F. + BrownishGrey = 0x86775F, + + /// A color described as Camel with a HEX value of #C69F59. + Camel = 0xC69F59, + + /// A color described as Purplish Grey with a HEX value of #7A687F. + PurplishGrey = 0x7A687F, + + /// A color described as Marine with a HEX value of #042E60. + Marine = 0x042E60, + + /// A color described as Greyish Pink with a HEX value of #C88D94. + GreyishPink = 0xC88D94, + + /// A color described as Pale Turquoise with a HEX value of #A5FBD5. + PaleTurquoise = 0xA5FBD5, + + /// A color described as Pastel Yellow with a HEX value of #FFFE71. + PastelYellow = 0xFFFE71, + + /// A color described as Bluey Purple with a HEX value of #6241C7. + BlueyPurple = 0x6241C7, + + /// A color described as Canary Yellow with a HEX value of #FFFE40. + CanaryYellow = 0xFFFE40, + + /// A color described as Faded Red with a HEX value of #D3494E. + FadedRed = 0xD3494E, + + /// A color described as Sepia with a HEX value of #985E2B. + Sepia = 0x985E2B, + + /// A color described as Coffee with a HEX value of #A6814C. + Coffee = 0xA6814C, + + /// A color described as Bright Magenta with a HEX value of #FF08E8. + BrightMagenta = 0xFF08E8, + + /// A color described as Mocha with a HEX value of #9D7651. + Mocha = 0x9D7651, + + /// A color described as Ecru with a HEX value of #FEFFCA. + Ecru = 0xFEFFCA, + + /// A color described as Purpleish with a HEX value of #98568D. + Purpleish = 0x98568D, + + /// A color described as Cranberry with a HEX value of #9E003A. + Cranberry = 0x9E003A, + + /// A color described as Darkish Green with a HEX value of #287C37. + DarkishGreen = 0x287C37, + + /// A color described as Brown Orange with a HEX value of #B96902. + BrownOrange = 0xB96902, + + /// A color described as Dusky Rose with a HEX value of #BA6873. + DuskyRose = 0xBA6873, + + /// A color described as Melon with a HEX value of #FF7855. + Melon = 0xFF7855, + + /// A color described as Sickly Green with a HEX value of #94B21C. + SicklyGreen = 0x94B21C, + + /// A color described as Silver with a HEX value of #C5C9C7. + Silver = 0xC5C9C7, + + /// A color described as Purply Blue with a HEX value of #661AEE. + PurplyBlue = 0x661AEE, + + /// A color described as Purpleish Blue with a HEX value of #6140EF. + PurpleishBlue = 0x6140EF, + + /// A color described as Hospital Green with a HEX value of #9BE5AA. + HospitalGreen = 0x9BE5AA, + + /// A color described as Shit Brown with a HEX value of #7B5804. + ShitBrown = 0x7B5804, + + /// A color described as Mid Blue with a HEX value of #276AB3. + MidBlue = 0x276AB3, + + /// A color described as Amber with a HEX value of #FEB308. + Amber = 0xFEB308, + + /// A color described as Easter Green with a HEX value of #8CFD7E. + EasterGreen = 0x8CFD7E, + + /// A color described as Soft Blue with a HEX value of #6488EA. + SoftBlue = 0x6488EA, + + /// A color described as Cerulean Blue with a HEX value of #056EEE. + CeruleanBlue = 0x056EEE, + + /// A color described as Golden Brown with a HEX value of #B27A01. + GoldenBrown = 0xB27A01, + + /// A color described as Bright Turquoise with a HEX value of #0FFEF9. + BrightTurquoise = 0x0FFEF9, + + /// A color described as Red Pink with a HEX value of #FA2A55. + RedPink = 0xFA2A55, + + /// A color described as Red Purple with a HEX value of #820747. + RedPurple = 0x820747, + + /// A color described as Greyish Brown with a HEX value of #7A6A4F. + GreyishBrown = 0x7A6A4F, + + /// A color described as Vermillion with a HEX value of #F4320C. + Vermillion = 0xF4320C, + + /// A color described as Russet with a HEX value of #A13905. + Russet = 0xA13905, + + /// A color described as Steel Grey with a HEX value of #6F828A. + SteelGrey = 0x6F828A, + + /// A color described as Lighter Purple with a HEX value of #A55AF4. + LighterPurple = 0xA55AF4, + + /// A color described as Bright Violet with a HEX value of #AD0AFD. + BrightViolet = 0xAD0AFD, + + /// A color described as Prussian Blue with a HEX value of #004577. + PrussianBlue = 0x004577, + + /// A color described as Slate Green with a HEX value of #658D6D. + SlateGreen = 0x658D6D, + + /// A color described as Dirty Pink with a HEX value of #CA7B80. + DirtyPink = 0xCA7B80, + + /// A color described as Dark Blue Green with a HEX value of #005249. + DarkBlueGreen = 0x005249, + + /// A color described as Pine with a HEX value of #2B5D34. + Pine = 0x2B5D34, + + /// A color described as Yellowy Green with a HEX value of #BFF128. + YellowyGreen = 0xBFF128, + + /// A color described as Dark Gold with a HEX value of #B59410. + DarkGold = 0xB59410, + + /// A color described as Bluish with a HEX value of #2976BB. + Bluish = 0x2976BB, + + /// A color described as Darkish Blue with a HEX value of #014182. + DarkishBlue = 0x014182, + + /// A color described as Dull Red with a HEX value of #BB3F3F. + DullRed = 0xBB3F3F, + + /// A color described as Pinky Red with a HEX value of #FC2647. + PinkyRed = 0xFC2647, + + /// A color described as Bronze with a HEX value of #A87900. + Bronze = 0xA87900, + + /// A color described as Pale Teal with a HEX value of #82CBB2. + PaleTeal = 0x82CBB2, + + /// A color described as Military Green with a HEX value of #667C3E. + MilitaryGreen = 0x667C3E, + + /// A color described as Barbie Pink with a HEX value of #FE46A5. + BarbiePink = 0xFE46A5, + + /// A color described as Bubblegum Pink with a HEX value of #FE83CC. + BubblegumPink = 0xFE83CC, + + /// A color described as Pea Soup Green with a HEX value of #94A617. + PeaSoupGreen = 0x94A617, + + /// A color described as Dark Mustard with a HEX value of #A88905. + DarkMustard = 0xA88905, + + /// A color described as Shit with a HEX value of #7F5F00. + Shit = 0x7F5F00, + + /// A color described as Medium Purple with a HEX value of #9E43A2. + MediumPurple = 0x9E43A2, + + /// A color described as Very Dark Green with a HEX value of #062E03. + VeryDarkGreen = 0x062E03, + + /// A color described as Dirt with a HEX value of #8A6E45. + Dirt = 0x8A6E45, + + /// A color described as Dusky Pink with a HEX value of #CC7A8B. + DuskyPink = 0xCC7A8B, + + /// A color described as Red Violet with a HEX value of #9E0168. + RedViolet = 0x9E0168, + + /// A color described as Lemon Yellow with a HEX value of #FDFF38. + LemonYellow = 0xFDFF38, + + /// A color described as Pistachio with a HEX value of #C0FA8B. + Pistachio = 0xC0FA8B, + + /// A color described as Dull Yellow with a HEX value of #EEDC5B. + DullYellow = 0xEEDC5B, + + /// A color described as Dark Lime Green with a HEX value of #7EBD01. + DarkLimeGreen = 0x7EBD01, + + /// A color described as Denim Blue with a HEX value of #3B5B92. + DenimBlue = 0x3B5B92, + + /// A color described as Teal Blue with a HEX value of #01889F. + TealBlue = 0x01889F, + + /// A color described as Lightish Blue with a HEX value of #3D7AFD. + LightishBlue = 0x3D7AFD, + + /// A color described as Purpley Blue with a HEX value of #5F34E7. + PurpleyBlue = 0x5F34E7, + + /// A color described as Light Indigo with a HEX value of #6D5ACF. + LightIndigo = 0x6D5ACF, + + /// A color described as Swamp Green with a HEX value of #748500. + SwampGreen = 0x748500, + + /// A color described as Brown Green with a HEX value of #706C11. + BrownGreen = 0x706C11, + + /// A color described as Dark Maroon with a HEX value of #3C0008. + DarkMaroon = 0x3C0008, + + /// A color described as Hot Purple with a HEX value of #CB00F5. + HotPurple = 0xCB00F5, + + /// A color described as Dark Forest Green with a HEX value of #002D04. + DarkForestGreen = 0x002D04, + + /// A color described as Faded Blue with a HEX value of #658CBB. + FadedBlue = 0x658CBB, + + /// A color described as Drab Green with a HEX value of #749551. + DrabGreen = 0x749551, + + /// A color described as Light Lime Green with a HEX value of #B9FF66. + LightLimeGreen = 0xB9FF66, + + /// A color described as Snot Green with a HEX value of #9DC100. + SnotGreen = 0x9DC100, + + /// A color described as Yellowish with a HEX value of #FAEE66. + Yellowish = 0xFAEE66, + + /// A color described as Light Blue Green with a HEX value of #7EFBB3. + LightBlueGreen = 0x7EFBB3, + + /// A color described as Bordeaux with a HEX value of #7B002C. + Bordeaux = 0x7B002C, + + /// A color described as Light Mauve with a HEX value of #C292A1. + LightMauve = 0xC292A1, + + /// A color described as Ocean with a HEX value of #017B92. + Ocean = 0x017B92, + + /// A color described as Marigold with a HEX value of #FCC006. + Marigold = 0xFCC006, + + /// A color described as Muddy Green with a HEX value of #657432. + MuddyGreen = 0x657432, + + /// A color described as Dull Orange with a HEX value of #D8863B. + DullOrange = 0xD8863B, + + /// A color described as Steel with a HEX value of #738595. + Steel = 0x738595, + + /// A color described as Electric Purple with a HEX value of #AA23FF. + ElectricPurple = 0xAA23FF, + + /// A color described as Fluorescent Green with a HEX value of #08FF08. + FluorescentGreen = 0x08FF08, + + /// A color described as Yellowish Brown with a HEX value of #9B7A01. + YellowishBrown = 0x9B7A01, + + /// A color described as Blush with a HEX value of #F29E8E. + Blush = 0xF29E8E, + + /// A color described as Soft Green with a HEX value of #6FC276. + SoftGreen = 0x6FC276, + + /// A color described as Bright Orange with a HEX value of #FF5B00. + BrightOrange = 0xFF5B00, + + /// A color described as Lemon with a HEX value of #FDFF52. + Lemon = 0xFDFF52, + + /// A color described as Purple Grey with a HEX value of #866F85. + PurpleGrey = 0x866F85, + + /// A color described as Acid Green with a HEX value of #8FFE09. + AcidGreen = 0x8FFE09, + + /// A color described as Pale Lavender with a HEX value of #EECFFE. + PaleLavender = 0xEECFFE, + + /// A color described as Violet Blue with a HEX value of #510AC9. + VioletBlue = 0x510AC9, + + /// A color described as Light Forest Green with a HEX value of #4F9153. + LightForestGreen = 0x4F9153, + + /// A color described as Burnt Red with a HEX value of #9F2305. + BurntRed = 0x9F2305, + + /// A color described as Khaki Green with a HEX value of #728639. + KhakiGreen = 0x728639, + + /// A color described as Cerise with a HEX value of #DE0C62. + Cerise = 0xDE0C62, + + /// A color described as Faded Purple with a HEX value of #916E99. + FadedPurple = 0x916E99, + + /// A color described as Apricot with a HEX value of #FFB16D. + Apricot = 0xFFB16D, + + /// A color described as Dark Olive Green with a HEX value of #3C4D03. + DarkOliveGreen = 0x3C4D03, + + /// A color described as Grey Brown with a HEX value of #7F7053. + GreyBrown = 0x7F7053, + + /// A color described as Green Grey with a HEX value of #77926F. + GreenGrey = 0x77926F, + + /// A color described as True Blue with a HEX value of #010FCC. + TrueBlue = 0x010FCC, + + /// A color described as Pale Violet with a HEX value of #CEAEFA. + PaleViolet = 0xCEAEFA, + + /// A color described as Periwinkle Blue with a HEX value of #8F99FB. + PeriwinkleBlue = 0x8F99FB, + + /// A color described as Light Sky Blue with a HEX value of #C6FCFF. + LightSkyBlue = 0xC6FCFF, + + /// A color described as Blurple with a HEX value of #5539CC. + Blurple = 0x5539CC, + + /// A color described as Green Brown with a HEX value of #544E03. + GreenBrown = 0x544E03, + + /// A color described as Bluegreen with a HEX value of #017A79. + Bluegreen = 0x017A79, + + /// A color described as Bright Teal with a HEX value of #01F9C6. + BrightTeal = 0x01F9C6, + + /// A color described as Brownish Yellow with a HEX value of #C9B003. + BrownishYellow = 0xC9B003, + + /// A color described as Pea Soup with a HEX value of #929901. + PeaSoup = 0x929901, + + /// A color described as Forest with a HEX value of #0B5509. + Forest = 0x0B5509, + + /// A color described as Barney Purple with a HEX value of #A00498. + BarneyPurple = 0xA00498, + + /// A color described as Ultramarine with a HEX value of #2000B1. + Ultramarine = 0x2000B1, + + /// A color described as Purplish with a HEX value of #94568C. + Purplish = 0x94568C, + + /// A color described as Puke Yellow with a HEX value of #C2BE0E. + PukeYellow = 0xC2BE0E, + + /// A color described as Bluish Grey with a HEX value of #748B97. + BluishGrey = 0x748B97, + + /// A color described as Dark Periwinkle with a HEX value of #665FD1. + DarkPeriwinkle = 0x665FD1, + + /// A color described as Dark Lilac with a HEX value of #9C6DA5. + DarkLilac = 0x9C6DA5, + + /// A color described as Reddish with a HEX value of #C44240. + Reddish = 0xC44240, + + /// A color described as Light Maroon with a HEX value of #A24857. + LightMaroon = 0xA24857, + + /// A color described as Dusty Purple with a HEX value of #825F87. + DustyPurple = 0x825F87, + + /// A color described as Terra Cotta with a HEX value of #C9643B. + TerraCotta = 0xC9643B, + + /// A color described as Avocado with a HEX value of #90B134. + Avocado = 0x90B134, + + /// A color described as Marine Blue with a HEX value of #01386A. + MarineBlue = 0x01386A, + + /// A color described as Teal Green with a HEX value of #25A36F. + TealGreen = 0x25A36F, + + /// A color described as Slate Grey with a HEX value of #59656D. + SlateGrey = 0x59656D, + + /// A color described as Lighter Green with a HEX value of #75FD63. + LighterGreen = 0x75FD63, + + /// A color described as Electric Green with a HEX value of #21FC0D. + ElectricGreen = 0x21FC0D, + + /// A color described as Dusty Blue with a HEX value of #5A86AD. + DustyBlue = 0x5A86AD, + + /// A color described as Golden Yellow with a HEX value of #FEC615. + GoldenYellow = 0xFEC615, + + /// A color described as Bright Yellow with a HEX value of #FFFD01. + BrightYellow = 0xFFFD01, + + /// A color described as Light Lavender with a HEX value of #DFC5FE. + LightLavender = 0xDFC5FE, + + /// A color described as Umber with a HEX value of #B26400. + Umber = 0xB26400, + + /// A color described as Poop with a HEX value of #7F5E00. + Poop = 0x7F5E00, + + /// A color described as Dark Peach with a HEX value of #DE7E5D. + DarkPeach = 0xDE7E5D, + + /// A color described as Jungle Green with a HEX value of #048243. + JungleGreen = 0x048243, + + /// A color described as Eggshell with a HEX value of #FFFFD4. + Eggshell = 0xFFFFD4, + + /// A color described as Denim with a HEX value of #3B638C. + Denim = 0x3B638C, + + /// A color described as Yellow Brown with a HEX value of #B79400. + YellowBrown = 0xB79400, + + /// A color described as Dull Purple with a HEX value of #84597E. + DullPurple = 0x84597E, + + /// A color described as Chocolate Brown with a HEX value of #411900. + ChocolateBrown = 0x411900, + + /// A color described as Wine Red with a HEX value of #7B0323. + WineRed = 0x7B0323, + + /// A color described as Neon Blue with a HEX value of #04D9FF. + NeonBlue = 0x04D9FF, + + /// A color described as Dirty Green with a HEX value of #667E2C. + DirtyGreen = 0x667E2C, + + /// A color described as Light Tan with a HEX value of #FBEEAC. + LightTan = 0xFBEEAC, + + /// A color described as Ice Blue with a HEX value of #D7FFFE. + IceBlue = 0xD7FFFE, + + /// A color described as Cadet Blue with a HEX value of #4E7496. + CadetBlue = 0x4E7496, + + /// A color described as Dark Mauve with a HEX value of #874C62. + DarkMauve = 0x874C62, + + /// A color described as Very Light Blue with a HEX value of #D5FFFF. + VeryLightBlue = 0xD5FFFF, + + /// A color described as Grey Purple with a HEX value of #826D8C. + GreyPurple = 0x826D8C, + + /// A color described as Pastel Pink with a HEX value of #FFBACD. + PastelPink = 0xFFBACD, + + /// A color described as Very Light Green with a HEX value of #D1FFBD. + VeryLightGreen = 0xD1FFBD, + + /// A color described as Dark Sky Blue with a HEX value of #448EE4. + DarkSkyBlue = 0x448EE4, + + /// A color described as Evergreen with a HEX value of #05472A. + Evergreen = 0x05472A, + + /// A color described as Dull Pink with a HEX value of #D5869D. + DullPink = 0xD5869D, + + /// A color described as Aubergine with a HEX value of #3D0734. + Aubergine = 0x3D0734, + + /// A color described as Mahogany with a HEX value of #4A0100. + Mahogany = 0x4A0100, + + /// A color described as Reddish Orange with a HEX value of #F8481C. + ReddishOrange = 0xF8481C, + + /// A color described as Deep Green with a HEX value of #02590F. + DeepGreen = 0x02590F, + + /// A color described as Vomit Green with a HEX value of #89A203. + VomitGreen = 0x89A203, + + /// A color described as Purple Pink with a HEX value of #E03FD8. + PurplePinkAlternate = 0xE03FD8, + + /// A color described as Dusty Pink with a HEX value of #D58A94. + DustyPink = 0xD58A94, + + /// A color described as Faded Green with a HEX value of #7BB274. + FadedGreen = 0x7BB274, + + /// A color described as Camo Green with a HEX value of #526525. + CamoGreen = 0x526525, + + /// A color described as Pinky Purple with a HEX value of #C94CBE. + PinkyPurple = 0xC94CBE, + + /// A color described as Pink Purple with a HEX value of #DB4BDA. + PinkPurpleAlternate = 0xDB4BDA, + + /// A color described as Brownish Red with a HEX value of #9E3623. + BrownishRed = 0x9E3623, + + /// A color described as Dark Rose with a HEX value of #B5485D. + DarkRose = 0xB5485D, + + /// A color described as Mud with a HEX value of #735C12. + Mud = 0x735C12, + + /// A color described as Brownish with a HEX value of #9C6D57. + Brownish = 0x9C6D57, + + /// A color described as Emerald Green with a HEX value of #028F1E. + EmeraldGreen = 0x028F1E, + + /// A color described as Pale Brown with a HEX value of #B1916E. + PaleBrown = 0xB1916E, + + /// A color described as Dull Blue with a HEX value of #49759C. + DullBlue = 0x49759C, + + /// A color described as Burnt Umber with a HEX value of #A0450E. + BurntUmber = 0xA0450E, + + /// A color described as Medium Green with a HEX value of #39AD48. + MediumGreen = 0x39AD48, + + /// A color described as Clay with a HEX value of #B66A50. + Clay = 0xB66A50, + + /// A color described as Light Aqua with a HEX value of #8CFFDB. + LightAqua = 0x8CFFDB, + + /// A color described as Light Olive Green with a HEX value of #A4BE5C. + LightOliveGreen = 0xA4BE5C, + + /// A color described as Brownish Orange with a HEX value of #CB7723. + BrownishOrange = 0xCB7723, + + /// A color described as Dark Aqua with a HEX value of #05696B. + DarkAqua = 0x05696B, + + /// A color described as Purplish Pink with a HEX value of #CE5DAE. + PurplishPink = 0xCE5DAE, + + /// A color described as Dark Salmon with a HEX value of #C85A53. + DarkSalmon = 0xC85A53, + + /// A color described as Greenish Grey with a HEX value of #96AE8D. + GreenishGrey = 0x96AE8D, + + /// A color described as Jade with a HEX value of #1FA774. + Jade = 0x1FA774, + + /// A color described as Ugly Green with a HEX value of #7A9703. + UglyGreen = 0x7A9703, + + /// A color described as Dark Beige with a HEX value of #AC9362. + DarkBeige = 0xAC9362, + + /// A color described as Emerald with a HEX value of #01A049. + Emerald = 0x01A049, + + /// A color described as Pale Red with a HEX value of #D9544D. + PaleRed = 0xD9544D, + + /// A color described as Light Magenta with a HEX value of #FA5FF7. + LightMagenta = 0xFA5FF7, + + /// A color described as Sky with a HEX value of #82CAFC. + Sky = 0x82CAFC, + + /// A color described as Light Cyan with a HEX value of #ACFFFC. + LightCyan = 0xACFFFC, + + /// A color described as Yellow Orange with a HEX value of #FCB001. + YellowOrange = 0xFCB001, + + /// A color described as Reddish Purple with a HEX value of #910951. + ReddishPurple = 0x910951, + + /// A color described as Reddish Pink with a HEX value of #FE2C54. + ReddishPink = 0xFE2C54, + + /// A color described as Orchid with a HEX value of #C875C4. + Orchid = 0xC875C4, + + /// A color described as Dirty Yellow with a HEX value of #CDC50A. + DirtyYellow = 0xCDC50A, + + /// A color described as Orange Red with a HEX value of #FD411E. + OrangeRed = 0xFD411E, + + /// A color described as Deep Red with a HEX value of #9A0200. + DeepRed = 0x9A0200, + + /// A color described as Orange Brown with a HEX value of #BE6400. + OrangeBrown = 0xBE6400, + + /// A color described as Cobalt Blue with a HEX value of #030AA7. + CobaltBlue = 0x030AA7, + + /// A color described as Neon Pink with a HEX value of #FE019A. + NeonPink = 0xFE019A, + + /// A color described as Rose Pink with a HEX value of #F7879A. + RosePink = 0xF7879A, + + /// A color described as Greyish Purple with a HEX value of #887191. + GreyishPurple = 0x887191, + + /// A color described as Raspberry with a HEX value of #B00149. + Raspberry = 0xB00149, + + /// A color described as Aqua Green with a HEX value of #12E193. + AquaGreen = 0x12E193, + + /// A color described as Salmon Pink with a HEX value of #FE7B7C. + SalmonPink = 0xFE7B7C, + + /// A color described as Tangerine with a HEX value of #FF9408. + Tangerine = 0xFF9408, + + /// A color described as Brownish Green with a HEX value of #6A6E09. + BrownishGreen = 0x6A6E09, + + /// A color described as Red Brown with a HEX value of #8B2E16. + RedBrown = 0x8B2E16, + + /// A color described as Greenish Brown with a HEX value of #696112. + GreenishBrown = 0x696112, + + /// A color described as Pumpkin with a HEX value of #E17701. + Pumpkin = 0xE17701, + + /// A color described as Pine Green with a HEX value of #0A481E. + PineGreen = 0x0A481E, + + /// A color described as Charcoal with a HEX value of #343837. + Charcoal = 0x343837, + + /// A color described as Baby Pink with a HEX value of #FFB7CE. + BabyPink = 0xFFB7CE, + + /// A color described as Cornflower with a HEX value of #6A79F7. + Cornflower = 0x6A79F7, + + /// A color described as Blue Violet with a HEX value of #5D06E9. + BlueViolet = 0x5D06E9, + + /// A color described as Chocolate with a HEX value of #3D1C02. + Chocolate = 0x3D1C02, + + /// A color described as Greyish Green with a HEX value of #82A67D. + GreyishGreen = 0x82A67D, + + /// A color described as Scarlet with a HEX value of #BE0119. + Scarlet = 0xBE0119, + + /// A color described as Green Yellow with a HEX value of #C9FF27. + GreenYellowAlternate = 0xC9FF27, + + /// A color described as Dark Olive with a HEX value of #373E02. + DarkOlive = 0x373E02, + + /// A color described as Sienna with a HEX value of #A9561E. + Sienna = 0xA9561E, + + /// A color described as Pastel Purple with a HEX value of #CAA0FF. + PastelPurple = 0xCAA0FF, + + /// A color described as Terracotta with a HEX value of #CA6641. + Terracotta = 0xCA6641, + + /// A color described as Aqua Blue with a HEX value of #02D8E9. + AquaBlue = 0x02D8E9, + + /// A color described as Sage Green with a HEX value of #88B378. + SageGreen = 0x88B378, + + /// A color described as Blood Red with a HEX value of #980002. + BloodRed = 0x980002, + + /// A color described as Deep Pink with a HEX value of #CB0162. + DeepPink = 0xCB0162, + + /// A color described as Grass with a HEX value of #5CAC2D. + Grass = 0x5CAC2D, + + /// A color described as Moss with a HEX value of #769958. + Moss = 0x769958, + + /// A color described as Pastel Blue with a HEX value of #A2BFFE. + PastelBlue = 0xA2BFFE, + + /// A color described as Bluish Green with a HEX value of #10A674. + BluishGreen = 0x10A674, + + /// A color described as Green Blue with a HEX value of #06B48B. + GreenBlueAlternate = 0x06B48B, + + /// A color described as Dark Tan with a HEX value of #AF884A. + DarkTan = 0xAF884A, + + /// A color described as Greenish Blue with a HEX value of #0B8B87. + GreenishBlue = 0x0B8B87, + + /// A color described as Pale Orange with a HEX value of #FFA756. + PaleOrange = 0xFFA756, + + /// A color described as Vomit with a HEX value of #A2A415. + Vomit = 0xA2A415, + + /// A color described as Forrest Green with a HEX value of #154406. + ForrestGreen = 0x154406, + + /// A color described as Dark Lavender with a HEX value of #856798. + DarkLavender = 0x856798, + + /// A color described as Dark Violet with a HEX value of #34013F. + DarkViolet = 0x34013F, + + /// A color described as Purple Blue with a HEX value of #632DE9. + PurpleBlueAlternate = 0x632DE9, + + /// A color described as Dark Cyan with a HEX value of #0A888A. + DarkCyan = 0x0A888A, + + /// A color described as Olive Drab with a HEX value of #6F7632. + OliveDrab = 0x6F7632, + + /// A color described as Pinkish with a HEX value of #D46A7E. + Pinkish = 0xD46A7E, + + /// A color described as Cobalt with a HEX value of #1E488F. + Cobalt = 0x1E488F, + + /// A color described as Neon Purple with a HEX value of #BC13FE. + NeonPurple = 0xBC13FE, + + /// A color described as Light Turquoise with a HEX value of #7EF4CC. + LightTurquoise = 0x7EF4CC, + + /// A color described as Apple Green with a HEX value of #76CD26. + AppleGreen = 0x76CD26, + + /// A color described as Dull Green with a HEX value of #74A662. + DullGreen = 0x74A662, + + /// A color described as Wine with a HEX value of #80013F. + Wine = 0x80013F, + + /// A color described as Powder Blue with a HEX value of #B1D1FC. + PowderBlue = 0xB1D1FC, + + /// A color described as Off White with a HEX value of #FFFFE4. + OffWhite = 0xFFFFE4, + + /// A color described as Electric Blue with a HEX value of #0652FF. + ElectricBlue = 0x0652FF, + + /// A color described as Dark Turquoise with a HEX value of #045C5A. + DarkTurquoise = 0x045C5A, + + /// A color described as Blue Purple with a HEX value of #5729CE. + BluePurpleAlternate = 0x5729CE, + + /// A color described as Azure with a HEX value of #069AF3. + Azure = 0x069AF3, + + /// A color described as Bright Red with a HEX value of #FF000D. + BrightRed = 0xFF000D, + + /// A color described as Pinkish Red with a HEX value of #F10C45. + PinkishRed = 0xF10C45, + + /// A color described as Cornflower Blue with a HEX value of #5170D7. + CornflowerBlue = 0x5170D7, + + /// A color described as Light Olive with a HEX value of #ACBF69. + LightOlive = 0xACBF69, + + /// A color described as Grape with a HEX value of #6C3461. + Grape = 0x6C3461, + + /// A color described as Greyish Blue with a HEX value of #5E819D. + GreyishBlue = 0x5E819D, + + /// A color described as Purplish Blue with a HEX value of #601EF9. + PurplishBlue = 0x601EF9, + + /// A color described as Yellowish Green with a HEX value of #B0DD16. + YellowishGreen = 0xB0DD16, + + /// A color described as Greenish Yellow with a HEX value of #CDFD02. + GreenishYellow = 0xCDFD02, + + /// A color described as Medium Blue with a HEX value of #2C6FBB. + MediumBlue = 0x2C6FBB, + + /// A color described as Dusty Rose with a HEX value of #C0737A. + DustyRose = 0xC0737A, + + /// A color described as Light Violet with a HEX value of #D6B4FC. + LightViolet = 0xD6B4FC, + + /// A color described as Midnight Blue with a HEX value of #020035. + MidnightBlue = 0x020035, + + /// A color described as Bluish Purple with a HEX value of #703BE7. + BluishPurple = 0x703BE7, + + /// A color described as Red Orange with a HEX value of #FD3C06. + RedOrange = 0xFD3C06, + + /// A color described as Dark Magenta with a HEX value of #960056. + DarkMagenta = 0x960056, + + /// A color described as Greenish with a HEX value of #40A368. + Greenish = 0x40A368, + + /// A color described as Ocean Blue with a HEX value of #03719C. + OceanBlue = 0x03719C, + + /// A color described as Coral with a HEX value of #FC5A50. + Coral = 0xFC5A50, + + /// A color described as Cream with a HEX value of #FFFFC2. + Cream = 0xFFFFC2, + + /// A color described as Reddish Brown with a HEX value of #7F2B0A. + ReddishBrown = 0x7F2B0A, + + /// A color described as Burnt Sienna with a HEX value of #B04E0F. + BurntSienna = 0xB04E0F, + + /// A color described as Brick with a HEX value of #A03623. + Brick = 0xA03623, + + /// A color described as Sage with a HEX value of #87AE73. + Sage = 0x87AE73, + + /// A color described as Grey Green with a HEX value of #789B73. + GreyGreenAlternate = 0x789B73, + + /// A color described as White with a HEX value of #FFFFFF. + White = 0xFFFFFF, + + /// A color described as Robin'S Egg Blue with a HEX value of #98EFF9. + RobinsEggBlue = 0x98EFF9, + + /// A color described as Moss Green with a HEX value of #658B38. + MossGreen = 0x658B38, + + /// A color described as Steel Blue with a HEX value of #5A7D9A. + SteelBlue = 0x5A7D9A, + + /// A color described as Eggplant with a HEX value of #380835. + Eggplant = 0x380835, + + /// A color described as Light Yellow with a HEX value of #FFFE7A. + LightYellow = 0xFFFE7A, + + /// A color described as Leaf Green with a HEX value of #5CA904. + LeafGreen = 0x5CA904, + + /// A color described as Light Grey with a HEX value of #D8DCD6. + LightGrey = 0xD8DCD6, + + /// A color described as Puke with a HEX value of #A5A502. + Puke = 0xA5A502, + + /// A color described as Pinkish Purple with a HEX value of #D648D7. + PinkishPurple = 0xD648D7, + + /// A color described as Sea Blue with a HEX value of #047495. + SeaBlue = 0x047495, + + /// A color described as Pale Purple with a HEX value of #B790D4. + PalePurple = 0xB790D4, + + /// A color described as Slate Blue with a HEX value of #5B7C99. + SlateBlue = 0x5B7C99, + + /// A color described as Blue Grey with a HEX value of #607C8E. + BlueGreyAlternate = 0x607C8E, + + /// A color described as Hunter Green with a HEX value of #0B4008. + HunterGreen = 0x0B4008, + + /// A color described as Fuchsia with a HEX value of #ED0DD9. + Fuchsia = 0xED0DD9, + + /// A color described as Crimson with a HEX value of #8C000F. + Crimson = 0x8C000F, + + /// A color described as Pale Yellow with a HEX value of #FFFF84. + PaleYellow = 0xFFFF84, + + /// A color described as Ochre with a HEX value of #BF9005. + Ochre = 0xBF9005, + + /// A color described as Mustard Yellow with a HEX value of #D2BD0A. + MustardYellow = 0xD2BD0A, + + /// A color described as Light Red with a HEX value of #FF474C. + LightRed = 0xFF474C, + + /// A color described as Cerulean with a HEX value of #0485D1. + Cerulean = 0x0485D1, + + /// A color described as Pale Pink with a HEX value of #FFCFDC. + PalePink = 0xFFCFDC, + + /// A color described as Deep Blue with a HEX value of #040273. + DeepBlue = 0x040273, + + /// A color described as Rust with a HEX value of #A83C09. + Rust = 0xA83C09, + + /// A color described as Light Teal with a HEX value of #90E4C1. + LightTeal = 0x90E4C1, + + /// A color described as Slate with a HEX value of #516572. + Slate = 0x516572, + + /// A color described as Goldenrod with a HEX value of #FAC205. + Goldenrod = 0xFAC205, + + /// A color described as Dark Yellow with a HEX value of #D5B60A. + DarkYellow = 0xD5B60A, + + /// A color described as Dark Grey with a HEX value of #363737. + DarkGrey = 0x363737, + + /// A color described as Army Green with a HEX value of #4B5D16. + ArmyGreen = 0x4B5D16, + + /// A color described as Grey Blue with a HEX value of #6B8BA4. + GreyBlueAlternate = 0x6B8BA4, + + /// A color described as Seafoam with a HEX value of #80F9AD. + Seafoam = 0x80F9AD, + + /// A color described as Puce with a HEX value of #A57E52. + Puce = 0xA57E52, + + /// A color described as Spring Green with a HEX value of #A9F971. + SpringGreen = 0xA9F971, + + /// A color described as Dark Orange with a HEX value of #C65102. + DarkOrange = 0xC65102, + + /// A color described as Sand with a HEX value of #E2CA76. + Sand = 0xE2CA76, + + /// A color described as Pastel Green with a HEX value of #B0FF9D. + PastelGreen = 0xB0FF9D, + + /// A color described as Mint with a HEX value of #9FFEB0. + Mint = 0x9FFEB0, + + /// A color described as Light Orange with a HEX value of #FDAA48. + LightOrange = 0xFDAA48, + + /// A color described as Bright Pink with a HEX value of #FE01B1. + BrightPink = 0xFE01B1, + + /// A color described as Chartreuse with a HEX value of #C1F80A. + Chartreuse = 0xC1F80A, + + /// A color described as Deep Purple with a HEX value of #36013F. + DeepPurple = 0x36013F, + + /// A color described as Dark Brown with a HEX value of #341C02. + DarkBrown = 0x341C02, + + /// A color described as Taupe with a HEX value of #B9A281. + Taupe = 0xB9A281, + + /// A color described as Pea Green with a HEX value of #8EAB12. + PeaGreen = 0x8EAB12, + + /// A color described as Puke Green with a HEX value of #9AAE07. + PukeGreen = 0x9AAE07, + + /// A color described as Kelly Green with a HEX value of #02AB2E. + KellyGreen = 0x02AB2E, + + /// A color described as Seafoam Green with a HEX value of #7AF9AB. + SeafoamGreen = 0x7AF9AB, + + /// A color described as Blue Green with a HEX value of #137E6D. + BlueGreenAlternate = 0x137E6D, + + /// A color described as Khaki with a HEX value of #AAA662. + Khaki = 0xAAA662, + + /// A color described as Burgundy with a HEX value of #610023. + Burgundy = 0x610023, + + /// A color described as Dark Teal with a HEX value of #014D4E. + DarkTeal = 0x014D4E, + + /// A color described as Brick Red with a HEX value of #8F1402. + BrickRed = 0x8F1402, + + /// A color described as Royal Purple with a HEX value of #4B006E. + RoyalPurple = 0x4B006E, + + /// A color described as Plum with a HEX value of #580F41. + Plum = 0x580F41, + + /// A color described as Mint Green with a HEX value of #8FFF9F. + MintGreen = 0x8FFF9F, + + /// A color described as Gold with a HEX value of #DBB40C. + Gold = 0xDBB40C, + + /// A color described as Baby Blue with a HEX value of #A2CFFE. + BabyBlue = 0xA2CFFE, + + /// A color described as Yellow Green with a HEX value of #C0FB2D. + YellowGreenAlternate = 0xC0FB2D, + + /// A color described as Bright Purple with a HEX value of #BE03FD. + BrightPurple = 0xBE03FD, + + /// A color described as Dark Red with a HEX value of #840000. + DarkRed = 0x840000, + + /// A color described as Pale Blue with a HEX value of #D0FEFE. + PaleBlue = 0xD0FEFE, + + /// A color described as Grass Green with a HEX value of #3F9B0B. + GrassGreen = 0x3F9B0B, + + /// A color described as Navy with a HEX value of #01153E. + Navy = 0x01153E, + + /// A color described as Aquamarine with a HEX value of #04D8B2. + Aquamarine = 0x04D8B2, + + /// A color described as Burnt Orange with a HEX value of #C04E01. + BurntOrange = 0xC04E01, + + /// A color described as Neon Green with a HEX value of #0CFF0C. + NeonGreen = 0x0CFF0C, + + /// A color described as Bright Blue with a HEX value of #0165FC. + BrightBlue = 0x0165FC, + + /// A color described as Rose with a HEX value of #CF6275. + Rose = 0xCF6275, + + /// A color described as Light Pink with a HEX value of #FFD1DF. + LightPink = 0xFFD1DF, + + /// A color described as Mustard with a HEX value of #CEB301. + Mustard = 0xCEB301, + + /// A color described as Indigo with a HEX value of #380282. + Indigo = 0x380282, + + /// A color described as Lime with a HEX value of #AAFF32. + Lime = 0xAAFF32, + + /// A color described as Sea Green with a HEX value of #53FCA1. + SeaGreen = 0x53FCA1, + + /// A color described as Periwinkle with a HEX value of #8E82FE. + Periwinkle = 0x8E82FE, + + /// A color described as Dark Pink with a HEX value of #CB416B. + DarkPink = 0xCB416B, + + /// A color described as Olive Green with a HEX value of #677A04. + OliveGreen = 0x677A04, + + /// A color described as Peach with a HEX value of #FFB07C. + Peach = 0xFFB07C, + + /// A color described as Pale Green with a HEX value of #C7FDB5. + PaleGreen = 0xC7FDB5, + + /// A color described as Light Brown with a HEX value of #AD8150. + LightBrown = 0xAD8150, + + /// A color described as Hot Pink with a HEX value of #FF028D. + HotPink = 0xFF028D, + + /// A color described as Black with a HEX value of #000000. + Black = 0x000000, + + /// A color described as Lilac with a HEX value of #CEA2FD. + Lilac = 0xCEA2FD, + + /// A color described as Navy Blue with a HEX value of #001146. + NavyBlue = 0x001146, + + /// A color described as Royal Blue with a HEX value of #0504AA. + RoyalBlue = 0x0504AA, + + /// A color described as Beige with a HEX value of #E6DAA6. + Beige = 0xE6DAA6, + + /// A color described as Salmon with a HEX value of #FF796C. + Salmon = 0xFF796C, + + /// A color described as Olive with a HEX value of #6E750E. + Olive = 0x6E750E, + + /// A color described as Maroon with a HEX value of #650021. + Maroon = 0x650021, + + /// A color described as Bright Green with a HEX value of #01FF07. + BrightGreen = 0x01FF07, + + /// A color described as Dark Purple with a HEX value of #35063E. + DarkPurple = 0x35063E, + + /// A color described as Mauve with a HEX value of #AE7181. + Mauve = 0xAE7181, + + /// A color described as Forest Green with a HEX value of #06470C. + ForestGreen = 0x06470C, + + /// A color described as Aqua with a HEX value of #13EAC9. + Aqua = 0x13EAC9, + + /// A color described as Cyan with a HEX value of #00FFFF. + Cyan = 0x00FFFF, + + /// A color described as Tan with a HEX value of #D1B26F. + Tan = 0xD1B26F, + + /// A color described as Dark Blue with a HEX value of #00035B. + DarkBlue = 0x00035B, + + /// A color described as Lavender with a HEX value of #C79FEF. + Lavender = 0xC79FEF, + + /// A color described as Turquoise with a HEX value of #06C2AC. + Turquoise = 0x06C2AC, + + /// A color described as Dark Green with a HEX value of #033500. + DarkGreen = 0x033500, + + /// A color described as Violet with a HEX value of #9A0EEA. + Violet = 0x9A0EEA, + + /// A color described as Light Purple with a HEX value of #BF77F6. + LightPurple = 0xBF77F6, + + /// A color described as Lime Green with a HEX value of #89FE05. + LimeGreen = 0x89FE05, + + /// A color described as Grey with a HEX value of #929591. + Grey = 0x929591, + + /// A color described as Sky Blue with a HEX value of #75BBFD. + SkyBlue = 0x75BBFD, + + /// A color described as Yellow with a HEX value of #FFFF14. + Yellow = 0xFFFF14, + + /// A color described as Magenta with a HEX value of #C20078. + Magenta = 0xC20078, + + /// A color described as Light Green with a HEX value of #96F97B. + LightGreen = 0x96F97B, + + /// A color described as Orange with a HEX value of #F97306. + Orange = 0xF97306, + + /// A color described as Teal with a HEX value of #029386. + Teal = 0x029386, + + /// A color described as Light Blue with a HEX value of #95D0FC. + LightBlue = 0x95D0FC, + + /// A color described as Red with a HEX value of #E50000. + Red = 0xE50000, + + /// A color described as Brown with a HEX value of #653700. + Brown = 0x653700, + + /// A color described as Pink with a HEX value of #FF81C0. + Pink = 0xFF81C0, + + /// A color described as Blue with a HEX value of #0343DF. + Blue = 0x0343DF, + + /// A color described as Green with a HEX value of #15B01A. + Green = 0x15B01A, + + /// A color described as Purple with a HEX value of #7E1E9C. + Purple = 0x7E1E9C, + Purple2 = 0x7E1E9C +} \ No newline at end of file diff --git a/CapyKit/Password.cs b/CapyKit/Password.cs index 76ba48e..9e64e35 100644 --- a/CapyKit/Password.cs +++ b/CapyKit/Password.cs @@ -1,289 +1,295 @@ -using System; -using System.Collections.Generic; -using System.Data.SqlTypes; -using System.Linq; -using System.Reflection.Metadata.Ecma335; -using System.Security.Cryptography; -using System.Text; -using System.Threading.Tasks; +using System.Security.Cryptography; -namespace CapyKit +namespace CapyKit; + +/// +/// Represents a password with its hash, salt and algorithm used for encryption. +/// +public class Password { - /// - /// Represents a password with its hash, salt and algorithm used for encryption. - /// - public class Password + #region Members + + private static readonly Lazy pbkdf2Algorithm = new(() => new Pbkdf2Algorithm()); + + #endregion + + /// Constructor. + /// The password to be hashed. + /// The salt used for encryption. + /// The algorithm used for password encryption. + /// + /// A variable-length parameters list containing arguments to include for the + /// . + /// + public Password(string password, byte[] salt, IPasswordAlgorithm algorithm, params object[] args) { - #region Members + // We know there will always be a salt, so we can prepend it to h + var augmented = args.Prepend(salt).ToArray(); - private static Lazy pbkdf2Algorithm = new Lazy(() => new Pbkdf2Algorithm()); - - #endregion - - #region Properties - - /// - /// Gets or sets the hash of the password. - /// - public byte[] Hash { get; private set; } - - /// - /// Gets or sets the salt used for encryption. - /// - public byte[] Salt { get; private set; } - - /// - /// Gets or sets the algorithm used for password encryption. - /// - public IPasswordAlgorithm Algorithm { get; private set; } - - #region Preconfigued Password Algorithms - - /// Gets the preconfigured PBKDF2 algorithm. - /// The preconfigured PBKDF2 algorithm. - public static Pbkdf2Algorithm Pbkdf2Algorithm - { - get - { - return pbkdf2Algorithm.Value; - } - } - - #endregion - - #endregion - - /// Constructor. - /// The password to be hashed. - /// The salt used for encryption. - /// The algorithm used for password encryption. - /// A variable-length parameters list containing arguments to include for the . - public Password(string password, byte[] salt, IPasswordAlgorithm algorithm, params object[] args) - { - // We know there will always be a salt, so we can prepend it to h - var augmented = args.Prepend(salt).ToArray(); - - this.Hash = algorithm.Encrypt(password, augmented); - this.Salt = salt; - this.Algorithm = algorithm; - } - - public Password(string password, string salt, IPasswordAlgorithm algorithm, params object[] args) - { - // We know there will always be a salt, so we can prepend it to h - var saltBytes = Convert.FromBase64String(salt); - var augmented = args.Prepend(saltBytes).ToArray(); - - this.Hash = algorithm.Encrypt(password, augmented); - this.Salt = saltBytes; - this.Algorithm = algorithm; - } - - #region Methods - - /// - public override bool Equals(object? obj) - { - if(obj == null) return false; // The object is null, and this object is not. - - if(ReferenceEquals(this, obj)) return true; // The object is literally this object. - - var objPassword = obj as Password; - - if (objPassword == null) - { - return base.Equals(obj); // Objects aren't the same type. We can fall back to the default comparison. - } - - return this.Algorithm.AlgorithmName == objPassword.Algorithm.AlgorithmName - && this.Hash.SequenceEqual(objPassword.Hash) - && this.Salt.SequenceEqual(objPassword.Salt); - } - - /// - public override string ToString() - { - return string.Format("Hash: {0}, Salt: {1}, Algorithm: {2}", BitConverter.ToString(this.Hash), BitConverter.ToString(this.Salt), this.Algorithm?.AlgorithmName); - } - - #endregion - - #region Operators - - /// - public static bool operator ==(Password a, Password b) - { - return ReferenceEquals(a, b) // Literally the same object. - || (ReferenceEquals(a, null) && ReferenceEquals(b,null)) // Both are null - || a.Equals(b); // Both are not null but not the same object. - } - - /// - public static bool operator !=(Password a, Password b) - { - return !(a == b); - } - - #endregion + this.Hash = algorithm.Encrypt(password, augmented); + this.Salt = salt; + this.Algorithm = algorithm; } - /// - /// Defines the contract for password encryption algorithms. - /// - public interface IPasswordAlgorithm + public Password(string password, string salt, IPasswordAlgorithm algorithm, params object[] args) { - #region Properties + // We know there will always be a salt, so we can prepend it to h + var saltBytes = Convert.FromBase64String(salt); + var augmented = args.Prepend(saltBytes).ToArray(); - /// - /// Gets the name of the algorithm. - /// - string AlgorithmName { get; } - - #endregion - - #region Methods - - /// Encrypts the given password using a defined algorithm. - /// The plaintext password. - /// - /// Additional arguments for the encryption process, such as salt and length. - /// - /// A byte array with the hashed . - byte[] Encrypt(string password, params object[] args); - - /// - /// Compares the given plaintext password with an encrypted value using PBKDF2 algorithm. - /// - /// The plaintext password to compare. - /// The encrypted value to compare against. - /// - /// Additional arguments for the encryption process, such as salt and length. - /// - /// - /// True if the given matches the , - /// false if they are different. - /// - bool Compare(string password, byte[] encryptedValue, params object[] args) - { - var challengedPassword = Encrypt(password, args); - - return encryptedValue.SequenceEqual(challengedPassword); - } - - #endregion + this.Hash = algorithm.Encrypt(password, augmented); + this.Salt = saltBytes; + this.Algorithm = algorithm; } - #region Implementations + #region Properties /// - /// Implements the PBKDF2 algorithm for password encryption. + /// Gets or sets the hash of the password. /// - public class Pbkdf2Algorithm : IPasswordAlgorithm + public byte[] Hash { get; } + + /// + /// Gets or sets the salt used for encryption. + /// + public byte[] Salt { get; } + + /// + /// Gets or sets the algorithm used for password encryption. + /// + public IPasswordAlgorithm Algorithm { get; } + + #region Preconfigued Password Algorithms + + /// Gets the preconfigured PBKDF2 algorithm. + /// The preconfigured PBKDF2 algorithm. + public static Pbkdf2Algorithm Pbkdf2Algorithm { - #region Members - - /// (Immutable) The default length. - /// This member is immutable. - public const int LENGTH = 32; + get { return Password.pbkdf2Algorithm.Value; } + } - /// The default number of iterations. - /// This member is immutable. - public const int ITERATIONS = 100000; - - #endregion + #endregion - #region Properties + #endregion - /// - public string AlgorithmName + #region Methods + + /// + public override bool Equals(object? obj) + { + if (obj == null) { - get - { - return "Pbkdf2"; - } + return false; // The object is null, and this object is not. } - #endregion - - #region Constructor - - /// Default constructor. - public Pbkdf2Algorithm() + if (ReferenceEquals(this, obj)) { - // + return true; // The object is literally this object. } - #endregion + var objPassword = obj as Password; - #region Methods - - /// Encrypts the given password using a PBKDF2 algorithm. - /// The plaintext password. - /// - /// Additional arguments for the encryption process, specifically - /// - /// salt - /// length - /// iterations - /// - /// - /// A byte array with the hashed . - public byte[] Encrypt(string password, params object[] args) + if (objPassword == null) { - if (args.Length == 0) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "No arguments passed."); - return new byte[0]; - } + return base.Equals(obj); // Objects aren't the same type. We can fall back to the default comparison. + } - var salt = args[0] as byte[]; + return this.Algorithm.AlgorithmName == objPassword.Algorithm.AlgorithmName + && this.Hash.SequenceEqual(objPassword.Hash) + && this.Salt.SequenceEqual(objPassword.Salt); + } - if (salt == null) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "The first parameters in the arguments wasn't a valid salt."); - return new byte[0]; - } + /// + public override string ToString() + { + return string.Format("Hash: {0}, Salt: {1}, Algorithm: {2}", BitConverter.ToString(this.Hash), + BitConverter.ToString(this.Salt), this.Algorithm?.AlgorithmName); + } - var length = 0; - try - { - length = Convert.ToInt32(args[1]); - } - catch (Exception ex) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "Could not convert the second parameter into an integer."); - length = LENGTH; - } + #endregion - var iterations = 0; - try - { - iterations = Convert.ToInt32(args[2]); - } - catch (Exception ex) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "Could not convert the second parameter into an integer."); - iterations = ITERATIONS; - } + #region Operators - var hash = new byte[0]; + /// + public static bool operator ==(Password a, Password b) + { + return ReferenceEquals(a, b) // Literally the same object. + || (ReferenceEquals(a, null) && ReferenceEquals(b, null)) // Both are null + || a.Equals(b); // Both are not null but not the same object. + } - using (var deriveBytes = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.SHA256)) - { - hash = deriveBytes.GetBytes(length); - } - - if (hash.Length == 0) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "Hash could not be generated."); - return new byte[0]; - } - - return hash; - } - - #endregion + /// + public static bool operator !=(Password a, Password b) + { + return !(a == b); } #endregion } + +/// +/// Defines the contract for password encryption algorithms. +/// +public interface IPasswordAlgorithm +{ + #region Properties + + /// + /// Gets the name of the algorithm. + /// + string AlgorithmName { get; } + + #endregion + + #region Methods + + /// Encrypts the given password using a defined algorithm. + /// The plaintext password. + /// + /// Additional arguments for the encryption process, such as salt and length. + /// + /// A byte array with the hashed . + byte[] Encrypt(string password, params object[] args); + + /// + /// Compares the given plaintext password with an encrypted value using PBKDF2 algorithm. + /// + /// The plaintext password to compare. + /// The encrypted value to compare against. + /// + /// Additional arguments for the encryption process, such as salt and length. + /// + /// + /// True if the given matches the , + /// false if they are different. + /// + bool Compare(string password, byte[] encryptedValue, params object[] args) + { + var challengedPassword = Encrypt(password, args); + + return encryptedValue.SequenceEqual(challengedPassword); + } + + #endregion +} + +#region Implementations + +/// +/// Implements the PBKDF2 algorithm for password encryption. +/// +public class Pbkdf2Algorithm : IPasswordAlgorithm +{ + #region Constructor + + /// Default constructor. + public Pbkdf2Algorithm() + { + // + } + + #endregion + + #region IPasswordAlgorithm Members + + #region Properties + + /// + public string AlgorithmName + { + get { return "Pbkdf2"; } + } + + #endregion + + #region Methods + + /// Encrypts the given password using a PBKDF2 algorithm. + /// The plaintext password. + /// + /// Additional arguments for the encryption process, specifically + /// + /// + /// salt + /// + /// + /// length + /// + /// + /// iterations + /// + /// + /// + /// A byte array with the hashed . + public byte[] Encrypt(string password, params object[] args) + { + if (args.Length == 0) + { + CapyEventReporter.EmitEvent(EventLevel.Error, "No arguments passed."); + return new byte[0]; + } + + var salt = args[0] as byte[]; + + if (salt == null) + { + CapyEventReporter.EmitEvent(EventLevel.Error, "The first parameters in the arguments wasn't a valid salt."); + return new byte[0]; + } + + var length = 0; + try + { + length = Convert.ToInt32(args[1]); + } + catch (Exception ex) + { + CapyEventReporter.EmitEvent(EventLevel.Error, "Could not convert the second parameter into an integer."); + length = Pbkdf2Algorithm.LENGTH; + } + + var iterations = 0; + try + { + iterations = Convert.ToInt32(args[2]); + } + catch (Exception ex) + { + CapyEventReporter.EmitEvent(EventLevel.Error, "Could not convert the second parameter into an integer."); + iterations = Pbkdf2Algorithm.ITERATIONS; + } + + var hash = new byte[0]; + + using (var deriveBytes = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.SHA256)) + { + hash = deriveBytes.GetBytes(length); + } + + if (hash.Length == 0) + { + CapyEventReporter.EmitEvent(EventLevel.Error, "Hash could not be generated."); + return new byte[0]; + } + + return hash; + } + + #endregion + + #endregion + + #region Members + + /// (Immutable) The default length. + /// This member is immutable. + public const int LENGTH = 32; + + /// The default number of iterations. + /// This member is immutable. + public const int ITERATIONS = 100000; + + #endregion +} + +#endregion \ No newline at end of file diff --git a/CapyKit/Pool.cs b/CapyKit/Pool.cs index f7eeceb..b45b54f 100644 --- a/CapyKit/Pool.cs +++ b/CapyKit/Pool.cs @@ -1,271 +1,255 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static System.Runtime.InteropServices.JavaScript.JSType; +using System.Collections.Concurrent; -namespace CapyKit +namespace CapyKit; + +/// +/// A managed pool of resources. This class provides a thread-safe way to manage a collection of +/// objects of type . +/// +/// The type of objects to be managed by the pool. +public class Pool { + #region Members + + /// The collection of pooled items. + private readonly ConcurrentBag> poolItemCollection; + + /// (Immutable) The number of items in the pool. + private readonly int poolSize; + + #endregion Members + + #region Constructors + /// - /// A managed pool of resources. This class provides a thread-safe way to manage a collection of - /// objects of type . + /// Initializes a new instance of the class with the specified pool size. /// - /// The type of objects to be managed by the pool. - public class Pool + /// The size of the pool. + public Pool(int poolSize) { - #region Members - - /// The collection of pooled items. - private readonly ConcurrentBag> poolItemCollection; - - /// (Immutable) The number of items in the pool. - private readonly int poolSize; - - #endregion Members - - #region Constructors - - /// - /// Initializes a new instance of the class with the specified pool size. - /// - /// The size of the pool. - public Pool(int poolSize) - { - this.poolSize = poolSize; - this.poolItemCollection = new ConcurrentBag>(); - FillPoolItemCollection(poolSize); - } - - /// - /// Initializes a new instance of the class with the specified pool size - /// and constructor selector. - /// - /// The size of the pool. - /// - /// The constructor selector used to create new instances of . - /// - public Pool(int poolSize, Func constructorSelector) - { - this.poolSize = poolSize; - this.poolItemCollection = new ConcurrentBag>(); - FillPoolItemCollection(poolSize, constructorSelector); - } - - /// - /// Initializes a new instance of the class with the specified collection - /// of items. - /// - /// - /// The collection of items with which to seed the pool. - /// - public Pool(IEnumerable collection) - { - this.poolSize = collection.Count(); - this.poolItemCollection = new ConcurrentBag>(); - FillPoolItemCollection(collection); - } - - #endregion Constructors - - #region Methods - - /// - /// Initializes the pool with the specified number of items using the default constructor. - /// - /// The size of the pool. - private void FillPoolItemCollection(int poolSize) - { - FillPoolItemCollection(poolSize, () => default(T)); - } - - /// - /// Initializes the pool with the specified number of items using the specified constructor - /// selector. - /// - /// The size of the pool. - /// The constructor selector. - private void FillPoolItemCollection(int poolSize, Func constructorSelector) - { - for (int i = 0; i < poolSize; i++) - { - this.poolItemCollection.Add(new PoolItem(constructorSelector(), i)); - } - } - - /// Fill the pool item collection from an existing collection. - /// The collection. - private void FillPoolItemCollection(IEnumerable collection) - { - int index = 0; - foreach (var item in collection) - { - this.poolItemCollection.Add(new PoolItem(item, index++)); - } - } - - /// Gets the first available item from the pool and sets its lock. - /// The first available item from the pool. - public PoolItem GetAvailableItem() - { - lock (this.poolItemCollection) - { - if (this.poolItemCollection.Any(item => !item.Locked)) - { - var firstAvailableItem = this.poolItemCollection.First(item => !item.Locked); - firstAvailableItem.SetLock(); - - CapyEventReporter.EmitEvent(EventLevel.Debug, "Accessed ppol and retrieved {0}", args: new[] { firstAvailableItem }); - - return firstAvailableItem; - } - } - - CapyEventReporter.EmitEvent(EventLevel.Error, "Could not return an available item."); - return null; - } - - /// Releases the lock on the specified item and returns it to the pool. - /// - /// This method sets the flag to so that - /// it can be retrieved by . - /// - /// The item to release. - public void ReleaseItem(PoolItem item) - { - item.ReleaseLock(); - } - - #endregion Methods + this.poolSize = poolSize; + this.poolItemCollection = new ConcurrentBag>(); + FillPoolItemCollection(poolSize); } - /// A pool item. This class cannot be inherited. - /// The type of the pooled item. - public sealed class PoolItem + /// + /// Initializes a new instance of the class with the specified pool size + /// and constructor selector. + /// + /// The size of the pool. + /// + /// The constructor selector used to create new instances of . + /// + public Pool(int poolSize, Func constructorSelector) { - #region Members - - /// The pooled item. - private readonly T item; - - /// A flag indicating whether the item is locked or not. - private bool locked; - - /// The zero-based index of the pooled item. - private readonly int index; - - /// The name of the pooled item . - private readonly string typeName; - - #endregion Members - - #region Properties - - /// Gets the pooled resource. - /// The pooled resource. - public T Item - { - get - { - return this.item; - } - } - - /// Gets a value indicating whether this object is locked or not. - /// A value indicating whether this object is locked or not. - public bool Locked - { - get - { - return this.locked; - } - } - - /// Gets the zero-based index of the pooled item. - /// The index. - public int Index - { - get - { - return this.index; - } - } - - /// Gets the name of the of the pooled item. - /// The name of the of the pooled item. - public string TypeName - { - get - { - return this.typeName; - } - } - - #endregion Properties - - #region Constructors - - /// - /// Initializes a new instance of the class with the specified item and - /// index. - /// - /// The pooled item. - /// The zero-based index of the pooled item. - internal PoolItem(T item, int index) - { - this.item = item; - this.index = index; - this.locked = false; - this.typeName = typeof(T).Name; - } - - #endregion Constructors - - #region Methods - - /// Sets the lock on the item indicating that it is in use. - /// If the item is already locked, an error event is emitted. - /// - /// if the item is locked successfully, if it - /// fails. - /// - public bool SetLock() - { - if (this.locked) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "Lock requested for {0}, but the lock request failed.", args: new[] { this }); - return false; - } - - this.locked = true; - - return true; - } - - /// Releases the lock on the item. - /// If the item is not locked, an error event is emitted. - public void ReleaseLock() - { - if (!this.locked) - { - CapyEventReporter.EmitEvent(EventLevel.Error, "Lock release requested for {0}, but the lock was already released.", args: new[] { this } ); - } - - this.locked = false; - } - - #endregion Methods - - #region Overrides - - /// Returns a string that represents the current object and its lock state. - /// A string that represents the current object and its lock state. - public override string ToString() - { - return string.Format("{0} {1} ({2})", this.typeName, this.index, this.locked ? "Locked" : "Unlocked"); - } - - #endregion Overrides + this.poolSize = poolSize; + this.poolItemCollection = new ConcurrentBag>(); + FillPoolItemCollection(poolSize, constructorSelector); } + + /// + /// Initializes a new instance of the class with the specified collection + /// of items. + /// + /// + /// The collection of items with which to seed the pool. + /// + public Pool(IEnumerable collection) + { + this.poolSize = collection.Count(); + this.poolItemCollection = new ConcurrentBag>(); + FillPoolItemCollection(collection); + } + + #endregion Constructors + + #region Methods + + /// + /// Initializes the pool with the specified number of items using the default constructor. + /// + /// The size of the pool. + private void FillPoolItemCollection(int poolSize) + { + FillPoolItemCollection(poolSize, () => default); + } + + /// + /// Initializes the pool with the specified number of items using the specified constructor + /// selector. + /// + /// The size of the pool. + /// The constructor selector. + private void FillPoolItemCollection(int poolSize, Func constructorSelector) + { + for (var i = 0; i < poolSize; i++) + { + this.poolItemCollection.Add(new PoolItem(constructorSelector(), i)); + } + } + + /// Fill the pool item collection from an existing collection. + /// The collection. + private void FillPoolItemCollection(IEnumerable collection) + { + var index = 0; + foreach (var item in collection) + { + this.poolItemCollection.Add(new PoolItem(item, index++)); + } + } + + /// Gets the first available item from the pool and sets its lock. + /// The first available item from the pool. + public PoolItem GetAvailableItem() + { + lock (this.poolItemCollection) + { + if (this.poolItemCollection.Any(item => !item.Locked)) + { + var firstAvailableItem = this.poolItemCollection.First(item => !item.Locked); + firstAvailableItem.SetLock(); + + CapyEventReporter.EmitEvent(EventLevel.Debug, "Accessed ppol and retrieved {0}", + args: new[] { firstAvailableItem }); + + return firstAvailableItem; + } + } + + CapyEventReporter.EmitEvent(EventLevel.Error, "Could not return an available item."); + return null; + } + + /// Releases the lock on the specified item and returns it to the pool. + /// + /// This method sets the flag to so that + /// it can be retrieved by . + /// + /// The item to release. + public void ReleaseItem(PoolItem item) + { + item.ReleaseLock(); + } + + #endregion Methods } + +/// A pool item. This class cannot be inherited. +/// The type of the pooled item. +public sealed class PoolItem +{ + #region Constructors + + /// + /// Initializes a new instance of the class with the specified item and + /// index. + /// + /// The pooled item. + /// The zero-based index of the pooled item. + internal PoolItem(T item, int index) + { + this.item = item; + this.index = index; + this.locked = false; + this.typeName = typeof(T).Name; + } + + #endregion Constructors + + #region Overrides + + /// Returns a string that represents the current object and its lock state. + /// A string that represents the current object and its lock state. + public override string ToString() + { + return string.Format("{0} {1} ({2})", this.typeName, this.index, this.locked ? "Locked" : "Unlocked"); + } + + #endregion Overrides + + #region Members + + /// The pooled item. + private readonly T item; + + /// A flag indicating whether the item is locked or not. + private bool locked; + + /// The zero-based index of the pooled item. + private readonly int index; + + /// The name of the pooled item . + private readonly string typeName; + + #endregion Members + + #region Properties + + /// Gets the pooled resource. + /// The pooled resource. + public T Item + { + get { return this.item; } + } + + /// Gets a value indicating whether this object is locked or not. + /// A value indicating whether this object is locked or not. + public bool Locked + { + get { return this.locked; } + } + + /// Gets the zero-based index of the pooled item. + /// The index. + public int Index + { + get { return this.index; } + } + + /// Gets the name of the of the pooled item. + /// The name of the of the pooled item. + public string TypeName + { + get { return this.typeName; } + } + + #endregion Properties + + #region Methods + + /// Sets the lock on the item indicating that it is in use. + /// If the item is already locked, an error event is emitted. + /// + /// if the item is locked successfully, if it + /// fails. + /// + public bool SetLock() + { + if (this.locked) + { + CapyEventReporter.EmitEvent(EventLevel.Error, "Lock requested for {0}, but the lock request failed.", + args: new[] { this }); + return false; + } + + this.locked = true; + + return true; + } + + /// Releases the lock on the item. + /// If the item is not locked, an error event is emitted. + public void ReleaseLock() + { + if (!this.locked) + { + CapyEventReporter.EmitEvent(EventLevel.Error, + "Lock release requested for {0}, but the lock was already released.", args: new[] { this }); + } + + this.locked = false; + } + + #endregion Methods +} \ No newline at end of file diff --git a/CapyKit/PropertyComparer.cs b/CapyKit/PropertyComparer.cs index 580cd34..0e136de 100644 --- a/CapyKit/PropertyComparer.cs +++ b/CapyKit/PropertyComparer.cs @@ -1,101 +1,93 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace CapyKit; -namespace CapyKit +/// +/// A object comparer that can accept a lambda expression to compare properties. +/// +/// Generic type parameter of the parent object. +/// Generic type parameter of the property value. +/// +/// using System; +/// using System.Collections.Generic; +/// using System.Linq; +/// class Program +/// { +/// static void Main(string[] args) +/// { +/// var people = new List<Person> +/// { +/// new Person { Name = "Alice", Age = 30 }, new Person { Name = "Bob", Age = 30 }, new +/// Person { Name = "Charlie", Age = 35 } +/// }; +/// var comparer = new PropertyComparer<Person, int>(p => p.Age); +/// var distinctPeople = people.Distinct(comparer).ToList(); +/// foreach (var person in distinctPeople) +/// { +/// Console.WriteLine($"{person.Name} - {person.Age}"); +/// } +/// } +/// } +/// class Person +/// { +/// public string Name { get; set; } +/// public int Age { get; set; } +/// } +/// +public class PropertyComparer : IEqualityComparer { - /// - /// A object comparer that can accept a lambda expression to compare properties. - /// - /// Generic type parameter of the parent object. - /// Generic type parameter of the property value. - /// - /// using System; - /// using System.Collections.Generic; - /// using System.Linq; - /// - /// class Program - /// { - /// static void Main(string[] args) - /// { - /// var people = new List<Person> - /// { - /// new Person { Name = "Alice", Age = 30 }, new Person { Name = "Bob", Age = 30 }, new - /// Person { Name = "Charlie", Age = 35 } - /// }; - /// - /// var comparer = new PropertyComparer<Person, int>(p => p.Age); - /// var distinctPeople = people.Distinct(comparer).ToList(); - /// - /// foreach (var person in distinctPeople) - /// { - /// Console.WriteLine($"{person.Name} - {person.Age}"); - /// } - /// } - /// } - /// - /// class Person - /// { - /// public string Name { get; set; } - /// public int Age { get; set; } - /// } - /// - public class PropertyComparer : IEqualityComparer + /// The expression to retrieve the property. + private readonly Func expression; + + /// Constructor. + /// The expression. + public PropertyComparer(Func expression) { - /// The expression to retrieve the property. - private Func expression; - - /// Constructor. - /// The expression. - public PropertyComparer(Func expression) - { - this.expression = expression; - } - - /// Determines whether the specified properties are equal. - /// The first object of type to compare. - /// The second object of type to compare. - /// - /// if the specified objects are equal; otherwise, - /// . - /// - public bool Equals(T x, T y) - { - var left = expression.Invoke(x); - var right = expression.Invoke(y); - - if (left == null && right == null) - { - return true; - } - if (left == null ^ right == null) - { - return false; - } - else - { - return left.Equals(right); - } - } - - /// Returns a hash code for the specified object. - /// - /// The for which a hash code is to be returned. - /// - /// A hash code for the specified object. - /// - /// ### - /// The type of is a reference type and - /// is - /// . - /// - public int GetHashCode(T obj) - { - var property = expression(obj); - - return (property == null) ? 0 : property.GetHashCode(); - } + this.expression = expression; } -} + + #region IEqualityComparer Members + + /// Determines whether the specified properties are equal. + /// The first object of type to compare. + /// The second object of type to compare. + /// + /// if the specified objects are equal; otherwise, + /// . + /// + public bool Equals(T x, T y) + { + var left = this.expression.Invoke(x); + var right = this.expression.Invoke(y); + + if (left == null && right == null) + { + return true; + } + + if ((left == null) ^ (right == null)) + { + return false; + } + + return left.Equals(right); + } + + /// Returns a hash code for the specified object. + /// + /// The for which a hash code is to be returned. + /// + /// A hash code for the specified object. + /// ### + /// + /// The type of is a reference type and + /// is + /// . + /// + public int GetHashCode(T obj) + { + var property = this.expression(obj); + + return property == null ? 0 : property.GetHashCode(); + } + + #endregion +} \ No newline at end of file