Monday, March 23, 2015

A Codeless Alert System For Dynamics CRM

A common requirement for JavaScript on CRM forms is to pop up a warning when a record opens. Perhaps it is an account marked as a bad credit risk in the ERP system or perhaps it is a case overdue for a response. Whatever the circumstance, we often want to inform a user of something before they start interacting with a record.

With Business Rules, we can now interrupt a user reliably without resorting to Javascript.

Setting up the Alert

First of all we need a text field to contain our alert. Initially I added this to the header of the record but found out that it is not possible (or, at least, I could not figure out how) to widen the field meaning my alert was being cut off. In the end I added a tab to the top of the form body and added the field to a section in the tab.

When blank the field is almost invisible so I clicked into it for the screenshot. I also turned off the label for the field as we do not need it.

Next, I set up a business rule to grab the user’s attention.

All the rule does is prevent the user from saving if the Alert field contains data and forces the user to clear the field first, making them acknowledge the contents.

Triggering the Alert

Now we simply set up another Business Rule, Workflow or whatever we like to populate the Alert field. When this is done, we are set. For example, let us say we want to warn the user of all Accounts beginning with A.

When the user opens up a guilty record, they are confronted with:

Until they clear the message, they will not be able to save any changes to the record.

A word of warning though, Business Rules fire in the order they are activated so if you add a rule to populate the Alert field, make sure you deactivate and reactivate the Alert Rule afterwards so it checks AFTER the field is populated and not before.

Conclusions

A simple and effective alerting system which forces the user to read the message before interacting with the record. If you need such an alert and do not want to rely on a coder to adjust it as the business alert criteria change over time, consider this option.

Tuesday, March 17, 2015

Marc’s Lemonade Stand 2015

Last year, around this time, I wrote about Marc’s Lemonade Stand. This was my attempt to demystify the cash flow of Salesforce. From their annual reports we know they have not made a profit for four years so how do they stay afloat? If the money from selling subscriptions is insufficient to cover costs where does the extra money come from? Now, with Salesforce’s financial year at a close we can, again, revisit, Marc’s Lemonade stand.

 

Cash is King

There are three financial reports released with an annual report:

  • Statement of Operations (Revenues and Costs)
  • Balance Sheet (Assets and Liabilities)
  • Cash Flow Statement (Incoming and Outgoing Cash)

Marc is quite the fan of Non-GAAP results. This is Marc being creative with the Statement of Operations where he literally turns a financial loss into a profit. In short, if you have the motivation, you can make the statement of operations sing whatever tune you want it to.

With the balance sheet, we list our assets and liabilities. I once heard of a creative account who argued research and development is an asset for the Balance Sheet and not an expense on the Statement of Operations because it is an ‘investment in the future’. He had turned a business cost into a valuable asset simply through creative accounting.

The Cash Flow Statement is harder to mess with. It simply shows what money came into the business and what money left the business over the financial year. Concepts like ‘revenue recognition’ are thrown away. Either the cash came in, or it did not. The best you can do is something like add a positive value in one part of the Cash Flow Statement and then put a matching negative one in another part of the Cash Flow Statement. For an example of this ‘give with one hand and take with the other’, see the most recent quarterly statement of Salesforce  and spot the two “Excess tax benefits from employee stock plans” entries.

The Story So Far

Marc runs a successful lemonade stand outside of his home in Hawaii. He buys the ingredients from the local corner store (Subscription and Support Costs) and puts up posters in the surrounding streets to promote his stand (Marketing and Sales). His sister also helps out, making the lemonade and sitting on the stand (General and Administrative Costs). She is a strong believer in the future success of the stand and frequently buys shares in the business from Marc (Expenses Related to Stock-Based Awards).

Uncle Sam visits around Christmas and takes a few lemonades and sometimes, if he has a few extra coins in his pocket, will add them to Marc’s kitty (Provision for Income Taxes). Similarly, his Dad comes home from work, thirsty and sometimes borrows money from Marc to buy a lemonade (Accounts Receivable). Marc also borrows money from Mom occasionally when money is short (Financing Activities).

Marc runs a loyalty program where, for new customers, if you pay $9 today you get ten lemonades over the rest of the year (Deferred Revenue).

Finally, Marc has been so successful at running his lemonade stand, he has bought out a few of the local rival stands, keeping the staff but taking the profits (Business Combinations).

Excess money earned from the stand goes into the bank and earns interest (Investment Income) or goes into comics (Purchases of Marketable Securities)

There are a few other entries in my ledger but you get the general idea.

The Numbers

As an exercise in masochism, I took the numbers back to 2003, using the Annual Reports on the Salesforce web site. The only exception to this were the 2015 results which I took from the latest quarterly announcement.

I then grouped the cash flows as if they related to a lemonade stand. So, for example, “Taste Testing” is “Research and Development” and “Fixing Up the Lemonade Stand” is “Land Activity and Building Improvements” plus “Capital Expenditures” plus “Principal Payments on Capital Lease Obligations”.

Finally I scaled all entries, relative to the revenue for that year, setting the revenue to equal $1. In effect, this tells us, in a given year what percentage was spent or how much money was received for that line item. So, in the above sheet, for 2015, 51% of Revenue (Lemonade Sales) was spent on Marketing and Sales (Posters).

Values in green are greater than or equal to 10c and values in red are less than or equal to -10c

Marc’s Main Sources of Revenue

Marc has three main sources of revenue:

  • Lemonade Sales (Subscription, Support, Professional and Other Revenue) $1.00
  • Selling Sister a Share of the Business (Expenses related to stock-based awards + Proceeds from the exercise of stock options + Repurchase of unvested shares) $0.16
  • Loyalty Program (Deferred Revenue) $0.15

Lemonade sales are, by far, the largest source of cash with the other two running roughly equal second. The use of options and shares as compensation (Selling Sister…) keeps cash flowing into the business but dilutes the value of the business per share. This source of cash is only viable while the receivers perceive value in the underlying stock. As the stock becomes diluted, this value diminishes.

The loyalty program (Deferred Revenue) is an interesting source of revenue.This refers to Salesforce taking the full value of an annual subscription at the start of the contract. They receive the cash but still have to deliver the service. In the quarterly calls, a big deal is made of the deferred revenue with the inference it is an indicator of future income. For a subscription model there is some truth to this, in that the clients will be paying the same next year, but it is also an indication of services yet to be delivered. In the case of the lemonade stand, Marc now has lots of money but eventually the customers will come asking for their lemonades which Marc will be compelled to provide for no additional cash.

In terms of historical significance, relative to subscription and support revenue, I was surprised to see that these additional sources of cash are not new. Both have provided significant cash inflows for most of the company’s life. In the case of deferred revenue, its relative importance is dropping, now only accounting for 15c for every dollar of revenue earned, compared to historic highs of 32c.

Marc’s Main Costs

Marc has quite a few significant costs in the business:

  • Cost of Ingredients (Subscription, Support, Professional and Other Costs) $0.24
  • Taste Testing (Research and Development) $0.15
  • Posters (Marketing and Sales) $0.51
  • Lending Dad Money (Accounts Receivable) $0.10
  • Borrowing Money From Mom (Financing Activities) $0.10

In total, this is $1.10 which explains the need for additional sources of revenue and the financial loss we see in the annual reports. By cherry-picking the sources of cash and sources of cost, this also explains how the financial loss is turned into a Non-GAAP profit.

Marketing and Sales absorbs half of the revenues received by Salesforce. This compares to, say, Microsoft whose Marketing and Sales runs at around 18c to the dollar (18% of revenue).

In terms of historical norms, ingredient costs have remained constant. Research and development appears to be increasing in cost, relative to revenue, which strikes me as unusual. Generally costs remain fixed or reduce as volume increases. Marketing and Sales are less than they were back in 2003-2004 but now seem to have flattened, relative to revenue. The other two (Accounts Receivable and Financing Activities) have no discernable pattern in terms of growing or shrinking.

What Happens If Sales Flatten?

Salesforce has enjoyed strong, on-going sales growth of over 20% year on year since 2003. However, Hawaii is an island and, similarly, markets are not infinite in size so sales will eventually flatten. When all the possible market share has been grabbed, Salesforce will rely on its existing subscription base to support it. How will this affect our cash sources and sinks?

With the client base regularly buying their lemonade, sales will remain constant and this source of revenue will remain the same. It is assumed defections will be countered by new sales.

However, with flattening sales, the future prospects of Salesforce will not be as rosy and the optimistic share price (based on consideration of stock’s P/E ratio) will flatten or drop. Marc’s sister may be less interested in buying shares in the business and this source will diminish, relative to sales.

With the only new sales being those to cover clients defecting to other lemonade stands, the loyalty program will disappear or diminish significantly as the new sales dry up.

Ingredient costs will remain the same and, as the lemonade quality needs to be maintained, I argue taste testing (R&D) will remain the same to maintain the existing client base.

Posters (marketing and sales) may increase to bolster demand but let us be generous and assume it will remain the same to ensure when the existing clients think of lemonade, they think of Marc’s lemonade. In terms of Salesforce, I am assuming marketing spend remains the same and the Salesforce sales team continue to get commission on active subscriptions.

Lending Dad Money (Accounts Receivable) will remain the same or increase as credit terms are relaxed to maintain the client base.

Borrowing from Mom (Financing Activities) will need to remain flat if the business is to be sustainable. We cannot rely on Mom to constantly bail us out.

Therefore, overall, if sales flatten, cash inflows will reduce and costs will remain the same or increase. With the current cash profit level of 2% (2c for every lemonade sold) we do not have a lot of wiggle room. The only place I can see concessions being made is in a reduction in posters (Marketing and Sales) and this will have to go down from around 50c for every lemonade sold down to around 20c, in line with the competition, to cover the 30c loss in cash inflows from the share sales and the loyalty program. If the costs of the business increase, this will mean a further reduction in posters.

Conclusions

Salesforce is sustainable while sales continue to grow. Sales growth brings optimism to the share price (ensuring revenue from stock sales) and allows them to take money from new customers to cover the costs of existing customers. However, if sales growth falters, this will affect these sources of cash and Salesforce will need to get even more creative with their financing to support the costs in their business.

The GAAP financials advertise this warning but the unique growth profile has allowed Salesforce to defy the warning so far. I sincerely hope that Salesforce see the end of the sales growth coming and adjust their business accordingly.

Monday, March 9, 2015

Book Review: Microsoft Dynamics CRM Customization Essentials

Introduction and Disclaimer

Packt are an interesting organisation. They are an online-only publisher who actively approach subject matter experts to write books in a profit-sharing arrangement. I have not written for them but I do the occasional review of their books. My compensation is a free copy of the book.

In this case it is Nicolae Tarla’s ‘Microsoft Dynamics CRM Customization Essentials’ (link to buy on the image).

It claims, on the cover, to “use a no-code approach to create powerful business solutions using Dynamics CRM 2015” so, given my lack of coding ability and focus on solutions requiring no code, it has my attention. Despite him being a CRM MVP, I do not personally know Nicolae but, if I am too harsh on him I promise to buy him a drink at the next MVP Summit.

Let us see how it stacks up. I am expecting to see lots of information on Business Rules, Dialogs and Real Time Workflows and perhaps some insights on using Business Process Flows. As usual I will review the chapters as I read them and bring my conclusion in at the end.

Overview and Structure of the Book

At 238 pages, this is not a massive tome but this should be enough to cover the essentials. There are six chapters and the book is split up like this:

  • Preface
  • Chapter 1: Getting Started
  • Chapter 2: Dynamics CRM Application Structure
  • Chapter 3: Customizing Entities
  • Chapter 4: Business Processes
  • Chapter 5: Social Features in Microsoft Dynamics CRM
  • Chapter 6: Dynamics CRM Administration

I was expecting a book on just business processes so this covers a lot more than I anticipated.

Preface

The preface makes it clear that this book assumes no prior knowledge and will give you a foundation in configuring CRM. The book will walk you through setting up a sandbox and the fundamental structure of Dynamics CRM. It then builds on this to show how the system can be modified and augmented.

There is certainly a demand for this kind of book in the market. Often Dynamics CRM is installed and it is assumed that IT will take on the responsibility for managing the system. While there are plenty of administration guides in the market, a book focussed on configuring CRM is, arguably, missing. For customers who have the inclination to take on the setup of their CRM system, if this book comes through with the goods, it has the potential to save a company thousands in consulting costs.

Chapter 1: Getting Started

This chapter provides an overview of Dynamics CRM talking about how it is deployed and how you interface with it. It suggests you need a Live ID to use Dynamics CRM but this is not true. It used to be that you needed a Live ID but now that Dynamics CRM is part of Office 365, it uses an Office 365 account. Setting up the 30 day trial will automatically provision an Office 365 account as well.

The sign up process for the 30 day trial is a little different to the one in the book but this process varies from country to country and is constantly evolving so this is no big surprise.

The chapter then goes on to talk about setting up Outlook for CRM. While not needed for customization/configuration, this is a nice touch. The configuration walkthrough assumes you have set up your 30 day trial on the US Microsoft Servers as it refers to “crm.dynamics.com”. For Australia, this needs to be changed to “crm5.dynamics.com” and it is different for other regions as well.

That brings us to the end of the chapter. We now have a 30 day trial and Outlook set up. While there were a few kinks, this chapter will put you on the right path for setting up your sandbox.

Chapter 2: Dynamics CRM Application Structure

This chapter talks about how the out-of-the-box system is put together. It talks about the modules of CRM and the entities which make up the system. Next it goes through, in detail, the out-of-the-box configuration for each module, covering the entities unique to that module, Business Process Flows, Dashboards and Reports.

Next it talks about CRM Processes (Dialogs, Workflows, Actions and Business Process Flows) giving a high-level overview of each of them. Then it gives an overview of Dashboards and Reports.

Finally it talks about new navigation at the top of CRM 2013/2015.

Overall an excellent summary of the out of the box setup, arguably the best I have seen.

Chapter 3: Customizing Entities

Now we get to the meat in the sandwich; how to change stuff.

First it covers the essentials of solutions. Managed and unmanaged solutions are tricky because managed solutions can get you in trouble if not handled right. The book recommends using unmanaged solutions for development and test and changed to a managed solution for production. I generally stick to unmanaged all the way through but if there is the possibility that you will need to uninstall the solution, the managed variety is the better option. It briefly talks about solution layering but to get a good handle on this tricky aspect I would look elsewhere.

Next the chapter talks about entities and changing them. For renaming entities it reminds the user to also change the messages for that entity but does not mention changing the field and view names. It also covers configuring entity settings. The ability to change the primary field for the entity i.e. the ‘name’ field is mentioned but the big pitfall with this is not mentioned. Specifically, if you make the name field optional and it is not filled out, any lookup field referencing a record with a blank name field will be blank. I have found that in certain browsers this makes the record very difficult to select. Also, when looking at the form with a blank name field, CRM assumes it is a new record and displays a title to reflect this. In other words, while it is possible to make the name field optional, leaving it blank i.e. not auto-populating it, can lead to a range of usability issues.

The chapter also distinguishes between system entities, business entities and custom entities, highlighting some of the differences between them.

Next we get into changing the various elements of the entity i.e. forms, views, charts etc. The different types of forms are reviewed. The details for adding a Quick View Form are covered in depth and well worth the read if you are unfamiliar with this relatively new feature. Form configuration comes next starting with tabs and ending with form spacers. This is probably a little lighter than I would have expected. Global option sets are not covered and, other than being mentioned, the details for calculated and rollup fields are not covered.

Entity relationships talks about how to link entities together through 1:N and N:N relationships. The new hierarchy display is mentioned but the limitations i.e. only can show the hierarchy of one entity, are not covered. For N:N relationships, the limitation of having no access to the linking entity is mentioned and the suggestion of creating a ‘manual N:N’ is offered. The elements involved in the set up on a new relationship are not covered and the pros and cons of the Display Option setup are not mentioned. For example, if I am creating three lookups from the Contact form to the Account form, I need to modify the Display options because, otherwise, when I go to the Account record, I will see three Contact buttons to choose from in the related records. It will not be clear which Contact button refers to which relationship without the Display Options being set up appropriately.

Views and Charts are covered in the same section. Although this initially surprised me, I can see the logic of it given a chart can only be set up once a view is in place. The section gives a high level summary for setting up views and then touches on the setup of charts. One thing the book does not mention is the importance of publishing and it is assumed by the book that the reader is familiar with this aspect of CRM. So, for example, when the book says “Once you have created the charts, you can see them by navigating to the view” it should probably mention the importance of publishing the changes.

Next come Dashboards, the logical extension of charts. The difference between organization-owned dashboards and user-owned dashboards is covered but, again, this section is a little light. A warning that once a dashboard format is set, it is locked in would have been nice.

Next comes Messages (where the importance of publishing is mentioned). Multi-lingual limitations are also touched on.

Finally, we move to Business Rules. This has good coverage and even mentions the scope of the Business Rule, which is often overlooked, and talks about how the Business Rule, since CRM 2015, can be run on either the client side or server side.

Overall not a bad chapter but some sections could be fleshed out more. It would be very easy to double the size of this chapter to cover the topic in more depth.

Chapter 4: Business Processes

The chapter begins by stating what types of Business Processes it will cover. Dialogs are given a very brief overview with Workflows not faring much better. The steps available to workflows and dialogs are not covered at all. Actions get some coverage, even though they can only be called by code. Business Rules get a good overview with a summary of their limitations (even though they were also covered in the previous chapter). Similarly, Business Process Flows also get a comprehensive summary and also discuss how to trigger workflows when the stage of a Process Flow changes.

Like the previous chapter, this one is a bit of a mixed bag. Some elements are covered well while others get little more than a few paragraphs. While reading this chapter sets me up nicely for making Business Rules and Business Process Flows, it offers little help for Workflows and Dialogs.

Chapter 5: Social Features in Microsoft Dynamics CRM

The first element covered is the Social Pane. This is the box that appears on the new forms which shows Posts, Activities and Notes. Bizarrely, the chapter not only provides some code to hide tabs on the Social Pane, the code is unsupported. For a book promoting codeless configuration, the inclusion of unsupported code seems unusual and dangerous for an audience who will not be familiar with concepts like supported/unsupported code. How to set up the social pane through configuration is covered and a sample workflow for adding a post is also included.

Next comes a review of Microsoft Social Listening (MSL) and instructions on how to link it with CRM Online. This is a bit of an unusual inclusion on a book talking about configuring CRM (MSL is a separate product with minimal configuration settings) but the review is quite detailed and of value if MSL is something you are considering.

Similarly, Insights by InsideView is reviewed. I gave an overview of the set up process in a previous blog post and this covers the same as well as a summary of the functionality. With minimal configuration, this also strikes me as an unusual inclusion.

Finally, Yammer is covered. Setup is covered and configuration to surface it in CRM is also reviewed.

I am not sure how this chapter fits in with a book on codeless configuration but its coverage of the three collaboration tools is quite good.

Chapter 6: Dynamics CRM Administration

This chapter is designed to cover “the most commonly-used configuration options that an administrator of the system will work with on a day-to-day basis.” The chapter certainly gives a summary of the Settings area of CRM but actual processes, such as adding a new user or configuring a security role are not covered.

Conclusions

This book reminds me of a cut-down version of Wittemann and Ables’ Administration Bible (that book was just shy of 800 pages and sought to address similar topics). The preface claims “This book takes a no-code approach to configuration and customization and is aimed at non-developers. It is intended as a guide for someone who is starting  out with the platform and as a reference material during the platform life.”

The first couple of chapters start down the path of addressing this claim well, empowering the reader to set up a thirty day trial and giving an overview of the CRM structure. Chapters three and four have some good moments but I expected them to be more in-depth, especially around topics such as Business Processes and form setup. Chapters five and six are an unexpected inclusion, especially chapter five. A chapter on free, commonly applied solutions makes sense, and InsideView fits into this camp nicely but setting up Yammer and MSL is not something I see as a ‘Customization Essential’.

Chapter six is little more than a high-level summary of the Settings module. Focussing on the Settings elements which can have a big impact on behaviour may have been a better approach here. For example, reviewing data duplication and SharePoint integration in detail would have made sense.

As a lifetime reference for codeless configuration, the book probably misses the mark. Beefing up chapters three and four, dropping chapter five and focussing the coverage of chapter six would get it there though. Is the book worth the ticket price of $30? There are very few books in the market addressing CRM 2015 so if you absolutely need something for CRM 2015 and are completely new to the product, this is it. The administration bible, for example, is only good for CRM 2011. The closest competitor I know of is the CRM 2013 QuickStart which costs a similar price for about twice the size and is focussed on configuration and customization of CRM. However, the description and reviews make it clear the QuickStart assumes prior knowledge of Dynamics CRM.

Buy the book for a guide on what is possible but you may have to look elsewhere to know how to change things and, more importantly, when not to change things. Nicolae, the first round at Summit is on me.

 
sale-70-410-exam    | we-sale-70-410-exam    | hot-sale-70-410-exam    | it-sale-70-410-exam    | dump-sale-70-410-exam    | test-king-sale-70-410-exam    | to-sale-70-410-exam    | net-sale-70-410-exam    | passsoon-sale-70-410-exam    | passresults-sale-70-410-exam    | realtests-sale-70-410-exam    | sale-70-461-exam    | cbtnuggets-sale-70-461-exam    | kingdump-sale-70-461-exam    | certguide-sale-70-461-exam    | certkiller-sale-70-461-exam    | ucertify-sale-70-461-exam    | itexamcup-sale-70-461-exam    | freebraindumps-sale-70-461-exam    | sale-70-486-exam    | pass-sale-70-486-exam    | bloggedbychris-sale-70-486-exam    | microsoft-sale-70-486-exam    | downloadvce-sale-70-486-exam    | passitdump-sale-70-486-exam    | certexam-sale-70-486-exam    | iexamcollection-sale-70-486-exam    | sale-C4040-252-exam    | certifyguide-sale-C4040-252-exam    | testking-sale-C4040-252-exam    | actualtests-sale-C4040-252-exam    | itdumps-sale-C4040-252-exam    | leads2pass-sale-C4040-252-exam    | examsheets-sale-C4040-252-exam    | itcertpass-sale-C4040-252-exam    | testkiz-sale-C4040-252-exam    | pass4sure-sale-C4040-252-exam    | examsboost-sale-C4040-252-exam    | examkiller-sale-C4040-252-exam    | certsgrade-sale-C4040-252-exam    | examsforall-sale-C4040-252-exam    | examcollection-sale-C4040-252-exam    | braindumps-sale-70-461-exam    | elearningexams-sale-70-488-exam    | itexambibles-sale-70-488-exam    | latestbraindumps-sale-70-488-exam    | downloadexam-sale-70-488-exam    | examsforall-sale-70-488-exam    | testinsides-sale-70-488-exam    | braindumps-sale-70-488-exam    | test-king-sale-70-488-exam    | kingexam-sale-70-488-exam    | mytestking-sale-70-488-exam    | prepnerds-sale-70-488-exam    | vcefiles-sale-70-488-exam    | ipass4sures-sale-70-488-exam    | prep4cert-sale-70-488-exam    | brain-dumps-sale-70-488-exam    | itexamboom-sale-70-461-exam    | pass4surebraindumps-sale-70-461-exam    | blogspot-sale-70-461-exam    | testking-sale-70-461-exam    | networkedminds-sale-70-461-exam    | realbraindumps-sale-70-461-exam    | test-inside-sale-70-461-exam    | exambraindumps-sale-70-461-exam    | testkingsite-sale-70-461-exam    | flashcardmachine-sale-70-461-exam    | blogspot-sale-mb5-705-exam    | passcertification-sale-mb5-705-exam    | passitdump-sale-mb5-705-exam    | beitcertified-sale-mb5-705-exam    | exams-collections-sale-mb5-705-exam    | vceexamstest-sale-mb5-705-exam    | pass4sureexam-sale-mb5-705-exam    | examref-sale-70-486-exam    | free-braindumps-sale-70-486-exam    | certshared-sale-70-486-exam    | passin1day-sale-70-486-exam    | itexamcool-sale-70-411-exam    | vceorg-sale-70-411-exam    | go2exam-sale-70-411-exam    | downloadexam-sale-70-411-exam    | examreal-sale-70-411-exam    | godumps-sale-70-480-exam    | examoutlet-sale-70-480-exam    | passvce-sale-70-480-exam    | lead2cert-sale-70-480-exam    | vcepracticetest-sale-70-346-exam    | dumpstree-sale-70-346-exam    | pass4king-sale-70-346-exam    | greatexam-sale-70-346-exam    | mybraindumps-sale-70-462-exam    | examvce-sale-70-462-exam    | braindumps-review-sale-70-462-exam    | brain2pass-sale-70-347-exam    | officialcerts-sale-70-347-exam    | actual-sale-70-347-exam    | testsnote-sale-70-347-exam    | certsall-sale-70-347-exam    | examschief-sale-70-347-exam    | examcollectionuk-sale-200-125-exam    | killexams-sale-200-125-exam    | labs-sale-200-105-exam    |
http://www.kernhigh.org/    | http://www.kernhigh.org/    |