public static ResolvedVariablesContainer Resolve(ApplicationWithOverrideVariableGroup appWithGroup, ApplicationServer server)
        {
            if (appWithGroup == null)
            {
                throw new ArgumentNullException("appWithGroup");
            }
            if (server == null)
            {
                throw new ArgumentNullException("server");
            }

            int    numberOfProblemsFound     = 0;
            bool   variableFoundMoreThanOnce = false;
            var    resolvedCustomVariables   = new List <CustomVariable>();
            string supplementalStatusMessage = string.Empty;

            // This is normally set when calling Install(), but since we're not doing that
            // here, set it explicitly.
            ApplicationWithOverrideVariableGroup.SetInstallationStartTimestamp(DateTime.Now);

            foreach (TaskBase task in appWithGroup.Application.MainAndPrerequisiteTasks)
            {
                if (variableFoundMoreThanOnce)
                {
                    break;
                }

                foreach (string taskProperty in task.GetTaskProperties())
                {
                    if (variableFoundMoreThanOnce)
                    {
                        break;
                    }

                    string key   = string.Empty;
                    string value = string.Empty;

                    foreach (Match match in CustomVariableGroup.GetCustomVariableStringsWithinBiggerString(taskProperty))
                    {
                        // Don't add the same key more than once.
                        if (resolvedCustomVariables.Any(x => x.Key == match.Value))
                        {
                            continue;
                        }

                        try
                        {
                            key = match.Value;
                            // Note, we pass true so that encrypted values stay encrypted. We don't want the user to see encrypted values.
                            value = CustomVariableGroup.ResolveCustomVariable(match.Value, server, appWithGroup, true);
                        }
                        catch (CustomVariableMissingException)
                        {
                            numberOfProblemsFound++;
                            value = "** NOT FOUND **";
                        }
                        catch (CustomVariableExistsMoreThanOnceException ex)
                        {
                            variableFoundMoreThanOnce = true;
                            numberOfProblemsFound++;
                            value = "** MORE THAN ONE FOUND **";
                            supplementalStatusMessage = ex.Message;
                        }

                        resolvedCustomVariables.Add(new CustomVariable()
                        {
                            Key = key, Value = value
                        });
                    }
                }
            }

            var container = new ResolvedVariablesContainer();

            container.NumberOfProblems          = numberOfProblemsFound;
            container.SupplementalStatusMessage = supplementalStatusMessage;
            container.Variables = resolvedCustomVariables;

            return(container);
        }