public override bool Execute(RockContext rockContext, WorkflowAction action, object entity, out List <string> errorMessages)
        {
            errorMessages = new List <string>();
            StringBuilder sbErrorMessages = new StringBuilder();

            if (!action.IsNotNull())
            {
                action.AddLogEntry("ReferenceValidation: Input (action) is null.");
                return(false);
            }

            int    refCount    = action.Activity.Workflow.GetAttributeValue("ReferenceCount").AsInteger();
            int    maxRef      = action.Activity.Workflow.GetAttributeValue("ReferenceLimit").AsInteger();
            string firstName   = action.Activity.GetAttributeValue("Firstname");
            string lastName    = action.Activity.GetAttributeValue("Lastname");
            string phoneNumber = action.Activity.GetAttributeValue("Phone");
            string phoneType   = action.Activity.GetAttributeValue("PhoneType");
            string email       = action.Activity.GetAttributeValue("Email");
            Guid?  addressGuid = action.Activity.GetAttributeValue("Address").AsGuidOrNull();

            if (refCount < maxRef)
            {
                validateName(firstName, lastName, sbErrorMessages);
                validatePhone(phoneNumber, phoneType, sbErrorMessages);
                validateEmail(email, sbErrorMessages);
                validateRelationships(action, refCount, maxRef, sbErrorMessages);

                LocationService locationService = new LocationService(new RockContext());
                Location        location        = locationService.Get(addressGuid.Value);
                if (addressGuid.HasValue && addressGuid != new Guid())
                {
                    validateAddress(location, sbErrorMessages);
                }
                else
                {
                    sbErrorMessages.AppendLine("<li> A valid address is required.</li>");
                }

                if (sbErrorMessages.Length == 0)
                {
                    ContactInfo userInfo = new ContactInfo();
                    userInfo.name        = formatName(firstName, lastName);
                    userInfo.address     = formatAddress(location);
                    userInfo.phoneNumber = formatPhone(phoneNumber);
                    userInfo.email       = email.Trim();

                    //if this is the 1st successful entry,
                    //store in the list for future comparison.
                    if (refCount == 0)
                    {
                        Reference.Clear();
                        Reference.Add(userInfo);
                    }
                    else if (refCount > 0 && refCount < maxRef)
                    {
                        for (var i = 0; i < Reference.Count; i++)
                        {
                            string fieldCorrectionStr = "";
                            if (checkForDuplicates(Reference[i], userInfo, out fieldCorrectionStr))
                            {
                                if (!String.IsNullOrEmpty(fieldCorrectionStr))
                                {
                                    string[] words = fieldCorrectionStr.Trim().Split(' ');
                                    foreach (var word in words)
                                    {
                                        sbErrorMessages.AppendFormat("<li>This reference's {0} matches that of reference {1}, Please correct.</li>", word.Trim(), i + 1);
                                    }
                                }
                                else
                                {
                                    action.AddLogEntry("ReferenceValidation: CheckForDuplicates returns true, but correction string is empty.");
                                }
                            }
                        }
                        if (sbErrorMessages.Length == 0)
                        {
                            Reference.Add(userInfo);
                        }
                    }
                }
            }
            Guid ErMsg = GetActionAttributeValue(action, "ErrorMessages").AsGuid();

            if (sbErrorMessages.Length > 0)
            {
                // If we get here, validation has failed
                SetWorkflowAttributeValue(action, ErMsg, sbErrorMessages.ToString());
                action.AddLogEntry("ReferenceValidation: Validation failed");
                return(reactivateCurrentActions(rockContext, action));
            }
            // If we get here, validation was successful
            SetWorkflowAttributeValue(action, ErMsg, string.Empty);
            action.AddLogEntry("ReferenceValidation: Validation successful");
            return(true);
        }