// Initialize the default starting properties. Should only be called once by MobileAppTracker.
        public MATParameters(string advId, string advKey, byte[] bytes)
        {
            this.culture = new CultureInfo("en-US");

            this.advertiserId  = advId;
            this.advertiserKey = advKey;

            this.localSettings = ApplicationData.Current.LocalSettings;

            this.urlEncrypter = new MATEncryption(advKey, MATConstants.IV);

            this.matResponse = null;

            // Default values
            this.AllowDuplicates = false;
            this.DebugMode       = false;
            this.ExistingUser    = false;
            this.AppAdTracking   = true;
            this.Gender          = MATGender.NONE;

            this.WindowsAid = AdvertisingManager.AdvertisingId;

            // Get app name asynchronously from appxmanifest
            this.AppName = GetAppName();

            var version = Package.Current.Id.Version;

            this.AppVersion = String.Format("{0}.{1}.{2}.{3}", version.Major, version.Minor, version.Build, version.Revision);

            // Use local package name by default
            this.PackageName = Package.Current.Id.Name;
            try
            {
                // If there's a store app id, use it
                if (CurrentApp.AppId != Guid.Empty)
                {
                    this.PackageName = CurrentApp.AppId.ToString();
                }
            }
            catch
            {
            }

            // Get device info
            EasClientDeviceInformation info = new EasClientDeviceInformation();

            this.DeviceBrand = info.SystemManufacturer.ToString();
            this.DeviceModel = info.SystemProductName.ToString();
            this.DeviceType  = info.OperatingSystem.ToString(); //Windows or WindowsPhone

            // Get ASHWID
            this.ASHWID = BitConverter.ToString(bytes);

            // Check if we can restore existing MAT ID or should generate new one
            if (localSettings.Values.ContainsKey(MATConstants.SETTINGS_MATID_KEY))
            {
                this.MatId = (string)localSettings.Values[MATConstants.SETTINGS_MATID_KEY];
            }
            else // Don't have MAT ID, generate new guid
            {
                this.MatId = System.Guid.NewGuid().ToString();
                SaveLocalSetting(MATConstants.SETTINGS_MATID_KEY, this.MatId);
            }

            // Get saved values from LocalSettings
            if (GetLocalSetting(MATConstants.SETTINGS_PHONENUMBER_KEY) != null)
            {
                this.PhoneNumber       = (string)GetLocalSetting(MATConstants.SETTINGS_PHONENUMBER_KEY);
                this.PhoneNumberMd5    = MATEncryption.Md5(this.PhoneNumber);
                this.PhoneNumberSha1   = MATEncryption.Sha1(this.PhoneNumber);
                this.PhoneNumberSha256 = MATEncryption.Sha256(this.PhoneNumber);
            }

            if (GetLocalSetting(MATConstants.SETTINGS_USEREMAIL_KEY) != null)
            {
                this.UserEmail       = (string)GetLocalSetting(MATConstants.SETTINGS_USEREMAIL_KEY);
                this.UserEmailMd5    = MATEncryption.Md5(this.UserEmail);
                this.UserEmailSha1   = MATEncryption.Sha1(this.UserEmail);
                this.UserEmailSha256 = MATEncryption.Sha256(this.UserEmail);
            }

            this.UserId = (string)GetLocalSetting(MATConstants.SETTINGS_USERID_KEY);

            if (GetLocalSetting(MATConstants.SETTINGS_USERNAME_KEY) != null)
            {
                this.UserName       = (string)GetLocalSetting(MATConstants.SETTINGS_USERNAME_KEY);
                this.UserNameMd5    = MATEncryption.Md5(this.UserName);
                this.UserNameSha1   = MATEncryption.Sha1(this.UserName);
                this.UserNameSha256 = MATEncryption.Sha256(this.UserName);
            }
        }
        //Initialize the default starting properties. Should only be called once by MobileAppTracker.
        internal MATParameters(string advId, string advKey)
        {
            // Initialize Parameters
            this.advertiserId  = advId;
            this.advertiserKey = advKey;

            matResponse = null;

            this.AllowDuplicates = false;
            this.DebugMode       = false;
            this.ExistingUser    = false;
            this.AppAdTracking   = true;
            this.Gender          = MATGender.NONE;

            // Get Windows AID through Reflection if app on WP8.1 device
            var type = Type.GetType("Windows.System.UserProfile.AdvertisingManager, Windows, Version=255.255.255.255, Culture=neutral, PublicKeyToken=null, ContentType=WindowsRuntime");

            this.WindowsAid = type != null ? (string)type.GetProperty("AdvertisingId").GetValue(null, null) : null;


            // If app has a Store app id, use it as package name
            if (CurrentApp.AppId != Guid.Empty)
            {
                this.PackageName = CurrentApp.AppId.ToString();
            }
            else
            {
                // Fallback is to try to get WMAppManifest ProductID
                XElement app = XDocument.Load("WMAppManifest.xml").Root.Element("App");
                this.AppName    = GetValue(app, "Title");
                this.AppVersion = GetValue(app, "Version");

                string productId = GetValue(app, "ProductID");
                if (productId != null)
                {
                    this.PackageName = Regex.Match(productId, "(?<={).*(?=})").Value;
                }
            }

            byte[] deviceUniqueId = (byte[])DeviceExtendedProperties.GetValue("DeviceUniqueId");
            this.DeviceUniqueId = Convert.ToBase64String(deviceUniqueId);
            this.DeviceBrand    = DeviceStatus.DeviceManufacturer;
            this.DeviceModel    = DeviceStatus.DeviceName;
            this.DeviceCarrier  = DeviceNetworkInformation.CellularMobileOperator;

            Version version = Environment.OSVersion.Version;

            this.OSVersion        = String.Format("{0}.{1}.{2}.{3}", version.Major, version.Minor, version.Build, version.Revision);
            this.DeviceScreenSize = GetScreenRes();

            // Check if we can restore existing MAT ID or should generate new one
            if (IsolatedStorageSettings.ApplicationSettings.Contains(MATConstants.SETTINGS_MATID_KEY))
            {
                this.MatId = (string)IsolatedStorageSettings.ApplicationSettings[MATConstants.SETTINGS_MATID_KEY];
            }
            else // Don't have MAT ID, generate new guid
            {
                this.MatId = System.Guid.NewGuid().ToString();
                SaveLocalSetting(MATConstants.SETTINGS_MATID_KEY, this.MatId);
            }

            // Get saved values from LocalSettings
            if (GetLocalSetting(MATConstants.SETTINGS_PHONENUMBER_KEY) != null)
            {
                this.PhoneNumber       = (string)GetLocalSetting(MATConstants.SETTINGS_PHONENUMBER_KEY);
                this.PhoneNumberMd5    = MATEncryption.Md5(this.PhoneNumber);
                this.PhoneNumberSha1   = MATEncryption.Sha1(this.PhoneNumber);
                this.PhoneNumberSha256 = MATEncryption.Sha256(this.PhoneNumber);
            }

            if (GetLocalSetting(MATConstants.SETTINGS_USEREMAIL_KEY) != null)
            {
                this.UserEmail       = (string)GetLocalSetting(MATConstants.SETTINGS_USEREMAIL_KEY);
                this.UserEmailMd5    = MATEncryption.Md5(this.UserEmail);
                this.UserEmailSha1   = MATEncryption.Sha1(this.UserEmail);
                this.UserEmailSha256 = MATEncryption.Sha256(this.UserEmail);
            }

            this.UserId = (string)GetLocalSetting(MATConstants.SETTINGS_USERID_KEY);

            if (GetLocalSetting(MATConstants.SETTINGS_USERNAME_KEY) != null)
            {
                this.UserName       = (string)GetLocalSetting(MATConstants.SETTINGS_USERNAME_KEY);
                this.UserNameMd5    = MATEncryption.Md5(this.UserName);
                this.UserNameSha1   = MATEncryption.Sha1(this.UserName);
                this.UserNameSha256 = MATEncryption.Sha256(this.UserName);
            }
        }