Foundatio.AzureServiceBus 10.2.2 Prefix Reserved

Install-Package Foundatio.AzureServiceBus -Version 10.2.2
dotnet add package Foundatio.AzureServiceBus --version 10.2.2
<PackageReference Include="Foundatio.AzureServiceBus" Version="10.2.2" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Foundatio.AzureServiceBus --version 10.2.2
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: Foundatio.AzureServiceBus, 10.2.2"
#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.AzureServiceBus as a Cake Addin
#addin nuget:?package=Foundatio.AzureServiceBus&version=10.2.2

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

Foundatio

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:

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Foundatio.AzureServiceBus:

Package Downloads
SoftwarePioniere.Fx.Hosting

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
10.2.2 29 9/23/2021
10.2.0 1,111 7/8/2021
10.1.0 274 6/16/2021
10.0.2 1,590 1/20/2021
10.0.0 1,312 9/16/2020
10.0.0-beta9 238 8/25/2020
10.0.0-beta8 215 8/3/2020
10.0.0-beta7 212 7/29/2020
10.0.0-beta6 251 7/8/2020
10.0.0-beta5 397 6/20/2020
10.0.0-beta3 332 6/14/2020
10.0.0-beta2 327 6/6/2020
10.0.0-beta10 213 9/15/2020
10.0.0-beta1 286 5/26/2020
9.0.0 36,478 1/16/2020
8.1.1518 4,192 8/30/2019
8.0.1512 990 5/14/2019
8.0.1510 358 4/16/2019
8.0.1507 397 2/24/2019
8.0.1505 351 2/22/2019
7.0.1490 616 5/9/2018
6.0.1467 736 11/30/2017
5.1.1454 694 5/5/2017
5.0.1336 723 3/14/2017
5.0.1334 574 3/13/2017
5.0.1331 609 3/12/2017
5.0.1329-pre 563 3/12/2017
5.0.1328-pre 583 3/12/2017
5.0.1327-pre 581 3/12/2017
5.0.1326-pre 581 3/12/2017
5.0.1324-pre 577 3/12/2017
4.3.1323-pre 585 3/11/2017
4.3.1319 607 3/1/2017
4.3.1317 582 2/23/2017
4.3.1316 625 2/22/2017
4.3.1315 617 2/22/2017
4.3.1314 619 2/20/2017
4.3.1312 602 2/20/2017
4.3.1311-pre 630 2/20/2017
4.3.1307 621 2/16/2017
4.3.1306 604 2/15/2017
4.3.1305 605 2/15/2017
4.3.1304-pre 575 2/15/2017
4.3.1303-pre 597 2/14/2017
4.3.1301 592 2/14/2017
4.3.1299 599 2/14/2017
4.3.1293 624 2/12/2017
4.3.1292 592 2/10/2017
4.3.1291 642 2/10/2017
4.3.1290 609 2/10/2017
4.3.1289 609 2/9/2017
4.3.1288 593 2/9/2017
4.3.1286 608 2/8/2017
4.3.1282 593 2/5/2017
4.3.1281 592 2/5/2017
4.3.1280 585 2/5/2017
4.3.1276-pre 562 2/5/2017
4.3.1177-pre 608 9/2/2016
4.3.1164-pre 615 8/21/2016
4.2.1205-pre 597 9/19/2016
4.2.1183 757 9/9/2016
4.2.1179 631 9/8/2016
4.2.1176 621 9/2/2016
4.2.1172 591 9/1/2016
4.2.1171-pre 603 9/1/2016
4.2.1169 609 8/22/2016
4.2.1167-pre 576 8/22/2016
4.2.1166-pre 587 8/22/2016
4.2.1161 622 8/10/2016
4.2.1156-pre 609 8/2/2016
4.2.1155 616 8/1/2016
4.2.1150 633 7/20/2016
4.2.1149-pre 604 7/19/2016
4.2.1148-pre 598 7/19/2016
4.2.1147-pre 618 7/19/2016
4.2.1146-pre 583 7/19/2016
4.2.1137 667 7/19/2016
4.2.1129-pre 584 7/19/2016
4.2.1128-pre 617 7/19/2016
4.2.1127-pre 566 7/19/2016
4.2.1126-pre 601 7/19/2016
4.2.1125-pre 597 7/19/2016
4.2.1123-pre 604 7/19/2016
4.2.1119-pre 604 7/18/2016
4.2.1113-pre 627 7/16/2016
4.2.1108-pre 593 7/15/2016
4.2.1107-pre 616 7/15/2016
4.2.1104-pre 746 7/13/2016
4.2.1099-pre 755 7/12/2016
4.2.1098-pre 758 7/12/2016
4.2.1093-pre 624 7/8/2016
4.2.1091-pre 604 7/8/2016
4.2.1090-pre 620 7/8/2016
4.2.1089-pre 615 7/7/2016
4.2.1087-pre 631 7/7/2016
4.2.1083-pre 624 7/6/2016
4.2.1082-pre 607 7/6/2016
4.2.1081-pre 615 7/6/2016
4.2.1079-pre 630 7/6/2016
4.2.1078-pre 635 7/6/2016
4.2.1073-pre 625 7/5/2016
4.2.1070-pre 590 7/5/2016
4.2.1069-pre 596 7/1/2016
4.2.1059-pre 607 7/1/2016
4.2.1046-pre 579 6/24/2016
4.2.1031-pre 588 6/24/2016
4.2.1028-pre 593 6/24/2016
4.2.1027-pre 607 6/24/2016
4.1.1009 972 6/15/2016
4.1.1002-pre 585 6/14/2016
4.1.995-pre 794 6/13/2016
4.1.989-pre 588 5/26/2016
4.1.983-pre 579 5/25/2016
4.1.982-pre 604 5/25/2016
4.1.978-pre 610 5/6/2016
4.1.977-pre 611 5/5/2016
4.1.975-pre 596 5/5/2016
4.0.958 629 5/1/2016
4.0.957 653 4/29/2016
4.0.956 653 4/29/2016
4.0.955 627 4/28/2016
4.0.941 624 4/27/2016
4.0.940 630 4/27/2016
4.0.925 623 4/27/2016
4.0.922 655 4/27/2016
4.0.909 648 4/20/2016
4.0.880 663 4/7/2016
4.0.869 628 3/30/2016
4.0.864 638 3/29/2016
4.0.861 624 3/29/2016
4.0.860 635 3/29/2016
4.0.857 624 3/29/2016
4.0.855 615 3/29/2016
4.0.846 654 3/22/2016
4.0.842 611 3/21/2016
4.0.836 642 3/18/2016
4.0.835 637 3/18/2016
4.0.834 607 3/17/2016
4.0.832 650 3/17/2016
4.0.831 612 3/16/2016
4.0.829 603 3/16/2016
4.0.828 642 3/15/2016
4.0.827 648 3/15/2016
4.0.826 625 3/15/2016
4.0.825 666 3/13/2016
4.0.821 705 3/11/2016
4.0.819 652 3/11/2016
4.0.818 652 3/11/2016
4.0.816 670 3/11/2016
4.0.815 661 3/11/2016
4.0.814 679 3/11/2016
4.0.813 627 3/10/2016
4.0.812 723 3/10/2016
4.0.811 662 3/10/2016
4.0.810 638 3/10/2016
4.0.809 655 3/10/2016
4.0.805 603 3/9/2016
4.0.797 618 3/9/2016
4.0.796 631 3/9/2016
4.0.794 646 3/9/2016
4.0.793 615 3/9/2016
4.0.792 630 3/8/2016
4.0.791 604 3/8/2016
4.0.790 608 3/8/2016
4.0.788 650 3/8/2016
4.0.774 639 3/2/2016
4.0.773 622 3/1/2016
4.0.772 637 3/1/2016
4.0.770 620 3/1/2016
4.0.769 715 3/1/2016
4.0.762 616 3/1/2016
4.0.761 652 3/1/2016
4.0.760 617 2/29/2016
4.0.759 612 2/29/2016
4.0.758 631 2/29/2016
4.0.757 640 2/29/2016
4.0.756 637 2/27/2016
4.0.755 625 2/27/2016
4.0.754 604 2/27/2016
4.0.753 608 2/27/2016
4.0.752 626 2/27/2016
4.0.750 613 2/27/2016
4.0.749 634 2/27/2016
4.0.747 618 2/26/2016
4.0.746 626 2/26/2016
4.0.744 614 2/26/2016
4.0.743 628 2/26/2016
4.0.742 633 2/26/2016
4.0.741 624 2/26/2016
4.0.739 602 2/25/2016
4.0.738 618 2/25/2016
4.0.734 657 2/25/2016
4.0.733-beta 587 2/25/2016
4.0.672 636 2/16/2016
4.0.669 685 2/11/2016
4.0.668 673 2/11/2016
3.0.654 643 2/10/2016
3.0.646 648 2/5/2016
3.0.645 642 2/5/2016
3.0.644 598 2/5/2016
3.0.639 654 2/3/2016
3.0.638 640 2/2/2016
3.0.637 645 2/1/2016
3.0.635 615 2/1/2016
3.0.633 617 1/27/2016
3.0.632 654 1/27/2016
3.0.629 644 1/18/2016
3.0.626 631 1/18/2016
3.0.625 617 1/18/2016
3.0.624 644 12/17/2015
3.0.623 747 12/9/2015
3.0.622 641 12/9/2015
3.0.621 618 12/9/2015
3.0.620 622 12/8/2015
3.0.613 691 12/4/2015
3.0.611 631 12/3/2015
3.0.610 640 11/30/2015
3.0.606 635 11/30/2015
3.0.605 613 11/25/2015
3.0.603 653 11/23/2015
3.0.601 646 11/23/2015
3.0.600 653 11/19/2015
3.0.599 638 11/19/2015
3.0.598 641 11/17/2015
3.0.592 680 11/12/2015
3.0.589 658 11/10/2015
3.0.588 631 11/10/2015
3.0.586 683 11/10/2015
3.0.584 635 11/10/2015
3.0.583 658 11/10/2015
3.0.581 642 11/6/2015
3.0.579 649 11/6/2015
3.0.576 647 11/5/2015
3.0.575 644 11/4/2015
3.0.574 670 11/4/2015
3.0.569 660 11/3/2015
3.0.568 653 11/3/2015
3.0.566 656 11/3/2015
3.0.545 646 10/28/2015
3.0.538 678 10/22/2015
3.0.537 659 10/21/2015
3.0.536 644 10/21/2015
3.0.534 636 10/21/2015
3.0.532 691 10/21/2015
3.0.531 644 10/21/2015
3.0.524 664 10/15/2015
3.0.523 642 10/10/2015
3.0.522 674 10/10/2015
3.0.520 661 10/9/2015
3.0.519 652 10/9/2015
3.0.518 644 10/9/2015
3.0.517 637 10/9/2015
3.0.516 669 10/7/2015
3.0.514 680 10/6/2015
3.0.513 670 10/6/2015
3.0.512 676 10/6/2015
3.0.509 668 10/1/2015
3.0.507 659 10/1/2015
3.0.505 683 9/30/2015
3.0.503 716 9/30/2015
3.0.502 679 9/30/2015
3.0.479 666 9/25/2015
3.0.476 652 9/24/2015
3.0.471 668 9/24/2015
3.0.470 686 9/24/2015
3.0.469 679 9/24/2015
3.0.468 682 9/24/2015
3.0.467 670 9/24/2015
3.0.465 691 9/24/2015
3.0.459 675 9/23/2015
3.0.456 695 9/23/2015
3.0.455 667 9/22/2015
3.0.454 707 9/19/2015
3.0.453 711 9/19/2015
3.0.452 668 9/18/2015
3.0.451 687 9/18/2015
3.0.450 696 9/18/2015
3.0.447 672 9/18/2015
2.0.378 700 9/5/2015
2.0.372 689 9/4/2015
2.0.370 730 9/4/2015
2.0.368 677 9/4/2015
2.0.365 668 9/3/2015
2.0.363 658 9/3/2015
2.0.361 667 9/3/2015
1.0.360 648 9/1/2015
1.0.359 679 9/1/2015
1.0.358 675 9/1/2015
1.0.356 658 8/31/2015
1.0.355 748 8/31/2015
1.0.354 659 8/29/2015
1.0.305 697 8/19/2015
1.0.299 715 8/8/2015
1.0.293 671 7/20/2015
1.0.292 679 7/20/2015
1.0.289 673 7/10/2015
1.0.288 669 7/10/2015
1.0.286 709 7/7/2015
1.0.285 696 7/7/2015
1.0.284 680 7/7/2015
1.0.282 682 7/6/2015
1.0.281 674 7/6/2015
1.0.279 674 7/6/2015
1.0.277 642 6/18/2015
1.0.276 694 6/8/2015
1.0.275 683 6/8/2015
1.0.274 634 6/8/2015
1.0.272 680 6/1/2015
1.0.269 671 5/25/2015
1.0.268 682 5/24/2015
1.0.266 663 5/24/2015
1.0.263 678 5/21/2015
1.0.258 686 5/19/2015
1.0.257 666 5/18/2015
1.0.256 792 5/17/2015
1.0.254 645 5/13/2015
1.0.253 670 5/13/2015
1.0.250 678 5/13/2015
1.0.249 686 5/12/2015
1.0.248 664 5/12/2015
1.0.245 677 5/12/2015
1.0.241 693 5/12/2015
1.0.240 672 5/12/2015
1.0.237 680 5/11/2015
1.0.234 681 5/9/2015
1.0.233 664 5/9/2015
1.0.231 664 5/7/2015
1.0.230 705 5/7/2015
1.0.229 687 5/7/2015
1.0.226 683 5/7/2015
1.0.217 737 4/28/2015
1.0.215 678 4/27/2015
1.0.213 724 4/23/2015
1.0.210 678 4/23/2015
1.0.209 680 4/15/2015
1.0.202 691 4/15/2015
1.0.201 659 4/15/2015
1.0.198 684 4/15/2015
1.0.197 660 4/15/2015
1.0.196 673 4/15/2015
1.0.195 678 4/15/2015
1.0.194 676 4/15/2015
1.0.193 672 4/15/2015
1.0.192 693 4/15/2015
1.0.191 691 4/14/2015
1.0.189 693 4/10/2015
1.0.187 674 4/9/2015
1.0.186 705 4/8/2015
1.0.185 689 4/6/2015
1.0.183 692 4/3/2015
1.0.181 751 4/3/2015
1.0.180 709 4/2/2015
1.0.178 690 4/1/2015
1.0.177 691 4/1/2015
1.0.175 753 4/1/2015
1.0.171 695 3/31/2015
1.0.170 668 3/31/2015
1.0.168 676 3/31/2015
1.0.164 704 3/30/2015
1.0.162 681 3/28/2015
1.0.160 680 3/27/2015
1.0.159 672 3/26/2015
1.0.157 673 3/24/2015
1.0.156 710 3/24/2015
1.0.154 672 3/24/2015
1.0.152 663 3/24/2015
1.0.151 680 3/24/2015
1.0.150 725 3/23/2015
1.0.149 687 3/23/2015
1.0.148 662 3/23/2015
1.0.147 687 3/21/2015
1.0.146 681 3/20/2015
1.0.145 675 3/19/2015
1.0.143 760 3/18/2015
1.0.142 687 3/12/2015
1.0.141 657 3/12/2015
1.0.140 730 3/5/2015
1.0.139 693 3/5/2015
1.0.138 692 3/4/2015
1.0.137 676 3/3/2015
1.0.134 670 3/3/2015
1.0.129 687 3/3/2015
1.0.128 731 3/3/2015
1.0.125 665 2/28/2015
1.0.124 677 2/28/2015
1.0.122 720 2/28/2015
1.0.119 760 2/25/2015
1.0.117 709 2/24/2015
1.0.115 659 2/24/2015
1.0.114 697 2/23/2015
1.0.113 733 2/23/2015
1.0.112 754 2/23/2015
1.0.111 757 2/23/2015
1.0.110 781 2/23/2015
1.0.109 687 2/22/2015
1.0.108 680 2/22/2015
1.0.103 730 2/22/2015