Foundatio.Redis 10.5.0 The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org. Prefix Reserved

.NET Standard 2.0
Install-Package Foundatio.Redis -Version 10.5.0
dotnet add package Foundatio.Redis --version 10.5.0
<PackageReference Include="Foundatio.Redis" Version="10.5.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Foundatio.Redis --version 10.5.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: Foundatio.Redis, 10.5.0"
#r directive can be used in F# Interactive, C# scripting and .NET Interactive. Copy this into the interactive tool or source code of the script to reference the package.
// Install Foundatio.Redis as a Cake Addin
#addin nuget:?package=Foundatio.Redis&version=10.5.0

// Install Foundatio.Redis as a Cake Tool
#tool nuget:?package=Foundatio.Redis&version=10.5.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.

FoundatioFoundatio

Build status NuGet Version feedz.io Discord

Pluggable foundation blocks for building loosely coupled distributed apps.

Includes implementations in Redis, Azure, AWS, RabbitMQ and in memory (for development).

Why Foundatio?

When building several big cloud applications we found a lack of great solutions (that's not to say there isn't solutions out there) for many key pieces to building scalable distributed applications while keeping the development experience simple. Here are a few examples of why we built and use Foundatio:

  • Wanted to build against abstract interfaces so that we could easily change implementations.
  • Wanted the blocks to be dependency injection friendly.
  • Caching: We were initially using an open source Redis cache client but then it turned into a commercial product with high licensing costs. Not only that, but there weren't any in memory implementations so every developer was required to set up and configure Redis.
  • Message Bus: We initially looked at NServiceBus (great product) but it had high licensing costs (they have to eat too) but was not OSS friendly. We also looked into MassTransit but found Azure support lacking and local set up a pain. We wanted a simple message bus that just worked locally or in the cloud.
  • Storage: We couldn't find any existing project that was decoupled and supported in memory, file storage or Azure Blob Storage.

To summarize, if you want pain free development and testing while allowing your app to scale, use Foundatio!

Implementations

Getting Started (Development)

Foundatio can be installed via the NuGet package manager. If you need help, please open an issue or join our Discord chat room. We’re always here to help if you have any questions!

This section is for development purposes only! If you are trying to use the Foundatio libraries, please get them from NuGet.

  1. You will need to have Visual Studio Code installed.
  2. Open the Foundatio.sln Visual Studio solution file.

Using Foundatio

The sections below contain a small subset of what's possible with Foundatio. We recommend taking a peek at the source code for more information. Please let us know if you have any questions or need assistance!

Caching

Caching allows you to store and access data lightning fast, saving you exspensive operations to create or get data. We provide four different cache implementations that derive from the ICacheClient interface:

  1. InMemoryCacheClient: An in memory cache client implementation. This cache implementation is only valid for the lifetime of the process. It's worth noting that the in memory cache client has the ability to cache the last X items via the MaxItems property. We use this in Exceptionless to only keep the last 250 resolved geoip results.
  2. HybridCacheClient: This cache implementation uses the InMemoryCacheClient and uses the IMessageBus to keep the cache in sync across processes.
  3. RedisCacheClient: A Redis cache client implementation.
  4. RedisHybridCacheClient: This cache implementation uses both the RedisCacheClient and InMemoryCacheClient implementations and uses the RedisMessageBus to keep the in memory cache in sync across processes. This can lead to huge wins in performance as you are saving a serialization operation and call to Redis if the item exists in the local cache.
  5. ScopedCacheClient: This cache implementation takes an instance of ICacheClient and a string scope. The scope is prefixed onto every cache key. This makes it really easy to scope all cache keys and remove them with ease.
Sample
using Foundatio.Caching;

ICacheClient cache = new InMemoryCacheClient();
await cache.SetAsync("test", 1);
var value = await cache.GetAsync<int>("test");

Queues

Queues offer First In, First Out (FIFO) message delivery. We provide four different queue implementations that derive from the IQueue interface:

  1. InMemoryQueue: An in memory queue implementation. This queue implementation is only valid for the lifetime of the process.
  2. RedisQueue: An Redis queue implementation.
  3. AzureServiceBusQueue: An Azure Service Bus Queue implementation.
  4. AzureStorageQueue: An Azure Storage Queue implementation.
  5. SQSQueue: An AWS SQS implementation.
Sample
using Foundatio.Queues;

IQueue<SimpleWorkItem> queue = new InMemoryQueue<SimpleWorkItem>();

await queue.EnqueueAsync(new SimpleWorkItem {
    Data = "Hello"
});

var workItem = await queue.DequeueAsync();

Locks

Locks ensure a resource is only accessed by one consumer at any given time. We provide two different locking implementations that derive from the ILockProvider interface:

  1. CacheLockProvider: A lock implementation that uses cache to communicate between processes.
  2. ThrottlingLockProvider: A lock implementation that only allows a certain amount of locks through. You could use this to throttle api calls to some external service and it will throttle them across all processes asking for that lock.
  3. ScopedLockProvider: This lock implementation takes an instance of ILockProvider and a string scope. The scope is prefixed onto every lock key. This makes it really easy to scope all locks and release them with ease.

It's worth noting that all lock providers take a ICacheClient. This allows you to ensure your code locks properly across machines.

Sample
using Foundatio.Lock;

ILockProvider locker = new CacheLockProvider(new InMemoryCacheClient(), new InMemoryMessageBus());
var lock = await locker.AcquireAsync("test");
// ...
await lock.ReleaseAsync();

ILockProvider throttledLocker = new ThrottlingLockProvider(new InMemoryCacheClient(), 1, TimeSpan.FromMinutes(1));
var throttledLock = await throttledLocker.AcquireAsync("test");
// ...
await throttledLock.ReleaseAsync();

Messaging

Allows you to publish and subscribe to messages flowing through your application. We provide four different message bus implementations that derive from the IMessageBus interface:

  1. InMemoryMessageBus: An in memory message bus implementation. This message bus implementation is only valid for the lifetime of the process.
  2. RedisMessageBus: A Redis message bus implementation.
  3. RabbitMQMessageBus: A RabbitMQ implementation.
  4. AzureServiceBusMessageBus: An Azure Service Bus implementation.
Sample
using Foundatio.Messaging;

IMessageBus messageBus = new InMemoryMessageBus();
await messageBus.SubscribeAsync<SimpleMessageA>(msg => {
  // Got message
});

await messageBus.PublishAsync(new SimpleMessageA { Data = "Hello" });

Jobs

Allows you to run a long running process (in process or out of process) without worrying about it being terminated prematurely. We provide three different ways of defining a job, based on your use case:

  1. Jobs: All jobs must derive from the IJob interface. We also have a JobBase base class you can derive from which provides a JobContext and logging. You can then run jobs by calling RunAsync() on the job or by creating a instance of the JobRunner class and calling one of the Run methods. The JobRunner can be used to easily run your jobs as Azure Web Jobs.
Sample
using Foundatio.Jobs;

public class HelloWorldJob : JobBase {
  public int RunCount { get; set; }

  protected override Task<JobResult> RunInternalAsync(JobContext context) {
     RunCount++;
     return Task.FromResult(JobResult.Success);
  }
}
var job = new HelloWorldJob();
await job.RunAsync(); // job.RunCount = 1;
await job.RunContinuousAsync(iterationLimit: 2); // job.RunCount = 3;
await job.RunContinuousAsync(cancellationToken: new CancellationTokenSource(10).Token); // job.RunCount > 10;
  1. Queue Processor Jobs: A queue processor job works great for working with jobs that will be driven from queued data. Queue Processor jobs must derive from QueueJobBase<T> class. You can then run jobs by calling RunAsync() on the job or passing it to the JobRunner class. The JobRunner can be used to easily run your jobs as Azure Web Jobs.
Sample
using Foundatio.Jobs;

public class HelloWorldQueueJob : QueueJobBase<HelloWorldQueueItem> {
  public int RunCount { get; set; }

  public HelloWorldQueueJob(IQueue<HelloWorldQueueItem> queue) : base(queue) {}

  protected override Task<JobResult> ProcessQueueEntryAsync(QueueEntryContext<HelloWorldQueueItem> context) {
     RunCount++;

     return Task.FromResult(JobResult.Success);
  }
}

public class HelloWorldQueueItem {
  public string Message { get; set; }
}
 // Register the queue for HelloWorldQueueItem.
container.AddSingleton<IQueue<HelloWorldQueueItem>>(s => new InMemoryQueue<HelloWorldQueueItem>());

// To trigger the job we need to queue the HelloWorldWorkItem message.
// This assumes that we injected an instance of IQueue<HelloWorldWorkItem> queue

IJob job = new HelloWorldQueueJob();
await job.RunAsync(); // job.RunCount = 0; The RunCount wasn't incremented because we didn't enqueue any data.

await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });
await job.RunAsync(); // job.RunCount = 1;

await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });
await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });
await job.RunUntilEmptyAsync(); // job.RunCount = 3;
  1. Work Item Jobs: A work item job will run in a job pool among other work item jobs. This type of job works great for things that don't happen often but should be in a job (Example: Deleting an entity that has many children.). It will be triggered when you publish a message on the message bus. The job must derive from the WorkItemHandlerBase class. You can then run all shared jobs via JobRunner class. The JobRunner can be used to easily run your jobs as Azure Web Jobs.
Sample
using System.Threading.Tasks;
using Foundatio.Jobs;

public class HelloWorldWorkItemHandler : WorkItemHandlerBase {
  public override async Task HandleItemAsync(WorkItemContext ctx) {
    var workItem = ctx.GetData<HelloWorldWorkItem>();

    // We can report the progress over the message bus easily.
    // To receive these messages just inject IMessageSubscriber
    // and Subscribe to messages of type WorkItemStatus
    await ctx.ReportProgressAsync(0, "Starting Hello World Job");
    await Task.Delay(TimeSpan.FromSeconds(2.5));
    await ctx.ReportProgressAsync(50, "Reading value");
    await Task.Delay(TimeSpan.FromSeconds(.5));
    await ctx.ReportProgressAsync(70, "Reading value.");
    await Task.Delay(TimeSpan.FromSeconds(.5));
    await ctx.ReportProgressAsync(90, "Reading value..");
    await Task.Delay(TimeSpan.FromSeconds(.5));

    await ctx.ReportProgressAsync(100, workItem.Message);
  }
}

public class HelloWorldWorkItem {
  public string Message { get; set; }
}
// Register the shared job.
var handlers = new WorkItemHandlers();
handlers.Register<HelloWorldWorkItem, HelloWorldWorkItemHandler>();

// Register the handlers with dependency injection.
container.AddSingleton(handlers);

// Register the queue for WorkItemData.
container.AddSingleton<IQueue<WorkItemData>>(s => new InMemoryQueue<WorkItemData>());

// The job runner will automatically look for and run all registered WorkItemHandlers.
new JobRunner(container.GetRequiredService<WorkItemJob>(), instanceCount: 2).RunInBackground();
 // To trigger the job we need to queue the HelloWorldWorkItem message.
 // This assumes that we injected an instance of IQueue<WorkItemData> queue

 // NOTE: You may have noticed that HelloWorldWorkItem doesn't derive from WorkItemData.
 // Foundatio has an extension method that takes the model you post and serializes it to the
 // WorkItemData.Data property.
 await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });

File Storage

We provide different file storage implementations that derive from the IFileStorage interface:

  1. InMemoryFileStorage: An in memory file implementation. This file storage implementation is only valid for the lifetime of the process.
  2. FolderFileStorage: An file storage implementation that uses the hard drive for storage.
  3. AzureFileStorage: An Azure Blob storage implementation.
  4. S3FileStorage: An AWS S3 file storage implementation.
  5. RedisFileStorage: An Redis file storage implementation.
  6. MinioFileStorage An Minio file storage implementation.
  7. AliyunFileStorage: An Aliyun file storage implementation.
  8. SshNetFileStorage: An SFTP file storage implementation.

We recommend using all of the IFileStorage implementations as singletons.

Sample
using Foundatio.Storage;

IFileStorage storage = new InMemoryFileStorage();
await storage.SaveFileAsync("test.txt", "test");
string content = await storage.GetFileContentsAsync("test.txt")

Metrics

We provide five implementations that derive from the IMetricsClient interface:

  1. InMemoryMetricsClient: An in memory metrics implementation.
  2. RedisMetricsClient: An Redis metrics implementation.
  3. StatsDMetricsClient: An statsd metrics implementation.
  4. MetricsNETClient: An Metrics.NET implementation.
  5. AppMetricsClient: An AppMetrics implementation.
  6. CloudWatchMetricsClient: An AWS CloudWatch implementation.

We recommend using all of the IMetricsClient implementations as singletons.

Sample
IMetricsClient metrics = new InMemoryMetricsClient();
metrics.Counter("c1");
metrics.Gauge("g1", 2.534);
metrics.Timer("t1", 50788);

Sample Application

We have both slides and a sample application that shows off how to use Foundatio.

Roadmap

This is a list of high level things that we are planning to do:

Product Versions
.NET net5.0 net5.0-windows net6.0 net6.0-android net6.0-ios net6.0-maccatalyst net6.0-macos net6.0-tvos net6.0-windows
.NET Core netcoreapp2.0 netcoreapp2.1 netcoreapp2.2 netcoreapp3.0 netcoreapp3.1
.NET Standard netstandard2.0 netstandard2.1
.NET Framework net461 net462 net463 net47 net471 net472 net48
MonoAndroid monoandroid
MonoMac monomac
MonoTouch monotouch
Tizen tizen40 tizen60
Xamarin.iOS xamarinios
Xamarin.Mac xamarinmac
Xamarin.TVOS xamarintvos
Xamarin.WatchOS xamarinwatchos
Compatible target framework(s)
Additional computed target framework(s)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (6)

Showing the top 5 NuGet packages that depend on Foundatio.Redis:

Package Downloads
SoftwarePioniere.Fx.Redis

Package Description

SoftwarePioniere.Foundatio.Redis

Software Pioniere Fx Foundatio Redis Extensions

HttpRequester

Multiple http clients

IFramework.FoundatioRedis

Description

Tcg.Owin.Cookies.SessionStore.Redis

Package Description

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on Foundatio.Redis:

Repository Stars
exceptionless/Exceptionless
Exceptionless server and jobs
Version Downloads Last updated
10.5.0 2,951 5/18/2022
10.4.0 8,555 3/8/2022
10.3.0 4,223 1/20/2022
10.2.3 68,798 9/24/2021
10.2.2 218 9/23/2021
10.2.0 29,471 7/8/2021
10.1.0 7,107 6/16/2021
10.0.2 35,503 1/20/2021
10.0.0 29,298 9/16/2020
10.0.0-beta9 921 8/25/2020
10.0.0-beta8 316 8/3/2020
10.0.0-beta6 777 7/8/2020
10.0.0-beta5 495 6/20/2020
10.0.0-beta3 414 6/14/2020
10.0.0-beta2 365 6/6/2020
10.0.0-beta10 312 9/16/2020
10.0.0-beta1 373 5/26/2020
9.0.0 57,950 1/16/2020
8.1.1662 70,674 8/30/2019
8.1.1651 12,413 8/1/2019
8.1.1648 1,164 7/20/2019
8.1.1642 10,566 5/14/2019
8.1.1638 2,159 4/16/2019
8.0.1631 1,142 4/3/2019
8.0.1627 8,581 2/24/2019
8.0.1621 809 2/22/2019
7.1.1608 85,042 11/9/2018
7.0.1584 3,482 10/18/2018
7.0.1570 2,125 9/7/2018
7.0.1564 17,400 5/9/2018
6.0.1496 5,636 11/30/2017
5.1.1478 8,958 8/21/2017
5.1.1468 4,946 6/23/2017
5.1.1460 1,382 5/5/2017
5.0.1336 1,030 3/14/2017
5.0.1334 837 3/13/2017
5.0.1331 844 3/12/2017
5.0.1329-pre 726 3/12/2017
5.0.1328-pre 721 3/12/2017
5.0.1327-pre 779 3/12/2017
5.0.1326-pre 781 3/12/2017
5.0.1324-pre 753 3/12/2017
4.3.1323-pre 744 3/11/2017
4.3.1317 2,722 2/23/2017
4.3.1316 894 2/22/2017
4.3.1315 961 2/22/2017
4.3.1314 1,112 2/20/2017
4.3.1312 874 2/20/2017
4.3.1311-pre 740 2/20/2017
4.3.1307 891 2/16/2017
4.3.1306 908 2/15/2017
4.3.1305 824 2/15/2017
4.3.1304-pre 740 2/15/2017
4.3.1303-pre 709 2/14/2017
4.3.1301 878 2/14/2017
4.3.1299 863 2/14/2017
4.3.1293 922 2/12/2017
4.3.1292 908 2/10/2017
4.3.1291 910 2/10/2017
4.3.1290 863 2/10/2017
4.3.1289 861 2/9/2017
4.3.1288 817 2/9/2017
4.3.1286 829 2/8/2017
4.3.1282 887 2/5/2017
4.3.1281 857 2/5/2017
4.3.1280 871 2/5/2017
4.3.1276-pre 734 2/5/2017
4.3.1177-pre 887 9/2/2016
4.3.1164-pre 732 8/21/2016
4.2.1205-pre 1,062 9/19/2016
4.2.1183 1,811 9/9/2016
4.2.1179 799 9/8/2016
4.2.1176 828 9/2/2016
4.2.1172 774 9/1/2016
4.2.1171-pre 755 9/1/2016
4.2.1169 835 8/22/2016
4.2.1167-pre 719 8/22/2016
4.2.1166-pre 743 8/22/2016
4.2.1161 790 8/10/2016
4.2.1156-pre 688 8/2/2016
4.2.1155 814 8/1/2016
4.2.1150 1,009 7/20/2016
4.2.1149-pre 752 7/19/2016
4.2.1148-pre 741 7/19/2016
4.2.1147-pre 708 7/19/2016
4.2.1146-pre 749 7/19/2016
4.2.1137 816 7/19/2016
4.2.1129-pre 721 7/19/2016
4.2.1128-pre 710 7/19/2016
4.2.1127-pre 690 7/19/2016
4.2.1126-pre 708 7/19/2016
4.2.1125-pre 713 7/19/2016
4.2.1123-pre 746 7/19/2016
4.2.1119-pre 707 7/18/2016
4.2.1113-pre 753 7/16/2016
4.2.1108-pre 788 7/15/2016
4.2.1107-pre 777 7/15/2016
4.2.1104-pre 950 7/13/2016
4.2.1099-pre 932 7/12/2016
4.2.1098-pre 921 7/12/2016
4.2.1093-pre 794 7/8/2016
4.2.1091-pre 811 7/8/2016
4.2.1090-pre 809 7/8/2016
4.2.1089-pre 803 7/7/2016
4.2.1087-pre 804 7/7/2016
4.2.1083-pre 804 7/6/2016
4.2.1082-pre 781 7/6/2016
4.2.1081-pre 785 7/6/2016
4.2.1079-pre 780 7/6/2016
4.2.1078-pre 759 7/6/2016
4.2.1073-pre 799 7/5/2016
4.2.1070-pre 815 7/5/2016
4.2.1069-pre 757 7/1/2016
4.2.1059-pre 770 7/1/2016
4.2.1046-pre 729 6/24/2016
4.2.1031-pre 707 6/24/2016
4.2.1028-pre 722 6/24/2016
4.2.1027-pre 727 6/24/2016
4.1.1009 1,052 6/15/2016
4.1.1002-pre 1,021 6/14/2016
4.1.995-pre 1,024 6/13/2016
4.1.989-pre 1,056 5/26/2016
4.1.983-pre 744 5/25/2016
4.1.982-pre 710 5/25/2016
4.1.978-pre 808 5/6/2016
4.1.977-pre 884 5/5/2016
4.1.975-pre 717 5/5/2016
4.0.958 2,421 5/1/2016
4.0.957 935 4/29/2016
4.0.956 955 4/29/2016
4.0.955 815 4/28/2016
4.0.941 1,117 4/27/2016
4.0.940 1,042 4/27/2016
4.0.925 967 4/27/2016
4.0.922 930 4/27/2016
4.0.909 1,043 4/20/2016
4.0.880 1,235 4/7/2016
4.0.869 866 3/30/2016
4.0.864 789 3/29/2016
4.0.861 787 3/29/2016
4.0.860 791 3/29/2016
4.0.857 788 3/29/2016
4.0.855 822 3/29/2016
4.0.846 939 3/22/2016
4.0.842 957 3/21/2016
4.0.836 868 3/18/2016
4.0.835 831 3/18/2016
4.0.834 792 3/17/2016
4.0.832 837 3/17/2016
4.0.831 788 3/16/2016
4.0.829 801 3/16/2016
4.0.828 796 3/15/2016
4.0.827 791 3/15/2016
4.0.826 800 3/15/2016
4.0.825 1,068 3/13/2016
4.0.821 864 3/11/2016
4.0.819 790 3/11/2016
4.0.818 862 3/11/2016
4.0.816 917 3/11/2016
4.0.815 797 3/11/2016
4.0.814 887 3/11/2016
4.0.813 801 3/10/2016
4.0.812 904 3/10/2016
4.0.811 855 3/10/2016
4.0.810 826 3/10/2016
4.0.809 818 3/10/2016
4.0.805 804 3/9/2016
4.0.797 781 3/9/2016
4.0.796 831 3/9/2016
4.0.794 813 3/9/2016
4.0.793 831 3/9/2016
4.0.792 795 3/8/2016
4.0.791 805 3/8/2016
4.0.790 798 3/8/2016
4.0.788 776 3/8/2016
4.0.774 950 3/2/2016
4.0.773 828 3/1/2016
4.0.772 870 3/1/2016
4.0.770 875 3/1/2016
4.0.769 800 3/1/2016
4.0.762 785 3/1/2016
4.0.761 770 3/1/2016
4.0.760 1,240 2/29/2016
4.0.759 769 2/29/2016
4.0.758 756 2/29/2016
4.0.757 798 2/29/2016
4.0.756 1,269 2/27/2016
4.0.755 1,243 2/27/2016
4.0.754 830 2/27/2016
4.0.753 1,156 2/27/2016
4.0.752 1,244 2/27/2016
4.0.750 1,276 2/27/2016
4.0.749 1,008 2/27/2016
4.0.747 912 2/26/2016
4.0.746 1,093 2/26/2016
4.0.744 946 2/26/2016
4.0.743 1,195 2/26/2016
4.0.742 875 2/26/2016
4.0.741 1,127 2/26/2016
4.0.739 1,047 2/25/2016
4.0.738 987 2/25/2016
4.0.734 935 2/25/2016
4.0.733-beta 1,026 2/25/2016
4.0.672 979 2/16/2016
4.0.669 981 2/11/2016
4.0.668 813 2/11/2016
3.0.654 2,202 2/10/2016
3.0.646 832 2/5/2016
3.0.645 808 2/5/2016
3.0.644 823 2/5/2016
3.0.639 823 2/3/2016
3.0.638 807 2/2/2016
3.0.637 830 2/1/2016
3.0.635 806 2/1/2016
3.0.633 922 1/27/2016
3.0.632 789 1/27/2016
3.0.629 1,176 1/18/2016
3.0.626 817 1/18/2016
3.0.625 1,051 1/18/2016
3.0.624 1,960 12/17/2015
3.0.623 894 12/9/2015
3.0.622 801 12/9/2015
3.0.621 856 12/9/2015
3.0.620 824 12/8/2015
3.0.613 838 12/4/2015
3.0.611 1,124 12/3/2015
3.0.610 1,154 11/30/2015
3.0.606 1,099 11/30/2015
3.0.605 936 11/25/2015
3.0.603 962 11/23/2015
3.0.601 887 11/23/2015
3.0.600 887 11/19/2015
3.0.599 885 11/19/2015
3.0.598 893 11/17/2015
3.0.592 858 11/12/2015
3.0.589 884 11/10/2015
3.0.588 810 11/10/2015
3.0.586 844 11/10/2015
3.0.584 846 11/10/2015
3.0.583 834 11/10/2015
3.0.581 830 11/6/2015
3.0.579 833 11/6/2015
3.0.576 877 11/5/2015
3.0.575 830 11/4/2015
3.0.574 841 11/4/2015
3.0.569 867 11/3/2015
3.0.568 884 11/3/2015
3.0.566 811 11/3/2015
3.0.545 999 10/28/2015
3.0.538 940 10/22/2015
3.0.537 816 10/21/2015
3.0.536 832 10/21/2015
3.0.534 831 10/21/2015
3.0.532 807 10/21/2015
3.0.531 892 10/21/2015
3.0.524 819 10/15/2015
3.0.523 892 10/10/2015
3.0.522 875 10/10/2015
3.0.520 970 10/9/2015
3.0.519 883 10/9/2015
3.0.518 1,098 10/9/2015
3.0.517 1,179 10/9/2015
3.0.516 917 10/7/2015
3.0.514 1,183 10/6/2015
3.0.513 1,130 10/6/2015
3.0.512 900 10/6/2015
3.0.509 1,005 10/1/2015
3.0.507 944 10/1/2015
3.0.505 957 9/30/2015
3.0.503 992 9/30/2015
3.0.502 943 9/30/2015
3.0.479 917 9/25/2015
3.0.476 922 9/24/2015
3.0.471 889 9/24/2015
3.0.470 893 9/24/2015
3.0.469 903 9/24/2015
3.0.468 891 9/24/2015
3.0.467 877 9/24/2015
3.0.465 889 9/24/2015
3.0.459 873 9/23/2015
3.0.456 868 9/23/2015
3.0.455 912 9/22/2015
3.0.454 931 9/19/2015
3.0.453 881 9/19/2015
3.0.452 868 9/18/2015
3.0.451 930 9/18/2015
3.0.450 866 9/18/2015
3.0.447 921 9/18/2015
2.0.378 924 9/5/2015
2.0.372 829 9/4/2015
2.0.370 881 9/4/2015
2.0.368 882 9/4/2015
2.0.365 1,726 9/3/2015
2.0.363 881 9/3/2015
2.0.361 868 9/3/2015
1.0.360 848 9/1/2015
1.0.359 828 9/1/2015
1.0.358 842 9/1/2015
1.0.356 856 8/31/2015
1.0.355 851 8/31/2015
1.0.354 856 8/29/2015
1.0.305 848 8/19/2015
1.0.299 1,205 8/8/2015
1.0.293 887 7/20/2015
1.0.292 962 7/20/2015
1.0.289 1,071 7/10/2015
1.0.288 836 7/10/2015
1.0.286 968 7/7/2015
1.0.285 857 7/7/2015
1.0.284 844 7/7/2015
1.0.282 863 7/6/2015
1.0.281 851 7/6/2015
1.0.279 829 7/6/2015
1.0.277 930 6/18/2015
1.0.276 882 6/8/2015
1.0.275 826 6/8/2015
1.0.274 839 6/8/2015
1.0.272 1,255 6/1/2015
1.0.269 883 5/25/2015
1.0.268 863 5/24/2015
1.0.266 812 5/24/2015
1.0.263 814 5/21/2015
1.0.258 838 5/19/2015
1.0.257 859 5/18/2015
1.0.256 951 5/17/2015
1.0.254 823 5/13/2015
1.0.253 809 5/13/2015
1.0.250 813 5/13/2015
1.0.249 821 5/12/2015
1.0.248 800 5/12/2015
1.0.245 800 5/12/2015
1.0.241 824 5/12/2015
1.0.240 820 5/12/2015
1.0.237 848 5/11/2015
1.0.234 817 5/9/2015
1.0.233 842 5/9/2015
1.0.231 812 5/7/2015
1.0.230 840 5/7/2015
1.0.229 836 5/7/2015
1.0.226 912 5/7/2015
1.0.217 1,069 4/28/2015
1.0.215 1,031 4/27/2015
1.0.213 1,072 4/23/2015
1.0.210 965 4/23/2015
1.0.209 883 4/15/2015
1.0.202 908 4/15/2015
1.0.201 880 4/15/2015
1.0.198 951 4/15/2015
1.0.197 893 4/15/2015
1.0.196 895 4/15/2015
1.0.195 884 4/15/2015
1.0.194 911 4/15/2015
1.0.193 900 4/15/2015
1.0.192 905 4/15/2015
1.0.191 940 4/14/2015
1.0.189 932 4/10/2015
1.0.187 848 4/9/2015
1.0.186 869 4/8/2015
1.0.185 971 4/6/2015
1.0.183 857 4/3/2015
1.0.181 906 4/3/2015
1.0.180 875 4/2/2015
1.0.178 906 4/1/2015
1.0.177 860 4/1/2015
1.0.175 859 4/1/2015
1.0.171 847 3/31/2015
1.0.170 875 3/31/2015
1.0.168 857 3/31/2015
1.0.164 850 3/30/2015
1.0.162 855 3/28/2015
1.0.160 893 3/27/2015
1.0.159 846 3/26/2015
1.0.157 1,093 3/24/2015
1.0.156 856 3/24/2015
1.0.154 839 3/24/2015
1.0.152 891 3/24/2015
1.0.151 841 3/24/2015
1.0.150 851 3/23/2015
1.0.149 852 3/23/2015
1.0.148 881 3/23/2015
1.0.147 858 3/21/2015
1.0.146 845 3/20/2015
1.0.145 855 3/19/2015
1.0.143 832 3/18/2015
1.0.142 993 3/12/2015
1.0.141 833 3/12/2015
1.0.140 1,021 3/5/2015
1.0.139 845 3/5/2015
1.0.138 887 3/4/2015
1.0.137 942 3/3/2015
1.0.134 838 3/3/2015
1.0.129 861 3/3/2015
1.0.128 1,150 3/3/2015
1.0.125 935 2/28/2015
1.0.124 962 2/28/2015
1.0.122 1,086 2/28/2015
1.0.119 1,267 2/25/2015
1.0.117 1,408 2/24/2015
1.0.115 1,204 2/24/2015
1.0.114 1,208 2/23/2015
1.0.113 1,203 2/23/2015
1.0.112 1,236 2/23/2015
1.0.111 1,174 2/23/2015
1.0.110 1,210 2/23/2015
1.0.109 1,269 2/22/2015
1.0.108 1,218 2/22/2015
1.0.103 1,108 2/22/2015
1.0.37 1,088 2/18/2015
1.0.36 1,127 2/18/2015
1.0.35 1,075 2/17/2015
1.0.34 1,072 2/17/2015
1.0.33 1,106 2/17/2015
1.0.32 846 2/15/2015
1.0.31 1,094 2/15/2015
1.0.30 1,090 2/15/2015
1.0.28 1,095 2/15/2015
1.0.27 1,116 2/15/2015
1.0.26 1,106 2/13/2015
1.0.25 1,058 2/13/2015
1.0.24 1,035 2/12/2015
1.0.23 1,087 2/12/2015
1.0.0 1,286 2/21/2015