I-Synergy.Framework.AspNetCore 2026.10110.10203

Prefix Reserved
There is a newer prerelease version of this package available.
See the version list below for details.
dotnet add package I-Synergy.Framework.AspNetCore --version 2026.10110.10203
                    
NuGet\Install-Package I-Synergy.Framework.AspNetCore -Version 2026.10110.10203
                    
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="I-Synergy.Framework.AspNetCore" Version="2026.10110.10203" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="I-Synergy.Framework.AspNetCore" Version="2026.10110.10203" />
                    
Directory.Packages.props
<PackageReference Include="I-Synergy.Framework.AspNetCore" />
                    
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 I-Synergy.Framework.AspNetCore --version 2026.10110.10203
                    
#r "nuget: I-Synergy.Framework.AspNetCore, 2026.10110.10203"
                    
#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 I-Synergy.Framework.AspNetCore@2026.10110.10203
                    
#: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=I-Synergy.Framework.AspNetCore&version=2026.10110.10203
                    
Install as a Cake Addin
#tool nuget:?package=I-Synergy.Framework.AspNetCore&version=2026.10110.10203
                    
Install as a Cake Tool

I-Synergy Framework ASP.NET Core

A comprehensive ASP.NET Core integration library for .NET 10.0 applications, providing middleware, filters, extensions, and utilities for building modern web APIs and applications. This package includes OpenTelemetry integration, health checks, global exception handling, result pattern extensions, and more.

NuGet License .NET

Features

  • OpenTelemetry integration for distributed tracing, metrics, and logging
  • Global exception handling with ProblemDetails responses
  • Health check endpoints with detailed JSON responses
  • Result pattern extensions for converting Result<T> to IActionResult
  • Action filters for validation, caching, and request filtering
  • Model binders for custom DateTime parsing
  • HTTP extensions for request/response manipulation
  • JWT token service abstractions for authentication
  • CORS configuration with environment-aware options
  • Service locator integration for legacy scenarios
  • View model base classes for MVC applications

Installation

Install the package via NuGet:

dotnet add package I-Synergy.Framework.AspNetCore

Quick Start

1. Configure Services with OpenTelemetry

using ISynergy.Framework.AspNetCore.Extensions;
using ISynergy.Framework.Core.Abstractions.Services;
using ISynergy.Framework.Core.Services;

var builder = WebApplication.CreateBuilder(args);

// Add info service for application metadata
builder.Services.AddSingleton<IInfoService>(new InfoService(
    productName: "My API",
    productVersion: new Version(1, 0, 0)));

// Configure OpenTelemetry
builder.Logging.AddTelemetry(
    builder,
    builder.Services.BuildServiceProvider().GetRequiredService<IInfoService>(),
    tracerProviderBuilder =>
    {
        // Add custom instrumentation
        tracerProviderBuilder.AddSource("MyApi");
    },
    meterProviderBuilder =>
    {
        // Add custom metrics
        meterProviderBuilder.AddMeter("MyApi");
    });

// Add controllers and services
builder.Services.AddControllers();
builder.Services.AddHealthChecks()
    .AddCheck("api", () => HealthCheckResult.Healthy());

var app = builder.Build();

// Configure middleware pipeline
app.UseExceptionHandler();
app.MapDefaultHealthEndpoints();
app.MapControllers();

app.Run();

2. Use Result Pattern in Controllers

using ISynergy.Framework.Core.Models.Results;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    private readonly IProductService _productService;

    public ProductsController(IProductService productService)
    {
        _productService = productService;
    }

    [HttpGet("{id}")]
    public async Task<IActionResult> GetProduct(int id)
    {
        var result = await _productService.GetProductByIdAsync(id);

        // Convert Result<Product> to IActionResult
        return result.Match<Product, IActionResult>(
            value => value is not null ? Ok(value) : NoContent(),
            () => NotFound()
        );
    }

    [HttpPost]
    public async Task<IActionResult> CreateProduct([FromBody] ProductDto dto)
    {
        var result = await _productService.CreateProductAsync(dto);

        return result.Match<int, IActionResult>(
            id => CreatedAtAction(nameof(GetProduct), new { id }, id),
            () => BadRequest(result.ErrorMessage)
        );
    }

    [HttpGet]
    public async Task<IActionResult> GetProducts(
        [FromQuery] int pageIndex = 0,
        [FromQuery] int pageSize = 10)
    {
        var result = await _productService.GetProductsPagedAsync(pageIndex, pageSize);

        return result.Match<PaginatedResult<ProductDto>, IActionResult>(
            paginatedResult => Ok(paginatedResult),
            () => NotFound()
        );
    }
}

3. Add Action Filters

using ISynergy.Framework.AspNetCore.Filters;

[ApiController]
[Route("api/[controller]")]
[ValidateModelFilter] // Validates ModelState automatically
public class OrdersController : ControllerBase
{
    [HttpPost]
    [NoCache] // Prevents caching of this endpoint
    public async Task<IActionResult> CreateOrder([FromBody] OrderDto order)
    {
        // ModelState is already validated by ValidateModelFilter
        // Response will not be cached due to NoCacheFilter

        await _orderService.CreateOrderAsync(order);
        return Ok();
    }

    [HttpGet("local-only")]
    [RequestShouldBeLocalFilter] // Only allows requests from localhost
    public IActionResult GetSensitiveData()
    {
        return Ok(new { Secret = "This is sensitive" });
    }
}

4. Configure Global Exception Handling

var app = builder.Build();

// Add global exception handler
app.UseExceptionHandler(exceptionHandlerApp =>
{
    exceptionHandlerApp.Run(async context =>
    {
        var exceptionHandler = context.RequestServices
            .GetRequiredService<IExceptionHandler>();

        await exceptionHandler.TryHandleAsync(
            context,
            context.Features.Get<IExceptionHandlerFeature>()?.Error!,
            context.RequestAborted);
    });
});

// Or register the built-in GlobalExceptionHandler
builder.Services.AddExceptionHandler<GlobalExceptionHandler>();
app.UseExceptionHandler();

Architecture

Core Components

ISynergy.Framework.AspNetCore/
├── Extensions/                 # Extension methods
│   ├── TelemetryExtensions    # OpenTelemetry configuration
│   ├── HealthCheckExtensions  # Health check endpoints
│   ├── ResultExtensions       # Result pattern conversions
│   ├── HttpContextExtensions  # HttpContext utilities
│   └── WebApplicationExtensions
│
├── Filters/                   # Action filters
│   ├── ValidateModelFilterAttribute
│   ├── NoCacheFilterAttribute
│   ├── NullResultFilterAttribute
│   ├── NoNullModelsFilterAttribute
│   └── RequestShouldBeLocalFilterAttribute
│
├── Handlers/                  # Exception handlers
│   └── GlobalExceptionHandler
│
├── Binders/                   # Model binders
│   ├── DateTimeModelBinder
│   └── DateTimeModelBinderProvider
│
├── Abstractions/              # Service interfaces
│   └── IJwtTokenService
│
└── Options/                   # Configuration options
    ├── CORSOptions
    ├── KeyVaultOptions
    ├── AzureOptions
    └── TelemetryOptions

Core Features

OpenTelemetry Integration

Configure comprehensive observability for your application:

using ISynergy.Framework.AspNetCore.Extensions;

builder.Logging.AddTelemetry(
    builder,
    infoService,
    tracerProviderBuilder =>
    {
        // Add custom sources
        tracerProviderBuilder
            .AddSource("MyApi")
            .AddSource("MyApi.Database");

        // Add exporters
        if (builder.Environment.IsProduction())
        {
            tracerProviderBuilder.AddOtlpExporter(options =>
            {
                options.Endpoint = new Uri("http://otel-collector:4317");
            });
        }
    },
    meterProviderBuilder =>
    {
        // Add custom meters
        meterProviderBuilder.AddMeter("MyApi.Metrics");

        // Add exporters
        if (builder.Environment.IsProduction())
        {
            meterProviderBuilder.AddOtlpExporter();
        }
    },
    loggerProviderBuilder =>
    {
        // Configure logging
        if (builder.Environment.IsProduction())
        {
            loggerProviderBuilder.AddOtlpExporter();
        }
    });

Health Check Endpoints

Configure detailed health checks with JSON responses:

using ISynergy.Framework.AspNetCore.Extensions;

// Configure health checks
builder.Services.AddHealthChecks()
    .AddCheck("database", () => HealthCheckResult.Healthy(), tags: ["live"])
    .AddCheck("external-api", () => HealthCheckResult.Healthy())
    .AddCheck("cache", () => HealthCheckResult.Healthy(), tags: ["live"]);

var app = builder.Build();

// Map default health endpoints
app.MapDefaultHealthEndpoints();
// Creates:
// - /health (all checks must pass)
// - /alive (only checks tagged with "live" must pass)

// Or use custom health check endpoint with telemetry
app.MapTelemetryHealthChecks("/healthz");

Example health check response:

{
  "Status": "Healthy",
  "Duration": "00:00:00.0234567",
  "Info": [
    {
      "Key": "database",
      "Description": "Database connection is healthy",
      "Status": "Healthy",
      "Duration": "00:00:00.0123456",
      "Data": {}
    }
  ]
}

Action Filters

Model Validation Filter

Automatically validate ModelState:

[ApiController]
[Route("api/[controller]")]
[ValidateModelFilter]
public class UsersController : ControllerBase
{
    [HttpPost]
    public IActionResult CreateUser([FromBody] CreateUserRequest request)
    {
        // If ModelState is invalid, filter returns BadRequest automatically
        // No need to check ModelState.IsValid here
        return Ok();
    }
}
No Cache Filter

Prevent caching of responses:

[HttpGet("real-time-data")]
[NoCache]
public IActionResult GetRealTimeData()
{
    // Response headers will include:
    // Cache-Control: no-store, no-cache, must-revalidate
    // Pragma: no-cache
    // Expires: 0
    return Ok(new { Timestamp = DateTime.UtcNow });
}
Local Request Filter

Restrict endpoints to localhost only:

[HttpGet("admin/diagnostics")]
[RequestShouldBeLocalFilter]
public IActionResult GetDiagnostics()
{
    // Returns 403 Forbidden if request is not from localhost
    return Ok(GetSystemDiagnostics());
}
Null Result Filter

Handle null results automatically:

[HttpGet("{id}")]
[NullResultFilter] // Returns 404 if result is null
public async Task<Product?> GetProduct(int id)
{
    return await _productService.GetProductByIdAsync(id);
    // If null, filter automatically returns 404 Not Found
}

HTTP Extensions

HttpContext Extensions
using ISynergy.Framework.AspNetCore.Extensions;

public class MyMiddleware
{
    public async Task InvokeAsync(HttpContext context)
    {
        // Get client IP address
        var ipAddress = context.GetClientIpAddress();

        // Check if request is from localhost
        if (context.IsLocalRequest())
        {
            // Handle local request
        }

        // Get user agent
        var userAgent = context.Request.GetUserAgent();

        await _next(context);
    }
}
HttpRequest Extensions
using ISynergy.Framework.AspNetCore.Extensions;

public IActionResult GetRequestInfo()
{
    var request = HttpContext.Request;

    var info = new
    {
        IsAjax = request.IsAjaxRequest(),
        IsMobile = request.IsMobileRequest(),
        UserAgent = request.GetUserAgent(),
        ContentType = request.ContentType
    };

    return Ok(info);
}

Custom DateTime Model Binder

Handle DateTime parsing with custom formats:

using ISynergy.Framework.AspNetCore.Providers;

// In Program.cs
builder.Services.AddControllers(options =>
{
    options.ModelBinderProviders.Insert(0, new DateTimeModelBinderProvider());
});

// In Controller
[HttpGet]
public IActionResult GetOrders(
    [FromQuery] DateTime? startDate,
    [FromQuery] DateTime? endDate)
{
    // Supports multiple date formats automatically
    // - ISO 8601: 2024-01-15T10:30:00Z
    // - Custom formats: 01/15/2024
    return Ok();
}

Advanced Features

Result Pattern HTTP Extensions

Convert HttpResponseMessage to Result objects:

using ISynergy.Framework.AspNetCore.Extensions;

public class ApiClient
{
    private readonly HttpClient _httpClient;

    public async Task<Result<Product>> GetProductAsync(int id)
    {
        var response = await _httpClient.GetAsync($"api/products/{id}");

        // Convert HttpResponseMessage to Result<Product>
        var result = await response.ToResult<Product>();

        return result ?? Result<Product>.Fail("Invalid response");
    }

    public async Task<PaginatedResult<Product>> GetProductsAsync(int page)
    {
        var response = await _httpClient.GetAsync($"api/products?page={page}");

        // Convert to PaginatedResult
        var result = await response.ToPaginatedResult<Product>();

        return result ?? PaginatedResult<Product>.Empty;
    }
}

JWT Token Service

Implement JWT token generation and validation:

using ISynergy.Framework.AspNetCore.Abstractions.Services;
using ISynergy.Framework.Core.Models;

public class JwtTokenService : IJwtTokenService
{
    private readonly IConfiguration _configuration;

    public JwtTokenService(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    public Token GenerateJwtToken(TokenRequest request)
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Encoding.ASCII.GetBytes(_configuration["Jwt:Secret"]);

        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new[]
            {
                new Claim(ClaimTypes.Name, request.Username),
                new Claim(ClaimTypes.Email, request.Email)
            }),
            Expires = DateTime.UtcNow.AddHours(8),
            SigningCredentials = new SigningCredentials(
                new SymmetricSecurityKey(key),
                SecurityAlgorithms.HmacSha256Signature)
        };

        var token = tokenHandler.CreateToken(tokenDescriptor);
        var tokenString = tokenHandler.WriteToken(token);

        return new Token
        {
            AccessToken = tokenString,
            ExpiresIn = 28800,
            TokenType = "Bearer"
        };
    }

    public List<Claim> GetClaims(Token token)
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var jwtToken = tokenHandler.ReadJwtToken(token.AccessToken);
        return jwtToken.Claims.ToList();
    }

    public string GetSingleClaim(Token token, string claimType)
    {
        var claims = GetClaims(token);
        return claims.FirstOrDefault(c => c.Type == claimType)?.Value ?? string.Empty;
    }
}

// Register in DI
builder.Services.AddSingleton<IJwtTokenService, JwtTokenService>();

CORS Configuration

Configure CORS with environment-aware settings:

using ISynergy.Framework.AspNetCore.Options;

// In appsettings.json
{
  "CORS": {
    "AllowedOrigins": ["https://myapp.com", "https://admin.myapp.com"],
    "AllowedMethods": ["GET", "POST", "PUT", "DELETE"],
    "AllowedHeaders": ["*"],
    "AllowCredentials": true
  }
}

// In Program.cs
var corsOptions = builder.Configuration
    .GetSection("CORS")
    .Get<CORSOptions>();

builder.Services.AddCors(options =>
{
    options.AddDefaultPolicy(policy =>
    {
        policy.WithOrigins(corsOptions.AllowedOrigins.ToArray())
            .WithMethods(corsOptions.AllowedMethods.ToArray())
            .WithHeaders(corsOptions.AllowedHeaders.ToArray());

        if (corsOptions.AllowCredentials)
            policy.AllowCredentials();
    });
});

app.UseCors();

Service Locator Integration

Use service locator for legacy scenarios:

using ISynergy.Framework.AspNetCore.Extensions;
using ISynergy.Framework.Core.Locators;

var app = builder.Build();

// Set service locator provider
app.SetLocatorProvider();

// Now you can use ServiceLocator anywhere
public class LegacyService
{
    public void DoWork()
    {
        var logger = ServiceLocator.Default.GetInstance<ILogger>();
        logger.LogInformation("Working...");
    }
}

Best Practices

Use Result pattern extensions to maintain consistent API responses and error handling.

Always configure global exception handling to prevent sensitive error details from leaking to clients.

OpenTelemetry integration automatically instruments ASP.NET Core, HttpClient, and runtime metrics.

API Design

  • Use Result<T> pattern for all service methods
  • Return appropriate HTTP status codes (200, 201, 204, 400, 404, 500)
  • Use ProblemDetails for error responses
  • Implement health check endpoints for monitoring
  • Use action filters to avoid repetitive validation code

Security

  • Always validate input using [ValidateModelFilter] or manual validation
  • Use [RequestShouldBeLocalFilter] for administrative endpoints
  • Implement JWT token authentication for protected endpoints
  • Configure CORS appropriately for your environment
  • Never expose internal exception details in production

Performance

  • Use [NoCache] filter sparingly - only for real-time data
  • Implement health checks that don't impact application performance
  • Use async/await throughout the application
  • Configure response compression for API endpoints
  • Monitor telemetry data to identify bottlenecks

Observability

  • Configure OpenTelemetry early in application startup
  • Tag health checks appropriately (live, ready)
  • Use structured logging with proper log levels
  • Instrument custom operations with ActivitySource
  • Monitor metrics for request duration, error rates, and throughput

Testing

The framework is designed for testability:

[TestClass]
public class ProductsControllerTests
{
    [TestMethod]
    public async Task GetProduct_ReturnsOk_WhenProductExists()
    {
        // Arrange
        var mockService = new Mock<IProductService>();
        mockService.Setup(s => s.GetProductByIdAsync(1))
            .ReturnsAsync(Result<Product>.Success(new Product { Id = 1 }));

        var controller = new ProductsController(mockService.Object);

        // Act
        var result = await controller.GetProduct(1);

        // Assert
        Assert.IsInstanceOfType(result, typeof(OkObjectResult));
    }

    [TestMethod]
    public async Task GetProduct_ReturnsNotFound_WhenProductDoesNotExist()
    {
        // Arrange
        var mockService = new Mock<IProductService>();
        mockService.Setup(s => s.GetProductByIdAsync(999))
            .ReturnsAsync(Result<Product>.Fail("Not found"));

        var controller = new ProductsController(mockService.Object);

        // Act
        var result = await controller.GetProduct(999);

        // Assert
        Assert.IsInstanceOfType(result, typeof(NotFoundResult));
    }
}

Integration Testing

public class ApiIntegrationTests : IClassFixture<WebApplicationFactory<Program>>
{
    private readonly WebApplicationFactory<Program> _factory;

    public ApiIntegrationTests(WebApplicationFactory<Program> factory)
    {
        _factory = factory;
    }

    [Fact]
    public async Task HealthEndpoint_ReturnsHealthy()
    {
        // Arrange
        var client = _factory.CreateClient();

        // Act
        var response = await client.GetAsync("/health");

        // Assert
        response.EnsureSuccessStatusCode();
        var content = await response.Content.ReadAsStringAsync();
        Assert.Contains("Healthy", content);
    }
}

Dependencies

  • ISynergy.Framework.Core - Core framework components
  • ISynergy.Framework.OpenTelemetry - OpenTelemetry integration
  • ISynergy.Framework.Storage - Storage abstractions
  • Microsoft.AspNetCore.App - ASP.NET Core framework
  • OpenTelemetry.Instrumentation.AspNetCore - ASP.NET Core instrumentation
  • OpenTelemetry.Instrumentation.Http - HttpClient instrumentation
  • OpenTelemetry.Instrumentation.Runtime - Runtime metrics

Configuration Examples

Complete Startup Configuration

using ISynergy.Framework.AspNetCore.Extensions;
using ISynergy.Framework.AspNetCore.Handlers;
using ISynergy.Framework.AspNetCore.Filters;

var builder = WebApplication.CreateBuilder(args);

// Add services
builder.Services.AddControllers(options =>
{
    // Add model binders
    options.ModelBinderProviders.Insert(0, new DateTimeModelBinderProvider());

    // Add global filters
    options.Filters.Add<ValidateModelFilterAttribute>();
});

// Add OpenTelemetry
var infoService = new InfoService("MyApi", new Version(1, 0, 0));
builder.Services.AddSingleton<IInfoService>(infoService);

builder.Logging.AddTelemetry(builder, infoService);

// Add health checks
builder.Services.AddHealthChecks()
    .AddCheck("self", () => HealthCheckResult.Healthy(), tags: ["live"]);

// Add exception handling
builder.Services.AddExceptionHandler<GlobalExceptionHandler>();
builder.Services.AddProblemDetails();

// Add CORS
builder.Services.AddCors();

var app = builder.Build();

// Configure middleware pipeline
app.UseExceptionHandler();
app.UseCors();
app.UseAuthentication();
app.UseAuthorization();

app.MapDefaultHealthEndpoints();
app.MapControllers();

app.SetLocatorProvider();

app.Run();

Documentation

For more information about the I-Synergy Framework:

  • I-Synergy.Framework.Core - Core framework components
  • I-Synergy.Framework.CQRS - CQRS implementation
  • I-Synergy.Framework.EntityFramework - Entity Framework integration
  • I-Synergy.Framework.OpenTelemetry - OpenTelemetry utilities

Support

For issues, questions, or contributions, please visit the GitHub repository.

Product Compatible and additional computed target framework versions.
.NET 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (4)

Showing the top 4 NuGet packages that depend on I-Synergy.Framework.AspNetCore:

Package Downloads
I-Synergy.Framework.AspNetCore.Authentication

I-Synergy Framework Authentication

I-Synergy.Framework.AspNetCore.Globalization

I-Synergy Framework Globalization

I-Synergy.Framework.AspNetCore.Proxy

I-Synergy Framework Proxy for .net 8.0

I-Synergy.Framework.AspNetCore.Blazor

I-Synergy Framework Blazor

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2026.10116.10015-preview 43 1/15/2026
2026.10110.10203 125 1/10/2026
2026.10110.10121-preview 118 1/10/2026
2026.10109.12335-preview 119 1/9/2026
2026.10105.11358-preview 111 1/5/2026
2026.10105.11229-preview 110 1/5/2026
2025.11231.11750-preview 120 12/31/2025
2025.11225.12213 220 12/25/2025
2025.11225.12003-preview 210 12/25/2025
2025.11218.11301 316 12/18/2025
2025.11218.10050-preview 300 12/18/2025
2025.11211.11307-preview 448 12/11/2025
2025.11211.11225-preview 442 12/11/2025
2025.11210.10145-preview 454 12/10/2025
2025.11209.11459 474 12/9/2025
2025.11209.11422-preview 464 12/9/2025
2025.11207.11553-preview 232 12/7/2025
2025.11204.11448-preview 223 12/4/2025
2025.11130.12248 452 11/30/2025
2025.11130.12134-preview 383 11/30/2025
2025.11130.11725-preview 380 11/30/2025
2025.11130.11553-preview 380 11/30/2025
2025.11130.11515-preview 380 11/30/2025
2025.11130.11420.59-preview 385 11/30/2025
2025.11130.11323.56-preview 278 11/30/2025
2025.11129.10227.14-preview 139 11/29/2025
2025.11120.10114 437 11/20/2025
2025.11119.12324.6-preview 424 11/19/2025
2025.11119.10110 438 11/19/2025
2025.11119.10037-preview 393 11/19/2025
2025.11118.12340.33-preview 424 11/18/2025
2025.11117.12349.4-preview 421 11/17/2025
2025.11117.11937.47-preview 426 11/17/2025
2025.11113.11532.29-preview 306 11/13/2025
2025.11113.10128.57-preview 276 11/13/2025
2025.11110.10306.55-preview 255 11/10/2025
2025.11109.10018.48-preview 170 11/8/2025
2025.11108.10119.29-preview 149 11/8/2025
2025.11106.10037.1-preview 222 11/6/2025
2025.11105.10254.54-preview 218 11/5/2025
2025.11105.10141.16-preview 229 11/5/2025
2025.11104.12308.54-preview 220 11/4/2025
2025.11104.10144.47-preview 222 11/4/2025
2025.11102.12003.8-preview 221 11/2/2025
2025.11102.11228.52-preview 191 11/2/2025
2025.11102.10309.42-preview 175 11/2/2025
2025.11029.11433.38-preview 230 10/29/2025
2025.11029.10201.38-preview 219 10/29/2025
2025.11027.11947.55-preview 221 10/27/2025
2025.11022.12207.12-preview 209 10/22/2025
2025.11019.12053.37-preview 210 10/19/2025
2025.11016.11750.24-preview 202 10/16/2025
2025.11015.10219.44-preview 199 10/15/2025
2025.11014.10245.12-preview 204 10/14/2025
2025.11012.10130.11-preview 180 10/12/2025
2025.11010.10052.52-preview 255 10/9/2025
2025.11001.12118.13-preview 240 10/1/2025
2025.10925.10144.25-preview 269 9/25/2025
2025.10921.11353.29-preview 285 9/21/2025
2025.10913.11841.29-preview 214 9/13/2025
2025.10912.12351.59-preview 170 9/12/2025
2025.10912.10210.52-preview 239 9/12/2025
2025.10911.10131.43-preview 229 9/10/2025
2025.10910.12340.34-preview 247 9/10/2025
2025.10910.11327.15-preview 233 9/10/2025
2025.10910.11206.45-preview 242 9/10/2025
2025.10910.10230.58-preview 255 9/10/2025
2025.10908.12343.47-preview 247 9/8/2025
2025.10904.12337.35-preview 257 9/4/2025
2025.10904.12245.51-preview 265 9/4/2025
2025.10904.11425.5-preview 244 9/4/2025
2025.10904.10323.39-preview 266 9/4/2025
2025.10826.11425.3-preview 311 8/26/2025
2025.10825.12350.9-preview 246 8/25/2025
2025.10810.10248-preview 214 8/10/2025
2025.10809.10146.35-preview 245 8/9/2025
2025.10806.12031.49-preview 315 8/6/2025
2025.10806.11955.54-preview 306 8/6/2025
2025.10806.11433.24-preview 325 8/6/2025
2025.10709.10105.39-preview 236 7/8/2025
2025.10707.12320.3-preview 240 7/7/2025
2025.10706.11957.9-preview 222 7/6/2025
2025.10702.11752.47-preview 238 7/2/2025
2025.10702.11256.17-preview 238 7/2/2025
2025.10702.11119.10-preview 241 7/2/2025
2025.10702.10000.31-preview 244 7/1/2025
2025.10701.11524.1-preview 239 7/1/2025
2025.10701.11310.13-preview 248 7/1/2025
2025.10630.12022.58-preview 238 6/30/2025
2025.10612.12134.8-preview 413 6/12/2025
2025.10611.12313.53-preview 410 6/11/2025
2025.10603.10159.54-preview 268 6/3/2025
2025.10602.11908.9-preview 266 6/2/2025
2025.10601.10124.29-preview 225 5/31/2025
2025.10531.12235.29-preview 209 5/31/2025
2025.10530.10121.50-preview 278 5/29/2025
2025.10527.12202.4-preview 264 5/27/2025
2025.10526.12034.25-preview 243 5/26/2025
2025.10521.11828.30-preview 270 5/21/2025
2025.10520.11715.6-preview 266 5/20/2025
2025.10520.11515.16-preview 242 5/20/2025
2025.10518.12303.43-preview 270 5/18/2025
2025.10518.11257.36-preview 275 5/18/2025
2025.10517.12347.27-preview 199 5/17/2025
2025.10517.12003.6-preview 208 5/17/2025
2025.10516.11720.13-preview 292 5/16/2025
2025.10514.12334.2-preview 364 5/14/2025
2025.10514.10015.27-preview 340 5/13/2025
2025.10511.11032.32-preview 282 5/11/2025
2025.10413.11530 354 4/13/2025
2025.10413.11434.33-preview 340 4/13/2025
2025.10413.10205.50-preview 267 4/13/2025
2025.10412.11526.4-preview 229 4/12/2025
2025.10412.10141 268 4/12/2025
2025.10411.11811.23-preview 250 4/11/2025
2025.10411.11645.1-preview 259 4/11/2025
2025.10410.11458.35-preview 299 4/10/2025
2025.10405.10143.28-preview 188 4/5/2025
2025.10403.12208.1-preview 305 4/3/2025
2025.10403.11954.16-preview 299 4/3/2025
2025.10401.11908.24-preview 291 4/1/2025
2025.10401.11559.45-preview 297 4/1/2025
2025.10331.12215.59-preview 283 3/31/2025
2025.10331.12130.34-preview 284 3/31/2025
2025.10331.10056.40-preview 290 3/30/2025
2025.10328.10150.21-preview 253 3/28/2025
2025.10323.11359-preview 404 3/23/2025
2025.10320.11800 300 3/20/2025
2025.10320.11616.45-preview 252 3/20/2025
2025.10320.10000 255 3/19/2025
2025.10319.12311.26-preview 253 3/19/2025
2025.10319.12238.6-preview 269 3/19/2025
2025.10319.12057.59-preview 276 3/19/2025
2025.10318.10055 274 3/18/2025
2025.10317.11728.13-preview 267 3/17/2025
2025.10317.11201.3-preview 279 3/17/2025
2025.10315.11523.14-preview 200 3/15/2025
2025.10305.12342 358 3/5/2025
2025.10305.12321.9-preview 345 3/5/2025
2025.10301.12313 274 3/1/2025
2025.10301.12129.38-preview 205 3/1/2025
2025.10221.10043.29-preview 214 2/21/2025
2025.1051.1246 288 2/20/2025
2025.1051.44.54-preview 231 2/20/2025
2025.1044.1 242 2/13/2025
2025.1044.0.2-preview 219 2/13/2025
2025.1043.0.2-preview 207 2/12/2025
2025.1041.0.1-preview 235 2/10/2025
2025.1038.1 308 2/7/2025
2025.1038.0.1-preview 233 2/7/2025
2025.1035.1 302 2/4/2025
2025.1035.0.1-preview 261 2/4/2025
2025.1034.1 307 2/3/2025
2025.1034.0.1-preview 250 2/3/2025
2025.1033.0.5-preview 243 2/2/2025
2025.1033.0.3-preview 250 2/2/2025
2025.1033.0.2-preview 260 2/2/2025
2025.1033.0.1-preview 207 2/2/2025
2025.1025.1 306 1/25/2025
2025.1025.0.1-preview 246 1/25/2025
2025.1021.1 280 1/21/2025
2025.1021.0.1-preview 248 1/21/2025
2025.1020.1 266 1/20/2025
2025.1020.0.3-preview 254 1/20/2025
2025.1020.0.1-preview 252 1/20/2025
2025.1018.0.7-preview 226 1/18/2025
2025.1018.0.5-preview 254 1/18/2025
2025.1018.0.4-preview 244 1/18/2025
2025.1017.0.2-preview 232 1/17/2025
2025.1017.0.1-preview 262 1/17/2025
2025.1016.0.1-preview 232 1/16/2025
2025.1010.1 292 1/10/2025
2025.1010.0.1-preview 238 1/9/2025
2025.1009.0.3-preview 253 1/9/2025
2025.1007.1 286 1/7/2025
2025.1007.0.5-preview 249 1/7/2025
2025.1007.0.3-preview 247 1/7/2025
2025.1006.1 275 1/7/2025
2025.1005.1 327 1/5/2025
2025.1005.0.2-preview 255 1/5/2025
2025.1004.1 309 1/4/2025
2024.1366.1 281 12/31/2024
2024.1366.0.2-preview 259 12/31/2024
2024.1366.0.1-preview 278 12/31/2024
2024.1365.0.2-preview 222 12/30/2024
2024.1365.0.1-preview 253 12/30/2024
2024.1361.0.2-preview 256 12/26/2024
2024.1353.0.1-preview 237 12/18/2024
2024.1352.0.3-preview 251 12/17/2024
2024.1352.0.2-preview 236 12/17/2024
2024.1352.0.1-preview 229 12/17/2024
2024.1351.1 304 12/16/2024
2024.1351.0.3-preview 240 12/16/2024
2024.1350.1 304 12/15/2024
2024.1343.1 302 12/8/2024
2024.1339.1 306 12/4/2024
2024.1336.1 301 12/1/2024
2024.1332.1 276 11/27/2024
2024.1330.1 295 11/25/2024
2024.1328.1 282 11/23/2024
2024.1325.1 319 11/20/2024
2024.1323.1 320 11/18/2024
2024.1316.1 151 11/11/2024
2024.1307.1 145 11/2/2024
2024.1300.1 158 10/26/2024
2024.1294.1 178 10/20/2024
2024.1290.1 317 10/16/2024
2024.1283.1 321 10/8/2024
2024.1282.1 253 10/8/2024
2024.1278.1 285 10/4/2024
2024.1277.1 294 10/3/2024
2024.1275.2 256 10/1/2024
2024.1275.1 241 10/1/2024
2024.1274.1 238 9/30/2024
2024.1263.1 239 9/19/2024
2024.1261.1 294 9/17/2024
2024.1258.1 268 9/13/2024
2024.1257.1 243 9/13/2024
2024.1256.1 236 9/12/2024
2024.1254.1 259 9/10/2024
2024.1250.1 279 9/6/2024
2024.1249.1 272 9/5/2024
2024.1246.1 278 9/2/2024
2024.1245.1 270 9/1/2024
2024.1237.1 300 8/24/2024
2024.1235.0.1-preview 248 8/23/2024
2024.1230.1 256 8/18/2024
2024.1229.1 297 8/16/2024
2024.1228.1 259 8/15/2024
2024.1222.1 329 8/8/2024
2024.1221.1 247 8/7/2024
2024.1221.0.2-preview 240 8/8/2024
2024.1221.0.1-preview 240 8/8/2024
2024.1220.1 249 8/7/2024
2024.1219.0.2-preview 223 8/6/2024
2024.1219.0.1-preview 194 8/6/2024
2024.1217.0.2-preview 200 8/4/2024
2024.1217.0.1-preview 216 8/4/2024
2024.1216.0.2-preview 208 8/3/2024
2024.1216.0.1-preview 210 8/3/2024
2024.1208.0.1-preview 238 7/26/2024
2024.1207.0.7-preview 199 7/25/2024
2024.1207.0.5-preview 212 7/25/2024
2024.1166.1 346 6/14/2024
2024.1165.1 271 6/13/2024
2024.1164.1 233 6/12/2024
2024.1162.1 255 6/10/2024
2024.1158.1 317 6/6/2024
2024.1156.1 278 6/4/2024
2024.1152.1 336 5/31/2024
2024.1151.1 306 5/29/2024
2024.1150.2 266 5/29/2024
2024.1150.1 277 5/29/2024
2024.1149.1 266 5/28/2024
2024.1147.1 277 5/26/2024
2024.1146.2 257 5/25/2024
2024.1146.1 258 5/25/2024
2024.1145.1 279 5/24/2024
2024.1135.2 273 5/14/2024
2024.1135.1 256 5/14/2024
2024.1134.1 232 5/13/2024
2024.1130.1 299 5/9/2024
2024.1123.1 301 5/2/2024
2024.1121.1 294 4/30/2024
2024.1114.1 333 4/22/2024
2024.1113.0.5-preview 264 4/22/2024
2024.1113.0.3-preview 266 4/22/2024
2024.1113.0.2-preview 242 4/22/2024
2024.1113.0.1-preview 239 4/22/2024
2024.1108.0.1-preview 267 4/17/2024
2024.1107.0.1-preview 267 4/16/2024
2024.1094.2 295 4/3/2024
2024.1094.1 256 4/3/2024
2024.1092.1 270 4/1/2024
2024.1088.1 277 3/28/2024
2024.1085.1 296 3/25/2024
2024.1080.2 306 3/20/2024
2024.1080.1 290 3/20/2024
2024.1078.1 305 3/18/2024
2024.1077.1 294 3/17/2024
2024.1073.1 325 3/13/2024
2024.1070.1 325 3/10/2024
2024.1069.1 312 3/9/2024
2024.1068.1 312 3/8/2024
2024.1066.2 288 3/6/2024
2024.1066.1 297 3/6/2024
2024.1065.1 315 3/5/2024
2024.1065.0.1-preview 259 3/5/2024
2024.1063.2 306 3/3/2024
2024.1063.1 284 3/3/2024
2024.1062.1 313 3/2/2024
2024.1061.2 310 3/1/2024
2024.1061.1 297 3/1/2024
2024.1060.2 303 2/29/2024
2024.1060.1 280 2/29/2024
2024.1060.0.5-preview 260 2/29/2024
2024.1060.0.3-preview 258 2/29/2024
2024.1059.0.1-preview 220 2/28/2024
2024.1058.1 277 2/27/2024
2024.1056.1 262 2/25/2024
2024.1055.1 261 2/24/2024
2024.1052.1 315 2/21/2024
2024.1050.2 288 2/20/2024
2024.1050.1 276 2/19/2024
2024.1049.1 298 2/18/2024
2024.1048.1 305 2/17/2024
2024.1047.1 278 2/16/2024
2024.1035.1 301 2/4/2024
2024.1034.2 279 2/3/2024
2024.1029.1 374 1/29/2024
2024.1023.1 378 1/23/2024
2024.1022.1 389 1/22/2024
2024.1020.1 358 1/20/2024
2024.1019.1 370 1/19/2024
2024.1017.1 398 1/17/2024
2024.1012.1 396 1/12/2024
2024.1010.1 402 1/10/2024
2024.1008.1 413 1/8/2024
2024.1007.1 404 1/7/2024
2024.1005.1 402 1/5/2024
2024.1004.1 444 1/4/2024
2023.1365.1 436 12/31/2023
2023.1362.1 397 12/28/2023
2023.1361.1 385 12/27/2023
2023.1359.1 427 12/25/2023
2023.1358.1 354 12/24/2023
2023.1357.1 363 12/23/2023
2023.1342.1 448 12/8/2023
2023.1336.1 438 12/2/2023
2023.1332.1 404 11/28/2023
2023.1330.1 400 11/26/2023
2023.1325.1 409 11/21/2023
2023.1323.1 322 11/19/2023
2023.1320.1 297 11/17/2023
2023.1318.1 400 11/15/2023
2023.1317.1 339 11/13/2023
2023.1307.1 356 11/3/2023
2023.1305.1 362 11/1/2023
2023.1304.1 345 10/31/2023
2023.1294.1 342 10/21/2023
2023.1290.1 371 10/16/2023
2023.1289.1 318 10/16/2023
2023.1284.1 381 10/11/2023
2023.1276.1 383 10/3/2023
2023.1275.1 380 10/2/2023
2023.1272.1 405 9/29/2023
2023.1269.1 358 9/26/2023
2023.1242.1 478 8/30/2023
2023.1231.1 522 8/19/2023
2023.1229.1 499 8/17/2023
2023.1228.1 500 8/16/2023
2023.1227.1 493 8/15/2023
2023.1224.2 505 8/12/2023
2023.1224.1 520 8/12/2023
2023.1213.2 581 8/1/2023
2023.1213.1 543 8/1/2023
2023.1209.1 515 7/27/2023
2023.1201.1 548 7/20/2023
2023.1197.1 543 7/16/2023
2023.1178.1 582 6/27/2023
2023.1175.1 593 6/24/2023
2023.1174.1 560 6/22/2023
2023.1169.1 575 6/18/2023
2023.1165.1 571 6/14/2023
2023.1161.1 637 6/11/2023
2023.1159.1 647 6/7/2023
2023.1157.1 622 6/6/2023
2023.1146.1 604 5/27/2023
2023.1139.1 656 5/19/2023
2023.1137.1 695 5/17/2023
2023.1136.1 668 5/16/2023
2023.1118.1 706 4/28/2023
2023.1111.1 733 4/21/2023
2023.1110.1 763 4/20/2023
2023.1105.1 762 4/15/2023
2023.1103.1 738 4/13/2023
2023.1102.1 732 4/12/2023
2023.1101.1 728 4/11/2023
2023.1090.1 784 3/31/2023
2023.1089.1 797 3/30/2023
2023.1088.1 812 3/29/2023
2023.1082.1 860 3/23/2023
2023.1078.1 872 3/19/2023
2023.1070.1 853 3/11/2023
2023.1069.1 875 3/10/2023
2023.1064.1 882 3/5/2023
2023.1060.1 939 3/1/2023
2023.1057.1 930 2/26/2023
2023.1046.1 953 2/15/2023
2023.1043.2 966 2/12/2023
2023.1043.1 947 2/12/2023
2023.1042.1 931 2/11/2023
2023.1041.1 962 2/10/2023
2023.1039.1 915 2/8/2023
2023.1036.1 971 2/5/2023
2023.1035.1 975 2/4/2023
2023.1033.1 1,005 2/2/2023
2023.1030.1 1,011 1/30/2023
2023.1028.1 1,013 1/28/2023
2023.1026.1 991 1/26/2023
2023.1025.1 997 1/25/2023
2023.1024.1 978 1/24/2023
2023.1023.1 999 1/23/2023
2022.1319.1 676 11/15/2022
2022.1309.1 976 11/5/2022
2022.1307.1 978 11/3/2022
2022.1295.1 1,024 10/22/2022
2022.1290.1 1,039 10/17/2022
2022.1289.2 1,016 10/16/2022
2022.1289.1 994 10/16/2022
2022.1283.1 1,067 10/10/2022
2022.1282.1 1,009 10/9/2022
2022.1278.1 1,036 10/5/2022
2022.1272.2 1,036 9/29/2022
2022.1272.1 1,047 9/29/2022
2022.1271.1 1,050 9/28/2022
2022.1266.1 1,082 9/23/2022
2022.1259.1 1,072 9/16/2022
2022.1257.1 1,092 9/14/2022
2022.1250.1 1,072 9/7/2022
2022.1250.0.2-preview 376 9/7/2022
2022.1249.0.2-preview 368 9/6/2022
2022.1249.0.1-preview 339 9/6/2022
2022.1197.1 1,149 7/16/2022
2022.1196.1 1,100 7/15/2022
2022.1194.1 1,158 7/13/2022
2022.1182.1 1,135 7/1/2022
2022.1178.1 1,138 6/27/2022
2022.1166.1 1,156 6/15/2022
2022.1157.1 1,150 6/6/2022
2022.1150.1 1,165 5/30/2022
2022.1149.1 1,157 5/29/2022
2022.1144.1 1,139 5/24/2022
0.6.2 1,139 5/23/2022
0.6.1 1,118 5/23/2022
0.6.0 1,155 5/14/2022
0.5.3 1,191 5/8/2022
0.5.2 1,188 5/1/2022
0.5.1 1,156 5/1/2022
0.5.0 1,164 4/23/2022
0.4.1 1,163 4/15/2022
0.4.0 1,178 4/9/2022
0.3.3 1,188 4/8/2022
0.3.2 1,172 4/1/2022
0.3.1 1,169 3/29/2022
0.3.0 1,122 3/28/2022
0.2.3 1,173 3/28/2022
0.2.2 1,202 3/25/2022
0.2.1 1,159 3/21/2022
0.2.0 1,196 3/18/2022