Debugging SharePoint Workflows
May 5, 2009
This blog post is about tips and tricks for monitoring the health of SharePoint workflows. I will like to suggest this excellent MSDN article for additional information.
Logging information about the progress of workflows
The WF tracking service logs the events as the workflow progresses along. For example, consider a simple workflow (see below) that creates a task and then loops until the task is 100% complete.
By turning the tracking service on (see [1]) we can capture entries like the following, the trace output below corresponds to the workflow in Figure 1 above:
System.Workflow.Runtime.Hosting Information: 0 : Creating instance 1888f8e6-145c-4220-be52-99cfd09098a7
System.Workflow.Runtime Information: 1 : Workflow Runtime: Scheduler: InstanceId: 1888f8e6-145c-4220-be52-99cfd09098a7 : Running scheduled entry: SubscriptionEvent((1)Workflow1, ActivityStatusChange(‘(1)createTask1‘, Closed, Succeeded))
System.Workflow.Runtime Information: 0 : Activity Status Change – Activity: whileActivity1 Old:Initialized; New:Executing
// At this point the workflow is waiting for the user to update the task. So the workflow runtime can hydrate the running instance to the database
System.Workflow.Runtime Information: 0 : Workflow Runtime: WorkflowExecutor: Got an unload request for instance 1888f8e6-145c-4220-be52-99cfd09098a7
System.Workflow.Runtime Information: 0 : 1888f8e6-145c-4220-be52-99cfd09098a7: Calling PerformUnloading(false) on instance 1888f8e6-145c-4220-be52-99cfd09098a7 hc 13970169
System.Workflow.Runtime Information: 0 : Workflow Runtime: WorkflowExecutor: Unloading instance 1888f8e6-145c-4220-be52-99cfd09098a7
System.Workflow.Runtime.Hosting Information: 0 : TimerEventSubscriptionQueue: 1888f8e6-145c-4220-be52-99cfd09098a7 Suspend
System.Workflow.Runtime Information: 0 : 1888f8e6-145c-4220-be52-99cfd09098a7: Calling Persist
// At this point the user marks the task as complete . So the workflow runtime can deserialize the workflow and pass it the TaskChanged event. This results in re-evaluation of the while loop
System.Workflow.Runtime Stop: 0 : Workflow Trace
System.Workflow.Runtime.Hosting Information: 0 : Deserialized a Workflow1 [SampleWorkflow.Workflow1] to length 8660. Took 00:00:00.0400576.
System.Workflow.Runtime Information: 0 : Workflow Runtime: WorkflowExecutor: Loading instance 1888f8e6-145c-4220-be52-99cfd09098a7
System.Workflow.Runtime Information: 0 : Activity Status Change – Activity: onTaskChanged1 Old:Executing; New:Closed
System.Workflow.Runtime Information: 1 : Workflow Runtime: Scheduler: InstanceId:
1888f8e6-145c-4220-be52-99cfd09098a7 : Scheduling entry: SubscriptionEvent((1)whileActivity1, ActivityStatusChange(‘(2)onTaskChanged1’, Closed, Succeeded))
As you can see from the snippets above, we have information about step by step execution of the workflow.
Workflow Failure Conditions
Some of the common reasons why a workflow can fail include:
a. The WF program instance errors out because of an exception. For example, if a null object reference is encountered inside the CreateTask handler, in the workflow in Figure 1, above. This exception will cause the WF instance to move to the error state (reflected in the status column of the document library)
The tracking service will record this exception and typically log detailed information as shown below:
System.Workflow.Runtime Critical: 0 : Uncaught exception escaped to the root of the workflow.
In instance 9e644d58-9990-443a-a595-1685fec2c311 in activity
Inner exception: System.NullReferenceException: Object reference not set to an instance of an object.
at SampleWorkflow.Workflow1.TaskCreation(Object sender, EventArgs e)
at System.Workflow.ComponentModel.Activity.RaiseEvent(DependencyProperty dependencyEvent, Object sender, EventArgs e)
at System.Workflow.Activities.CallExternalMethodActivity.Execute(ActivityExecutionContext executionContext)
at System.Workflow.ComponentModel.ActivityExecutor`1.Execute(T activity, ActivityExecutionContext executionContext)
at System.Workflow.ComponentModel.ActivityExecutor`1.Execute(Activity activity, ActivityExecutionContext executionContext)
at System.Workflow.ComponentModel.ActivityExecutorOperation.Run(IWorkflowCoreRuntime workflowCoreRuntime)
at System.Workflow.Runtime.Scheduler.Run()
System.Workflow.Runtime Information: 0 : Workflow Runtime: WorkflowExecutor: Terminating instance 9e644d58-9990-443a-a595-1685fec2c311
One more point about exception conditions – there are times when we need to thrown an exception ourselves. For instance, if the user does not have appropriate permission, or there is missing data. In those cases, we could set a custom error message (See [2])
b. The Application pool is recycled. The state from a previous persist point (if there was one – typically a delay activity or OnTaskChanged activity) is persisted in the database, but since there is no retry mechanism, there is no way to re-start the persisted workflow instance. For example, if the sample WF program instance was executing inside the While activity (whileActivity1 in Figure 1) when the app pool crashed, there is no automatic way to have the workflow restarted.
One potential solution would be to model the workflow as a state machine and include retry logic. But this would add complexity to the workflow.
c. If the correlation token is being set dynamically, there is a chance that the value gets incorrectly set in some cases. As a result, the waiting WF program instance will never receive the event. A correlation token is an identifier WF uses to tie activities to a common task – for example if CreateTask, OnTaskChanged and CompleteTask relate to a single task; they should have the same correlation token.
d. SharePoint workflow activities (like Create Task) delay database commits until a persist point is reached. This means that a CreateTask activity will not result in a “real” task being added to the list until a persist point is reached. So any direct SharePoint OM calls that attempt to reference the created task will fail until the point a persist point is reached. Please refer to [3] to dump out the
[1] Workflow Diagnostics
Add the following section to the web.config:
<system.diagnostics>
<switches>
<add name=“System.Workflow LogToTraceListeners“ value=“1“ />
<add name=“System.Workflow.Runtime.Hosting“ value=“All“ />
<add name=“System.Workflow.Runtime“ value=“All“ />
<add name=“System.Workflow.Runtime.Tracking“ value=“All“ />
<add name=“System.Workflow.Activities“ value=“All“ />
</switches>
<trace autoflush=“true“ indentsize=“4“>
<listeners>
<add name=“customListener“
type=“System.Diagnostics.TextWriterTraceListener“
initializeData=“WFTrace.log“ />
</listeners>
</trace>
</system.diagnostics>
Additionally, we can use stsadm to capture the trace messages from Workflow Infrstructure as shown below:
@echo off
set SPAdminTool=%CommonProgramFiles%\Microsoft Shared\web server extensions\12\BIN\stsadm.exe
rem echo Logging levels before…
rem “%SPAdminTool%” -o listlogginglevels
echo Setting levels…
stsadm -o setlogginglevel -category “Workflow Features;Workflow Infrastructure” -tracelevel Verbose -windowslogginglevel Error
echo Restarting SPTrace service…
net stop sptrace
net start sptrace
rem echo Logging levels after…
rem “%SPAdminTool%” -o listlogginglevels
pause
[2] Adding custom status message
1. Add a custom status in workflow.xml
<ExtendedStatusColumnValues>
<StatusColumnValue>
Failed to start due to insufficient permissions
</StatusColumnValue>
</ExtendedStatusColumnValues>
2. Add the following code for the invoking method
private void setState1_MethodInvoking(object sender, EventArgs e)
{
((Microsoft.SharePoint.WorkflowActions.SetState)sender).State = ((Int32)SPWorkflowStatus.Max);
}
[3] Code to extract the persisted workflow state
Since the workflow runtime is finicky about changes such as adding private variables, it is useful to dump the persisted state.
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(
“select InstanceData from dbo.workflow where InstanceDataSize > 0″);
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(
“Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=WSS_Content_Portal;Data Source=CTSDEV1”);
conn.Open();
cmd.Connection = conn;
byte[] image = (byte[])cmd.ExecuteScalar();
System.IO.FileStream fs = new System.IO.FileStream(@”c:\data.gz”, System.IO.FileMode.CreateNew);
fs.Write(image, 0, image.Length);
fs.Flush();
fs.Close();
May 6, 2009 at 2:17 pm
[…] Debugging SharePoint Workflows (Vishwas Lele) […]
May 22, 2009 at 12:06 am
Пора переименовать блог, присвоив название связанное с доменами 🙂 может хватит про них?
May 23, 2009 at 9:25 pm
Захватывающе. Зачет! и ниипет!
August 6, 2009 at 8:02 pm
[…] on WF tracing (see my previous post for more information). Trace logs provide a great source of information on how a given workflow […]
December 22, 2009 at 8:14 am
порно портал
January 24, 2010 at 12:55 am
гей армия
December 25, 2010 at 9:22 pm
Секс фото брюнеток на нашем ресурсе. Секс фото, интервью: секс – это чудо.
November 17, 2012 at 8:50 pm
Excellent goods from you, man. I’ve understand your stuff previous to and you are just extremely excellent. I really like what you have acquired here, certainly like what you’re stating and the way
in which you say it. You make it enjoyable and you still
take care of to keep it smart. I cant wait to read
far more from you. This is actually a great site.
June 19, 2013 at 1:29 am
Great site. Lots of useful info here. I am sending it to several friends ans additionally
sharing in delicious. And obviously, thanks for your effort!
June 25, 2013 at 2:50 pm
I’d like to thank you for the efforts you’ve put in writing
this website. I’m hoping to see the same high-grade blog posts from you in the future as well. In truth, your creative writing abilities has motivated me to get my own website now 😉
July 27, 2013 at 2:49 am
capable click the next website
August 2, 2013 at 12:00 pm
Quality content is the main to invite the users to pay a quick visit the web site, that’s what this site is providing.
August 5, 2013 at 11:32 pm
Thanks for your marvelous posting! I truly enjoyed reading
it, you will be a great author.I will make certain to bookmark your blog
and will often come back in the foreseeable future. I want to encourage that you continue
your great posts, have a nice day!
I absolutely love your blog and find a lot
of your post’s to be just what I’m looking for.
Would you offer guest writers to write content
to suit your needs? I wouldn’t mind producing a post or elaborating on many of the subjects you write about here. Again, awesome web log!
My spouse and I stumbled over here coming from a different website and thought I might check things out. I like what I see so now i am following you. Look forward to exploring your web page again.
I really like what you guys are usually up too. Such clever work and coverage! Keep up the fantastic works guys I’ve
added you guys to my personal blogroll.
Howdy I am so grateful I found your blog, I really found you by error, while I was searching
on Google for something else, Nonetheless I am here now and would just like to say thanks
a lot for a fantastic post and a all round thrilling blog (I also love the theme/design), I don’t
have time to read through it all at the moment but I have bookmarked it and also added your RSS feeds, so
when I have time I will be back to read more, Please do keep up the excellent work.
Appreciating the hard work you put into your site and
detailed information you provide. It’s nice to come across a blog every once in a while that isn’t the same out of date rehashed
material. Excellent read! I’ve saved your site and I’m adding your RSS
feeds to my Google account.
Hello! I’ve been following your weblog for a long time now and finally got the courage to go ahead and give you a shout out from Kingwood Texas! Just wanted to say keep up the fantastic job!
I’m really enjoying the theme/design of your web site. Do you ever run into any browser compatibility
issues? A number of my blog visitors have complained about my site not operating correctly in Explorer but looks
great in Firefox. Do you have any tips to help fix this issue?
I’m curious to find out what blog platform you are using? I’m having
some minor security issues with my latest blog and I would
like to find something more safeguarded. Do you have any suggestions?
Hmm it seems like your website ate my first comment (it was super long) so I guess I’ll just sum it up what I wrote and say, I’m thoroughly enjoying your blog.
I too am an aspiring blog blogger but I’m still new to the whole thing. Do you have any helpful hints for beginner blog writers? I’d genuinely appreciate it.
Woah! I’m really digging the template/theme of this site. It’s simple, yet effective.
A lot of times it’s difficult to get that “perfect balance” between superb usability and appearance. I must say you’ve done a superb job with this.
Additionally, the blog loads extremely quick for me on Internet explorer.
Outstanding Blog!
Do you mind if I quote a few of your articles as long as I provide credit and
sources back to your blog? My blog site is in the exact same area
of interest as yours and my visitors would definitely benefit from a lot of
the information you provide here. Please let me know if this ok with you.
Appreciate it!
Hi would you mind letting me know which hosting company you’re working with? I’ve loaded your blog in 3 completely different
browsers and I must say this blog loads a lot quicker then most.
Can you suggest a good hosting provider at a reasonable price?
Thank you, I appreciate it!
Awesome blog you have here but I was wanting to know if
you knew of any user discussion forums that cover the same
topics discussed in this article? I’d really like to be a part of online community where I can get advice from other experienced people that share the same interest. If you have any recommendations, please let me know. Thank you!
Good day! This is my first comment here so I just wanted to give a quick shout out and say I really enjoy reading through your blog posts. Can you recommend any other blogs/websites/forums that go over the same topics? Thanks a lot!
Do you have a spam problem on this site; I also am a blogger, and I was wanting to know your situation; we have developed some nice methods and we are looking to exchange strategies with others, please shoot me an e-mail if interested.
Please let me know if you’re looking for a author for your blog.
You have some really great articles and I believe
I would be a good asset. If you ever want to take some of the load off, I’d really like to write some content for your blog in exchange for a link back to mine. Please shoot me an e-mail if interested. Kudos!
Have you ever thought about including a little bit more than just your articles? I mean, what you say is fundamental and all. However think about if you added some great photos or video clips to give your posts more, “pop”! Your content is excellent but with images and clips, this website could undeniably be one of the greatest in its niche. Awesome blog!
Great blog! Is your theme custom made or did you download it from somewhere? A theme like yours with a few simple adjustements would really make my blog shine. Please let me know where you got your theme. Kudos
Hey there would you mind stating which blog platform you’re using?
I’m going to start my own blog soon but I’m having a tough time selecting between
BlogEngine/Wordpress/B2evolution and Drupal. The reason I ask is because your layout seems different then most blogs and I’m looking for something unique. P.S Sorry for being off-topic but I had to ask!
Hello just wanted to give you a quick heads up. The text in your content seem to be running off the screen in Ie. I’m not sure if this is a format issue or something to do with web browser compatibility but I thought I’d post to let you know. The layout look great though! Hope you get the issue solved soon. Cheers
With havin so much content do you ever run into any issues of plagorism or copyright violation? My website has a lot of unique content I’ve either created myself or outsourced but it appears a lot of
it is popping it up all over the web without my authorization.
Do you know any solutions to help prevent content from being
ripped off? I’d definitely appreciate it.
Have you ever considered writing an e-book or guest authoring on other websites? I have a blog centered on the same topics you discuss and would love to have you share some stories/information. I know my readers would enjoy your work. If you are even remotely interested, feel free to send me an email.
Hi there! Someone in my Myspace group shared this website with us so I came to check it out. I’m definitely loving the information.
I’m book-marking and will be tweeting this to my followers! Great blog and superb style and design.
Excellent blog! Do you have any tips for aspiring writers? I’m hoping to start my own website soon but I’m a little lost on everything. Would you suggest starting with a free platform like WordPress or go for a paid option? There are so many choices out there that I’m totally
confused .. Any ideas? Cheers!
My programmer is trying to persuade me to move to .net from PHP.
I have always disliked the idea because of the expenses.
But he’s tryiong none the less. I’ve been using Movable-type on numerous
websites for about a year and am worried about switching to another platform.
I have heard fantastic things about blogengine.
net. Is there a way I can transfer all my wordpress content
into it? Any kind of help would be really appreciated!
Does your site have a contact page? I’m having trouble locating it but, I’d like to send you an email.
I’ve got some ideas for your blog you might be interested in hearing. Either way, great website and I look forward to seeing it develop over time.
It’s a shame you don’t have a donate button! I’d without a doubt
donate to this outstanding blog! I suppose
for now i’ll settle for bookmarking and adding your RSS feed to my Google account. I look forward to new updates and will share this blog with my Facebook group. Talk soon!
Greetings from Colorado! I’m bored to tears at work so I
decided to check out your blog on my iphone during lunch
break. I really like the knowledge you present
here and can’t wait to take a look when I get home. I’m amazed at how fast your blog loaded
on my cell phone .. I’m not even using WIFI, just 3G .. Anyways, superb blog!
Greetings! I know this is kinda off topic however I’d figured I’d ask. Would you be interested in trading links or maybe guest authoring a blog article or vice-versa? My website covers a lot of the same topics as yours and I believe we could greatly benefit from each other. If you’re interested feel free to shoot
me an email. I look forward to hearing from you!
Great blog by the way!
Right now it looks like WordPress is the best blogging platform available right now.
(from what I’ve read) Is that what you’re using on your blog?
Fantastic post but I was wondering if you could write a
litte more on this topic? I’d be very thankful if you could elaborate a little bit further. Thanks!
Good day! I know this is kind of off topic but I was wondering if you knew where I could get a captcha plugin for my comment form? I’m
using the same blog platform as yours and I’m having problems finding one? Thanks a lot!
When I originally commented I clicked the “Notify me when new comments are added” checkbox and now each time a comment is added I get four e-mails with the same comment. Is there any way you can remove people from that service? Thanks!
Hey! This is my first visit to your blog! We are a collection of volunteers and starting a new project in a community in the same niche. Your blog provided us beneficial information to work on. You have done a wonderful job!
Hey there! I know this is somewhat off topic but I was wondering which blog platform are you using for this website? I’m getting sick and tired of WordPress
because I’ve had issues with hackers and I’m looking at alternatives
for another platform. I would be awesome if you could point me in the direction
of a good platform.
Hey there! This post couldn’t be written any better! Reading through this post reminds me of my good old room mate! He always kept talking about this. I will forward this article to him. Fairly certain he will have a good read. Many thanks for sharing!
Write more, thats all I have to say. Literally, it seems as though you relied on the video to make your point. You obviously know what youre talking about, why throw away your intelligence on just posting videos to your blog when you could be giving us something enlightening to read?
Today, I went to the beach with my children. I found a sea shell and gave it to my 4 year old daughter and said “You can hear the ocean if you put this to your ear.” She put the shell to her ear and screamed. There was a hermit crab inside and it pinched her ear. She never wants to go back! LoL I know this is totally off topic but I had to tell someone!
Yesterday, while I was at work, my cousin stole my apple ipad and tested to see if it can survive a thirty foot drop, just so she can be a youtube sensation. My apple ipad is now destroyed and she has 83 views. I know this is totally off topic but I had to share it with someone!
I was curious if you ever considered changing the page layout of your blog? Its very well written; I love what youve got to say. But maybe you could a little more in the way of content so people could connect with it better. Youve got an awful lot of text for only having one or 2 pictures. Maybe you could space it out better?
Hello, i read your blog occasionally and i own a similar one and i was just curious if you get a lot of spam feedback? If so how do you reduce it, any plugin or anything you can recommend? I get so much lately it’s driving me insane so any assistance is very much appreciated.
This design is steller! You certainly know how to
keep a reader amused. Between your wit and your
videos, I was almost moved to start my own blog (well, almost.
..HaHa!) Fantastic job. I really loved what you had to
say, and more than that, how you presented it. Too cool!
I’m truly enjoying the design and layout of your site. It’s
a very easy on the eyes which makes it much more enjoyable for
me to come here and visit more often. Did you hire out a developer to create your theme?
Outstanding work!
Howdy! I could have sworn I’ve been to this site before but after checking through some of the post I realized it’s new to
me. Anyways, I’m definitely delighted I found it and I’ll be book-marking and checking back often!
Good day! Would you mind if I share your blog with my twitter group?
There’s a lot of folks that I think would really enjoy your content. Please let me know. Cheers
Hey there, I think your site might be having browser compatibility issues. When I look at your blog in Ie, it looks fine but when opening in Internet Explorer, it has some overlapping. I just wanted to give you a quick heads up! Other then that, superb blog!
Wonderful blog! I found it while searching on Yahoo News. Do you have any tips on how to get listed in Yahoo News? I’ve been trying for
a while but I never seem to get there! Many thanks
Hello there! This is kind of off topic but I need some help from
an established blog. Is it difficult to set up your own blog?
I’m not very techincal but I can figure things out pretty quick. I’m thinking about making my own but I’m not sure where to begin. Do you have any points or suggestions? Thanks
Hi there! Quick question that’s totally off topic.
Do you know how to make your site mobile friendly?
My website looks weird when viewing from my apple
iphone. I’m trying to find a theme or plugin that might be able to correct this problem. If you have any recommendations, please share. With thanks!
I’m not that much of a online reader to be honest but your sites really nice, keep it up! I’ll go ahead and
bookmark your site to come back later on. All the best
I love your blog.. very nice colors & theme. Did you create this website yourself or did you hire someone to do it for you?
Plz respond as I’m looking to design my own blog and would like to know where u got this from. appreciate it
Whoa! This blog looks just like my old one! It’s on a completely different topic but it has pretty much the same
page layout and design. Superb choice of
colors!
Hello just wanted to give you a quick heads up and let you know a few of the images aren’t loading correctly. I’m not sure why but I think its a linking issue.
I’ve tried it in two different internet browsers and both show the same outcome.
Heya are using WordPress for your site platform? I’m new
to the blog world but I’m trying to get started and set up my own. Do you need any coding expertise to make your own blog? Any help would be really appreciated!
Heya this is kinda of off topic but I was wanting to know if blogs use WYSIWYG editors or if you have to manually code with HTML. I’m starting a blog soon
but have no coding expertise so I wanted to get guidance from someone with experience.
Any help would be greatly appreciated!
Hello! I just wanted to ask if you ever have any issues with hackers?
My last blog (wordpress) was hacked and I ended up losing months of hard work due to no data backup.
Do you have any solutions to protect against
hackers?
Hey! Do you use Twitter? I’d like to follow you if that would be okay. I’m
definitely enjoying your blog and look forward to new updates.
Hi there! Do you know if they make any plugins to protect against hackers?
I’m kinda paranoid about losing everything I’ve worked hard
on. Any tips?
Hi! Do you know if they make any plugins to help with SEO?
I’m trying to get my blog to rank for some targeted keywords but I’m not seeing very good success.
If you know of any please share. Thanks!
I know this if off topic but I’m looking into starting my own blog and was wondering what all is needed to get set up? I’m assuming
having a blog like yours would cost a pretty penny? I’m not very web savvy so I’m not 100%
sure. Any suggestions or advice would be greatly appreciated.
Thank you
Hmm is anyone else experiencing problems with
the images on this blog loading? I’m trying to figure out if its a problem on my end or if it’s the blog.
Any responses would be greatly appreciated.
I’m not sure exactly why but this website is loading incredibly slow for me. Is anyone else having this problem or is it a issue on my end? I’ll check back later and see if the problem still exists.
Hey there! I’m at work surfing around your blog from my new iphone 4! Just wanted to say I love reading your blog and look forward to all your posts! Keep up the outstanding work!
Wow that was strange. I just wrote an extremely long comment but after I clicked submit my comment didn’t appear.
Grrrr… well I’m not writing all that over again. Regardless, just wanted to say superb blog!
January 25, 2014 at 10:49 am
“Debugging SharePoint Workflows | Fleeting Thoughts”
genuinely causes myself imagine a little bit extra.
I personally treasured each and every particular section of it.
Thanks for your effort -Leia
January 25, 2014 at 7:35 pm
This website really has all the information and facts I wanted about this subject and didn’t know who to ask.
January 30, 2014 at 5:24 pm
You really make it seem so easy woth your presentation but I find this
topic to bee actuazlly something which I think I would never understand.
It seems too complicated annd extremely broad for me. I am looking forsard for youur
next post, I’ll try to get thhe hang of it!
August 18, 2014 at 5:29 am
Thanks for some other great post. The place else could anybody get that type of information in such a perfect approach of writing?
I have a presentation subsequent week, and I’m on the search for such info.
September 8, 2014 at 11:07 am
constantly i used to read smaller posts that as well clear their motive, and that is also happening
with this piece of writing which I am reading here.
September 10, 2014 at 12:56 am
It’s a pity you don’t have a donate button! I’d definitely donate to this fantastic blog!
I suppose for now i’ll settle for bookmarking and
adding your RSS feed to my Google account. I look forward to new updates and will talk
about this site with my Facebook group. Talk soon!
September 10, 2014 at 11:29 am
I delight in, cause I discovered just what I was taking a look for.
You’ve ended my four day long hunt! God Bless you
man. Have a great day. Bye
September 15, 2014 at 8:31 pm
Thankfulness to my father who informed me regarding this blog, this web
site is genuinely amazing.
September 21, 2014 at 8:49 am
Thanks for sharing such a good idea, post is pleasant, thats why i have read it completely