Ecng.Reflection 1.0.295

There is a newer version of this package available.
See the version list below for details.
dotnet add package Ecng.Reflection --version 1.0.295
                    
NuGet\Install-Package Ecng.Reflection -Version 1.0.295
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Ecng.Reflection" Version="1.0.295" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Ecng.Reflection" Version="1.0.295" />
                    
Directory.Packages.props
<PackageReference Include="Ecng.Reflection" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Ecng.Reflection --version 1.0.295
                    
#r "nuget: Ecng.Reflection, 1.0.295"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Ecng.Reflection@1.0.295
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Ecng.Reflection&version=1.0.295
                    
Install as a Cake Addin
#tool nuget:?package=Ecng.Reflection&version=1.0.295
                    
Install as a Cake Tool

Ecng.Reflection

A high-performance reflection library providing utilities for type introspection, member discovery, fast attribute retrieval, and dynamic type operations.

Overview

Ecng.Reflection extends .NET's reflection capabilities with performance optimizations through caching, simplified API for common reflection tasks, and utilities for working with types, members, and attributes. It's designed to reduce the complexity and improve the performance of reflection-heavy code.

Key Features

  • Fast attribute retrieval with built-in caching
  • Simplified member access (properties, fields, methods, constructors)
  • Type discovery and metadata exploration
  • Assembly scanning for type implementations
  • Generic type utilities for working with generic types
  • Collection type detection and item type extraction
  • Member signature comparison for overload resolution
  • Indexer support for types with indexers
  • Proxy type mapping for custom type resolution

Installation

Add a reference to the Ecng.Reflection project or NuGet package in your project.

<ItemGroup>
  <ProjectReference Include="..\Ecng.Reflection\Reflection.csproj" />
</ItemGroup>

Usage Examples

Working with Attributes

The library provides extension methods for easy attribute retrieval with caching support:

using Ecng.Reflection;
using Ecng.Common;

public class MyClass
{
    [Obsolete("Use NewMethod instead")]
    public void OldMethod() { }

    [DisplayName("User Name")]
    public string Name { get; set; }
}

// Get a single attribute
var obsoleteAttr = typeof(MyClass)
    .GetMember<MethodInfo>("OldMethod")
    .GetAttribute<ObsoleteAttribute>();

Console.WriteLine(obsoleteAttr?.Message); // "Use NewMethod instead"

// Get all attributes
var attrs = typeof(MyClass)
    .GetProperty("Name")
    .GetAttributes<Attribute>();

// Check if type/member is obsolete
bool isObsolete = typeof(MyClass).GetMethod("OldMethod").IsObsolete();

// Check if type/member is browsable
bool isBrowsable = typeof(MyClass).GetProperty("Name").IsBrowsable();

Getting Members by Name and Type

Retrieve members with simple, chainable syntax:

using Ecng.Reflection;

public class Calculator
{
    public int Add(int a, int b) => a + b;
    public double Add(double a, double b) => a + b;

    public string Name { get; set; }
    private int _count;
}

// Get a specific method by parameter types
var addIntMethod = typeof(Calculator)
    .GetMember<MethodInfo>("Add", typeof(int), typeof(int));

// Get a property
var nameProperty = typeof(Calculator)
    .GetMember<PropertyInfo>("Name");

// Get a field (including private)
var countField = typeof(Calculator)
    .GetMember<FieldInfo>("_count", ReflectionHelper.AllInstanceMembers);

// Get constructor with specific parameters
var ctor = typeof(Calculator)
    .GetMember<ConstructorInfo>(typeof(string));

Working with Generic Types

Extract generic type information and create generic types:

using Ecng.Reflection;
using Ecng.Common;

// Get the generic type definition from a type hierarchy
var listType = typeof(List<string>).GetGenericType(typeof(IEnumerable<>));
// Returns: IEnumerable<string>

// Get a specific generic argument
var itemType = typeof(List<int>).GetGenericTypeArg(typeof(IEnumerable<>), 0);
// Returns: typeof(int)

// Create a generic type
var genericListDef = typeof(List<>);
var stringListType = genericListDef.Make(typeof(string));
// Returns: typeof(List<string>)

// Get item type from collection
var collectionItemType = typeof(List<int>).GetItemType();
// Returns: typeof(int)

// Works with IEnumerable<T>, ICollection<T>, and IAsyncEnumerable<T>
var enumerableItemType = typeof(IEnumerable<string>).GetItemType();
// Returns: typeof(string)

Type Detection and Validation

Check type characteristics:

using Ecng.Reflection;
using Ecng.Common;

// Check if type is a collection
bool isList = typeof(List<int>).IsCollection(); // true
bool isArray = typeof(int[]).IsCollection(); // true
bool isEnumerable = typeof(IEnumerable<int>).IsCollection(); // true

// Check if type is primitive (extended definition)
bool isPrimitive = typeof(int).IsPrimitive(); // true
bool isString = typeof(string).IsPrimitive(); // true
bool isDateTime = typeof(DateTime).IsPrimitive(); // true
bool isGuid = typeof(Guid).IsPrimitive(); // true

// Check if type is numeric
bool isNumeric = typeof(int).IsNumeric(); // true
bool isIntegerNumeric = typeof(int).IsNumericInteger(); // true
bool isFloatNumeric = typeof(double).IsNumeric(); // true (but IsNumericInteger() = false)

// Check if type is struct or enum
bool isStruct = typeof(DateTime).IsStruct(); // true
bool isEnum = typeof(DayOfWeek).IsEnum(); // true

// Check if type is delegate or attribute
bool isDelegate = typeof(Action).IsDelegate(); // true
bool isAttribute = typeof(ObsoleteAttribute).IsAttribute(); // true

Member Information

Work with member metadata:

using Ecng.Reflection;

public class Product
{
    public string Name { get; set; }
    public decimal Price { get; set; }
    public static int Count { get; set; }
}

var nameProperty = typeof(Product).GetProperty("Name");
var priceProperty = typeof(Product).GetProperty("Price");
var countProperty = typeof(Product).GetProperty("Count");

// Get the type of a member
Type nameType = nameProperty.GetMemberType(); // typeof(string)
Type priceType = priceProperty.GetMemberType(); // typeof(decimal)

// Check if member is static
bool isStatic = nameProperty.IsStatic(); // false
bool isCountStatic = countProperty.IsStatic(); // true

// Check if member is abstract
bool isAbstract = nameProperty.IsAbstract(); // false

// Check if member is virtual
bool isVirtual = nameProperty.IsVirtual(); // true (properties are virtual by default)

// Check if member is overloadable
bool isOverloadable = nameProperty.IsOverloadable(); // true

// Check if property is modifiable (has public setter and not read-only)
bool isModifiable = nameProperty.IsModifiable(); // true

Working with Indexers

Access indexer properties:

using Ecng.Reflection;

public class DataStore
{
    private Dictionary<string, object> _data = new();

    // Default indexer
    public object this[string key]
    {
        get => _data[key];
        set => _data[key] = value;
    }

    // Indexer with multiple parameters
    public object this[int row, int col]
    {
        get => _data[$"{row},{col}"];
        set => _data[$"{row},{col}"] = value;
    }
}

// Get default string indexer
var stringIndexer = typeof(DataStore).GetIndexer(typeof(string));

// Get indexer with multiple parameters
var multiIndexer = typeof(DataStore).GetIndexer(typeof(int), typeof(int));

// Get all indexers
var allIndexers = typeof(DataStore).GetIndexers();

// Get indexer types
var indexerTypes = stringIndexer.GetIndexerTypes();
// Returns: [typeof(string)]

// Check if property is an indexer
bool isIndexer = stringIndexer.IsIndexer(); // true

Creating Instances

Fast instance creation:

using Ecng.Reflection;
using Ecng.Common;

public class Person
{
    public Person() { }
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    public string Name { get; set; }
    public int Age { get; set; }
}

// Create with default constructor
var person1 = typeof(Person).CreateInstance();

// Create with parameters
var person2 = typeof(Person).CreateInstance("John", 30);

// Create with generic type parameter
var person3 = typeof(Person).CreateInstance<Person>("Jane", 25);

// Note: For value types, a default constructor is automatically supported
var point = typeof(Point).CreateInstance(); // Works even without explicit constructor

Finding Implementations

Scan assemblies for type implementations:

using Ecng.Reflection;
using System.Reflection;

// Find all implementations of IDisposable in the current assembly
var disposableTypes = Assembly.GetExecutingAssembly()
    .FindImplementations<IDisposable>();

// Find all implementations with filters
var publicDisposableTypes = Assembly.GetExecutingAssembly()
    .FindImplementations<IDisposable>(
        showObsolete: false,      // Exclude obsolete types
        showNonPublic: false,     // Exclude non-public types
        showNonBrowsable: false   // Exclude non-browsable types
    );

// Find implementations with custom filter
var customTypes = Assembly.GetExecutingAssembly()
    .FindImplementations<IComparable>(
        extraFilter: t => t.Namespace?.StartsWith("MyApp") == true
    );

// Check if type is compatible with requirements
bool isCompatible = typeof(MyClass).IsRequiredType<IService>();
// Checks: not abstract, public, not generic definition, has parameterless constructor

Method and Parameter Information

Work with methods and their parameters:

using Ecng.Reflection;

public class MathService
{
    public int Calculate(int x, ref int y, out int result)
    {
        result = x + y;
        y = y * 2;
        return result;
    }

    public void Print(string message, params object[] args)
    {
        Console.WriteLine(message, args);
    }
}

var method = typeof(MathService).GetMethod("Calculate");

// Get parameter types with info
var paramTypes = method.GetParameterTypes();
// Returns: [(param: x, type: int), (param: y, type: int&), (param: result, type: int&)]

// Get parameter types without ref/out wrappers
var plainParamTypes = method.GetParameterTypes(removeRef: true);
// Returns: [(param: x, type: int), (param: y, type: int), (param: result, type: int)]

// Check if parameter is output
var parameters = method.GetParameters();
bool isYOutput = parameters[1].IsOutput(); // true (ref parameter)
bool isResultOutput = parameters[2].IsOutput(); // true (out parameter)

// Check for params array
var printMethod = typeof(MathService).GetMethod("Print");
var printParams = printMethod.GetParameters();
bool hasParams = printParams[1].IsParams(); // true

// Get delegate invoke method
var delegateType = typeof(Action<int>);
var invokeMethod = delegateType.GetInvokeMethod();

Assembly and Type Validation

Verify assemblies and validate types:

using Ecng.Reflection;

// Check if file is a valid assembly
bool isAssembly = @"C:\path\to\MyLibrary.dll".IsAssembly();

// Verify assembly and get assembly name
AssemblyName asmName = @"C:\path\to\MyLibrary.dll".VerifyAssembly();

if (asmName != null)
{
    Console.WriteLine($"Valid assembly: {asmName.FullName}");
}

// Check if type is runtime type
bool isRuntimeType = typeof(string).IsRuntimeType();

Accessor Methods and Property Names

Work with property/event accessor methods:

using Ecng.Reflection;

public class EventSource
{
    public event EventHandler DataChanged;
    public string Name { get; set; }
}

// Get property name from accessor method name
string propName = "get_Name".MakePropertyName(); // "Name"
string eventName = "add_DataChanged".MakePropertyName(); // "DataChanged"

// Get the owner member of an accessor method
var method = typeof(EventSource).GetMethod("get_Name", ReflectionHelper.AllInstanceMembers);
var owner = method.GetAccessorOwner();
// Returns: PropertyInfo for "Name" property

var addMethod = typeof(EventSource).GetMethod("add_DataChanged", ReflectionHelper.AllInstanceMembers);
var eventOwner = addMethod.GetAccessorOwner();
// Returns: EventInfo for "DataChanged" event

Member Signature Comparison

Compare member signatures for overload resolution:

using Ecng.Reflection;

public class Calculator
{
    public int Add(int a, int b) => a + b;
    public double Add(double a, double b) => a + b;
}

var method1 = typeof(Calculator).GetMember<MethodInfo>("Add", typeof(int), typeof(int));
var method2 = typeof(Calculator).GetMember<MethodInfo>("Add", typeof(double), typeof(double));

var sig1 = new MemberSignature(method1);
var sig2 = new MemberSignature(method2);

bool areSame = sig1.Equals(sig2); // false

// MemberSignature captures:
// - Return type
// - Parameter types
// - For indexers: indexer parameter types

Filtering Members

Filter members by various criteria:

using Ecng.Reflection;

public class DataService
{
    public string GetData(int id) => "data";
    public void SetData(int id, string value) { }
    public string this[int index]
    {
        get => "value";
        set { }
    }
}

// Get all public instance members
var members = typeof(DataService).GetMembers<MemberInfo>(ReflectionHelper.AllInstanceMembers);

// Get all properties
var properties = typeof(DataService).GetMembers<PropertyInfo>();

// Get all methods with specific parameters
var getMethods = typeof(DataService).GetMembers<MethodInfo>(typeof(int));

// Filter members by type signature
var filtered = members.FilterMembers(isSetter: false, typeof(int));
// Returns members that accept (int) as parameter(s)

// Check member type
bool isMethod = members[0].MemberIs(MemberTypes.Method);
bool isPropertyOrField = members[0].MemberIs(MemberTypes.Property, MemberTypes.Field);

Proxy Types

Register proxy types for custom type resolution:

using Ecng.Reflection;

// Register a proxy type mapping
ReflectionHelper.ProxyTypes[typeof(IMyInterface)] = typeof(MyImplementation);

// When getting members, the library will automatically use the proxy type
var members = typeof(IMyInterface).GetMembers<MethodInfo>();
// Actually retrieves members from MyImplementation

Binding Flags Helpers

Use predefined binding flags for common scenarios:

using Ecng.Reflection;

// Get all members (public + non-public, static + instance)
var allMembers = typeof(MyClass).GetMembers<MemberInfo>(ReflectionHelper.AllMembers);

// Get all static members
var staticMembers = typeof(MyClass).GetMembers<MethodInfo>(ReflectionHelper.AllStaticMembers);

// Get all instance members
var instanceMembers = typeof(MyClass).GetMembers<PropertyInfo>(ReflectionHelper.AllInstanceMembers);

// Common attribute targets
// ReflectionHelper.Members = AttributeTargets.Field | AttributeTargets.Property
// ReflectionHelper.Types = AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface

Ordering Members

Order members by their declaration order:

using Ecng.Reflection;

public class MyClass
{
    public string FirstProperty { get; set; }
    public int SecondProperty { get; set; }
    public bool ThirdProperty { get; set; }
}

var properties = typeof(MyClass)
    .GetMembers<PropertyInfo>()
    .OrderByDeclaration();

// Properties will be in declaration order: FirstProperty, SecondProperty, ThirdProperty

Matching Members with Binding Flags

Check if members match specific binding flags:

using Ecng.Reflection;

public class TestClass
{
    public string PublicProperty { get; set; }
    private int PrivateField;
    public static void StaticMethod() { }
    public void InstanceMethod() { }
}

var publicProp = typeof(TestClass).GetProperty("PublicProperty");
var privateField = typeof(TestClass).GetField("PrivateField", ReflectionHelper.AllInstanceMembers);
var staticMethod = typeof(TestClass).GetMethod("StaticMethod");
var instanceMethod = typeof(TestClass).GetMethod("InstanceMethod");

// Check if members match binding flags
bool matchPublic = publicProp.IsMatch(BindingFlags.Public | BindingFlags.Instance); // true
bool matchPrivate = privateField.IsMatch(BindingFlags.NonPublic | BindingFlags.Instance); // true
bool matchStatic = staticMethod.IsMatch(BindingFlags.Public | BindingFlags.Static); // true
bool noMatch = staticMethod.IsMatch(BindingFlags.Public | BindingFlags.Instance); // false

VoidType Class

A marker class for representing void type in generic contexts:

using Ecng.Reflection;

// Use VoidType when you need a type parameter but want to represent "void"
var voidType = typeof(VoidType);

// This can be useful in generic scenarios where you need a placeholder
// for methods that don't return a value

Performance Considerations

The library uses extensive caching to improve performance:

  • Attribute cache: Caches retrieved attributes by (type, provider, inherit) key
  • Generic type cache: Caches generic type lookups
  • Collection type cache: Caches collection type checks
  • Member property caches: Caches results for IsAbstract, IsVirtual, IsStatic checks

Cache Management

using Ecng.Reflection;
using Ecng.Common;

// Enable/disable caching (enabled by default)
ReflectionHelper.CacheEnabled = true;
AttributeHelper.CacheEnabled = true;

// Clear all caches
ReflectionHelper.ClearCache();
AttributeHelper.ClearCache();

Common Patterns

Getting All Public Properties with Setters

var writableProps = typeof(MyClass)
    .GetMembers<PropertyInfo>(BindingFlags.Public | BindingFlags.Instance)
    .Where(p => p.IsModifiable());

Finding All Methods That Take Specific Parameters

var methods = typeof(MyClass)
    .GetMembers<MethodInfo>()
    .Where(m => m.GetParameterTypes()
        .Select(t => t.type)
        .SequenceEqual(new[] { typeof(string), typeof(int) }));

Scanning Multiple Assemblies for Implementations

var assemblies = AppDomain.CurrentDomain.GetAssemblies();
var allImplementations = assemblies
    .SelectMany(asm => asm.FindImplementations<IMyInterface>(
        showObsolete: false,
        showNonPublic: false
    ));

Working with Nullable Types

using Ecng.Common;

// Check if type is nullable
bool isNullable = typeof(int?).IsNullable(); // true

// Get underlying type
Type underlyingType = typeof(int?).GetUnderlyingType(); // typeof(int)

Advanced Topics

Custom Type Constructors

Implement ITypeConstructor for custom type instantiation logic:

using Ecng.Common;

public class CustomType : ITypeConstructor
{
    public object CreateInstance(params object[] args)
    {
        // Custom instantiation logic
        return new CustomType();
    }
}

// When using CreateInstance, custom logic will be invoked
var instance = typeof(CustomType).CreateInstance();

Working with ref/out Parameters

using Ecng.Reflection;

// GetParameterTypes with removeRef: true strips ref/out wrappers
var method = typeof(MyClass).GetMethod("MethodWithRefParams");
var types = method.GetParameterTypes(removeRef: true);

// Check if parameter is output (ref or out)
foreach (var param in method.GetParameters())
{
    if (param.IsOutput())
    {
        Console.WriteLine($"{param.Name} is an output parameter");
    }
}

Constants and Definitions

// Indexer property name
ReflectionHelper.IndexerName // "Item"

// Accessor prefixes
ReflectionHelper.GetPrefix    // "get_"
ReflectionHelper.SetPrefix    // "set_"
ReflectionHelper.AddPrefix    // "add_"
ReflectionHelper.RemovePrefix // "remove_"

// Binding flags
ReflectionHelper.AllMembers         // Static | Instance | Public | NonPublic
ReflectionHelper.AllStaticMembers   // Static | Public | NonPublic
ReflectionHelper.AllInstanceMembers // Instance | Public | NonPublic

// Attribute targets
ReflectionHelper.Members // Field | Property
ReflectionHelper.Types   // Class | Struct | Interface

Dependencies

  • Ecng.Collections: Collection utilities
  • Ecng.Common: Common type helpers and extension methods

License

Part of the StockSharp/Ecng framework.

See Also

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on Ecng.Reflection:

Package Downloads
Ecng.Serialization

Ecng system framework

Ecng.Backup.Yandex

Ecng system framework

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.298 260 2/4/2026
1.0.297 1,347 2/1/2026
1.0.296 1,425 1/26/2026
1.0.295 646 1/22/2026
1.0.294 1,828 1/19/2026
1.0.293 603 1/19/2026
1.0.292 621 1/18/2026
1.0.291 593 1/18/2026
1.0.290 1,169 1/14/2026
1.0.289 660 1/13/2026
1.0.288 601 1/13/2026
1.0.287 966 1/9/2026
1.0.286 663 1/9/2026
1.0.285 3,049 1/4/2026
1.0.284 1,957 12/30/2025
1.0.283 600 12/29/2025
1.0.282 1,050 12/26/2025
1.0.281 612 12/26/2025
1.0.280 610 12/26/2025
1.0.279 628 12/26/2025
1.0.278 697 12/25/2025
1.0.277 706 12/25/2025
1.0.276 1,208 12/22/2025
1.0.275 697 12/21/2025
1.0.274 774 12/19/2025
1.0.273 741 12/19/2025
1.0.272 939 12/17/2025
1.0.271 1,009 12/15/2025
1.0.270 764 12/15/2025
1.0.269 725 12/14/2025
1.0.268 1,795 12/12/2025
1.0.267 1,020 12/12/2025
1.0.266 623 12/12/2025
1.0.265 624 12/12/2025
1.0.264 996 12/12/2025
1.0.263 1,353 12/2/2025
1.0.262 1,220 12/2/2025
1.0.261 1,224 12/2/2025
1.0.260 855 11/30/2025
1.0.259 694 11/29/2025
1.0.258 705 11/28/2025
1.0.257 705 11/28/2025
1.0.256 775 11/27/2025
1.0.255 831 11/24/2025
1.0.254 777 11/24/2025
1.0.253 776 11/23/2025
1.0.252 1,257 11/22/2025
1.0.251 1,611 11/20/2025
1.0.250 1,018 11/18/2025
1.0.249 965 11/18/2025
1.0.248 1,003 11/13/2025
1.0.247 916 11/10/2025
1.0.246 1,786 11/1/2025
1.0.245 1,021 10/28/2025
1.0.244 1,000 10/27/2025
1.0.243 860 10/27/2025
1.0.242 791 10/25/2025
1.0.241 4,398 10/3/2025
1.0.240 2,247 9/28/2025
1.0.239 971 9/25/2025
1.0.238 9,277 8/30/2025
1.0.237 1,842 8/19/2025
1.0.236 7,909 7/13/2025
1.0.235 833 7/13/2025
1.0.234 827 7/12/2025
1.0.233 2,166 7/8/2025
1.0.232 1,548 7/4/2025
1.0.231 897 7/2/2025
1.0.230 5,634 6/16/2025
1.0.229 1,027 6/9/2025
1.0.228 898 6/8/2025
1.0.227 2,517 5/21/2025
1.0.226 1,029 5/17/2025
1.0.225 2,583 5/12/2025
1.0.224 933 5/12/2025
1.0.223 3,222 4/17/2025
1.0.222 5,916 3/22/2025
1.0.221 889 3/20/2025
1.0.220 864 3/20/2025
1.0.219 887 3/19/2025
1.0.218 5,904 2/26/2025
1.0.217 935 2/26/2025
1.0.216 9,394 2/5/2025
1.0.215 4,777 1/21/2025
1.0.214 934 1/20/2025
1.0.213 807 1/20/2025
1.0.212 929 1/19/2025
1.0.211 2,542 1/14/2025
1.0.210 1,277 1/12/2025
1.0.209 858 1/12/2025
1.0.208 897 1/12/2025
1.0.207 1,044 1/12/2025
1.0.206 1,500 1/10/2025
1.0.205 5,071 12/27/2024
1.0.204 921 12/19/2024
1.0.203 1,363 11/20/2024
1.0.202 4,364 11/18/2024
1.0.201 2,748 11/7/2024
1.0.200 1,325 10/31/2024
1.0.199 1,204 10/19/2024
1.0.198 4,009 10/12/2024
1.0.197 4,534 10/5/2024
1.0.196 5,594 9/18/2024
1.0.195 961 9/17/2024
1.0.194 5,233 9/3/2024
1.0.193 982 9/1/2024
1.0.192 14,990 6/12/2024
1.0.191 3,763 5/28/2024
1.0.190 4,546 5/4/2024
1.0.189 3,185 4/23/2024
1.0.188 2,272 4/21/2024
1.0.187 1,134 4/14/2024
1.0.186 6,421 3/28/2024
1.0.185 1,063 3/17/2024
1.0.184 4,356 2/23/2024
1.0.183 1,008 2/23/2024
1.0.182 4,339 2/18/2024
1.0.181 972 2/18/2024
1.0.180 1,021 2/16/2024
1.0.179 3,066 2/13/2024
1.0.178 2,881 2/8/2024
1.0.177 3,270 2/5/2024
1.0.176 924 2/4/2024
1.0.175 3,476 1/23/2024
1.0.174 1,014 1/23/2024
1.0.173 2,694 1/12/2024
1.0.172 6,161 1/2/2024
1.0.171 1,154 12/29/2023
1.0.170 5,717 12/15/2023
1.0.169 14,756 11/12/2023
1.0.168 1,678 11/10/2023
1.0.167 1,277 11/10/2023
1.0.166 1,506 11/9/2023
1.0.165 2,305 11/3/2023
1.0.164 1,291 11/1/2023
1.0.163 1,307 11/1/2023
1.0.162 26,473 9/8/2023
1.0.161 1,660 9/8/2023
1.0.160 1,797 9/3/2023
1.0.159 2,096 8/21/2023
1.0.158 2,091 8/14/2023
1.0.157 1,123 8/14/2023
1.0.156 1,725 8/10/2023
1.0.155 42,330 6/29/2023
1.0.154 16,689 5/27/2023
1.0.153 1,833 5/21/2023
1.0.152 1,944 5/19/2023
1.0.151 27,356 5/8/2023
1.0.150 7,135 4/21/2023
1.0.149 52,934 4/3/2023
1.0.148 5,720 3/21/2023
1.0.147 4,259 3/13/2023
1.0.146 20,559 3/6/2023
1.0.145 2,788 2/26/2023
1.0.144 17,882 2/21/2023
1.0.143 2,191 2/20/2023
1.0.142 3,509 2/15/2023
1.0.141 2,219 2/14/2023
1.0.140 34,836 2/9/2023
1.0.139 18,657 2/7/2023
1.0.138 2,796 2/4/2023
1.0.137 23,069 2/2/2023
1.0.136 19,250 1/30/2023
1.0.135 7,802 1/18/2023
1.0.134 46,859 12/30/2022
1.0.133 4,158 12/23/2022
1.0.132 23,645 12/12/2022
1.0.131 26,400 12/4/2022
1.0.130 3,359 12/4/2022
1.0.129 4,146 11/30/2022
1.0.128 3,461 11/29/2022
1.0.127 3,567 11/28/2022
1.0.126 7,669 11/18/2022
1.0.125 30,773 11/11/2022
1.0.124 3,529 11/11/2022
1.0.123 3,274 11/10/2022
1.0.122 3,734 11/5/2022
1.0.121 5,090 11/4/2022
1.0.120 27,615 11/1/2022
1.0.119 28,130 10/16/2022
1.0.118 11,025 9/10/2022
1.0.117 54,772 9/8/2022
1.0.116 3,934 9/8/2022
1.0.115 3,848 9/8/2022
1.0.114 6,396 9/4/2022
1.0.113 94,363 8/24/2022
1.0.112 13,762 8/8/2022
1.0.111 7,205 7/26/2022
1.0.110 4,398 7/26/2022
1.0.109 57,569 7/19/2022
1.0.108 49,340 7/18/2022
1.0.107 9,519 7/8/2022
1.0.106 8,644 6/18/2022
1.0.105 4,374 6/6/2022
1.0.104 102,020 4/30/2022
1.0.103 4,620 4/20/2022
1.0.102 4,413 4/10/2022
1.0.101 4,604 4/7/2022
1.0.100 4,461 4/7/2022
1.0.99 4,482 4/2/2022
1.0.98 16,088 3/29/2022
1.0.97 7,281 3/27/2022
1.0.96 293,447 1/24/2022
1.0.95 166,715 12/29/2021
1.0.94 32,118 12/20/2021
1.0.93 4,736 12/13/2021
1.0.92 61,769 12/6/2021
1.0.91 6,099 12/2/2021
1.0.90 33,204 11/29/2021
1.0.89 31,567 11/22/2021
1.0.88 2,825 11/17/2021
1.0.87 33,322 11/13/2021
1.0.86 6,464 11/10/2021
1.0.85 2,993 11/9/2021
1.0.84 66,753 11/5/2021
1.0.83 4,657 11/4/2021
1.0.82 3,118 11/4/2021
1.0.81 2,981 11/3/2021
1.0.80 3,257 10/30/2021
1.0.79 35,051 10/21/2021
1.0.78 3,703 10/17/2021
1.0.77 65,347 10/14/2021
1.0.76 14,596 10/13/2021
1.0.75 3,247 10/12/2021
1.0.74 35,309 10/11/2021
1.0.73 3,090 10/9/2021
1.0.72 38,632 10/7/2021
1.0.71 40,624 10/7/2021
1.0.70 3,166 10/7/2021
1.0.69 2,918 10/6/2021
1.0.68 3,196 9/28/2021
1.0.67 37,061 9/23/2021
1.0.66 4,888 9/10/2021
1.0.65 2,916 9/9/2021
1.0.64 2,840 9/8/2021
1.0.63 2,637 9/8/2021
1.0.62 33,092 9/6/2021
1.0.61 3,117 8/31/2021
1.0.60 2,593 8/30/2021
1.0.59 35,931 7/31/2021
1.0.58 61,794 7/30/2021
1.0.57 3,274 7/26/2021
1.0.56 91,198 7/5/2021
1.0.55 3,232 7/1/2021
1.0.54 64,770 6/4/2021
1.0.53 92,406 4/26/2021
1.0.52 33,551 4/19/2021
1.0.51 150,193 4/7/2021
1.0.50 32,741 4/3/2021
1.0.49 178,876 3/22/2021
1.0.48 113,722 3/4/2021
1.0.47 36,033 2/26/2021
1.0.46 853 2/3/2021
1.0.45 167,981 2/2/2021
1.0.44 116,272 1/24/2021
1.0.43 3,509 1/24/2021
1.0.42 3,320 1/23/2021
1.0.41 60,148 1/20/2021
1.0.40 3,582 1/20/2021
1.0.39 31,739 1/18/2021
1.0.38 3,291 1/18/2021
1.0.37 30,388 1/16/2021
1.0.36 119,743 12/16/2020
1.0.35 57,705 12/14/2020
1.0.34 35,681 12/9/2020
1.0.33 5,822 12/6/2020
1.0.32 4,028 12/2/2020
1.0.31 3,886 12/2/2020
1.0.30 31,386 12/1/2020
1.0.29 186,962 11/12/2020
1.0.29-atestpub 1,707 11/11/2020
1.0.28 32,859 10/11/2020
1.0.27 112,553 9/9/2020
1.0.26 31,304 9/3/2020
1.0.25 31,642 8/20/2020
1.0.24 85,953 8/9/2020
1.0.23 32,167 7/28/2020
1.0.22 31,085 7/19/2020
1.0.21 57,447 7/6/2020
1.0.20 86,218 6/6/2020
1.0.19 31,919 6/4/2020
1.0.18 59,093 5/29/2020
1.0.17 58,779 5/21/2020
1.0.16 4,590 5/17/2020
1.0.15 58,059 5/12/2020
1.0.14 112,008 5/4/2020
1.0.13 8,698 4/24/2020
1.0.12 11,314 4/22/2020
1.0.11 4,369 4/22/2020
1.0.10 4,355 4/21/2020
1.0.9 33,146 4/18/2020
1.0.8 31,027 4/16/2020
1.0.7 4,088 4/16/2020
1.0.6 26,506 4/15/2020
1.0.5 28,944 4/11/2020
1.0.4 28,038 4/3/2020
1.0.3 3,764 4/1/2020
1.0.2 15,125 3/27/2020
1.0.1 14,005 3/22/2020
1.0.0 6,219 3/22/2020