chore(docs): Adds UnmanagedDataReader & BinaryFileReader documentation (#1968)

This commit is contained in:
Derek Gooding 2024-10-01 20:07:51 -04:00 committed by GitHub
parent 766b46bcc1
commit 4b3b2839c6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 728 additions and 543 deletions

View file

@ -147,6 +147,7 @@ dotnet_diagnostic.IDE0008.severity = none # using var
# csharp_style_var_for_built_in_types = true:suggestion # suggest using var (implied) variables
# csharp_style_var_when_type_is_apparent = true:suggestion # suggest using var (implied) variables
# csharp_style_var_elsewhere = true:suggestion # suggest using var (implied) variables
dotnet_diagnostic.RCS1123.severity = none
# ReSharper properties
resharper_apply_auto_detected_rules=false

View file

@ -21,6 +21,15 @@ using System.Text;
namespace Server;
/// <summary>
/// Read bits of data from a serialized file in a managed environment.
/// <para>
/// Uses the following components collectively:
/// <br><see cref="MemoryMappedFile"/></br>
/// <br><see cref="MemoryMappedViewStream"/></br>
/// <br><see cref="UnmanagedDataReader"/></br>
/// </para>
/// </summary>
public sealed unsafe class BinaryFileReader : IDisposable, IGenericReader
{
private readonly bool _usePrefixes;
@ -28,6 +37,19 @@ public sealed unsafe class BinaryFileReader : IDisposable, IGenericReader
private readonly MemoryMappedViewStream _accessor;
private readonly UnmanagedDataReader _reader;
/// <summary>
/// Read bits of data from a serialized file in a managed environment.
/// <br>Encoding is UTF8 if left null.</br>
/// <para>
/// Uses the following components collectively:
/// <br><see cref="MemoryMappedFile"/></br>
/// <br><see cref="MemoryMappedViewStream"/></br>
/// <br><see cref="UnmanagedDataReader"/></br>
/// </para>
/// </summary>
/// <param name="path">Full file path of the file to be deserialized.</param>
/// <param name="usePrefixes">Sets if strings should be read with itern.</param>
/// <param name="encoding">Set an encoding. By default UTF8</param>
public BinaryFileReader(string path, bool usePrefixes = true, Encoding encoding = null)
{
_usePrefixes = usePrefixes;
@ -47,6 +69,9 @@ public sealed unsafe class BinaryFileReader : IDisposable, IGenericReader
}
}
/// <summary>
/// How many bits deep into the file is the reader at currently.
/// </summary>
public long Position => _reader.Position;
public void Dispose()
@ -56,54 +81,118 @@ public sealed unsafe class BinaryFileReader : IDisposable, IGenericReader
_mmf?.Dispose();
}
/// <summary>
/// If usePrefixes is true, return a ReadString(intern) else ReadStringRaw(intern).
/// </summary>
/// <returns>A string value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public string ReadString(bool intern = false) => _usePrefixes ? _reader.ReadString(intern) : _reader.ReadStringRaw(intern);
/// <summary>
/// Returns the next set of bits that make up a string.
/// </summary>
/// <returns>Next string value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public string ReadStringRaw(bool intern = false) => _reader.ReadStringRaw(intern);
/// <summary>
/// Read the next 64 bits to make up a long (int64).
/// </summary>
/// <returns>Next long value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public long ReadLong() => _reader.ReadLong();
/// <summary>
/// Read the next 64 bits to make up an unsigned long (uint64).
/// </summary>
/// <returns>Next ulong value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public ulong ReadULong() => _reader.ReadULong();
/// <summary>
/// Read the next 32 bits to make up an int (int32).
/// </summary>
/// <returns>Next int value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public int ReadInt() => _reader.ReadInt();
/// <summary>
/// Read the next 32 bits to make up an unsigned int (uint32).
/// </summary>
/// <returns>Next uint value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public uint ReadUInt() => _reader.ReadUInt();
/// <summary>
/// Read the next 16 bits to make up a short (int16).
/// </summary>
/// <returns>Next short value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public short ReadShort() => _reader.ReadShort();
/// <summary>
/// Read the next 16 bits to make up an unsigned short (int16).
/// </summary>
/// <returns>Next ushort value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public ushort ReadUShort() => _reader.ReadUShort();
/// <summary>
/// Read the next 8 bits to make up a float point double.
/// </summary>
/// <returns>Next double value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public double ReadDouble() => _reader.ReadDouble();
/// <summary>
/// Read the next 4 bits to make up a float point.
/// </summary>
/// <returns>Next float value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public float ReadFloat() => _reader.ReadFloat();
/// <summary>
/// Read the next 8 bits to make up a byte.
/// </summary>
/// <returns>Next byte value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public byte ReadByte() => _reader.ReadByte();
/// <summary>
/// Read the next 8 bits to make up a signed byte.
/// </summary>
/// <returns>Next sbyte value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public sbyte ReadSByte() => _reader.ReadSByte();
/// <summary>
/// Read the next 1 bit to make up a boolean.
/// </summary>
/// <returns>Next bool value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool ReadBool() => _reader.ReadBool();
/// <summary>
/// Read the next 32 bytes to make up a <see cref="Serial"/>.
/// </summary>
/// <returns>Next uint value cast as a <see cref="Serial"/> struct.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Serial ReadSerial() => _reader.ReadSerial();
/// <summary>
/// Reads the next Byte which helps determin how to read the following Type.
/// <br>If the byte returns 1 => <see cref="ReadStringRaw"/> and translate into a Type via the <see cref="AssemblyHandler"/></br>
/// <br>If the byte returns 2 => <see cref="UnmanagedDataReader.ReadTypeByHash"/></br>
/// <br>else return null</br>
/// </summary>
/// <returns>Next Type value</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Type ReadType() => _reader.ReadType();
/// <summary>
/// Reads the next set of bytes to fill the buffer.
/// </summary>
/// <param name="buffer">A reference span that will be filled with the next set of bytes.</param>
/// <returns>The length of the buffer.</returns>
/// <exception cref="OutOfMemoryException">Thrown if the buffer is larger than the remaining data to read in the file.</exception>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public int Read(Span<byte> buffer) => _reader.Read(buffer);
/// <summary>
/// Sets the current position of the stream to a specified value.
/// </summary>
/// <param name="offset">The new position, relative to the <paramref name="origin"/> parameter.</param>
/// <param name="origin">The reference point for the <paramref name="offset"/> parameter. It can be one of the values of <see cref="SeekOrigin"/>.</param>
/// <returns>The new position in the stream, in bytes.</returns>
/// <exception cref="ArgumentOutOfRangeException">Thrown when the <paramref name="offset"/> or the resulting position is out of the valid range.</exception>
/// <exception cref="InvalidOperationException">Thrown if the stream does not support seeking.</exception>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public long Seek(long offset, SeekOrigin origin) => _reader.Seek(offset, origin);
}

View file

@ -25,19 +25,31 @@ using Server.Text;
namespace Server;
/// <summary>
/// Read bits of data raw from a serialized file using Little-endian.
/// </summary>
public unsafe class UnmanagedDataReader : IGenericReader
{
private static readonly ILogger logger = LogFactory.GetLogger(typeof(UnmanagedDataReader));
private readonly byte* _ptr;
private long _position;
private readonly long _size;
private readonly Dictionary<ulong, string> _typesDb;
private readonly Encoding _encoding;
public long Position => _position;
/// <summary>
/// How many bits deep into the file is the reader at currently.
/// </summary>
public long Position { get; private set; }
/// <summary>
/// Read bits of data raw from a serialized file using Little-endian.
/// </summary>
/// <param name="ptr">The starting address for reading bits.</param>
/// <param name="size">The total size of memory to be read.</param>
/// <param name="typesDb">The custom type dictionary. Will throw an error if left null ReadType is called.</param>
/// <param name="encoding"><see cref="TextEncoding.UTF8"/> by default.</param>
public UnmanagedDataReader(byte* ptr, long size, Dictionary<ulong, string> typesDb = null, Encoding encoding = null)
{
_encoding = encoding ?? TextEncoding.UTF8;
@ -46,9 +58,19 @@ public unsafe class UnmanagedDataReader : IGenericReader
_size = size;
}
/// <summary>
/// Reads the next bit as a bool. If that bit is true, return an <see cref="ReadStringRaw"/> else null.
/// </summary>
/// <param name="intern"></param>
/// <returns>Next string value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public string ReadString(bool intern = false) => ReadBool() ? ReadStringRaw(intern) : null;
/// <summary>
/// Returns the next set of bits that make up a string.
/// </summary>
/// <param name="intern"></param>
/// <returns>Next string value.</returns>
public string ReadStringRaw(bool intern = false)
{
// ReadEncodedInt
@ -57,7 +79,7 @@ public unsafe class UnmanagedDataReader : IGenericReader
do
{
b = *(_ptr + _position++);
b = *(_ptr + Position++);
length |= (b & 0x7F) << shift;
shift += 7;
}
@ -68,95 +90,153 @@ public unsafe class UnmanagedDataReader : IGenericReader
return "".Intern();
}
var str = TextEncoding.GetString(new ReadOnlySpan<byte>(_ptr + _position, length), _encoding);
_position += length;
var str = TextEncoding.GetString(new ReadOnlySpan<byte>(_ptr + Position, length), _encoding);
Position += length;
return intern ? str.Intern() : str;
}
/// <summary>
/// Read the next 64 bits to make up a long (int64).
/// </summary>
/// <returns>Next long value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public long ReadLong()
{
var v = BinaryPrimitives.ReadInt64LittleEndian(new ReadOnlySpan<byte>(_ptr + _position, sizeof(long)));
_position += sizeof(long);
var v = BinaryPrimitives.ReadInt64LittleEndian(new ReadOnlySpan<byte>(_ptr + Position, sizeof(long)));
Position += sizeof(long);
return v;
}
/// <summary>
/// Read the next 64 bits to make up an unsigned long (uint64).
/// </summary>
/// <returns>Next ulong value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public ulong ReadULong()
{
var v = BinaryPrimitives.ReadUInt64LittleEndian(new ReadOnlySpan<byte>(_ptr + _position, sizeof(ulong)));
_position += sizeof(ulong);
var v = BinaryPrimitives.ReadUInt64LittleEndian(new ReadOnlySpan<byte>(_ptr + Position, sizeof(ulong)));
Position += sizeof(ulong);
return v;
}
/// <summary>
/// Read the next 32 bits to make up an int (int32).
/// </summary>
/// <returns>Next int value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public int ReadInt()
{
var v = BinaryPrimitives.ReadInt32LittleEndian(new ReadOnlySpan<byte>(_ptr + _position, sizeof(int)));
_position += sizeof(int);
var v = BinaryPrimitives.ReadInt32LittleEndian(new ReadOnlySpan<byte>(_ptr + Position, sizeof(int)));
Position += sizeof(int);
return v;
}
/// <summary>
/// Read the next 32 bits to make up an unsigned int (uint32).
/// </summary>
/// <returns>Next uint value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public uint ReadUInt()
{
var v = BinaryPrimitives.ReadUInt32LittleEndian(new ReadOnlySpan<byte>(_ptr + _position, sizeof(uint)));
_position += sizeof(uint);
var v = BinaryPrimitives.ReadUInt32LittleEndian(new ReadOnlySpan<byte>(_ptr + Position, sizeof(uint)));
Position += sizeof(uint);
return v;
}
/// <summary>
/// Read the next 16 bits to make up a short (int16).
/// </summary>
/// <returns>Next short value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public short ReadShort()
{
var v = BinaryPrimitives.ReadInt16LittleEndian(new ReadOnlySpan<byte>(_ptr + _position, sizeof(short)));
_position += sizeof(short);
var v = BinaryPrimitives.ReadInt16LittleEndian(new ReadOnlySpan<byte>(_ptr + Position, sizeof(short)));
Position += sizeof(short);
return v;
}
/// <summary>
/// Read the next 16 bits to make up an unsigned short (int16).
/// </summary>
/// <returns>Next ushort value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public ushort ReadUShort()
{
var v = BinaryPrimitives.ReadUInt16LittleEndian(new ReadOnlySpan<byte>(_ptr + _position, sizeof(ushort)));
_position += sizeof(ushort);
var v = BinaryPrimitives.ReadUInt16LittleEndian(new ReadOnlySpan<byte>(_ptr + Position, sizeof(ushort)));
Position += sizeof(ushort);
return v;
}
/// <summary>
/// Read the next 8 bits to make up a float point double.
/// </summary>
/// <returns>Next double value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public double ReadDouble()
{
var v = BinaryPrimitives.ReadDoubleLittleEndian(new ReadOnlySpan<byte>(_ptr + _position, sizeof(double)));
_position += sizeof(double);
var v = BinaryPrimitives.ReadDoubleLittleEndian(new ReadOnlySpan<byte>(_ptr + Position, sizeof(double)));
Position += sizeof(double);
return v;
}
/// <summary>
/// Read the next 4 bits to make up a float point.
/// </summary>
/// <returns>Next float value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public float ReadFloat()
{
var v = BinaryPrimitives.ReadSingleLittleEndian(new ReadOnlySpan<byte>(_ptr + _position, sizeof(float)));
_position += sizeof(float);
var v = BinaryPrimitives.ReadSingleLittleEndian(new ReadOnlySpan<byte>(_ptr + Position, sizeof(float)));
Position += sizeof(float);
return v;
}
/// <summary>
/// Read the next 8 bits to make up a byte.
/// </summary>
/// <returns>Next byte value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public byte ReadByte() => *(_ptr + _position++);
public byte ReadByte() => *(_ptr + Position++);
/// <summary>
/// Read the next 8 bits to make up a signed byte.
/// </summary>
/// <returns>Next sbyte value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public sbyte ReadSByte() => (sbyte)ReadByte();
/// <summary>
/// Read the next Byte and return true if it's value returns zero.
/// </summary>
/// <returns>Next bool value.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool ReadBool() => ReadByte() != 0;
/// <summary>
/// Read the next 32 bytes to make up a <see cref="Serial"/>.
/// </summary>
/// <returns>Next uint value cast as a <see cref="Serial"/> struct.</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Serial ReadSerial() => (Serial)ReadUInt();
/// <summary>
/// Reads the next Byte which helps determin how to read the following Type.
/// <br>If the byte returns 1 => <see cref="ReadStringRaw"/> and translate into a Type via the <see cref="AssemblyHandler"/></br>
/// <br>If the byte returns 2 => <see cref="ReadTypeByHash"/></br>
/// <br>else return null</br>
/// </summary>
/// <returns>Next Type value</returns>
public Type ReadType() =>
ReadByte() switch
{
0 => null,
1 => AssemblyHandler.FindTypeByFullName(ReadStringRaw()), // Backward compatibility
2 => ReadTypeByHash()
2 => ReadTypeByHash(),
_ => null,
};
/// <summary>
/// Reads the next <see cref="ulong"/> to create a hash and convert that into a Type using the <see cref="AssemblyHandler"/>.
/// <para>Will log an <see cref="Exception"/> if typesDb is null or typesDb doesn't contain the hash and return null</para>
/// </summary>
/// <returns>Next Type value</returns>
public Type ReadTypeByHash()
{
var hash = ReadULong();
@ -205,19 +285,33 @@ public unsafe class UnmanagedDataReader : IGenericReader
return t;
}
/// <summary>
/// Reads the next set of bytes to fill the buffer.
/// </summary>
/// <param name="buffer">A reference span that will be filled with the next set of bytes.</param>
/// <returns>The length of the buffer.</returns>
/// <exception cref="OutOfMemoryException">Thrown if the buffer is larger than the remaining data to read in the file.</exception>
public int Read(Span<byte> buffer)
{
var length = buffer.Length;
if (length > _size - _position)
if (length > _size - Position)
{
throw new OutOfMemoryException();
}
new ReadOnlySpan<byte>(_ptr + _position, length).CopyTo(buffer);
_position += length;
new ReadOnlySpan<byte>(_ptr + Position, length).CopyTo(buffer);
Position += length;
return length;
}
/// <summary>
/// Sets the current position of the stream to a specified value.
/// </summary>
/// <param name="offset">The new position, relative to the <paramref name="origin"/> parameter.</param>
/// <param name="origin">The reference point for the <paramref name="offset"/> parameter. It can be one of the values of <see cref="SeekOrigin"/>.</param>
/// <returns>The new position in the stream, in bytes.</returns>
/// <exception cref="ArgumentOutOfRangeException">Thrown when the <paramref name="offset"/> or the resulting position is out of the valid range.</exception>
/// <exception cref="InvalidOperationException">Thrown if the stream does not support seeking.</exception>
public virtual long Seek(long offset, SeekOrigin origin)
{
Debug.Assert(
@ -229,18 +323,16 @@ public unsafe class UnmanagedDataReader : IGenericReader
"Attempting to seek to an invalid position using SeekOrigin.Begin"
);
Debug.Assert(
origin != SeekOrigin.Current || _position + offset >= 0 && _position + offset < _size,
origin != SeekOrigin.Current || Position + offset >= 0 && Position + offset < _size,
"Attempting to seek to an invalid position using SeekOrigin.Current"
);
var position = Math.Max(0L, origin switch
Position = Math.Max(0L, origin switch
{
SeekOrigin.Current => _position + offset,
SeekOrigin.Current => Position + offset,
SeekOrigin.End => _size + offset,
_ => offset // Begin
});
_position = position;
return _position;
return Position;
}
}

View file

@ -1,496 +1,499 @@
<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="Microsoft Managed Recommended Rules" Description="These rules focus on the most critical problems in your code, including potential security holes, application crashes, and other important logic and design errors. It is recommended to include this rule set in any custom rule set you create for your projects." ToolsVersion="16.0">
<Localization ResourceAssembly="Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.dll" ResourceBaseName="Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.Localized">
<Name Resource="MinimumRecommendedRules_Name" />
<Description Resource="MinimumRecommendedRules_Description" />
</Localization>
<Rules AnalyzerId="Microsoft.CodeAnalysis.CSharp" RuleNamespace="Microsoft.CodeAnalysis.CSharp">
<Rule Id="AD0001" Action="None" />
<Rule Id="CS0078" Action="None" />
<Rule Id="CS0105" Action="None" />
<Rule Id="CS0108" Action="None" />
<Rule Id="CS0109" Action="None" />
<Rule Id="CS0114" Action="None" />
<Rule Id="CS0162" Action="None" />
<Rule Id="CS0164" Action="None" />
<Rule Id="CS0168" Action="None" />
<Rule Id="CS0183" Action="None" />
<Rule Id="CS0184" Action="None" />
<Rule Id="CS0197" Action="None" />
<Rule Id="CS0219" Action="None" />
<Rule Id="CS0251" Action="None" />
<Rule Id="CS0252" Action="None" />
<Rule Id="CS0253" Action="None" />
<Rule Id="CS0278" Action="None" />
<Rule Id="CS0279" Action="None" />
<Rule Id="CS0280" Action="None" />
<Rule Id="CS0282" Action="None" />
<Rule Id="CS0419" Action="None" />
<Rule Id="CS0420" Action="None" />
<Rule Id="CS0435" Action="None" />
<Rule Id="CS0436" Action="None" />
<Rule Id="CS0437" Action="None" />
<Rule Id="CS0440" Action="None" />
<Rule Id="CS0458" Action="None" />
<Rule Id="CS0464" Action="None" />
<Rule Id="CS0465" Action="None" />
<Rule Id="CS0469" Action="None" />
<Rule Id="CS0472" Action="None" />
<Rule Id="CS0473" Action="None" />
<Rule Id="CS0612" Action="None" />
<Rule Id="CS0618" Action="None" />
<Rule Id="CS0626" Action="None" />
<Rule Id="CS0628" Action="None" />
<Rule Id="CS0642" Action="None" />
<Rule Id="CS0652" Action="None" />
<Rule Id="CS0657" Action="None" />
<Rule Id="CS0658" Action="None" />
<Rule Id="CS0659" Action="None" />
<Rule Id="CS0660" Action="None" />
<Rule Id="CS0661" Action="None" />
<Rule Id="CS0665" Action="None" />
<Rule Id="CS0672" Action="None" />
<Rule Id="CS0675" Action="None" />
<Rule Id="CS0684" Action="None" />
<Rule Id="CS0693" Action="None" />
<Rule Id="CS0728" Action="None" />
<Rule Id="CS0809" Action="None" />
<Rule Id="CS0811" Action="None" />
<Rule Id="CS0824" Action="None" />
<Rule Id="CS1030" Action="None" />
<Rule Id="CS1058" Action="None" />
<Rule Id="CS1062" Action="None" />
<Rule Id="CS1064" Action="None" />
<Rule Id="CS1066" Action="None" />
<Rule Id="CS1072" Action="None" />
<Rule Id="CS1522" Action="None" />
<Rule Id="CS1570" Action="None" />
<Rule Id="CS1571" Action="None" />
<Rule Id="CS1572" Action="None" />
<Rule Id="CS1573" Action="None" />
<Rule Id="CS1574" Action="None" />
<Rule Id="CS1580" Action="None" />
<Rule Id="CS1581" Action="None" />
<Rule Id="CS1584" Action="None" />
<Rule Id="CS1587" Action="None" />
<Rule Id="CS1589" Action="None" />
<Rule Id="CS1590" Action="None" />
<Rule Id="CS1591" Action="None" />
<Rule Id="CS1592" Action="None" />
<Rule Id="CS1616" Action="None" />
<Rule Id="CS1633" Action="None" />
<Rule Id="CS1634" Action="None" />
<Rule Id="CS1635" Action="None" />
<Rule Id="CS1645" Action="None" />
<Rule Id="CS1658" Action="None" />
<Rule Id="CS1668" Action="None" />
<Rule Id="CS1685" Action="None" />
<Rule Id="CS1687" Action="None" />
<Rule Id="CS1690" Action="None" />
<Rule Id="CS1692" Action="None" />
<Rule Id="CS1695" Action="None" />
<Rule Id="CS1696" Action="None" />
<Rule Id="CS1697" Action="None" />
<Rule Id="CS1700" Action="None" />
<Rule Id="CS1701" Action="None" />
<Rule Id="CS1702" Action="None" />
<Rule Id="CS1710" Action="None" />
<Rule Id="CS1711" Action="None" />
<Rule Id="CS1712" Action="None" />
<Rule Id="CS1717" Action="None" />
<Rule Id="CS1718" Action="None" />
<Rule Id="CS1720" Action="None" />
<Rule Id="CS1723" Action="None" />
<Rule Id="CS1734" Action="None" />
<Rule Id="CS1735" Action="None" />
<Rule Id="CS1762" Action="None" />
<Rule Id="CS1927" Action="None" />
<Rule Id="CS1956" Action="None" />
<Rule Id="CS1957" Action="None" />
<Rule Id="CS1974" Action="None" />
<Rule Id="CS1981" Action="None" />
<Rule Id="CS1998" Action="None" />
<Rule Id="CS2002" Action="None" />
<Rule Id="CS2008" Action="None" />
<Rule Id="CS2023" Action="None" />
<Rule Id="CS2029" Action="None" />
<Rule Id="CS2038" Action="None" />
<Rule Id="CS3000" Action="None" />
<Rule Id="CS3001" Action="None" />
<Rule Id="CS3002" Action="None" />
<Rule Id="CS3003" Action="None" />
<Rule Id="CS3005" Action="None" />
<Rule Id="CS3006" Action="None" />
<Rule Id="CS3007" Action="None" />
<Rule Id="CS3008" Action="None" />
<Rule Id="CS3009" Action="None" />
<Rule Id="CS3010" Action="None" />
<Rule Id="CS3011" Action="None" />
<Rule Id="CS3012" Action="None" />
<Rule Id="CS3013" Action="None" />
<Rule Id="CS3014" Action="None" />
<Rule Id="CS3015" Action="None" />
<Rule Id="CS3016" Action="None" />
<Rule Id="CS3017" Action="None" />
<Rule Id="CS3018" Action="None" />
<Rule Id="CS3019" Action="None" />
<Rule Id="CS3021" Action="None" />
<Rule Id="CS3022" Action="None" />
<Rule Id="CS3023" Action="None" />
<Rule Id="CS3024" Action="None" />
<Rule Id="CS3026" Action="None" />
<Rule Id="CS3027" Action="None" />
<Rule Id="CS4014" Action="None" />
<Rule Id="CS4024" Action="None" />
<Rule Id="CS4025" Action="None" />
<Rule Id="CS4026" Action="None" />
<Rule Id="CS7033" Action="None" />
<Rule Id="CS7035" Action="None" />
<Rule Id="CS7080" Action="None" />
<Rule Id="CS7081" Action="None" />
<Rule Id="CS7082" Action="None" />
<Rule Id="CS7090" Action="None" />
<Rule Id="CS7095" Action="None" />
<Rule Id="CS8001" Action="None" />
<Rule Id="CS8002" Action="None" />
<Rule Id="CS8009" Action="None" />
<Rule Id="CS8012" Action="None" />
<Rule Id="CS8018" Action="None" />
<Rule Id="CS8019" Action="None" />
<Rule Id="CS8020" Action="None" />
<Rule Id="CS8021" Action="None" />
<Rule Id="CS8029" Action="None" />
<Rule Id="CS8032" Action="None" />
<Rule Id="CS8033" Action="None" />
<Rule Id="CS8034" Action="None" />
<Rule Id="CS8040" Action="None" />
<Rule Id="CS8073" Action="None" />
<Rule Id="CS8094" Action="None" />
<Rule Id="CS8105" Action="None" />
<Rule Id="CS8123" Action="None" />
<Rule Id="CS8305" Action="None" />
<Rule Id="CS8321" Action="None" />
<Rule Id="CS8359" Action="None" />
<Rule Id="CS8360" Action="None" />
<Rule Id="CS8371" Action="None" />
<Rule Id="CS8383" Action="None" />
<Rule Id="CS8387" Action="None" />
<Rule Id="CS8424" Action="None" />
<Rule Id="CS8425" Action="None" />
<Rule Id="CS8509" Action="None" />
<Rule Id="CS8512" Action="None" />
<Rule Id="CS8513" Action="None" />
<Rule Id="CS8519" Action="None" />
<Rule Id="CS8520" Action="None" />
<Rule Id="CS8597" Action="None" />
<Rule Id="CS8600" Action="None" />
<Rule Id="CS8601" Action="None" />
<Rule Id="CS8602" Action="None" />
<Rule Id="CS8603" Action="None" />
<Rule Id="CS8604" Action="None" />
<Rule Id="CS8605" Action="None" />
<Rule Id="CS8607" Action="None" />
<Rule Id="CS8608" Action="None" />
<Rule Id="CS8609" Action="None" />
<Rule Id="CS8610" Action="None" />
<Rule Id="CS8611" Action="None" />
<Rule Id="CS8612" Action="None" />
<Rule Id="CS8613" Action="None" />
<Rule Id="CS8614" Action="None" />
<Rule Id="CS8615" Action="None" />
<Rule Id="CS8616" Action="None" />
<Rule Id="CS8617" Action="None" />
<Rule Id="CS8618" Action="None" />
<Rule Id="CS8619" Action="None" />
<Rule Id="CS8620" Action="None" />
<Rule Id="CS8621" Action="None" />
<Rule Id="CS8622" Action="None" />
<Rule Id="CS8624" Action="None" />
<Rule Id="CS8625" Action="None" />
<Rule Id="CS8629" Action="None" />
<Rule Id="CS8631" Action="None" />
<Rule Id="CS8632" Action="None" />
<Rule Id="CS8633" Action="None" />
<Rule Id="CS8634" Action="None" />
<Rule Id="CS8643" Action="None" />
<Rule Id="CS8644" Action="None" />
<Rule Id="CS8645" Action="None" />
<Rule Id="CS8655" Action="None" />
<Rule Id="CS8656" Action="None" />
<Rule Id="CS8667" Action="None" />
<Rule Id="CS8669" Action="None" />
<Rule Id="CS8670" Action="None" />
<Rule Id="CS8714" Action="None" />
<Rule Id="CS8762" Action="None" />
<Rule Id="CS8763" Action="None" />
<Rule Id="CS8764" Action="None" />
<Rule Id="CS8765" Action="None" />
<Rule Id="CS8766" Action="None" />
<Rule Id="CS8767" Action="None" />
<Rule Id="CS8768" Action="None" />
<Rule Id="CS8769" Action="None" />
<Rule Id="CS8770" Action="None" />
<Rule Id="CS8774" Action="None" />
<Rule Id="CS8775" Action="None" />
<Rule Id="CS8776" Action="None" />
<Rule Id="CS8777" Action="None" />
<Rule Id="CS8784" Action="None" />
<Rule Id="CS8785" Action="None" />
<Rule Id="CS8793" Action="None" />
<Rule Id="CS8794" Action="None" />
<Rule Id="CS8819" Action="None" />
</Rules>
<Rules AnalyzerId="Microsoft.CodeAnalysis.CSharp.Features" RuleNamespace="Microsoft.CodeAnalysis.CSharp.Features">
<Rule Id="IDE0001" Action="None" />
<Rule Id="IDE0002" Action="None" />
<Rule Id="IDE0003" Action="None" />
<Rule Id="IDE0003WithoutSuggestion" Action="None" />
<Rule Id="IDE0004" Action="None" />
<Rule Id="IDE0004WithoutSuggestion" Action="None" />
<Rule Id="IDE0005" Action="None" />
<Rule Id="IDE0007" Action="None" />
<Rule Id="IDE0007WithoutSuggestion" Action="None" />
<Rule Id="IDE0008" Action="None" />
<Rule Id="IDE0008WithoutSuggestion" Action="None" />
<Rule Id="IDE0009" Action="None" />
<Rule Id="IDE0009WithoutSuggestion" Action="None" />
<Rule Id="IDE0010" Action="None" />
<Rule Id="IDE0010WithoutSuggestion" Action="None" />
<Rule Id="IDE0011" Action="None" />
<Rule Id="IDE0011WithoutSuggestion" Action="None" />
<Rule Id="IDE0016" Action="None" />
<Rule Id="IDE0016WithoutSuggestion" Action="None" />
<Rule Id="IDE0017" Action="None" />
<Rule Id="IDE0017WithoutSuggestion" Action="None" />
<Rule Id="IDE0018" Action="None" />
<Rule Id="IDE0018WithoutSuggestion" Action="None" />
<Rule Id="IDE0019" Action="None" />
<Rule Id="IDE0019WithoutSuggestion" Action="None" />
<Rule Id="IDE0020" Action="None" />
<Rule Id="IDE0020WithoutSuggestion" Action="None" />
<Rule Id="IDE0021" Action="None" />
<Rule Id="IDE0022" Action="None" />
<Rule Id="IDE0023" Action="None" />
<Rule Id="IDE0024" Action="None" />
<Rule Id="IDE0025" Action="None" />
<Rule Id="IDE0026" Action="None" />
<Rule Id="IDE0027" Action="None" />
<Rule Id="IDE0028" Action="None" />
<Rule Id="IDE0028WithoutSuggestion" Action="None" />
<Rule Id="IDE0029" Action="None" />
<Rule Id="IDE0029WithoutSuggestion" Action="None" />
<Rule Id="IDE0030" Action="None" />
<Rule Id="IDE0030WithoutSuggestion" Action="None" />
<Rule Id="IDE0031" Action="None" />
<Rule Id="IDE0031WithoutSuggestion" Action="None" />
<Rule Id="IDE0032" Action="None" />
<Rule Id="IDE0032WithoutSuggestion" Action="None" />
<Rule Id="IDE0034" Action="None" />
<Rule Id="IDE0034WithoutSuggestion" Action="None" />
<Rule Id="IDE0036" Action="None" />
<Rule Id="IDE0036WithoutSuggestion" Action="None" />
<Rule Id="IDE0037" Action="None" />
<Rule Id="IDE0037WithoutSuggestion" Action="None" />
<Rule Id="IDE0038" Action="None" />
<Rule Id="IDE0038WithoutSuggestion" Action="None" />
<Rule Id="IDE0039" Action="None" />
<Rule Id="IDE0039WithoutSuggestion" Action="None" />
<Rule Id="IDE0040" Action="None" />
<Rule Id="IDE0040WithoutSuggestion" Action="None" />
<Rule Id="IDE0041" Action="None" />
<Rule Id="IDE0041WithoutSuggestion" Action="None" />
<Rule Id="IDE0042" Action="None" />
<Rule Id="IDE0042WithoutSuggestion" Action="None" />
<Rule Id="IDE0043" Action="None" />
<Rule Id="IDE0045" Action="None" />
<Rule Id="IDE0045WithoutSuggestion" Action="None" />
<Rule Id="IDE0046" Action="None" />
<Rule Id="IDE0046WithoutSuggestion" Action="None" />
<Rule Id="IDE0047" Action="None" />
<Rule Id="IDE0048" Action="None" />
<Rule Id="IDE0048WithoutSuggestion" Action="None" />
<Rule Id="IDE0049" Action="None" />
<Rule Id="IDE0049WithoutSuggestion" Action="None" />
<Rule Id="IDE0050" Action="None" />
<Rule Id="IDE0050WithoutSuggestion" Action="None" />
<Rule Id="IDE0051" Action="None" />
<Rule Id="IDE0052" Action="None" />
<Rule Id="IDE0053" Action="None" />
<Rule Id="IDE0053WithoutSuggestion" Action="None" />
<Rule Id="IDE0054" Action="None" />
<Rule Id="IDE0054WithoutSuggestion" Action="None" />
<Rule Id="IDE0056" Action="None" />
<Rule Id="IDE0056WithoutSuggestion" Action="None" />
<Rule Id="IDE0057" Action="None" />
<Rule Id="IDE0057WithoutSuggestion" Action="None" />
<Rule Id="IDE0058" Action="None" />
<Rule Id="IDE0059" Action="None" />
<Rule Id="IDE0060" Action="None" />
<Rule Id="IDE0061" Action="None" />
<Rule Id="IDE0062" Action="None" />
<Rule Id="IDE0062WithoutSuggestion" Action="None" />
<Rule Id="IDE0063" Action="None" />
<Rule Id="IDE0063WithoutSuggestion" Action="None" />
<Rule Id="IDE0064" Action="None" />
<Rule Id="IDE0065" Action="None" />
<Rule Id="IDE0066" Action="None" />
<Rule Id="IDE0066WithoutSuggestion" Action="None" />
<Rule Id="IDE0071" Action="None" />
<Rule Id="IDE0071WithoutSuggestion" Action="None" />
<Rule Id="IDE0072" Action="None" />
<Rule Id="IDE0072WithoutSuggestion" Action="None" />
<Rule Id="IDE0073" Action="None" />
<Rule Id="IDE0073WithoutSuggestion" Action="None" />
<Rule Id="IDE0074" Action="None" />
<Rule Id="IDE0074WithoutSuggestion" Action="None" />
<Rule Id="IDE0075" Action="None" />
<Rule Id="IDE0075WithoutSuggestion" Action="None" />
<Rule Id="IDE0076" Action="None" />
<Rule Id="IDE0077" Action="None" />
<Rule Id="IDE0080" Action="None" />
<Rule Id="IDE0080WithoutSuggestion" Action="None" />
<Rule Id="IDE1005" Action="None" />
<Rule Id="IDE1005WithoutSuggestion" Action="None" />
<Rule Id="IDE1006" Action="None" />
<Rule Id="IDE1006WithoutSuggestion" Action="None" />
<Rule Id="RE0001" Action="None" />
<Rule Id="RE0001WithoutSuggestion" Action="None" />
</Rules>
<Rules AnalyzerId="Microsoft.CodeAnalysis.Features" RuleNamespace="Microsoft.CodeAnalysis.Features">
<Rule Id="IDE0033" Action="None" />
<Rule Id="IDE0033WithoutSuggestion" Action="None" />
<Rule Id="IDE0044" Action="None" />
<Rule Id="IDE0044WithoutSuggestion" Action="None" />
<Rule Id="IDE0055" Action="None" />
<Rule Id="IDE0055WithoutSuggestion" Action="None" />
<Rule Id="IDE0070" Action="None" />
<Rule Id="IDE0070WithoutSuggestion" Action="None" />
</Rules>
<Rules AnalyzerId="Microsoft.CodeQuality.Analyzers" RuleNamespace="Microsoft.CodeQuality.Analyzers">
<Rule Id="CA1010" Action="None" />
<Rule Id="CA1028" Action="None" />
<Rule Id="CA1030" Action="None" />
<Rule Id="CA1031" Action="None" />
<Rule Id="CA1034" Action="None" />
<Rule Id="CA1036" Action="None" />
<Rule Id="CA1043" Action="None" /> <!-- Non integral/string indexers -->
<Rule Id="CA1051" Action="None" /> <!-- Visible fields that shouldn't be -->
<Rule Id="CA1054" Action="None" />
<Rule Id="CA1055" Action="None" />
<Rule Id="CA1056" Action="None" />
<Rule Id="CA1062" Action="None" />
<Rule Id="CA1063" Action="None" />
<Rule Id="CA1069" Action="None" />
<Rule Id="CA1707" Action="None" />
<Rule Id="CA1710" Action="None" />
<Rule Id="CA1714" Action="None" />
<Rule Id="CA1715" Action="None" />
<Rule Id="CA1716" Action="None" />
<Rule Id="CA1717" Action="None" />
<Rule Id="CA1720" Action="None" />
<Rule Id="CA1721" Action="None" />
<Rule Id="CA1724" Action="None" />
<Rule Id="CA1801" Action="None" />
<Rule Id="CA1802" Action="None" />
<Rule Id="CA1805" Action="None" />
<Rule Id="CA1806" Action="None" /> <!-- Enable to find leaked objects -->
<Rule Id="CA1812" Action="None" />
<Rule Id="CA1814" Action="None" />
<Rule Id="CA1815" Action="None" />
<Rule Id="CA1819" Action="None" />
<Rule Id="CA1822" Action="None" />
<Rule Id="CA1823" Action="None" />
<Rule Id="CA2119" Action="None" /> <!-- Lots of properties and methods are not used but provided for consumption -->
<Rule Id="CA2211" Action="None" />
<Rule Id="CA2214" Action="None" />
<Rule Id="CA2225" Action="None" />
<Rule Id="CA2227" Action="None" />
</Rules>
<Rules AnalyzerId="Microsoft.CodeQuality.CSharp.Analyzers" RuleNamespace="Microsoft.CodeQuality.CSharp.Analyzers">
<Rule Id="CA1000" Action="None" /> <!-- No generics in static classes -->
<Rule Id="CA1001" Action="None" />
<Rule Id="CA1032" Action="None" />
<Rule Id="CA2234" Action="None" />
</Rules>
<Rules AnalyzerId="Microsoft.NetCore.Analyzers" RuleNamespace="Microsoft.NetCore.Analyzers">
<Rule Id="CA1303" Action="None" />
<Rule Id="CA1304" Action="None" />
<Rule Id="CA1305" Action="None" />
<Rule Id="CA1307" Action="Warning" />
<Rule Id="CA1309" Action="Warning" />
<Rule Id="CA1310" Action="Warning" />
<Rule Id="CA1816" Action="None" />
<Rule Id="CA2000" Action="None" />
<Rule Id="CA2213" Action="None" />
<Rule Id="CA2216" Action="None" />
</Rules>
<Rules AnalyzerId="Microsoft.NetCore.CSharp.Analyzers" RuleNamespace="Microsoft.NetCore.CSharp.Analyzers">
<Rule Id="CA1810" Action="None" />
<Rule Id="CA2207" Action="None" />
</Rules>
<Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers">
<Rule Id="SA0001" Action="None" />
<Rule Id="SA1009" Action="None" />
<Rule Id="SA1101" Action="None" />
<Rule Id="SA1108" Action="None" />
<Rule Id="SA1111" Action="None" />
<Rule Id="SA1116" Action="None" />
<Rule Id="SA1117" Action="None" />
<Rule Id="SA1118" Action="None" />
<Rule Id="SA1122" Action="None" />
<Rule Id="SA1127" Action="None" />
<Rule Id="SA1128" Action="None" />
<Rule Id="SA1132" Action="None" />
<Rule Id="SA1133" Action="None" />
<Rule Id="SA1138" Action="Error" />
<Rule Id="SA1200" Action="None" />
<Rule Id="SA1201" Action="None" />
<Rule Id="SA1202" Action="None" />
<Rule Id="SA1203" Action="None" />
<Rule Id="SA1204" Action="None" />
<Rule Id="SA1214" Action="None" />
<Rule Id="SA1300" Action="None" />
<Rule Id="SA1303" Action="None" />
<Rule Id="SA1307" Action="None" />
<Rule Id="SA1308" Action="None" />
<Rule Id="SA1309" Action="None" />
<Rule Id="SA1310" Action="None" />
<Rule Id="SA1311" Action="None" />
<Rule Id="SA1312" Action="None" />
<Rule Id="SA1401" Action="None" />
<Rule Id="SA1402" Action="None" />
<Rule Id="SA1403" Action="None" />
<Rule Id="SA1404" Action="None" />
<Rule Id="SA1407" Action="None" />
<Rule Id="SA1408" Action="None" />
<Rule Id="SA1413" Action="None" />
<Rule Id="SA1500" Action="Warning" />
<Rule Id="SA1501" Action="None" />
<Rule Id="SA1502" Action="None" />
<Rule Id="SA1503" Action="None" />
<Rule Id="SA1512" Action="None" />
<Rule Id="SA1513" Action="None" />
<Rule Id="SA1515" Action="None" />
<Rule Id="SA1516" Action="None" />
<Rule Id="SA1519" Action="None" />
<Rule Id="SA1520" Action="None" />
<Rule Id="SA1600" Action="None" />
<Rule Id="SA1601" Action="None" />
<Rule Id="SA1602" Action="None" />
<Rule Id="SA1604" Action="None" />
<Rule Id="SA1615" Action="None" />
<Rule Id="SA1623" Action="None" />
<Rule Id="SA1629" Action="None" />
<Rule Id="SA1633" Action="None" />
<Rule Id="SA1634" Action="None" />
<Rule Id="SA1635" Action="None" />
<Rule Id="SA1636" Action="None" />
<Rule Id="SA1637" Action="None" />
<Rule Id="SA1638" Action="None" />
<Rule Id="SA1640" Action="None" />
<Rule Id="SA1641" Action="None" />
<Rule Id="SA1642" Action="None" />
<Rule Id="SA1643" Action="None" />
<Rule Id="SA1649" Action="None" />
</Rules>
</RuleSet>
<RuleSet Name="Microsoft Managed Recommended Rules" Description="These rules focus on the most critical problems in your code, including potential security holes, application crashes, and other important logic and design errors. It is recommended to include this rule set in any custom rule set you create for your projects." ToolsVersion="17.0">
<Localization ResourceAssembly="Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.dll" ResourceBaseName="Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.Localized">
<Name Resource="MinimumRecommendedRules_Name" />
<Description Resource="MinimumRecommendedRules_Description" />
</Localization>
<Rules AnalyzerId="Microsoft.CodeAnalysis.CSharp" RuleNamespace="Microsoft.CodeAnalysis.CSharp">
<Rule Id="AD0001" Action="None" />
<Rule Id="CS0078" Action="None" />
<Rule Id="CS0105" Action="None" />
<Rule Id="CS0108" Action="None" />
<Rule Id="CS0109" Action="None" />
<Rule Id="CS0114" Action="None" />
<Rule Id="CS0162" Action="None" />
<Rule Id="CS0164" Action="None" />
<Rule Id="CS0168" Action="None" />
<Rule Id="CS0183" Action="None" />
<Rule Id="CS0184" Action="None" />
<Rule Id="CS0197" Action="None" />
<Rule Id="CS0219" Action="None" />
<Rule Id="CS0251" Action="None" />
<Rule Id="CS0252" Action="None" />
<Rule Id="CS0253" Action="None" />
<Rule Id="CS0278" Action="None" />
<Rule Id="CS0279" Action="None" />
<Rule Id="CS0280" Action="None" />
<Rule Id="CS0282" Action="None" />
<Rule Id="CS0419" Action="None" />
<Rule Id="CS0420" Action="None" />
<Rule Id="CS0435" Action="None" />
<Rule Id="CS0436" Action="None" />
<Rule Id="CS0437" Action="None" />
<Rule Id="CS0440" Action="None" />
<Rule Id="CS0458" Action="None" />
<Rule Id="CS0464" Action="None" />
<Rule Id="CS0465" Action="None" />
<Rule Id="CS0469" Action="None" />
<Rule Id="CS0472" Action="None" />
<Rule Id="CS0473" Action="None" />
<Rule Id="CS0612" Action="None" />
<Rule Id="CS0618" Action="None" />
<Rule Id="CS0626" Action="None" />
<Rule Id="CS0628" Action="None" />
<Rule Id="CS0642" Action="None" />
<Rule Id="CS0652" Action="None" />
<Rule Id="CS0657" Action="None" />
<Rule Id="CS0658" Action="None" />
<Rule Id="CS0659" Action="None" />
<Rule Id="CS0660" Action="None" />
<Rule Id="CS0661" Action="None" />
<Rule Id="CS0665" Action="None" />
<Rule Id="CS0672" Action="None" />
<Rule Id="CS0675" Action="None" />
<Rule Id="CS0684" Action="None" />
<Rule Id="CS0693" Action="None" />
<Rule Id="CS0728" Action="None" />
<Rule Id="CS0809" Action="None" />
<Rule Id="CS0811" Action="None" />
<Rule Id="CS0824" Action="None" />
<Rule Id="CS1030" Action="None" />
<Rule Id="CS1058" Action="None" />
<Rule Id="CS1062" Action="None" />
<Rule Id="CS1064" Action="None" />
<Rule Id="CS1066" Action="None" />
<Rule Id="CS1072" Action="None" />
<Rule Id="CS1522" Action="None" />
<Rule Id="CS1570" Action="None" />
<Rule Id="CS1571" Action="None" />
<Rule Id="CS1572" Action="None" />
<Rule Id="CS1573" Action="None" />
<Rule Id="CS1574" Action="None" />
<Rule Id="CS1580" Action="None" />
<Rule Id="CS1581" Action="None" />
<Rule Id="CS1584" Action="None" />
<Rule Id="CS1587" Action="None" />
<Rule Id="CS1589" Action="None" />
<Rule Id="CS1590" Action="None" />
<Rule Id="CS1591" Action="None" />
<Rule Id="CS1592" Action="None" />
<Rule Id="CS1616" Action="None" />
<Rule Id="CS1633" Action="None" />
<Rule Id="CS1634" Action="None" />
<Rule Id="CS1635" Action="None" />
<Rule Id="CS1645" Action="None" />
<Rule Id="CS1658" Action="None" />
<Rule Id="CS1668" Action="None" />
<Rule Id="CS1685" Action="None" />
<Rule Id="CS1687" Action="None" />
<Rule Id="CS1690" Action="None" />
<Rule Id="CS1692" Action="None" />
<Rule Id="CS1695" Action="None" />
<Rule Id="CS1696" Action="None" />
<Rule Id="CS1697" Action="None" />
<Rule Id="CS1700" Action="None" />
<Rule Id="CS1701" Action="None" />
<Rule Id="CS1702" Action="None" />
<Rule Id="CS1710" Action="None" />
<Rule Id="CS1711" Action="None" />
<Rule Id="CS1712" Action="None" />
<Rule Id="CS1717" Action="None" />
<Rule Id="CS1718" Action="None" />
<Rule Id="CS1720" Action="None" />
<Rule Id="CS1723" Action="None" />
<Rule Id="CS1734" Action="None" />
<Rule Id="CS1735" Action="None" />
<Rule Id="CS1762" Action="None" />
<Rule Id="CS1927" Action="None" />
<Rule Id="CS1956" Action="None" />
<Rule Id="CS1957" Action="None" />
<Rule Id="CS1974" Action="None" />
<Rule Id="CS1981" Action="None" />
<Rule Id="CS1998" Action="None" />
<Rule Id="CS2002" Action="None" />
<Rule Id="CS2008" Action="None" />
<Rule Id="CS2023" Action="None" />
<Rule Id="CS2029" Action="None" />
<Rule Id="CS2038" Action="None" />
<Rule Id="CS3000" Action="None" />
<Rule Id="CS3001" Action="None" />
<Rule Id="CS3002" Action="None" />
<Rule Id="CS3003" Action="None" />
<Rule Id="CS3005" Action="None" />
<Rule Id="CS3006" Action="None" />
<Rule Id="CS3007" Action="None" />
<Rule Id="CS3008" Action="None" />
<Rule Id="CS3009" Action="None" />
<Rule Id="CS3010" Action="None" />
<Rule Id="CS3011" Action="None" />
<Rule Id="CS3012" Action="None" />
<Rule Id="CS3013" Action="None" />
<Rule Id="CS3014" Action="None" />
<Rule Id="CS3015" Action="None" />
<Rule Id="CS3016" Action="None" />
<Rule Id="CS3017" Action="None" />
<Rule Id="CS3018" Action="None" />
<Rule Id="CS3019" Action="None" />
<Rule Id="CS3021" Action="None" />
<Rule Id="CS3022" Action="None" />
<Rule Id="CS3023" Action="None" />
<Rule Id="CS3024" Action="None" />
<Rule Id="CS3026" Action="None" />
<Rule Id="CS3027" Action="None" />
<Rule Id="CS4014" Action="None" />
<Rule Id="CS4024" Action="None" />
<Rule Id="CS4025" Action="None" />
<Rule Id="CS4026" Action="None" />
<Rule Id="CS7033" Action="None" />
<Rule Id="CS7035" Action="None" />
<Rule Id="CS7080" Action="None" />
<Rule Id="CS7081" Action="None" />
<Rule Id="CS7082" Action="None" />
<Rule Id="CS7090" Action="None" />
<Rule Id="CS7095" Action="None" />
<Rule Id="CS8001" Action="None" />
<Rule Id="CS8002" Action="None" />
<Rule Id="CS8009" Action="None" />
<Rule Id="CS8012" Action="None" />
<Rule Id="CS8018" Action="None" />
<Rule Id="CS8019" Action="None" />
<Rule Id="CS8020" Action="None" />
<Rule Id="CS8021" Action="None" />
<Rule Id="CS8029" Action="None" />
<Rule Id="CS8032" Action="None" />
<Rule Id="CS8033" Action="None" />
<Rule Id="CS8034" Action="None" />
<Rule Id="CS8040" Action="None" />
<Rule Id="CS8073" Action="None" />
<Rule Id="CS8094" Action="None" />
<Rule Id="CS8105" Action="None" />
<Rule Id="CS8123" Action="None" />
<Rule Id="CS8305" Action="None" />
<Rule Id="CS8321" Action="None" />
<Rule Id="CS8359" Action="None" />
<Rule Id="CS8360" Action="None" />
<Rule Id="CS8371" Action="None" />
<Rule Id="CS8383" Action="None" />
<Rule Id="CS8387" Action="None" />
<Rule Id="CS8424" Action="None" />
<Rule Id="CS8425" Action="None" />
<Rule Id="CS8509" Action="None" />
<Rule Id="CS8512" Action="None" />
<Rule Id="CS8513" Action="None" />
<Rule Id="CS8519" Action="None" />
<Rule Id="CS8520" Action="None" />
<Rule Id="CS8597" Action="None" />
<Rule Id="CS8600" Action="None" />
<Rule Id="CS8601" Action="None" />
<Rule Id="CS8602" Action="None" />
<Rule Id="CS8603" Action="None" />
<Rule Id="CS8604" Action="None" />
<Rule Id="CS8605" Action="None" />
<Rule Id="CS8607" Action="None" />
<Rule Id="CS8608" Action="None" />
<Rule Id="CS8609" Action="None" />
<Rule Id="CS8610" Action="None" />
<Rule Id="CS8611" Action="None" />
<Rule Id="CS8612" Action="None" />
<Rule Id="CS8613" Action="None" />
<Rule Id="CS8614" Action="None" />
<Rule Id="CS8615" Action="None" />
<Rule Id="CS8616" Action="None" />
<Rule Id="CS8617" Action="None" />
<Rule Id="CS8618" Action="None" />
<Rule Id="CS8619" Action="None" />
<Rule Id="CS8620" Action="None" />
<Rule Id="CS8621" Action="None" />
<Rule Id="CS8622" Action="None" />
<Rule Id="CS8624" Action="None" />
<Rule Id="CS8625" Action="None" />
<Rule Id="CS8629" Action="None" />
<Rule Id="CS8631" Action="None" />
<Rule Id="CS8632" Action="None" />
<Rule Id="CS8633" Action="None" />
<Rule Id="CS8634" Action="None" />
<Rule Id="CS8643" Action="None" />
<Rule Id="CS8644" Action="None" />
<Rule Id="CS8645" Action="None" />
<Rule Id="CS8655" Action="None" />
<Rule Id="CS8656" Action="None" />
<Rule Id="CS8667" Action="None" />
<Rule Id="CS8669" Action="None" />
<Rule Id="CS8670" Action="None" />
<Rule Id="CS8714" Action="None" />
<Rule Id="CS8762" Action="None" />
<Rule Id="CS8763" Action="None" />
<Rule Id="CS8764" Action="None" />
<Rule Id="CS8765" Action="None" />
<Rule Id="CS8766" Action="None" />
<Rule Id="CS8767" Action="None" />
<Rule Id="CS8768" Action="None" />
<Rule Id="CS8769" Action="None" />
<Rule Id="CS8770" Action="None" />
<Rule Id="CS8774" Action="None" />
<Rule Id="CS8775" Action="None" />
<Rule Id="CS8776" Action="None" />
<Rule Id="CS8777" Action="None" />
<Rule Id="CS8784" Action="None" />
<Rule Id="CS8785" Action="None" />
<Rule Id="CS8793" Action="None" />
<Rule Id="CS8794" Action="None" />
<Rule Id="CS8819" Action="None" />
</Rules>
<Rules AnalyzerId="Microsoft.CodeAnalysis.CSharp.Features" RuleNamespace="Microsoft.CodeAnalysis.CSharp.Features">
<Rule Id="IDE0001" Action="None" />
<Rule Id="IDE0002" Action="None" />
<Rule Id="IDE0003" Action="None" />
<Rule Id="IDE0003WithoutSuggestion" Action="None" />
<Rule Id="IDE0004" Action="None" />
<Rule Id="IDE0004WithoutSuggestion" Action="None" />
<Rule Id="IDE0005" Action="None" />
<Rule Id="IDE0007" Action="None" />
<Rule Id="IDE0007WithoutSuggestion" Action="None" />
<Rule Id="IDE0008" Action="None" />
<Rule Id="IDE0008WithoutSuggestion" Action="None" />
<Rule Id="IDE0009" Action="None" />
<Rule Id="IDE0009WithoutSuggestion" Action="None" />
<Rule Id="IDE0010" Action="None" />
<Rule Id="IDE0010WithoutSuggestion" Action="None" />
<Rule Id="IDE0011" Action="None" />
<Rule Id="IDE0011WithoutSuggestion" Action="None" />
<Rule Id="IDE0016" Action="None" />
<Rule Id="IDE0016WithoutSuggestion" Action="None" />
<Rule Id="IDE0017" Action="None" />
<Rule Id="IDE0017WithoutSuggestion" Action="None" />
<Rule Id="IDE0018" Action="None" />
<Rule Id="IDE0018WithoutSuggestion" Action="None" />
<Rule Id="IDE0019" Action="None" />
<Rule Id="IDE0019WithoutSuggestion" Action="None" />
<Rule Id="IDE0020" Action="None" />
<Rule Id="IDE0020WithoutSuggestion" Action="None" />
<Rule Id="IDE0021" Action="None" />
<Rule Id="IDE0022" Action="None" />
<Rule Id="IDE0023" Action="None" />
<Rule Id="IDE0024" Action="None" />
<Rule Id="IDE0025" Action="None" />
<Rule Id="IDE0026" Action="None" />
<Rule Id="IDE0027" Action="None" />
<Rule Id="IDE0028" Action="None" />
<Rule Id="IDE0028WithoutSuggestion" Action="None" />
<Rule Id="IDE0029" Action="None" />
<Rule Id="IDE0029WithoutSuggestion" Action="None" />
<Rule Id="IDE0030" Action="None" />
<Rule Id="IDE0030WithoutSuggestion" Action="None" />
<Rule Id="IDE0031" Action="None" />
<Rule Id="IDE0031WithoutSuggestion" Action="None" />
<Rule Id="IDE0032" Action="None" />
<Rule Id="IDE0032WithoutSuggestion" Action="None" />
<Rule Id="IDE0034" Action="None" />
<Rule Id="IDE0034WithoutSuggestion" Action="None" />
<Rule Id="IDE0036" Action="None" />
<Rule Id="IDE0036WithoutSuggestion" Action="None" />
<Rule Id="IDE0037" Action="None" />
<Rule Id="IDE0037WithoutSuggestion" Action="None" />
<Rule Id="IDE0038" Action="None" />
<Rule Id="IDE0038WithoutSuggestion" Action="None" />
<Rule Id="IDE0039" Action="None" />
<Rule Id="IDE0039WithoutSuggestion" Action="None" />
<Rule Id="IDE0040" Action="None" />
<Rule Id="IDE0040WithoutSuggestion" Action="None" />
<Rule Id="IDE0041" Action="None" />
<Rule Id="IDE0041WithoutSuggestion" Action="None" />
<Rule Id="IDE0042" Action="None" />
<Rule Id="IDE0042WithoutSuggestion" Action="None" />
<Rule Id="IDE0043" Action="None" />
<Rule Id="IDE0045" Action="None" />
<Rule Id="IDE0045WithoutSuggestion" Action="None" />
<Rule Id="IDE0046" Action="None" />
<Rule Id="IDE0046WithoutSuggestion" Action="None" />
<Rule Id="IDE0047" Action="None" />
<Rule Id="IDE0048" Action="None" />
<Rule Id="IDE0048WithoutSuggestion" Action="None" />
<Rule Id="IDE0049" Action="None" />
<Rule Id="IDE0049WithoutSuggestion" Action="None" />
<Rule Id="IDE0050" Action="None" />
<Rule Id="IDE0050WithoutSuggestion" Action="None" />
<Rule Id="IDE0051" Action="None" />
<Rule Id="IDE0052" Action="None" />
<Rule Id="IDE0053" Action="None" />
<Rule Id="IDE0053WithoutSuggestion" Action="None" />
<Rule Id="IDE0054" Action="None" />
<Rule Id="IDE0054WithoutSuggestion" Action="None" />
<Rule Id="IDE0056" Action="None" />
<Rule Id="IDE0056WithoutSuggestion" Action="None" />
<Rule Id="IDE0057" Action="None" />
<Rule Id="IDE0057WithoutSuggestion" Action="None" />
<Rule Id="IDE0058" Action="None" />
<Rule Id="IDE0059" Action="None" />
<Rule Id="IDE0060" Action="None" />
<Rule Id="IDE0061" Action="None" />
<Rule Id="IDE0062" Action="None" />
<Rule Id="IDE0062WithoutSuggestion" Action="None" />
<Rule Id="IDE0063" Action="None" />
<Rule Id="IDE0063WithoutSuggestion" Action="None" />
<Rule Id="IDE0064" Action="None" />
<Rule Id="IDE0065" Action="None" />
<Rule Id="IDE0066" Action="None" />
<Rule Id="IDE0066WithoutSuggestion" Action="None" />
<Rule Id="IDE0071" Action="None" />
<Rule Id="IDE0071WithoutSuggestion" Action="None" />
<Rule Id="IDE0072" Action="None" />
<Rule Id="IDE0072WithoutSuggestion" Action="None" />
<Rule Id="IDE0073" Action="None" />
<Rule Id="IDE0073WithoutSuggestion" Action="None" />
<Rule Id="IDE0074" Action="None" />
<Rule Id="IDE0074WithoutSuggestion" Action="None" />
<Rule Id="IDE0075" Action="None" />
<Rule Id="IDE0075WithoutSuggestion" Action="None" />
<Rule Id="IDE0076" Action="None" />
<Rule Id="IDE0077" Action="None" />
<Rule Id="IDE0080" Action="None" />
<Rule Id="IDE0080WithoutSuggestion" Action="None" />
<Rule Id="IDE1005" Action="None" />
<Rule Id="IDE1005WithoutSuggestion" Action="None" />
<Rule Id="IDE1006" Action="None" />
<Rule Id="IDE1006WithoutSuggestion" Action="None" />
<Rule Id="RE0001" Action="None" />
<Rule Id="RE0001WithoutSuggestion" Action="None" />
</Rules>
<Rules AnalyzerId="Microsoft.CodeAnalysis.Features" RuleNamespace="Microsoft.CodeAnalysis.Features">
<Rule Id="IDE0033" Action="None" />
<Rule Id="IDE0033WithoutSuggestion" Action="None" />
<Rule Id="IDE0044" Action="None" />
<Rule Id="IDE0044WithoutSuggestion" Action="None" />
<Rule Id="IDE0055" Action="None" />
<Rule Id="IDE0055WithoutSuggestion" Action="None" />
<Rule Id="IDE0070" Action="None" />
<Rule Id="IDE0070WithoutSuggestion" Action="None" />
</Rules>
<Rules AnalyzerId="Microsoft.CodeQuality.Analyzers" RuleNamespace="Microsoft.CodeQuality.Analyzers">
<Rule Id="CA1010" Action="None" />
<Rule Id="CA1028" Action="None" />
<Rule Id="CA1030" Action="None" />
<Rule Id="CA1031" Action="None" />
<Rule Id="CA1034" Action="None" />
<Rule Id="CA1036" Action="None" />
<Rule Id="CA1043" Action="None" />
<Rule Id="CA1051" Action="None" />
<Rule Id="CA1054" Action="None" />
<Rule Id="CA1055" Action="None" />
<Rule Id="CA1056" Action="None" />
<Rule Id="CA1062" Action="None" />
<Rule Id="CA1063" Action="None" />
<Rule Id="CA1069" Action="None" />
<Rule Id="CA1707" Action="None" />
<Rule Id="CA1710" Action="None" />
<Rule Id="CA1714" Action="None" />
<Rule Id="CA1715" Action="None" />
<Rule Id="CA1716" Action="None" />
<Rule Id="CA1717" Action="None" />
<Rule Id="CA1720" Action="None" />
<Rule Id="CA1721" Action="None" />
<Rule Id="CA1724" Action="None" />
<Rule Id="CA1801" Action="None" />
<Rule Id="CA1802" Action="None" />
<Rule Id="CA1805" Action="None" />
<Rule Id="CA1806" Action="None" />
<Rule Id="CA1812" Action="None" />
<Rule Id="CA1814" Action="None" />
<Rule Id="CA1815" Action="None" />
<Rule Id="CA1819" Action="None" />
<Rule Id="CA1822" Action="None" />
<Rule Id="CA1823" Action="None" />
<Rule Id="CA2119" Action="None" />
<Rule Id="CA2211" Action="None" />
<Rule Id="CA2214" Action="None" />
<Rule Id="CA2225" Action="None" />
<Rule Id="CA2227" Action="None" />
</Rules>
<Rules AnalyzerId="Microsoft.CodeQuality.CSharp.Analyzers" RuleNamespace="Microsoft.CodeQuality.CSharp.Analyzers">
<Rule Id="CA1000" Action="None" />
<Rule Id="CA1001" Action="None" />
<Rule Id="CA1032" Action="None" />
<Rule Id="CA2234" Action="None" />
</Rules>
<Rules AnalyzerId="Microsoft.NetCore.Analyzers" RuleNamespace="Microsoft.NetCore.Analyzers">
<Rule Id="CA1303" Action="None" />
<Rule Id="CA1304" Action="None" />
<Rule Id="CA1305" Action="None" />
<Rule Id="CA1307" Action="Warning" />
<Rule Id="CA1309" Action="Warning" />
<Rule Id="CA1310" Action="Warning" />
<Rule Id="CA1816" Action="None" />
<Rule Id="CA2000" Action="None" />
<Rule Id="CA2213" Action="None" />
<Rule Id="CA2216" Action="None" />
</Rules>
<Rules AnalyzerId="Microsoft.NetCore.CSharp.Analyzers" RuleNamespace="Microsoft.NetCore.CSharp.Analyzers">
<Rule Id="CA1810" Action="None" />
<Rule Id="CA2207" Action="None" />
</Rules>
<Rules AnalyzerId="Roslynator.CSharp.Analyzers" RuleNamespace="Roslynator.CSharp.Analyzers">
<Rule Id="RCS1123" Action="None" />
</Rules>
<Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers">
<Rule Id="SA0001" Action="None" />
<Rule Id="SA1009" Action="None" />
<Rule Id="SA1101" Action="None" />
<Rule Id="SA1108" Action="None" />
<Rule Id="SA1111" Action="None" />
<Rule Id="SA1116" Action="None" />
<Rule Id="SA1117" Action="None" />
<Rule Id="SA1118" Action="None" />
<Rule Id="SA1122" Action="None" />
<Rule Id="SA1127" Action="None" />
<Rule Id="SA1128" Action="None" />
<Rule Id="SA1132" Action="None" />
<Rule Id="SA1133" Action="None" />
<Rule Id="SA1138" Action="Error" />
<Rule Id="SA1200" Action="None" />
<Rule Id="SA1201" Action="None" />
<Rule Id="SA1202" Action="None" />
<Rule Id="SA1203" Action="None" />
<Rule Id="SA1204" Action="None" />
<Rule Id="SA1214" Action="None" />
<Rule Id="SA1300" Action="None" />
<Rule Id="SA1303" Action="None" />
<Rule Id="SA1307" Action="None" />
<Rule Id="SA1308" Action="None" />
<Rule Id="SA1309" Action="None" />
<Rule Id="SA1310" Action="None" />
<Rule Id="SA1311" Action="None" />
<Rule Id="SA1312" Action="None" />
<Rule Id="SA1401" Action="None" />
<Rule Id="SA1402" Action="None" />
<Rule Id="SA1403" Action="None" />
<Rule Id="SA1404" Action="None" />
<Rule Id="SA1407" Action="None" />
<Rule Id="SA1408" Action="None" />
<Rule Id="SA1413" Action="None" />
<Rule Id="SA1500" Action="Warning" />
<Rule Id="SA1501" Action="None" />
<Rule Id="SA1502" Action="None" />
<Rule Id="SA1503" Action="None" />
<Rule Id="SA1512" Action="None" />
<Rule Id="SA1513" Action="None" />
<Rule Id="SA1515" Action="None" />
<Rule Id="SA1516" Action="None" />
<Rule Id="SA1519" Action="None" />
<Rule Id="SA1520" Action="None" />
<Rule Id="SA1600" Action="None" />
<Rule Id="SA1601" Action="None" />
<Rule Id="SA1602" Action="None" />
<Rule Id="SA1604" Action="None" />
<Rule Id="SA1615" Action="None" />
<Rule Id="SA1623" Action="None" />
<Rule Id="SA1629" Action="None" />
<Rule Id="SA1633" Action="None" />
<Rule Id="SA1634" Action="None" />
<Rule Id="SA1635" Action="None" />
<Rule Id="SA1636" Action="None" />
<Rule Id="SA1637" Action="None" />
<Rule Id="SA1638" Action="None" />
<Rule Id="SA1640" Action="None" />
<Rule Id="SA1641" Action="None" />
<Rule Id="SA1642" Action="None" />
<Rule Id="SA1643" Action="None" />
<Rule Id="SA1649" Action="None" />
</Rules>
</RuleSet>