From d6cff567d878eb98714aec20957483f19227aab3 Mon Sep 17 00:00:00 2001 From: uerceg Date: Tue, 11 Jun 2024 15:08:54 +0200 Subject: [PATCH 01/43] feat: upgrade unity sdk for ios to v5 --- Assets/Adjust/Editor/AdjustCustomEditor.cs | 23 +- Assets/Adjust/ExampleGUI/ExampleGUI.cs | 88 +- Assets/Adjust/Test/CommandExecutor.cs | 389 ++++---- Assets/Adjust/Test/TestApp.cs | 6 +- Assets/Adjust/Test/TestLibraryiOS.cs | 4 +- Assets/Adjust/Unity/Adjust.cs | 756 +++++++-------- Assets/Adjust/Unity/AdjustAdRevenue.cs | 14 +- .../Unity/AdjustAppStoreSubscription.cs | 8 +- Assets/Adjust/Unity/AdjustAttribution.cs | 3 - Assets/Adjust/Unity/AdjustConfig.cs | 275 ++---- Assets/Adjust/Unity/AdjustEvent.cs | 51 +- Assets/Adjust/Unity/AdjustEventSuccess.cs | 1 - .../Unity/AdjustPlayStoreSubscription.cs | 14 +- .../Unity/AdjustPurchaseVerificationInfo.cs | 23 +- .../Adjust/Unity/AdjustThirdPartySharing.cs | 4 +- Assets/Adjust/Unity/AdjustUrlStrategy.cs | 30 - Assets/Adjust/Unity/AdjustUrlStrategy.cs.meta | 13 - Assets/Adjust/Unity/AdjustUtils.cs | 54 +- Assets/Adjust/iOS/ADJAdRevenue.h.meta | 24 - Assets/Adjust/iOS/ADJAttribution.h.meta | 21 - Assets/Adjust/iOS/ADJConfig.h | 299 ------ Assets/Adjust/iOS/ADJConfig.h.meta | 21 - Assets/Adjust/iOS/ADJEvent.h.meta | 21 - Assets/Adjust/iOS/ADJEventFailure.h.meta | 147 --- Assets/Adjust/iOS/ADJEventSuccess.h.meta | 147 --- Assets/Adjust/iOS/ADJLogger.h.meta | 21 - Assets/Adjust/iOS/ADJPurchase.h.meta | 24 - .../iOS/ADJPurchaseVerificationResult.h.meta | 24 - Assets/Adjust/iOS/ADJSessionFailure.h.meta | 147 --- Assets/Adjust/iOS/ADJSessionSuccess.h.meta | 147 --- Assets/Adjust/iOS/ADJSubscription.h.meta | 24 - Assets/Adjust/iOS/ADJThirdPartySharing.h.meta | 24 - Assets/Adjust/iOS/Adjust.h | 497 ---------- Assets/Adjust/iOS/Adjust.h.meta | 21 - Assets/Adjust/iOS/AdjustSdk.a | Bin 6972752 -> 0 bytes Assets/Adjust/iOS/AdjustSdk.a.meta | 147 --- ...lution.h.meta => AdjustSdk.framework.meta} | 3 +- .../Adjust/iOS/AdjustSdk.framework/AdjustSdk | Bin 0 -> 2512808 bytes .../iOS/AdjustSdk.framework/AdjustSdk.meta | 7 + .../iOS/AdjustSdk.framework/Headers.meta | 8 + .../Headers}/ADJAdRevenue.h | 0 .../Headers/ADJAdRevenue.h.meta | 7 + .../Headers/ADJAppStorePurchase.h} | 4 +- .../Headers/ADJAppStorePurchase.h.meta | 7 + .../Headers/ADJAppStoreSubscription.h} | 6 +- .../Headers/ADJAppStoreSubscription.h.meta | 7 + .../Headers}/ADJAttribution.h | 10 +- .../Headers/ADJAttribution.h.meta | 7 + .../AdjustSdk.framework/Headers/ADJConfig.h | 333 +++++++ .../Headers/ADJConfig.h.meta | 7 + .../Headers}/ADJEvent.h | 106 +-- .../Headers/ADJEvent.h.meta | 7 + .../Headers}/ADJEventFailure.h | 15 +- .../Headers/ADJEventFailure.h.meta | 7 + .../Headers}/ADJEventSuccess.h | 7 - .../Headers/ADJEventSuccess.h.meta | 7 + .../Headers}/ADJLinkResolution.h | 0 .../Headers/ADJLinkResolution.h.meta | 7 + .../Headers}/ADJLogger.h | 0 .../Headers/ADJLogger.h.meta | 7 + .../Headers}/ADJPurchaseVerificationResult.h | 0 .../ADJPurchaseVerificationResult.h.meta | 7 + .../Headers}/ADJSessionFailure.h | 7 - .../Headers/ADJSessionFailure.h.meta | 7 + .../Headers}/ADJSessionSuccess.h | 7 - .../Headers/ADJSessionSuccess.h.meta | 7 + .../Headers}/ADJThirdPartySharing.h | 4 +- .../Headers/ADJThirdPartySharing.h.meta | 7 + .../iOS/AdjustSdk.framework/Headers/Adjust.h | 417 +++++++++ .../AdjustSdk.framework/Headers/Adjust.h.meta | 7 + .../AdjustSdk.framework/Headers/AdjustSdk.h | 25 + .../Headers/AdjustSdk.h.meta | 7 + .../iOS/AdjustSdk.framework/Modules.meta | 8 + .../Modules/module.modulemap | 6 + .../Modules/module.modulemap.meta | 7 + .../iOS/AdjustSdk.framework/Versions.meta | 8 + .../iOS/AdjustSdk.framework/Versions/A.meta | 8 + .../iOS/AdjustSdk.framework/Versions/Current | 1 + .../AdjustSdk.framework/Versions/Current.meta | 8 + Assets/Adjust/iOS/AdjustUnity.mm | 883 ++++++++---------- Assets/Adjust/iOS/AdjustUnityAppDelegate.m | 6 +- Assets/Adjust/iOS/AdjustUnityDelegate.h | 32 +- Assets/Adjust/iOS/AdjustUnityDelegate.mm | 224 +++-- Assets/Adjust/iOS/AdjustiOS.cs | 394 ++++---- 84 files changed, 2520 insertions(+), 3648 deletions(-) delete mode 100644 Assets/Adjust/Unity/AdjustUrlStrategy.cs delete mode 100644 Assets/Adjust/Unity/AdjustUrlStrategy.cs.meta delete mode 100644 Assets/Adjust/iOS/ADJAdRevenue.h.meta delete mode 100644 Assets/Adjust/iOS/ADJAttribution.h.meta delete mode 100644 Assets/Adjust/iOS/ADJConfig.h delete mode 100644 Assets/Adjust/iOS/ADJConfig.h.meta delete mode 100644 Assets/Adjust/iOS/ADJEvent.h.meta delete mode 100644 Assets/Adjust/iOS/ADJEventFailure.h.meta delete mode 100644 Assets/Adjust/iOS/ADJEventSuccess.h.meta delete mode 100644 Assets/Adjust/iOS/ADJLogger.h.meta delete mode 100644 Assets/Adjust/iOS/ADJPurchase.h.meta delete mode 100644 Assets/Adjust/iOS/ADJPurchaseVerificationResult.h.meta delete mode 100644 Assets/Adjust/iOS/ADJSessionFailure.h.meta delete mode 100644 Assets/Adjust/iOS/ADJSessionSuccess.h.meta delete mode 100644 Assets/Adjust/iOS/ADJSubscription.h.meta delete mode 100644 Assets/Adjust/iOS/ADJThirdPartySharing.h.meta delete mode 100644 Assets/Adjust/iOS/Adjust.h delete mode 100644 Assets/Adjust/iOS/Adjust.h.meta delete mode 100644 Assets/Adjust/iOS/AdjustSdk.a delete mode 100644 Assets/Adjust/iOS/AdjustSdk.a.meta rename Assets/Adjust/iOS/{ADJLinkResolution.h.meta => AdjustSdk.framework.meta} (88%) create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/AdjustSdk create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/AdjustSdk.meta create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers.meta rename Assets/Adjust/iOS/{ => AdjustSdk.framework/Headers}/ADJAdRevenue.h (100%) create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers/ADJAdRevenue.h.meta rename Assets/Adjust/iOS/{ADJPurchase.h => AdjustSdk.framework/Headers/ADJAppStorePurchase.h} (88%) create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers/ADJAppStorePurchase.h.meta rename Assets/Adjust/iOS/{ADJSubscription.h => AdjustSdk.framework/Headers/ADJAppStoreSubscription.h} (89%) create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers/ADJAppStoreSubscription.h.meta rename Assets/Adjust/iOS/{ => AdjustSdk.framework/Headers}/ADJAttribution.h (90%) create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers/ADJAttribution.h.meta create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers/ADJConfig.h create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers/ADJConfig.h.meta rename Assets/Adjust/iOS/{ => AdjustSdk.framework/Headers}/ADJEvent.h (75%) create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers/ADJEvent.h.meta rename Assets/Adjust/iOS/{ => AdjustSdk.framework/Headers}/ADJEventFailure.h (69%) create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers/ADJEventFailure.h.meta rename Assets/Adjust/iOS/{ => AdjustSdk.framework/Headers}/ADJEventSuccess.h (86%) create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers/ADJEventSuccess.h.meta rename Assets/Adjust/iOS/{ => AdjustSdk.framework/Headers}/ADJLinkResolution.h (100%) create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers/ADJLinkResolution.h.meta rename Assets/Adjust/iOS/{ => AdjustSdk.framework/Headers}/ADJLogger.h (100%) create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers/ADJLogger.h.meta rename Assets/Adjust/iOS/{ => AdjustSdk.framework/Headers}/ADJPurchaseVerificationResult.h (100%) create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers/ADJPurchaseVerificationResult.h.meta rename Assets/Adjust/iOS/{ => AdjustSdk.framework/Headers}/ADJSessionFailure.h (85%) create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers/ADJSessionFailure.h.meta rename Assets/Adjust/iOS/{ => AdjustSdk.framework/Headers}/ADJSessionSuccess.h (82%) create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers/ADJSessionSuccess.h.meta rename Assets/Adjust/iOS/{ => AdjustSdk.framework/Headers}/ADJThirdPartySharing.h (90%) create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers/ADJThirdPartySharing.h.meta create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers/Adjust.h create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers/Adjust.h.meta create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers/AdjustSdk.h create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Headers/AdjustSdk.h.meta create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Modules.meta create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Modules/module.modulemap create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Modules/module.modulemap.meta create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Versions.meta create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Versions/A.meta create mode 120000 Assets/Adjust/iOS/AdjustSdk.framework/Versions/Current create mode 100644 Assets/Adjust/iOS/AdjustSdk.framework/Versions/Current.meta diff --git a/Assets/Adjust/Editor/AdjustCustomEditor.cs b/Assets/Adjust/Editor/AdjustCustomEditor.cs index 01621529..0c055f43 100644 --- a/Assets/Adjust/Editor/AdjustCustomEditor.cs +++ b/Assets/Adjust/Editor/AdjustCustomEditor.cs @@ -34,36 +34,25 @@ public override void OnInspectorGUI() adjust.appToken = EditorGUILayout.TextField("App Token", adjust.appToken); adjust.environment = (AdjustEnvironment)EditorGUILayout.EnumPopup("Environment", adjust.environment); adjust.logLevel = (AdjustLogLevel)EditorGUILayout.EnumPopup("Log Level", adjust.logLevel); - adjust.urlStrategy = (AdjustUrlStrategy)EditorGUILayout.EnumPopup("URL Strategy", adjust.urlStrategy); - adjust.eventBuffering = EditorGUILayout.Toggle("Event Buffering", adjust.eventBuffering); + // TODO: URL strategy missing adjust.sendInBackground = EditorGUILayout.Toggle("Send In Background", adjust.sendInBackground); adjust.launchDeferredDeeplink = EditorGUILayout.Toggle("Launch Deferred Deep Link", adjust.launchDeferredDeeplink); - adjust.needsCost = EditorGUILayout.Toggle("Cost Data In Attribution Callback", adjust.needsCost); - adjust.coppaCompliant = EditorGUILayout.Toggle("COPPA Compliant", adjust.coppaCompliant); + adjust.costDataInAttribution = EditorGUILayout.Toggle("Cost Data In Attribution Callback", adjust.costDataInAttribution); adjust.linkMe = EditorGUILayout.Toggle("LinkMe", adjust.linkMe); adjust.defaultTracker = EditorGUILayout.TextField("Default Tracker", adjust.defaultTracker); - adjust.startDelay = EditorGUILayout.DoubleField("Start Delay", adjust.startDelay); - EditorGUILayout.LabelField("App Secret:", EditorStyles.label); - EditorGUI.indentLevel += 1; - adjust.secretId = EditorGUILayout.LongField("Secret ID", adjust.secretId); - adjust.info1 = EditorGUILayout.LongField("Info 1", adjust.info1); - adjust.info2 = EditorGUILayout.LongField("Info 2", adjust.info2); - adjust.info3 = EditorGUILayout.LongField("Info 3", adjust.info3); - adjust.info4 = EditorGUILayout.LongField("Info 4", adjust.info4); - EditorGUI.indentLevel -= 2; + EditorGUI.indentLevel -= 1; EditorGUILayout.Space(); EditorGUILayout.LabelField("ANDROID SETTINGS:", darkerCyanTextFieldStyles); EditorGUI.indentLevel += 1; adjust.preinstallTracking = EditorGUILayout.Toggle("Preinstall Tracking", adjust.preinstallTracking); adjust.preinstallFilePath = EditorGUILayout.TextField("Preinstall File Path", adjust.preinstallFilePath); - adjust.playStoreKidsApp = EditorGUILayout.Toggle("Play Store Kids App", adjust.playStoreKidsApp); EditorGUI.indentLevel -= 1; EditorGUILayout.Space(); EditorGUILayout.LabelField("IOS SETTINGS:", darkerCyanTextFieldStyles); EditorGUI.indentLevel += 1; - adjust.adServicesInfoReading = EditorGUILayout.Toggle("AdServices Info Reading", adjust.adServicesInfoReading); - adjust.idfaInfoReading = EditorGUILayout.Toggle("IDFA Info Reading", adjust.idfaInfoReading); - adjust.skAdNetworkHandling = EditorGUILayout.Toggle("SKAdNetwork Handling", adjust.skAdNetworkHandling); + adjust.adServices = EditorGUILayout.Toggle("AdServices Info Reading", adjust.adServices); + adjust.idfaReading = EditorGUILayout.Toggle("IDFA Info Reading", adjust.idfaReading); + adjust.skanAttribution = EditorGUILayout.Toggle("SKAdNetwork Handling", adjust.skanAttribution); EditorGUI.indentLevel -= 1; } diff --git a/Assets/Adjust/ExampleGUI/ExampleGUI.cs b/Assets/Adjust/ExampleGUI/ExampleGUI.cs index 57a5490a..12e487ad 100644 --- a/Assets/Adjust/ExampleGUI/ExampleGUI.cs +++ b/Assets/Adjust/ExampleGUI/ExampleGUI.cs @@ -27,15 +27,15 @@ void OnGUI() if (!string.Equals(txtManualLaunch, "SDK Launched", StringComparison.OrdinalIgnoreCase)) { AdjustConfig adjustConfig = new AdjustConfig("2fm9gkqubvpc", AdjustEnvironment.Sandbox); - adjustConfig.setLogLevel(AdjustLogLevel.Verbose); - adjustConfig.setLogDelegate(msg => Debug.Log(msg)); - adjustConfig.setEventSuccessDelegate(EventSuccessCallback); - adjustConfig.setEventFailureDelegate(EventFailureCallback); - adjustConfig.setSessionSuccessDelegate(SessionSuccessCallback); - adjustConfig.setSessionFailureDelegate(SessionFailureCallback); - adjustConfig.setDeferredDeeplinkDelegate(DeferredDeeplinkCallback); - adjustConfig.setAttributionChangedDelegate(AttributionChangedCallback); - Adjust.start(adjustConfig); + adjustConfig.SetLogLevel(AdjustLogLevel.Verbose); + // adjustConfig.setLogDelegate(msg => Debug.Log(msg)); + // adjustConfig.setEventSuccessDelegate(EventSuccessCallback); + // adjustConfig.setEventFailureDelegate(EventFailureCallback); + // adjustConfig.setSessionSuccessDelegate(SessionSuccessCallback); + // adjustConfig.setSessionFailureDelegate(SessionFailureCallback); + // adjustConfig.setDeferredDeeplinkDelegate(DeferredDeeplinkCallback); + // adjustConfig.setAttributionChangedDelegate(AttributionChangedCallback); + Adjust.InitSdk(adjustConfig); isEnabled = true; txtManualLaunch = "SDK Launched"; @@ -45,64 +45,64 @@ void OnGUI() if (GUI.Button(new Rect(0, Screen.height * 1 / numberOfButtons, Screen.width, Screen.height / numberOfButtons), "Track Simple Event")) { AdjustEvent adjustEvent = new AdjustEvent("g3mfiw"); - Adjust.trackEvent(adjustEvent); + Adjust.TrackEvent(adjustEvent); } if (GUI.Button(new Rect(0, Screen.height * 2 / numberOfButtons, Screen.width, Screen.height / numberOfButtons), "Track Revenue Event")) { AdjustEvent adjustEvent = new AdjustEvent("a4fd35"); - adjustEvent.setRevenue(0.25, "EUR"); - Adjust.trackEvent(adjustEvent); + adjustEvent.SetRevenue(0.25, "EUR"); + Adjust.TrackEvent(adjustEvent); } if (GUI.Button(new Rect(0, Screen.height * 3 / numberOfButtons, Screen.width, Screen.height / numberOfButtons), "Track Callback Event")) { - AdjustEvent adjustEvent = new AdjustEvent("34vgg9"); - adjustEvent.addCallbackParameter("key", "value"); - adjustEvent.addCallbackParameter("foo", "bar"); - Adjust.trackEvent(adjustEvent); + // AdjustEvent adjustEvent = new AdjustEvent("34vgg9"); + // adjustEvent.addCallbackParameter("key", "value"); + // adjustEvent.addCallbackParameter("foo", "bar"); + // Adjust.trackEvent(adjustEvent); } if (GUI.Button(new Rect(0, Screen.height * 4 / numberOfButtons, Screen.width, Screen.height / numberOfButtons), "Track Partner Event")) { - AdjustEvent adjustEvent = new AdjustEvent("w788qs"); - adjustEvent.addPartnerParameter("key", "value"); - adjustEvent.addPartnerParameter("foo", "bar"); - Adjust.trackEvent(adjustEvent); + // AdjustEvent adjustEvent = new AdjustEvent("w788qs"); + // adjustEvent.addPartnerParameter("key", "value"); + // adjustEvent.addPartnerParameter("foo", "bar"); + // Adjust.trackEvent(adjustEvent); } if (GUI.Button(new Rect(0, Screen.height * 5 / numberOfButtons, Screen.width, Screen.height / numberOfButtons), txtSetOfflineMode)) { - if (string.Equals(txtSetOfflineMode, "Turn Offline Mode ON", StringComparison.OrdinalIgnoreCase)) - { - Adjust.setOfflineMode(true); - txtSetOfflineMode = "Turn Offline Mode OFF"; - } - else - { - Adjust.setOfflineMode(false); - txtSetOfflineMode = "Turn Offline Mode ON"; - } + // if (string.Equals(txtSetOfflineMode, "Turn Offline Mode ON", StringComparison.OrdinalIgnoreCase)) + // { + // Adjust.setOfflineMode(true); + // txtSetOfflineMode = "Turn Offline Mode OFF"; + // } + // else + // { + // Adjust.setOfflineMode(false); + // txtSetOfflineMode = "Turn Offline Mode ON"; + // } } if (GUI.Button(new Rect(0, Screen.height * 6 / numberOfButtons, Screen.width, Screen.height / numberOfButtons), txtSetEnabled)) { - if (string.Equals(txtSetEnabled, "Disable SDK", StringComparison.OrdinalIgnoreCase)) - { - Adjust.setEnabled(false); - txtSetEnabled = "Enable SDK"; - } - else - { - Adjust.setEnabled(true); - txtSetEnabled = "Disable SDK"; - } + // if (string.Equals(txtSetEnabled, "Disable SDK", StringComparison.OrdinalIgnoreCase)) + // { + // Adjust.setEnabled(false); + // txtSetEnabled = "Enable SDK"; + // } + // else + // { + // Adjust.setEnabled(true); + // txtSetEnabled = "Disable SDK"; + // } } if (GUI.Button(new Rect(0, Screen.height * 7 / numberOfButtons, Screen.width, Screen.height / numberOfButtons), "Is SDK Enabled?")) { - isEnabled = Adjust.isEnabled(); - showPopUp = true; + // isEnabled = Adjust.isEnabled(); + // showPopUp = true; } } @@ -160,10 +160,6 @@ public void AttributionChangedCallback(AdjustAttribution attributionData) { Debug.Log("Click label: " + attributionData.clickLabel); } - if (attributionData.adid != null) - { - Debug.Log("ADID: " + attributionData.adid); - } } public void EventSuccessCallback(AdjustEventSuccess eventSuccessData) diff --git a/Assets/Adjust/Test/CommandExecutor.cs b/Assets/Adjust/Test/CommandExecutor.cs index defa8682..03cf26e0 100644 --- a/Assets/Adjust/Test/CommandExecutor.cs +++ b/Assets/Adjust/Test/CommandExecutor.cs @@ -50,28 +50,26 @@ public void ExecuteCommand(Command command) case "resume": Resume(); break; case "pause": Pause(); break; case "setEnabled": SetEnabled(); break; - case "setReferrer": SetReferrer(); break; case "setOfflineMode": SetOfflineMode(); break; - case "sendFirstPackages": SendFirstPackages(); break; - case "addSessionCallbackParameter": AddSessionCallbackParameter(); break; - case "addSessionPartnerParameter": AddSessionPartnerParameter(); break; - case "removeSessionCallbackParameter": RemoveSessionCallbackParameter(); break; - case "removeSessionPartnerParameter": RemoveSessionPartnerParameter(); break; - case "resetSessionCallbackParameters": ResetSessionCallbackParameters(); break; - case "resetSessionPartnerParameters": ResetSessionPartnerParameters(); break; + case "addGlobalCallbackParameter": AddGlobalCallbackParameter(); break; + case "addGlobalPartnerParameter": AddGlobalPartnerParameter(); break; + case "removeGlobalCallbackParameter": RemoveGlobalCallbackParameter(); break; + case "removeGlobalPartnerParameter": RemoveGlobalPartnerParameter(); break; + case "removeGlobalCallbackParameters": RemoveGlobalCallbackParameters(); break; + case "removeGlobalPartnerParameters": RemoveGlobalPartnerParameters(); break; case "setPushToken": SetPushToken(); break; case "openDeeplink": OpenDeepLink(); break; - case "sendReferrer": SetReferrer(); break; case "gdprForgetMe": GdprForgetMe(); break; - case "trackAdRevenue": TrackAdRevenue(); break; - case "disableThirdPartySharing": DisableThirdPartySharing(); break; case "trackSubscription": TrackSubscription(); break; case "thirdPartySharing": ThirdPartySharing(); break; case "measurementConsent": MeasurementConsent(); break; - case "trackAdRevenueV2": TrackAdRevenueV2(); break; + case "trackAdRevenue": TrackAdRevenue(); break; case "getLastDeeplink": GetLastDeeplink(); break; case "verifyPurchase": VerifyPurchase(); break; - case "processDeeplink": ProcessDeeplink(); break; + case "processDeeplink": ProcessAndResolveDeeplink(); break; + case "attributionGetter": AttributionGetter(); break; + case "enableCoppaCompliance": EnableCoppaCompliance(); break; + case "disableCoppaCompliance": DisableCoppaCompliance(); break; default: CommandNotFound(_command.ClassName, _command.MethodName); break; } } @@ -260,7 +258,7 @@ private void Config() if (logLevel.HasValue) { - adjustConfig.setLogLevel(logLevel.Value); + adjustConfig.SetLogLevel(logLevel.Value); } #if (UNITY_WSA || UNITY_WP8) @@ -276,91 +274,42 @@ private void Config() if (_command.ContainsParameter("defaultTracker")) { - adjustConfig.setDefaultTracker(_command.GetFirstParameterValue("defaultTracker")); + adjustConfig.SetDefaultTracker(_command.GetFirstParameterValue("defaultTracker")); } if (_command.ContainsParameter("externalDeviceId")) { - adjustConfig.setExternalDeviceId(_command.GetFirstParameterValue("externalDeviceId")); - } - - if (_command.ContainsParameter("delayStart")) - { - var delayStartStr = _command.GetFirstParameterValue("delayStart"); - var delayStart = double.Parse(delayStartStr, System.Globalization.CultureInfo.InvariantCulture); - adjustConfig.setDelayStart(delayStart); - } - - if (_command.ContainsParameter("appSecret")) - { - var appSecretList = _command.Parameters["appSecret"]; - if (!string.IsNullOrEmpty(appSecretList[0]) && appSecretList.Count == 5) - { - long secretId, info1, info2, info3, info4; - long.TryParse(appSecretList[0], out secretId); - long.TryParse(appSecretList[1], out info1); - long.TryParse(appSecretList[2], out info2); - long.TryParse(appSecretList[3], out info3); - long.TryParse(appSecretList[4], out info4); - - adjustConfig.setAppSecret(secretId, info1, info2, info3, info4); - } - } - - if (_command.ContainsParameter("deviceKnown")) - { - var deviceKnownS = _command.GetFirstParameterValue("deviceKnown"); - var deviceKnown = deviceKnownS.ToLower() == "true"; - adjustConfig.setIsDeviceKnown(deviceKnown); - } - - if (_command.ContainsParameter("eventBufferingEnabled")) - { - var eventBufferingEnabledS = _command.GetFirstParameterValue("eventBufferingEnabled"); - var eventBufferingEnabled = eventBufferingEnabledS.ToLower() == "true"; - adjustConfig.setEventBufferingEnabled(eventBufferingEnabled); - } - - if (_command.ContainsParameter("coppaCompliant")) - { - var coppaCompliantS = _command.GetFirstParameterValue("coppaCompliant"); - var coppaCompliant = coppaCompliantS.ToLower() == "true"; - adjustConfig.setCoppaCompliantEnabled(coppaCompliant); - } - - if (_command.ContainsParameter("playStoreKids")) - { - var playStoreKidsS = _command.GetFirstParameterValue("playStoreKids"); - var playStoreKids = playStoreKidsS.ToLower() == "true"; - adjustConfig.setPlayStoreKidsAppEnabled(playStoreKids); - } - - if (_command.ContainsParameter("finalAttributionEnabled")) - { - var finalAndroidAttributionEnabledS = _command.GetFirstParameterValue("finalAttributionEnabled"); - var finalAndroidAttributionEnabled = finalAndroidAttributionEnabledS.ToLower() == "true"; - adjustConfig.setFinalAndroidAttributionEnabled(finalAndroidAttributionEnabled); + adjustConfig.SetExternalDeviceId(_command.GetFirstParameterValue("externalDeviceId")); } if (_command.ContainsParameter("sendInBackground")) { var sendInBackgroundS = _command.GetFirstParameterValue("sendInBackground"); var sendInBackground = sendInBackgroundS.ToLower() == "true"; - adjustConfig.sendInBackground = sendInBackground; + if (sendInBackground == true) + { + adjustConfig.EnableSendingInBackground(); + } } if (_command.ContainsParameter("allowAdServicesInfoReading")) { var allowAdServicesInfoReadingS = _command.GetFirstParameterValue("allowAdServicesInfoReading"); var allowAdServicesInfoReading = allowAdServicesInfoReadingS.ToLower() == "true"; - adjustConfig.allowAdServicesInfoReading = allowAdServicesInfoReading; + if (allowAdServicesInfoReading == false) + { + adjustConfig.DisableAdServices(); + } } if (_command.ContainsParameter("allowIdfaReading")) { var allowIdfaReadingS = _command.GetFirstParameterValue("allowIdfaReading"); var allowIdfaReading = allowIdfaReadingS.ToLower() == "true"; - adjustConfig.allowIdfaReading = allowIdfaReading; + if (allowIdfaReading == false) + { + adjustConfig.DisableIdfaReading(); + } } if (_command.ContainsParameter("allowSkAdNetworkHandling")) @@ -369,20 +318,7 @@ private void Config() var allowSkAdNetworkHandling = allowSkAdNetworkHandlingS.ToLower() == "true"; if (allowSkAdNetworkHandling == false) { - adjustConfig.deactivateSKAdNetworkHandling(); - } - } - - if (_command.ContainsParameter("userAgent")) - { - var userAgent = _command.GetFirstParameterValue("userAgent"); - if (userAgent.Equals("null")) - { - adjustConfig.setUserAgent(null); - } - else - { - adjustConfig.setUserAgent(userAgent); + adjustConfig.DisableSkanAttribution(); } } @@ -390,15 +326,25 @@ private void Config() { var attConsentWaitingSecondsStr = _command.GetFirstParameterValue("attConsentWaitingSeconds"); var attConsentWaitingSeconds = int.Parse(attConsentWaitingSecondsStr, System.Globalization.CultureInfo.InvariantCulture); - adjustConfig.setAttConsentWaitingInterval(attConsentWaitingSeconds); + adjustConfig.SetAttConsentWaitingInterval(attConsentWaitingSeconds); + } + + if (_command.ContainsParameter("eventDeduplicationIdsMaxSize")) + { + var eventDeduplicationIdsMaxSizeStr = _command.GetFirstParameterValue("eventDeduplicationIdsMaxSize"); + var eventDeduplicationIdsMaxSize = int.Parse(eventDeduplicationIdsMaxSizeStr, System.Globalization.CultureInfo.InvariantCulture); + adjustConfig.SetEventDeduplicationIdsMaxSize(eventDeduplicationIdsMaxSize); } if (_command.ContainsParameter("deferredDeeplinkCallback")) { bool launchDeferredDeeplink = _command.GetFirstParameterValue("deferredDeeplinkCallback") == "true"; - adjustConfig.setLaunchDeferredDeeplink(launchDeferredDeeplink); + if (launchDeferredDeeplink == false) + { + adjustConfig.DisableDeferredDeeplinkOpening(); + } string localExtraPath = ExtraPath; - adjustConfig.setDeferredDeeplinkDelegate(uri => + adjustConfig.SetDeferredDeeplinkDelegate(uri => { _testLibrary.AddInfoToSend("deeplink", uri); _testLibrary.SendInfoToServer(localExtraPath); @@ -408,20 +354,19 @@ private void Config() if (_command.ContainsParameter("attributionCallbackSendAll")) { string localExtraPath = ExtraPath; - adjustConfig.setAttributionChangedDelegate(attribution => + adjustConfig.SetAttributionChangedDelegate(attribution => { - _testLibrary.AddInfoToSend("trackerToken", attribution.trackerToken); - _testLibrary.AddInfoToSend("trackerName", attribution.trackerName); + _testLibrary.AddInfoToSend("tracker_token", attribution.trackerToken); + _testLibrary.AddInfoToSend("tracker_name", attribution.trackerName); _testLibrary.AddInfoToSend("network", attribution.network); _testLibrary.AddInfoToSend("campaign", attribution.campaign); _testLibrary.AddInfoToSend("adgroup", attribution.adgroup); _testLibrary.AddInfoToSend("creative", attribution.creative); - _testLibrary.AddInfoToSend("clickLabel", attribution.clickLabel); - _testLibrary.AddInfoToSend("adid", attribution.adid); - _testLibrary.AddInfoToSend("costType", attribution.costType); - _testLibrary.AddInfoToSend("costAmount", attribution.costAmount.ToString()); - _testLibrary.AddInfoToSend("costCurrency", attribution.costCurrency); - _testLibrary.AddInfoToSend("fbInstallReferrer", attribution.fbInstallReferrer); + _testLibrary.AddInfoToSend("click_label", attribution.clickLabel); + _testLibrary.AddInfoToSend("cost_type", attribution.costType); + _testLibrary.AddInfoToSend("cost_amount", attribution.costAmount.ToString()); + _testLibrary.AddInfoToSend("cost_currency", attribution.costCurrency); + _testLibrary.AddInfoToSend("fb_install_referrer", attribution.fbInstallReferrer); _testLibrary.SendInfoToServer(localExtraPath); }); } @@ -429,7 +374,7 @@ private void Config() if (_command.ContainsParameter("sessionCallbackSendSuccess")) { string localExtraPath = ExtraPath; - adjustConfig.setSessionSuccessDelegate(sessionSuccessResponseData => + adjustConfig.SetSessionSuccessDelegate(sessionSuccessResponseData => { _testLibrary.AddInfoToSend("message", sessionSuccessResponseData.Message); _testLibrary.AddInfoToSend("timestamp", sessionSuccessResponseData.Timestamp); @@ -445,7 +390,7 @@ private void Config() if (_command.ContainsParameter("sessionCallbackSendFailure")) { string localExtraPath = ExtraPath; - adjustConfig.setSessionFailureDelegate(sessionFailureResponseData => + adjustConfig.SetSessionFailureDelegate(sessionFailureResponseData => { _testLibrary.AddInfoToSend("message", sessionFailureResponseData.Message); _testLibrary.AddInfoToSend("timestamp", sessionFailureResponseData.Timestamp); @@ -462,7 +407,7 @@ private void Config() if (_command.ContainsParameter("eventCallbackSendSuccess")) { string localExtraPath = ExtraPath; - adjustConfig.setEventSuccessDelegate(eventSuccessResponseData => + adjustConfig.SetEventSuccessDelegate(eventSuccessResponseData => { _testLibrary.AddInfoToSend("message", eventSuccessResponseData.Message); _testLibrary.AddInfoToSend("timestamp", eventSuccessResponseData.Timestamp); @@ -480,7 +425,7 @@ private void Config() if (_command.ContainsParameter("eventCallbackSendFailure")) { string localExtraPath = ExtraPath; - adjustConfig.setEventFailureDelegate(eventFailureResponseData => + adjustConfig.SetEventFailureDelegate(eventFailureResponseData => { _testLibrary.AddInfoToSend("message", eventFailureResponseData.Message); _testLibrary.AddInfoToSend("timestamp", eventFailureResponseData.Timestamp); @@ -495,6 +440,19 @@ private void Config() _testLibrary.SendInfoToServer(localExtraPath); }); } + + if (_command.ContainsParameter("skanCallback")) + { + string localExtraPath = ExtraPath; + adjustConfig.SetSkanUpdatedDelegate(skanUpdatedData => + { + foreach (KeyValuePair entry in skanUpdatedData) + { + _testLibrary.AddInfoToSend(entry.Key, entry.Value); + } + _testLibrary.SendInfoToServer(localExtraPath); + }); + } } private void Start() @@ -509,7 +467,7 @@ private void Start() } var adjustConfig = _savedConfigs[configNumber]; - Adjust.start(adjustConfig); + Adjust.InitSdk(adjustConfig); _savedConfigs.Remove(0); } @@ -539,7 +497,7 @@ private void Event() var revenueParams = _command.Parameters["revenue"]; var currency = revenueParams[0]; var revenue = double.Parse(revenueParams[1], System.Globalization.CultureInfo.InvariantCulture); - adjustEvent.setRevenue(revenue, currency); + adjustEvent.SetRevenue(revenue, currency); } if (_command.ContainsParameter("callbackParams")) @@ -549,7 +507,7 @@ private void Event() { var key = callbackParams[i]; var value = callbackParams[i + 1]; - adjustEvent.addCallbackParameter(key, value); + adjustEvent.AddCallbackParameter(key, value); } } @@ -560,44 +518,50 @@ private void Event() { var key = partnerParams[i]; var value = partnerParams[i + 1]; - adjustEvent.addPartnerParameter(key, value); + adjustEvent.AddPartnerParameter(key, value); } } if (_command.ContainsParameter("orderId")) { var orderId = _command.GetFirstParameterValue("orderId"); - adjustEvent.setTransactionId(orderId); + adjustEvent.SetOrderId(orderId); } if (_command.ContainsParameter("callbackId")) { var callbackId = _command.GetFirstParameterValue("callbackId"); - adjustEvent.setCallbackId(callbackId); + adjustEvent.SetCallbackId(callbackId); } if (_command.ContainsParameter("transactionId")) { var transactionId = _command.GetFirstParameterValue("transactionId"); - adjustEvent.setTransactionId(transactionId); + adjustEvent.SetTransactionId(transactionId); } if (_command.ContainsParameter("productId")) { var productId = _command.GetFirstParameterValue("productId"); - adjustEvent.setProductId(productId); + adjustEvent.SetProductId(productId); } if (_command.ContainsParameter("receipt")) { var receipt = _command.GetFirstParameterValue("receipt"); - adjustEvent.setReceipt(receipt); + adjustEvent.SetReceipt(receipt); } if (_command.ContainsParameter("purchaseToken")) { var purchaseToken = _command.GetFirstParameterValue("purchaseToken"); - adjustEvent.setPurchaseToken(purchaseToken); + adjustEvent.SetPurchaseToken(purchaseToken); + } + + if (_command.ContainsParameter("deduplicationId")) + { + var deduplicationId = _command.GetFirstParameterValue("deduplicationId"); + adjustEvent.SetDeduplicationId(deduplicationId); } } @@ -613,7 +577,7 @@ private void TrackEvent() } var adjustEvent = _savedEvents[eventNumber]; - Adjust.trackEvent(adjustEvent); + Adjust.TrackEvent(adjustEvent); _savedEvents.Remove(0); } @@ -646,34 +610,35 @@ private void Pause() private void SetEnabled() { var enabled = bool.Parse(_command.GetFirstParameterValue("enabled")); - Adjust.setEnabled(enabled); + if (enabled == true) + { + Adjust.Enable(); + } + else + { + Adjust.Disable(); + } } public void GdprForgetMe() { - Adjust.gdprForgetMe(); - } - - public void DisableThirdPartySharing() - { - Adjust.disableThirdPartySharing(); + Adjust.GdprForgetMe(); } private void SetOfflineMode() { var enabled = bool.Parse(_command.GetFirstParameterValue("enabled")); - Adjust.setOfflineMode(enabled); - } - - private void SetReferrer() - { - string referrer = _command.GetFirstParameterValue("referrer"); - #pragma warning disable CS0618 - Adjust.setReferrer(referrer); - #pragma warning restore CS0618 + if (enabled == true) + { + Adjust.SwitchToOfflineMode(); + } + else + { + Adjust.SwitchBackToOnlineMode(); + } } - private void AddSessionCallbackParameter() + private void AddGlobalCallbackParameter() { if (!_command.ContainsParameter("KeyValue")) { @@ -685,16 +650,11 @@ private void AddSessionCallbackParameter() { var key = keyValuePairs[i]; var value = keyValuePairs[i + 1]; - Adjust.addSessionCallbackParameter(key, value); + Adjust.AddGlobalCallbackParameter(key, value); } } - private void SendFirstPackages() - { - Adjust.sendFirstPackages(); - } - - private void AddSessionPartnerParameter() + private void AddGlobalPartnerParameter() { if (!_command.ContainsParameter("KeyValue")) { @@ -706,11 +666,11 @@ private void AddSessionPartnerParameter() { var key = keyValuePairs[i]; var value = keyValuePairs[i + 1]; - Adjust.addSessionPartnerParameter(key, value); + Adjust.AddGlobalPartnerParameter(key, value); } } - private void RemoveSessionCallbackParameter() + private void RemoveGlobalCallbackParameter() { if (!_command.ContainsParameter("key")) { @@ -721,11 +681,11 @@ private void RemoveSessionCallbackParameter() for (var i = 0; i < keys.Count; i = i + 1) { var key = keys[i]; - Adjust.removeSessionCallbackParameter(key); + Adjust.RemoveGlobalCallbackParameter(key); } } - private void RemoveSessionPartnerParameter() + private void RemoveGlobalPartnerParameter() { if (!_command.ContainsParameter("key")) { @@ -736,28 +696,18 @@ private void RemoveSessionPartnerParameter() for (var i = 0; i < keys.Count; i = i + 1) { var key = keys[i]; - Adjust.removeSessionPartnerParameter(key); + Adjust.RemoveGlobalPartnerParameter(key); } } - private void ResetSessionCallbackParameters() - { - Adjust.resetSessionCallbackParameters(); - } - - private void ResetSessionPartnerParameters() - { - Adjust.resetSessionPartnerParameters(); - } - - private void ResetSessionCallbackParameters(JSONNode parameters) + private void RemoveGlobalCallbackParameters() { - Adjust.resetSessionCallbackParameters(); + Adjust.RemoveGlobalCallbackParameters(); } - private void ResetSessionPartnerParameters(JSONNode parameters) + private void RemoveGlobalPartnerParameters() { - Adjust.resetSessionPartnerParameters(); + Adjust.RemoveGlobalPartnerParameters(); } private void SetPushToken() @@ -768,11 +718,11 @@ private void SetPushToken() { if (pushToken.Equals("null")) { - Adjust.setDeviceToken(null); + Adjust.SetPushToken(null); } else { - Adjust.setDeviceToken(pushToken); + Adjust.SetPushToken(pushToken); } } } @@ -780,14 +730,7 @@ private void SetPushToken() private void OpenDeepLink() { var deeplink = _command.GetFirstParameterValue("deeplink"); - Adjust.appWillOpenUrl(deeplink); - } - - private void TrackAdRevenue() - { - string source = _command.GetFirstParameterValue("adRevenueSource"); - string payload = _command.GetFirstParameterValue("adRevenueJsonString"); - Adjust.trackAdRevenue(source, payload); + Adjust.ProcessDeeplink(deeplink); } private void TrackSubscription() @@ -805,8 +748,8 @@ private void TrackSubscription() currency, transactionId, receipt); - subscription.setTransactionDate(transactionDate); - subscription.setSalesRegion(salesRegion); + subscription.SetTransactionDate(transactionDate); + subscription.SetSalesRegion(salesRegion); if (_command.ContainsParameter("callbackParams")) { @@ -815,7 +758,7 @@ private void TrackSubscription() { var key = callbackParams[i]; var value = callbackParams[i + 1]; - subscription.addCallbackParameter(key, value); + subscription.AddCallbackParameter(key, value); } } @@ -826,11 +769,11 @@ private void TrackSubscription() { var key = partnerParams[i]; var value = partnerParams[i + 1]; - subscription.addPartnerParameter(key, value); + subscription.AddPartnerParameter(key, value); } } - Adjust.trackAppStoreSubscription(subscription); + Adjust.TrackAppStoreSubscription(subscription); #elif UNITY_ANDROID string price = _command.GetFirstParameterValue("revenue"); string currency = _command.GetFirstParameterValue("currency"); @@ -847,7 +790,7 @@ private void TrackSubscription() orderId, signature, purchaseToken); - subscription.setPurchaseTime(purchaseTime); + subscription.SetPurchaseTime(purchaseTime); if (_command.ContainsParameter("callbackParams")) { @@ -856,7 +799,7 @@ private void TrackSubscription() { var key = callbackParams[i]; var value = callbackParams[i + 1]; - subscription.addCallbackParameter(key, value); + subscription.AddCallbackParameter(key, value); } } @@ -867,11 +810,11 @@ private void TrackSubscription() { var key = partnerParams[i]; var value = partnerParams[i + 1]; - subscription.addPartnerParameter(key, value); + subscription.AddPartnerParameter(key, value); } } - Adjust.trackPlayStoreSubscription(subscription); + Adjust.TrackPlayStoreSubscription(subscription); #endif } @@ -894,7 +837,7 @@ private void ThirdPartySharing() var partnerName = granularOptions[i]; var key = granularOptions[i+1]; var value = granularOptions[i+2]; - adjustThirdPartySharing.addGranularOption(partnerName, key, value); + adjustThirdPartySharing.AddGranularOption(partnerName, key, value); } } @@ -906,20 +849,20 @@ private void ThirdPartySharing() var partnerName = partnerSharingSettings[i]; var key = partnerSharingSettings[i+1]; var value = partnerSharingSettings[i+2]; - adjustThirdPartySharing.addPartnerSharingSetting(partnerName, key, bool.Parse(value)); + adjustThirdPartySharing.AddPartnerSharingSetting(partnerName, key, bool.Parse(value)); } } - Adjust.trackThirdPartySharing(adjustThirdPartySharing); + Adjust.TrackThirdPartySharing(adjustThirdPartySharing); } private void MeasurementConsent() { var enabled = bool.Parse(_command.GetFirstParameterValue("isEnabled")); - Adjust.trackMeasurementConsent(enabled); + Adjust.TrackMeasurementConsent(enabled); } - private void TrackAdRevenueV2() + private void TrackAdRevenue() { string source = _command.GetFirstParameterValue("adRevenueSource"); AdjustAdRevenue adRevenue = new AdjustAdRevenue(source); @@ -929,31 +872,31 @@ private void TrackAdRevenueV2() var revenueParams = _command.Parameters["revenue"]; var currency = revenueParams[0]; var revenue = double.Parse(revenueParams[1], System.Globalization.CultureInfo.InvariantCulture); - adRevenue.setRevenue(revenue, currency); + adRevenue.SetRevenue(revenue, currency); } if (_command.ContainsParameter("adImpressionsCount")) { int adImpressionsCount = int.Parse(_command.GetFirstParameterValue("adImpressionsCount")); - adRevenue.setAdImpressionsCount(adImpressionsCount); + adRevenue.SetAdImpressionsCount(adImpressionsCount); } if (_command.ContainsParameter("adRevenueUnit")) { string adRevenueUnit = _command.GetFirstParameterValue("adRevenueUnit"); - adRevenue.setAdRevenueUnit(adRevenueUnit); + adRevenue.SetAdRevenueUnit(adRevenueUnit); } if (_command.ContainsParameter("adRevenuePlacement")) { string adRevenuePlacement = _command.GetFirstParameterValue("adRevenuePlacement"); - adRevenue.setAdRevenuePlacement(adRevenuePlacement); + adRevenue.SetAdRevenuePlacement(adRevenuePlacement); } if (_command.ContainsParameter("adRevenueNetwork")) { string adRevenueNetwork = _command.GetFirstParameterValue("adRevenueNetwork"); - adRevenue.setAdRevenueNetwork(adRevenueNetwork); + adRevenue.SetAdRevenueNetwork(adRevenueNetwork); } if (_command.ContainsParameter("callbackParams")) @@ -963,7 +906,7 @@ private void TrackAdRevenueV2() { var key = callbackParams[i]; var value = callbackParams[i + 1]; - adRevenue.addCallbackParameter(key, value); + adRevenue.AddCallbackParameter(key, value); } } @@ -974,20 +917,17 @@ private void TrackAdRevenueV2() { var key = partnerParams[i]; var value = partnerParams[i + 1]; - adRevenue.addPartnerParameter(key, value); + adRevenue.AddPartnerParameter(key, value); } } - Adjust.trackAdRevenue(adRevenue); + Adjust.TrackAdRevenue(adRevenue); } private void GetLastDeeplink() { #if UNITY_IOS - string localExtraPath = ExtraPath; - string lastDeeplink = Adjust.getLastDeeplink(); - _testLibrary.AddInfoToSend("last_deeplink", lastDeeplink); - _testLibrary.SendInfoToServer(localExtraPath); + Adjust.GetLastDeeplink(LastDeeplinkCallback); #endif } @@ -998,16 +938,12 @@ private void VerifyPurchase() string productId = _command.GetFirstParameterValue("productId"); string receipt = _command.GetFirstParameterValue("receipt"); - // recreate UnityIAP base64 encoding of the receipt - var receiptBytes = System.Text.Encoding.UTF8.GetBytes(receipt); - string receiptBase64 = System.Convert.ToBase64String(receiptBytes); - AdjustAppStorePurchase purchase = new AdjustAppStorePurchase( transactionId, productId, - receiptBase64); + receipt); - Adjust.verifyAppStorePurchase(purchase, VerificationInfoCallback); + Adjust.VerifyAppStorePurchase(purchase, VerificationInfoCallback); #elif UNITY_ANDROID string productId = _command.GetFirstParameterValue("productId"); string purchaseToken = _command.GetFirstParameterValue("purchaseToken"); @@ -1020,20 +956,48 @@ private void VerifyPurchase() #endif } - private void ProcessDeeplink() + private void ProcessAndResolveDeeplink() { var deeplink = _command.GetFirstParameterValue("deeplink"); - Adjust.processDeeplink(deeplink, DeeplinkResolvedCallback); + Adjust.ProcessAndResolveDeeplink(deeplink, DeeplinkResolvedCallback); } - // helper methods + private void AttributionGetter() + { + string localExtraPath = ExtraPath; + Adjust.GetAttribution((attribution) => { + _testLibrary.AddInfoToSend("tracker_token", attribution.trackerToken); + _testLibrary.AddInfoToSend("tracker_name", attribution.trackerName); + _testLibrary.AddInfoToSend("network", attribution.network); + _testLibrary.AddInfoToSend("campaign", attribution.campaign); + _testLibrary.AddInfoToSend("adgroup", attribution.adgroup); + _testLibrary.AddInfoToSend("creative", attribution.creative); + _testLibrary.AddInfoToSend("click_label", attribution.clickLabel); + _testLibrary.AddInfoToSend("cost_type", attribution.costType); + _testLibrary.AddInfoToSend("cost_amount", attribution.costAmount.ToString()); + _testLibrary.AddInfoToSend("cost_currency", attribution.costCurrency); + _testLibrary.AddInfoToSend("fb_install_referrer", attribution.fbInstallReferrer); + _testLibrary.SendInfoToServer(localExtraPath); + }); + } + private void EnableCoppaCompliance() + { + Adjust.EnableCoppaCompliance(); + } + + private void DisableCoppaCompliance() + { + Adjust.DisableCoppaCompliance(); + } + + // helper methods private void VerificationInfoCallback(AdjustPurchaseVerificationInfo verificationInfo) { string localExtraPath = ExtraPath; - _testLibrary.AddInfoToSend("verification_status", verificationInfo.verificationStatus); - _testLibrary.AddInfoToSend("code", verificationInfo.code.ToString()); - _testLibrary.AddInfoToSend("message", verificationInfo.message); + _testLibrary.AddInfoToSend("verification_status", verificationInfo.VerificationStatus); + _testLibrary.AddInfoToSend("code", verificationInfo.Code.ToString()); + _testLibrary.AddInfoToSend("message", verificationInfo.Message); _testLibrary.SendInfoToServer(localExtraPath); } @@ -1044,6 +1008,13 @@ private void DeeplinkResolvedCallback(string resolvedLink) _testLibrary.SendInfoToServer(localExtraPath); } + private void LastDeeplinkCallback(string lastDeeplink) + { + string localExtraPath = ExtraPath; + _testLibrary.AddInfoToSend("last_deeplink", lastDeeplink); + _testLibrary.SendInfoToServer(localExtraPath); + } + private void CommandNotFound(string className, string methodName) { TestApp.Log("Adjust Test: Method '" + methodName + "' not found for class '" + className + "'"); diff --git a/Assets/Adjust/Test/TestApp.cs b/Assets/Adjust/Test/TestApp.cs index 4bacf9e1..f46cee88 100644 --- a/Assets/Adjust/Test/TestApp.cs +++ b/Assets/Adjust/Test/TestApp.cs @@ -12,11 +12,11 @@ public class TestApp : MonoBehaviour #if UNITY_ANDROID private const string PORT = ":8443"; private const string PROTOCOL = "https://"; - private const string IP = "192.168.8.65"; + private const string IP = "192.168.8.218"; #elif UNITY_IOS private const string PORT = ":8080"; private const string PROTOCOL = "http://"; - private const string IP = "192.168.8.65"; + private const string IP = "192.168.8.218"; private TestLibraryiOS _testLibraryiOS; #else private const string PORT = ":8080"; @@ -41,7 +41,7 @@ private void StartTestSession() _testLibraryiOS = testLibrary as TestLibraryiOS; #endif // Set specific tests to run. - // testLibrary.AddTest("Test_PurchaseVerification_android_after_install"); + // testLibrary.AddTest("Test_Event_purchase_verification_ios"); // testLibrary.AddTestDirectory ("purchase-verification"); Log("Starting test session."); diff --git a/Assets/Adjust/Test/TestLibraryiOS.cs b/Assets/Adjust/Test/TestLibraryiOS.cs index acc71a73..7fe57ad2 100644 --- a/Assets/Adjust/Test/TestLibraryiOS.cs +++ b/Assets/Adjust/Test/TestLibraryiOS.cs @@ -17,7 +17,9 @@ public TestLibraryiOS(string overwriteUrl, string controlUrl) public void StartTestSession() { TestApp.Log("TestLibrary -> StartTestSession()"); - TestLibraryBridgeiOS.StartTestSession(Adjust.getSdkVersion()); + Adjust.GetSdkVersion((sdkVersion) => { + TestLibraryBridgeiOS.StartTestSession("unity5.0.0@" + sdkVersion); + }); } public void AddInfoToSend(string key, string paramValue) diff --git a/Assets/Adjust/Unity/Adjust.cs b/Assets/Adjust/Unity/Adjust.cs index 269adf7d..46b408e2 100644 --- a/Assets/Adjust/Unity/Adjust.cs +++ b/Assets/Adjust/Unity/Adjust.cs @@ -8,7 +8,7 @@ public class Adjust : MonoBehaviour { private const string errorMsgEditor = "[Adjust]: SDK can not be used in Editor."; private const string errorMsgStart = "[Adjust]: SDK not started. Start it manually using the 'start' method."; - private const string errorMsgPlatform = "[Adjust]: SDK can only be used in Android, iOS, Windows Phone 8.1, Windows Store or Universal Windows apps."; + private const string errorMsgPlatform = "[Adjust]: SDK can only be used in Android and iOS apps."; // [Header("SDK SETTINGS:")] // [Space(5)] @@ -23,36 +23,15 @@ public class Adjust : MonoBehaviour [HideInInspector] public AdjustLogLevel logLevel = AdjustLogLevel.Info; [HideInInspector] - public bool eventBuffering = false; - [HideInInspector] public bool sendInBackground = false; [HideInInspector] public bool launchDeferredDeeplink = true; [HideInInspector] - public bool needsCost = false; - [HideInInspector] - public bool coppaCompliant = false; + public bool costDataInAttribution = false; [HideInInspector] public bool linkMe = false; [HideInInspector] public string defaultTracker; - [HideInInspector] - public AdjustUrlStrategy urlStrategy = AdjustUrlStrategy.Default; - [HideInInspector] - public double startDelay = 0; - - // [Header("APP SECRET:")] - // [Space(5)] - [HideInInspector] - public long secretId = 0; - [HideInInspector] - public long info1 = 0; - [HideInInspector] - public long info2 = 0; - [HideInInspector] - public long info3 = 0; - [HideInInspector] - public long info4 = 0; // [Header("ANDROID SPECIFIC FEATURES:")] // [Space(5)] @@ -60,33 +39,38 @@ public class Adjust : MonoBehaviour public bool preinstallTracking = false; [HideInInspector] public string preinstallFilePath; - [HideInInspector] - public bool playStoreKidsApp = false; // [Header("iOS SPECIFIC FEATURES:")] // [Space(5)] [HideInInspector] - public bool adServicesInfoReading = true; + public bool adServices = true; [HideInInspector] - public bool idfaInfoReading = true; + public bool idfaReading = true; [HideInInspector] - public bool skAdNetworkHandling = true; + public bool skanAttribution = true; #if UNITY_IOS - // Delegate references for iOS callback triggering - private static List> authorizationStatusDelegates = null; - private static Action deferredDeeplinkDelegate = null; - private static Action eventSuccessDelegate = null; - private static Action eventFailureDelegate = null; + // subscriptions + private static Action attributionChangedDelegate = null; private static Action sessionSuccessDelegate = null; private static Action sessionFailureDelegate = null; - private static Action attributionChangedDelegate = null; - private static Action conversionValueUpdatedDelegate = null; - private static Action skad4ConversionValueUpdatedDelegate = null; - private static Action skadUpdateConversionValueDelegate = null; - private static Action skad4UpdateConversionValueDelegate = null; + private static Action eventSuccessDelegate = null; + private static Action eventFailureDelegate = null; + private static Action deferredDeeplinkDelegate = null; + private static Action> skanUpdatedDelegate = null; + + // callbacks as method parameters + private static List> authorizationStatusDelegates = null; private static Action verificationInfoDelegate = null; private static Action deeplinkResolutionDelegate = null; + private static Action skanErrorDelegate = null; + private static Action getIsEnabledDelegate = null; + private static Action getAttributionDelegate = null; + private static Action getAdidDelegate = null; + private static Action getIdfaDelegate = null; + private static Action getIdfvDelegate = null; + private static Action getSdkVersionDelegate = null; + private static Action getLastDeeplinkDelegate = null; #endif void Awake() @@ -98,75 +82,63 @@ void Awake() DontDestroyOnLoad(transform.gameObject); + // TODO: double-check the state of Unity on deep linking nowadays #if UNITY_ANDROID && UNITY_2019_2_OR_NEWER Application.deepLinkActivated += Adjust.appWillOpenUrl; if (!string.IsNullOrEmpty(Application.absoluteURL)) { - // Cold start and Application.absoluteURL not null so process Deep Link. + // cold start and Application.absoluteURL not null so process deep link Adjust.appWillOpenUrl(Application.absoluteURL); } #endif if (!this.startManually) { - AdjustConfig adjustConfig = new AdjustConfig(this.appToken, this.environment, (this.logLevel == AdjustLogLevel.Suppress)); - adjustConfig.setLogLevel(this.logLevel); - adjustConfig.setSendInBackground(this.sendInBackground); - adjustConfig.setEventBufferingEnabled(this.eventBuffering); - adjustConfig.setLaunchDeferredDeeplink(this.launchDeferredDeeplink); - adjustConfig.setDefaultTracker(this.defaultTracker); - adjustConfig.setUrlStrategy(this.urlStrategy.ToLowerCaseString()); - adjustConfig.setAppSecret(this.secretId, this.info1, this.info2, this.info3, this.info4); - adjustConfig.setDelayStart(this.startDelay); - adjustConfig.setNeedsCost(this.needsCost); - adjustConfig.setPreinstallTrackingEnabled(this.preinstallTracking); - adjustConfig.setPreinstallFilePath(this.preinstallFilePath); - adjustConfig.setAllowAdServicesInfoReading(this.adServicesInfoReading); - adjustConfig.setAllowIdfaReading(this.idfaInfoReading); - adjustConfig.setCoppaCompliantEnabled(this.coppaCompliant); - adjustConfig.setPlayStoreKidsAppEnabled(this.playStoreKidsApp); - adjustConfig.setLinkMeEnabled(this.linkMe); - if (!skAdNetworkHandling) + AdjustConfig adjustConfig = new AdjustConfig( + this.appToken, + this.environment, + (this.logLevel == AdjustLogLevel.Suppress)); + adjustConfig.SetLogLevel(this.logLevel); + if (this.sendInBackground == true) { - adjustConfig.deactivateSKAdNetworkHandling(); + adjustConfig.EnableSendingInBackground(); } - Adjust.start(adjustConfig); - } - } - - void OnApplicationPause(bool pauseStatus) - { - if (IsEditor()) - { - return; - } - -#if UNITY_IOS - // No action, iOS SDK is subscribed to iOS lifecycle notifications. -#elif UNITY_ANDROID - if (pauseStatus) + if (this.launchDeferredDeeplink == false) { - AdjustAndroid.OnPause(); + adjustConfig.DisableDeferredDeeplinkOpening(); } - else + adjustConfig.SetDefaultTracker(this.defaultTracker); + // TODO: URL strategy + if (this.costDataInAttribution == true) { - AdjustAndroid.OnResume(); + adjustConfig.EnableCostDataInAttribution(); } -#elif (UNITY_WSA || UNITY_WP8) - if (pauseStatus) + if (this.preinstallTracking == true) { - AdjustWindows.OnPause(); + adjustConfig.EnablePreinstallTracking(); } - else + adjustConfig.SetPreinstallFilePath(this.preinstallFilePath); + if (this.adServices == false) { - AdjustWindows.OnResume(); + adjustConfig.DisableAdServices(); } -#else - Debug.Log(errorMsgPlatform); -#endif + if (this.idfaReading == false) + { + adjustConfig.DisableIdfaReading(); + } + if (this.linkMe == true) + { + adjustConfig.EnableLinkMe(); + } + if (this.skanAttribution == false) + { + adjustConfig.DisableSkanAttribution(); + } + Adjust.InitSdk(adjustConfig); + } } - public static void start(AdjustConfig adjustConfig) + public static void InitSdk(AdjustConfig adjustConfig) { if (IsEditor()) { @@ -180,15 +152,14 @@ public static void start(AdjustConfig adjustConfig) } #if UNITY_IOS - Adjust.eventSuccessDelegate = adjustConfig.getEventSuccessDelegate(); - Adjust.eventFailureDelegate = adjustConfig.getEventFailureDelegate(); - Adjust.sessionSuccessDelegate = adjustConfig.getSessionSuccessDelegate(); - Adjust.sessionFailureDelegate = adjustConfig.getSessionFailureDelegate(); - Adjust.deferredDeeplinkDelegate = adjustConfig.getDeferredDeeplinkDelegate(); - Adjust.attributionChangedDelegate = adjustConfig.getAttributionChangedDelegate(); - Adjust.conversionValueUpdatedDelegate = adjustConfig.getConversionValueUpdatedDelegate(); - Adjust.skad4ConversionValueUpdatedDelegate = adjustConfig.getSkad4ConversionValueUpdatedDelegate(); - AdjustiOS.Start(adjustConfig); + Adjust.eventSuccessDelegate = adjustConfig.GetEventSuccessDelegate(); + Adjust.eventFailureDelegate = adjustConfig.GetEventFailureDelegate(); + Adjust.sessionSuccessDelegate = adjustConfig.GetSessionSuccessDelegate(); + Adjust.sessionFailureDelegate = adjustConfig.GetSessionFailureDelegate(); + Adjust.deferredDeeplinkDelegate = adjustConfig.GetDeferredDeeplinkDelegate(); + Adjust.attributionChangedDelegate = adjustConfig.GetAttributionChangedDelegate(); + Adjust.skanUpdatedDelegate = adjustConfig.GetSkanUpdatedDelegate(); + AdjustiOS.InitSdk(adjustConfig); #elif UNITY_ANDROID AdjustAndroid.Start(adjustConfig); #elif (UNITY_WSA || UNITY_WP8) @@ -198,7 +169,7 @@ public static void start(AdjustConfig adjustConfig) #endif } - public static void trackEvent(AdjustEvent adjustEvent) + public static void TrackEvent(AdjustEvent adjustEvent) { if (IsEditor()) { @@ -221,7 +192,7 @@ public static void trackEvent(AdjustEvent adjustEvent) #endif } - public static void setEnabled(bool enabled) + public static void Enable() { if (IsEditor()) { @@ -229,7 +200,7 @@ public static void setEnabled(bool enabled) } #if UNITY_IOS - AdjustiOS.SetEnabled(enabled); + AdjustiOS.Enable(); #elif UNITY_ANDROID AdjustAndroid.SetEnabled(enabled); #elif (UNITY_WSA || UNITY_WP8) @@ -239,26 +210,25 @@ public static void setEnabled(bool enabled) #endif } - public static bool isEnabled() + public static void Disable() { if (IsEditor()) { - return false; + return; } #if UNITY_IOS - return AdjustiOS.IsEnabled(); + AdjustiOS.Disable(); #elif UNITY_ANDROID - return AdjustAndroid.IsEnabled(); + AdjustAndroid.SetEnabled(enabled); #elif (UNITY_WSA || UNITY_WP8) - return AdjustWindows.IsEnabled(); + AdjustWindows.SetEnabled(enabled); #else Debug.Log(errorMsgPlatform); - return false; #endif } - public static void setOfflineMode(bool enabled) + public static void EnableCoppaCompliance() { if (IsEditor()) { @@ -266,17 +236,15 @@ public static void setOfflineMode(bool enabled) } #if UNITY_IOS - AdjustiOS.SetOfflineMode(enabled); + AdjustiOS.EnableCoppaCompliance(); #elif UNITY_ANDROID - AdjustAndroid.SetOfflineMode(enabled); -#elif (UNITY_WSA || UNITY_WP8) - AdjustWindows.SetOfflineMode(enabled); + AdjustAndroid.EnableCoppaCompliance(); #else Debug.Log(errorMsgPlatform); #endif } - public static void setDeviceToken(string deviceToken) + public static void DisableCoppaCompliance() { if (IsEditor()) { @@ -284,17 +252,35 @@ public static void setDeviceToken(string deviceToken) } #if UNITY_IOS - AdjustiOS.SetDeviceToken(deviceToken); + AdjustiOS.DisableCoppaCompliance(); #elif UNITY_ANDROID - AdjustAndroid.SetDeviceToken(deviceToken); + AdjustAndroid.DisableCoppaCompliance(); +#else + Debug.Log(errorMsgPlatform); +#endif + } + + public static void IsEnabled(Action callback, string gameObjectName = "Adjust") + { + if (IsEditor()) + { + return; + } + +#if UNITY_IOS + Adjust.getIsEnabledDelegate = callback; + AdjustiOS.IsEnabled(gameObjectName); +#elif UNITY_ANDROID + return AdjustAndroid.IsEnabled(); #elif (UNITY_WSA || UNITY_WP8) - AdjustWindows.SetDeviceToken(deviceToken); + return AdjustWindows.IsEnabled(); #else Debug.Log(errorMsgPlatform); + return; #endif } - public static void gdprForgetMe() + public static void SwitchToOfflineMode() { if (IsEditor()) { @@ -302,17 +288,17 @@ public static void gdprForgetMe() } #if UNITY_IOS - AdjustiOS.GdprForgetMe(); + AdjustiOS.SwitchToOfflineMode(); #elif UNITY_ANDROID - AdjustAndroid.GdprForgetMe(); + AdjustAndroid.SetOfflineMode(enabled); #elif (UNITY_WSA || UNITY_WP8) - AdjustWindows.GdprForgetMe(); + AdjustWindows.SetOfflineMode(enabled); #else Debug.Log(errorMsgPlatform); #endif } - public static void disableThirdPartySharing() + public static void SwitchBackToOnlineMode() { if (IsEditor()) { @@ -320,17 +306,17 @@ public static void disableThirdPartySharing() } #if UNITY_IOS - AdjustiOS.DisableThirdPartySharing(); + AdjustiOS.SwitchBackToOnlineMode(); #elif UNITY_ANDROID - AdjustAndroid.DisableThirdPartySharing(); + AdjustAndroid.SetOfflineMode(enabled); #elif (UNITY_WSA || UNITY_WP8) - Debug.Log("[Adjust]: Disable third party sharing is only supported for Android and iOS platforms."); + AdjustWindows.SetOfflineMode(enabled); #else Debug.Log(errorMsgPlatform); #endif } - public static void appWillOpenUrl(string url) + public static void SetPushToken(string pushToken) { if (IsEditor()) { @@ -338,17 +324,17 @@ public static void appWillOpenUrl(string url) } #if UNITY_IOS - AdjustiOS.AppWillOpenUrl(url); + AdjustiOS.SetPushToken(pushToken); #elif UNITY_ANDROID - AdjustAndroid.AppWillOpenUrl(url); + AdjustAndroid.SetDeviceToken(deviceToken); #elif (UNITY_WSA || UNITY_WP8) - AdjustWindows.AppWillOpenUrl(url); + AdjustWindows.SetDeviceToken(deviceToken); #else Debug.Log(errorMsgPlatform); #endif } - public static void sendFirstPackages() + public static void GdprForgetMe() { if (IsEditor()) { @@ -356,17 +342,17 @@ public static void sendFirstPackages() } #if UNITY_IOS - AdjustiOS.SendFirstPackages(); + AdjustiOS.GdprForgetMe(); #elif UNITY_ANDROID - AdjustAndroid.SendFirstPackages(); + AdjustAndroid.GdprForgetMe(); #elif (UNITY_WSA || UNITY_WP8) - AdjustWindows.SendFirstPackages(); + AdjustWindows.GdprForgetMe(); #else Debug.Log(errorMsgPlatform); #endif } - public static void addSessionPartnerParameter(string key, string value) + public static void ProcessDeeplink(string deeplink) { if (IsEditor()) { @@ -374,17 +360,17 @@ public static void addSessionPartnerParameter(string key, string value) } #if UNITY_IOS - AdjustiOS.AddSessionPartnerParameter(key, value); + AdjustiOS.ProcessDeeplink(deeplink); #elif UNITY_ANDROID - AdjustAndroid.AddSessionPartnerParameter(key, value); + AdjustAndroid.AppWillOpenUrl(url); #elif (UNITY_WSA || UNITY_WP8) - AdjustWindows.AddSessionPartnerParameter(key, value); + AdjustWindows.AppWillOpenUrl(url); #else Debug.Log(errorMsgPlatform); #endif } - public static void addSessionCallbackParameter(string key, string value) + public static void AddGlobalPartnerParameter(string key, string value) { if (IsEditor()) { @@ -392,17 +378,17 @@ public static void addSessionCallbackParameter(string key, string value) } #if UNITY_IOS - AdjustiOS.AddSessionCallbackParameter(key, value); + AdjustiOS.AddGlobalPartnerParameter(key, value); #elif UNITY_ANDROID - AdjustAndroid.AddSessionCallbackParameter(key, value); + AdjustAndroid.AddSessionPartnerParameter(key, value); #elif (UNITY_WSA || UNITY_WP8) - AdjustWindows.AddSessionCallbackParameter(key, value); + AdjustWindows.AddSessionPartnerParameter(key, value); #else Debug.Log(errorMsgPlatform); #endif } - public static void removeSessionPartnerParameter(string key) + public static void AddGlobalCallbackParameter(string key, string value) { if (IsEditor()) { @@ -410,17 +396,17 @@ public static void removeSessionPartnerParameter(string key) } #if UNITY_IOS - AdjustiOS.RemoveSessionPartnerParameter(key); + AdjustiOS.AddGlobalCallbackParameter(key, value); #elif UNITY_ANDROID - AdjustAndroid.RemoveSessionPartnerParameter(key); + AdjustAndroid.AddSessionCallbackParameter(key, value); #elif (UNITY_WSA || UNITY_WP8) - AdjustWindows.RemoveSessionPartnerParameter(key); + AdjustWindows.AddSessionCallbackParameter(key, value); #else Debug.Log(errorMsgPlatform); #endif } - public static void removeSessionCallbackParameter(string key) + public static void RemoveGlobalPartnerParameter(string key) { if (IsEditor()) { @@ -428,17 +414,17 @@ public static void removeSessionCallbackParameter(string key) } #if UNITY_IOS - AdjustiOS.RemoveSessionCallbackParameter(key); + AdjustiOS.RemoveGlobalPartnerParameter(key); #elif UNITY_ANDROID - AdjustAndroid.RemoveSessionCallbackParameter(key); + AdjustAndroid.RemoveSessionPartnerParameter(key); #elif (UNITY_WSA || UNITY_WP8) - AdjustWindows.RemoveSessionCallbackParameter(key); + AdjustWindows.RemoveSessionPartnerParameter(key); #else Debug.Log(errorMsgPlatform); #endif } - public static void resetSessionPartnerParameters() + public static void RemoveGlobalCallbackParameter(string key) { if (IsEditor()) { @@ -446,17 +432,17 @@ public static void resetSessionPartnerParameters() } #if UNITY_IOS - AdjustiOS.ResetSessionPartnerParameters(); + AdjustiOS.RemoveGlobalCallbackParameter(key); #elif UNITY_ANDROID - AdjustAndroid.ResetSessionPartnerParameters(); + AdjustAndroid.RemoveSessionCallbackParameter(key); #elif (UNITY_WSA || UNITY_WP8) - AdjustWindows.ResetSessionPartnerParameters(); + AdjustWindows.RemoveSessionCallbackParameter(key); #else Debug.Log(errorMsgPlatform); #endif } - public static void resetSessionCallbackParameters() + public static void RemoveGlobalPartnerParameters() { if (IsEditor()) { @@ -464,17 +450,17 @@ public static void resetSessionCallbackParameters() } #if UNITY_IOS - AdjustiOS.ResetSessionCallbackParameters(); + AdjustiOS.RemoveGlobalPartnerParameters(); #elif UNITY_ANDROID - AdjustAndroid.ResetSessionCallbackParameters(); + AdjustAndroid.ResetSessionPartnerParameters(); #elif (UNITY_WSA || UNITY_WP8) - AdjustWindows.ResetSessionCallbackParameters(); + AdjustWindows.ResetSessionPartnerParameters(); #else Debug.Log(errorMsgPlatform); #endif } - public static void trackAdRevenue(string source, string payload) + public static void RemoveGlobalCallbackParameters() { if (IsEditor()) { @@ -482,17 +468,17 @@ public static void trackAdRevenue(string source, string payload) } #if UNITY_IOS - AdjustiOS.TrackAdRevenue(source, payload); + AdjustiOS.RemoveGlobalCallbackParameters(); #elif UNITY_ANDROID - AdjustAndroid.TrackAdRevenue(source, payload); + AdjustAndroid.ResetSessionCallbackParameters(); #elif (UNITY_WSA || UNITY_WP8) - Debug.Log("[Adjust]: Ad revenue tracking is only supported for Android and iOS platforms."); + AdjustWindows.ResetSessionCallbackParameters(); #else Debug.Log(errorMsgPlatform); #endif } - public static void trackAdRevenue(AdjustAdRevenue adRevenue) + public static void TrackAdRevenue(AdjustAdRevenue adRevenue) { if (IsEditor()) { @@ -510,7 +496,7 @@ public static void trackAdRevenue(AdjustAdRevenue adRevenue) #endif } - public static void trackAppStoreSubscription(AdjustAppStoreSubscription subscription) + public static void TrackAppStoreSubscription(AdjustAppStoreSubscription subscription) { if (IsEditor()) { @@ -528,7 +514,7 @@ public static void trackAppStoreSubscription(AdjustAppStoreSubscription subscrip #endif } - public static void trackPlayStoreSubscription(AdjustPlayStoreSubscription subscription) + public static void TrackPlayStoreSubscription(AdjustPlayStoreSubscription subscription) { if (IsEditor()) { @@ -546,7 +532,7 @@ public static void trackPlayStoreSubscription(AdjustPlayStoreSubscription subscr #endif } - public static void trackThirdPartySharing(AdjustThirdPartySharing thirdPartySharing) + public static void TrackThirdPartySharing(AdjustThirdPartySharing thirdPartySharing) { if (IsEditor()) { @@ -564,7 +550,7 @@ public static void trackThirdPartySharing(AdjustThirdPartySharing thirdPartyShar #endif } - public static void trackMeasurementConsent(bool measurementConsent) + public static void TrackMeasurementConsent(bool measurementConsent) { if (IsEditor()) { @@ -582,7 +568,9 @@ public static void trackMeasurementConsent(bool measurementConsent) #endif } - public static void requestTrackingAuthorizationWithCompletionHandler(Action statusCallback, string sceneName = "Adjust") + public static void RequestAppTrackingAuthorizationWithCompletionHandler( + Action callback, + string gameObjectName = "Adjust") { if (IsEditor()) { @@ -594,8 +582,8 @@ public static void requestTrackingAuthorizationWithCompletionHandler(Action { Adjust.authorizationStatusDelegates = new List>(); } - Adjust.authorizationStatusDelegates.Add(statusCallback); - AdjustiOS.RequestTrackingAuthorizationWithCompletionHandler(sceneName); + Adjust.authorizationStatusDelegates.Add(callback); + AdjustiOS.RequestAppTrackingAuthorizationWithCompletionHandler(gameObjectName); #elif UNITY_ANDROID Debug.Log("[Adjust]: Requesting tracking authorization is only supported for iOS platform."); #elif (UNITY_WSA || UNITY_WP8) @@ -605,44 +593,12 @@ public static void requestTrackingAuthorizationWithCompletionHandler(Action #endif } - public static void updateConversionValue(int conversionValue) - { - if (IsEditor()) - { - return; - } - -#if UNITY_IOS - AdjustiOS.UpdateConversionValue(conversionValue); -#elif UNITY_ANDROID - Debug.Log("[Adjust]: Updating SKAdNetwork conversion value is only supported for iOS platform."); -#elif (UNITY_WSA || UNITY_WP8) - Debug.Log("[Adjust]: Updating SKAdNetwork conversion value is only supported for iOS platform."); -#else - Debug.Log(errorMsgPlatform); -#endif - } - - public static void updateConversionValue(int conversionValue, Action completionCallback, string sceneName = "Adjust") - { - if (IsEditor()) - { - return; - } - -#if UNITY_IOS - Adjust.skadUpdateConversionValueDelegate = completionCallback; - AdjustiOS.UpdateConversionValue(conversionValue, sceneName); -#elif UNITY_ANDROID - Debug.Log("[Adjust]: Updating SKAdNetwork conversion value is only supported for iOS platform."); -#elif (UNITY_WSA || UNITY_WP8) - Debug.Log("[Adjust]: Updating SKAdNetwork conversion value is only supported for iOS platform."); -#else - Debug.Log(errorMsgPlatform); -#endif - } - - public static void updateConversionValue(int conversionValue, string coarseValue, bool lockWindow, Action completionCallback, string sceneName = "Adjust") + public static void UpdateSkanConversionValue( + int conversionValue, + string coarseValue, + bool lockWindow, + Action callback, + string gameObjectName = "Adjust") { if (IsEditor()) { @@ -650,8 +606,8 @@ public static void updateConversionValue(int conversionValue, string coarseValue } #if UNITY_IOS - Adjust.skad4UpdateConversionValueDelegate = completionCallback; - AdjustiOS.UpdateConversionValue(conversionValue, coarseValue, lockWindow, sceneName); + Adjust.skanErrorDelegate = callback; + AdjustiOS.UpdateSkanConversionValue(conversionValue, coarseValue, lockWindow, gameObjectName); #elif UNITY_ANDROID Debug.Log("[Adjust]: Updating SKAdNetwork conversion value is only supported for iOS platform."); #elif (UNITY_WSA || UNITY_WP8) @@ -661,25 +617,7 @@ public static void updateConversionValue(int conversionValue, string coarseValue #endif } - public static void checkForNewAttStatus() - { - if (IsEditor()) - { - return; - } - -#if UNITY_IOS - AdjustiOS.CheckForNewAttStatus(); -#elif UNITY_ANDROID - Debug.Log("[Adjust]: Checking for new ATT status is only supported for iOS platform."); -#elif (UNITY_WSA || UNITY_WP8) - Debug.Log("[Adjust]: Checking for new ATT status is only supported for iOS platform."); -#else - Debug.Log(errorMsgPlatform); -#endif - } - - public static int getAppTrackingAuthorizationStatus() + public static int GetAppTrackingAuthorizationStatus() { if (IsEditor()) { @@ -700,15 +638,16 @@ public static int getAppTrackingAuthorizationStatus() #endif } - public static string getAdid() + public static void GetAdid(Action callback, string gameObjectName = "Adjust") { if (IsEditor()) { - return string.Empty; + return; } #if UNITY_IOS - return AdjustiOS.GetAdid(); + Adjust.getIdfaDelegate = callback; + AdjustiOS.GetAdid(gameObjectName); #elif UNITY_ANDROID return AdjustAndroid.GetAdid(); #elif (UNITY_WSA || UNITY_WP8) @@ -719,15 +658,18 @@ public static string getAdid() #endif } - public static AdjustAttribution getAttribution() + public static void GetAttribution( + Action callback, + string gameObjectName = "Adjust") { if (IsEditor()) { - return null; + return; } #if UNITY_IOS - return AdjustiOS.GetAttribution(); + Adjust.getAttributionDelegate = callback; + AdjustiOS.GetAttribution(gameObjectName); #elif UNITY_ANDROID return AdjustAndroid.GetAttribution(); #elif (UNITY_WSA || UNITY_WP8) @@ -738,36 +680,37 @@ public static AdjustAttribution getAttribution() #endif } - public static string getWinAdid() +// public static string getWinAdid() +// { +// if (IsEditor()) +// { +// return string.Empty; +// } + +// #if UNITY_IOS +// Debug.Log("[Adjust]: Error! Windows Advertising ID is not available on iOS platform."); +// return string.Empty; +// #elif UNITY_ANDROID +// Debug.Log("[Adjust]: Error! Windows Advertising ID is not available on Android platform."); +// return string.Empty; +// #elif (UNITY_WSA || UNITY_WP8) +// return AdjustWindows.GetWinAdId(); +// #else +// Debug.Log(errorMsgPlatform); +// return string.Empty; +// #endif +// } + + public static void GetIdfa(Action callback, string gameObjectName = "Adjust") { if (IsEditor()) { - return string.Empty; - } - -#if UNITY_IOS - Debug.Log("[Adjust]: Error! Windows Advertising ID is not available on iOS platform."); - return string.Empty; -#elif UNITY_ANDROID - Debug.Log("[Adjust]: Error! Windows Advertising ID is not available on Android platform."); - return string.Empty; -#elif (UNITY_WSA || UNITY_WP8) - return AdjustWindows.GetWinAdId(); -#else - Debug.Log(errorMsgPlatform); - return string.Empty; -#endif - } - - public static string getIdfa() - { - if (IsEditor()) - { - return string.Empty; + return; } #if UNITY_IOS - return AdjustiOS.GetIdfa(); + Adjust.getIdfaDelegate = callback; + AdjustiOS.GetIdfa(gameObjectName); #elif UNITY_ANDROID Debug.Log("[Adjust]: Error! IDFA is not available on Android platform."); return string.Empty; @@ -780,15 +723,16 @@ public static string getIdfa() #endif } - public static string getIdfv() + public static void GetIdfv(Action callback, string gameObjectName = "Adjust") { if (IsEditor()) { - return string.Empty; + return; } #if UNITY_IOS - return AdjustiOS.GetIdfv(); + Adjust.getIdfvDelegate = callback; + AdjustiOS.GetIdfv(gameObjectName); #elif UNITY_ANDROID Debug.Log("[Adjust]: Error! IDFV is not available on Android platform."); return string.Empty; @@ -801,15 +745,16 @@ public static string getIdfv() #endif } - public static string getSdkVersion() + public static void GetSdkVersion(Action callback, string gameObjectName = "Adjust") { if (IsEditor()) { - return string.Empty; + return; } #if UNITY_IOS - return AdjustiOS.GetSdkVersion(); + Adjust.getSdkVersionDelegate = callback; + AdjustiOS.GetSdkVersion(gameObjectName); #elif UNITY_ANDROID return AdjustAndroid.GetSdkVersion(); #elif (UNITY_WSA || UNITY_WP8) @@ -820,26 +765,7 @@ public static string getSdkVersion() #endif } - [Obsolete("This method is intended for testing purposes only. Do not use it.")] - public static void setReferrer(string referrer) - { - if (IsEditor()) - { - return; - } - -#if UNITY_IOS - Debug.Log("[Adjust]: Install referrer is not available on iOS platform."); -#elif UNITY_ANDROID - AdjustAndroid.SetReferrer(referrer); -#elif (UNITY_WSA || UNITY_WP8) - Debug.Log("[Adjust]: Error! Install referrer is not available on Windows platform."); -#else - Debug.Log(errorMsgPlatform); -#endif - } - - public static void getGoogleAdId(Action onDeviceIdsRead) + public static void GetLastDeeplink(Action callback, string gameObjectName = "Adjust") { if (IsEditor()) { @@ -847,48 +773,8 @@ public static void getGoogleAdId(Action onDeviceIdsRead) } #if UNITY_IOS - Debug.Log("[Adjust]: Google Play Advertising ID is not available on iOS platform."); - onDeviceIdsRead(string.Empty); -#elif UNITY_ANDROID - AdjustAndroid.GetGoogleAdId(onDeviceIdsRead); -#elif (UNITY_WSA || UNITY_WP8) - Debug.Log("[Adjust]: Google Play Advertising ID is not available on Windows platform."); - onDeviceIdsRead(string.Empty); -#else - Debug.Log(errorMsgPlatform); -#endif - } - - public static string getAmazonAdId() - { - if (IsEditor()) - { - return string.Empty; - } - -#if UNITY_IOS - Debug.Log("[Adjust]: Amazon Advertising ID is not available on iOS platform."); - return string.Empty; -#elif UNITY_ANDROID - return AdjustAndroid.GetAmazonAdId(); -#elif (UNITY_WSA || UNITY_WP8) - Debug.Log("[Adjust]: Amazon Advertising ID not available on Windows platform."); - return string.Empty; -#else - Debug.Log(errorMsgPlatform); - return string.Empty; -#endif - } - - public static string getLastDeeplink() - { - if (IsEditor()) - { - return string.Empty; - } - -#if UNITY_IOS - return AdjustiOS.GetLastDeeplink(); + Adjust.getLastDeeplinkDelegate = callback; + AdjustiOS.GetLastDeeplink(gameObjectName); #elif UNITY_ANDROID Debug.Log("[Adjust]: Error! Last deeplink getter is not available on Android platform."); return string.Empty; @@ -901,10 +787,10 @@ public static string getLastDeeplink() #endif } - public static void verifyAppStorePurchase( + public static void VerifyAppStorePurchase( AdjustAppStorePurchase purchase, Action verificationInfoDelegate, - string sceneName = "Adjust") + string gameObjectName = "Adjust") { if (IsEditor()) { @@ -922,7 +808,7 @@ public static void verifyAppStorePurchase( } Adjust.verificationInfoDelegate = verificationInfoDelegate; - AdjustiOS.VerifyAppStorePurchase(purchase, sceneName); + AdjustiOS.VerifyAppStorePurchase(purchase, gameObjectName); #elif UNITY_ANDROID Debug.Log("[Adjust]: App Store purchase verification is only supported for iOS platform."); #elif (UNITY_WSA || UNITY_WP8) @@ -932,38 +818,38 @@ public static void verifyAppStorePurchase( #endif } - public static void verifyPlayStorePurchase( - AdjustPlayStorePurchase purchase, - Action verificationInfoDelegate) - { - if (IsEditor()) - { - return; - } - -#if UNITY_IOS - Debug.Log("[Adjust]: Play Store purchase verification is only supported for Android platform."); -#elif UNITY_ANDROID - if (purchase == null || - purchase.productId == null || - purchase.purchaseToken == null) - { - Debug.Log("[Adjust]: Invalid Play Store purchase parameters."); - return; - } - - AdjustAndroid.VerifyPlayStorePurchase(purchase, verificationInfoDelegate); -#elif (UNITY_WSA || UNITY_WP8) - Debug.Log("[Adjust]: Play Store purchase verification is only supported for Android platform."); -#else - Debug.Log(errorMsgPlatform); -#endif - } - - public static void processDeeplink( - string url, +// public static void verifyPlayStorePurchase( +// AdjustPlayStorePurchase purchase, +// Action verificationInfoDelegate) +// { +// if (IsEditor()) +// { +// return; +// } + +// #if UNITY_IOS +// Debug.Log("[Adjust]: Play Store purchase verification is only supported for Android platform."); +// #elif UNITY_ANDROID +// if (purchase == null || +// purchase.productId == null || +// purchase.purchaseToken == null) +// { +// Debug.Log("[Adjust]: Invalid Play Store purchase parameters."); +// return; +// } + +// AdjustAndroid.VerifyPlayStorePurchase(purchase, verificationInfoDelegate); +// #elif (UNITY_WSA || UNITY_WP8) +// Debug.Log("[Adjust]: Play Store purchase verification is only supported for Android platform."); +// #else +// Debug.Log(errorMsgPlatform); +// #endif +// } + + public static void ProcessAndResolveDeeplink( + string deeplink, Action resolvedLinkDelegate, - string sceneName = "Adjust") + string gameObjectName = "Adjust") { if (IsEditor()) { @@ -972,7 +858,7 @@ public static void processDeeplink( #if UNITY_IOS Adjust.deeplinkResolutionDelegate = resolvedLinkDelegate; - AdjustiOS.ProcessDeeplink(url, sceneName); + AdjustiOS.ProcessAndResolveDeeplink(deeplink, gameObjectName); #elif UNITY_ANDROID AdjustAndroid.ProcessDeeplink(url, resolvedLinkDelegate); #elif (UNITY_WSA || UNITY_WP8) @@ -983,7 +869,7 @@ public static void processDeeplink( } #if UNITY_IOS - public void GetNativeAttribution(string attributionData) + public void UnityAdjustAttributionCallback(string attributionData) { if (IsEditor()) { @@ -1000,7 +886,7 @@ public void GetNativeAttribution(string attributionData) Adjust.attributionChangedDelegate(attribution); } - public void GetNativeEventSuccess(string eventSuccessData) + public void UnityAdjustEventSuccessCallback(string eventSuccessData) { if (IsEditor()) { @@ -1017,7 +903,7 @@ public void GetNativeEventSuccess(string eventSuccessData) Adjust.eventSuccessDelegate(eventSuccess); } - public void GetNativeEventFailure(string eventFailureData) + public void UnityAdjustEventFailureCallback(string eventFailureData) { if (IsEditor()) { @@ -1034,7 +920,7 @@ public void GetNativeEventFailure(string eventFailureData) Adjust.eventFailureDelegate(eventFailure); } - public void GetNativeSessionSuccess(string sessionSuccessData) + public void UnityAdjustSessionSuccessCallback(string sessionSuccessData) { if (IsEditor()) { @@ -1051,7 +937,7 @@ public void GetNativeSessionSuccess(string sessionSuccessData) Adjust.sessionSuccessDelegate(sessionSuccess); } - public void GetNativeSessionFailure(string sessionFailureData) + public void UnityAdjustSessionFailureCallback(string sessionFailureData) { if (IsEditor()) { @@ -1068,7 +954,7 @@ public void GetNativeSessionFailure(string sessionFailureData) Adjust.sessionFailureDelegate(sessionFailure); } - public void GetNativeDeferredDeeplink(string deeplinkURL) + public void UnityAdjustDeferredDeeplinkCallback(string deeplinkURL) { if (IsEditor()) { @@ -1084,138 +970,202 @@ public void GetNativeDeferredDeeplink(string deeplinkURL) Adjust.deferredDeeplinkDelegate(deeplinkURL); } - public void GetNativeConversionValueUpdated(string conversionValue) + public void UnityAdjustSkanUpdatedCallback(string skanUpdateData) { if (IsEditor()) { return; } - if (Adjust.conversionValueUpdatedDelegate == null) + if (Adjust.skanUpdatedDelegate == null) { - Debug.Log("[Adjust]: Conversion value updated delegate was not set."); + Debug.Log("[Adjust]: SKAN update delegate was not set."); return; } - int cv = -1; - if (Int32.TryParse(conversionValue, out cv)) + Adjust.skanUpdatedDelegate(AdjustUtils.GetSkanUpdateDataDictionary(skanUpdateData)); + } + + public void UnityAdjustAttDialogCallback(string authorizationStatus) + { + if (IsEditor()) { - if (cv != -1) - { - Adjust.conversionValueUpdatedDelegate(cv); - } + return; + } + + if (Adjust.authorizationStatusDelegates == null) + { + Debug.Log("[Adjust]: Authorization status delegates were not set."); + return; + } + + foreach (Action callback in Adjust.authorizationStatusDelegates) + { + callback(Int16.Parse(authorizationStatus)); } + Adjust.authorizationStatusDelegates.Clear(); } - public void GetNativeSkad4ConversionValueUpdated(string conversionValueUpdate) + public void UnityAdjustPurchaseVerificationCallback(string verificationInfoData) { if (IsEditor()) { return; } - if (Adjust.skad4ConversionValueUpdatedDelegate == null) + if (Adjust.verificationInfoDelegate == null) + { + Debug.Log("[Adjust]: Purchase verification info delegate was not set."); + return; + } + + var verificationInfo = new AdjustPurchaseVerificationInfo(verificationInfoData); + Adjust.verificationInfoDelegate(verificationInfo); + } + + public void UnityAdjustResolvedDeeplinkCallback(string resolvedLink) + { + if (IsEditor()) { - Debug.Log("[Adjust]: SKAD4 Conversion value updated delegate was not set."); return; } - int conversionValue = AdjustUtils.GetSkad4ConversionValue(conversionValueUpdate); - string coarseValue = AdjustUtils.GetSkad4CoarseValue(conversionValueUpdate); - bool lockWindow = AdjustUtils.GetSkad4LockWindow(conversionValueUpdate); + if (Adjust.deeplinkResolutionDelegate == null) + { + Debug.Log("[Adjust]: Deep link reoslution delegate was not set."); + return; + } - Adjust.skad4ConversionValueUpdatedDelegate(conversionValue, coarseValue, lockWindow); + Adjust.deeplinkResolutionDelegate(resolvedLink); } - public void GetNativeSkadCompletionDelegate(string message) + public void UnityAdjustSkanErrorCallback(string skanError) { if (IsEditor()) { return; } - if (Adjust.skadUpdateConversionValueDelegate == null) + if (Adjust.skanErrorDelegate == null) + { + Debug.Log("[Adjust]: SKAN error delegate was not set."); + return; + } + + Adjust.skanErrorDelegate(skanError); + } + + public void UnityAdjustIsEnabledGetter(string isEnabled) + { + if (IsEditor()) { - Debug.Log("[Adjust]: SKAD completion delegate was not set."); return; } - if (message != null) + if (Adjust.getIsEnabledDelegate == null) { - Adjust.skadUpdateConversionValueDelegate(message); + Debug.Log("[Adjust]: Is enabled delegate was not set."); + return; } + + Adjust.getIsEnabledDelegate(bool.Parse(isEnabled)); } - public void GetNativeSkad4CompletionDelegate(string message) + public void UnityAdjustAttributionGetter(string attributionData) { if (IsEditor()) { return; } - if (Adjust.skad4UpdateConversionValueDelegate == null) + if (Adjust.getAttributionDelegate == null) + { + Debug.Log("[Adjust]: Attribution delegate was not set."); + return; + } + + var attribution = new AdjustAttribution(attributionData); + Adjust.getAttributionDelegate(attribution); + } + + public void UnityAdjustAdidGetter(string adid) + { + if (IsEditor()) { - Debug.Log("[Adjust]: SKAD4 completion delegate was not set."); return; } - if (message != null) + if (Adjust.getAdidDelegate == null) { - Adjust.skad4UpdateConversionValueDelegate(message); + Debug.Log("[Adjust]: Adid delegate was not set."); + return; } + + Adjust.getAdidDelegate(adid); } - public void GetAuthorizationStatus(string authorizationStatus) + public void UnityAdjustIdfaGetter(string idfa) { if (IsEditor()) { return; } - if (Adjust.authorizationStatusDelegates == null) + if (Adjust.getIdfaDelegate == null) { - Debug.Log("[Adjust]: Authorization status delegates were not set."); + Debug.Log("[Adjust]: IDFA delegate was not set."); return; } - foreach (Action callback in Adjust.authorizationStatusDelegates) + Adjust.getIdfaDelegate(idfa); + } + + public void UnityAdjustIdfvGetter(string idfv) + { + if (IsEditor()) { - callback(Int16.Parse(authorizationStatus)); + return; } - Adjust.authorizationStatusDelegates.Clear(); + + if (Adjust.getIdfvDelegate == null) + { + Debug.Log("[Adjust]: IDFV delegate was not set."); + return; + } + + Adjust.getIdfvDelegate(idfv); } - public void GetNativeVerificationInfo(string verificationInfoData) + public void UnityAdjustSdkVersionGetter(string sdkVersion) { if (IsEditor()) { return; } - if (Adjust.verificationInfoDelegate == null) + if (Adjust.getSdkVersionDelegate == null) { - Debug.Log("[Adjust]: Purchase verification info delegate was not set."); + Debug.Log("[Adjust]: SDK version delegate was not set."); return; } - var verificationInfo = new AdjustPurchaseVerificationInfo(verificationInfoData); - Adjust.verificationInfoDelegate(verificationInfo); + Adjust.getSdkVersionDelegate(sdkVersion); } - public void GetNativeResolvedLink(string resolvedLink) + public void UnityAdjustLastDeeplinkGetter(string lastDeeplink) { if (IsEditor()) { return; } - if (Adjust.deeplinkResolutionDelegate == null) + if (Adjust.getLastDeeplinkDelegate == null) { - Debug.Log("[Adjust]: Deep link reoslution delegate was not set."); + Debug.Log("[Adjust]: Last deep link delegate was not set."); return; } - Adjust.deeplinkResolutionDelegate(resolvedLink); + Adjust.getLastDeeplinkDelegate(lastDeeplink); } #endif diff --git a/Assets/Adjust/Unity/AdjustAdRevenue.cs b/Assets/Adjust/Unity/AdjustAdRevenue.cs index 95d3e2bc..ad0a1ea2 100644 --- a/Assets/Adjust/Unity/AdjustAdRevenue.cs +++ b/Assets/Adjust/Unity/AdjustAdRevenue.cs @@ -20,33 +20,33 @@ public AdjustAdRevenue(string source) this.source = source; } - public void setRevenue(double amount, string currency) + public void SetRevenue(double amount, string currency) { this.revenue = amount; this.currency = currency; } - public void setAdImpressionsCount(int adImpressionsCount) + public void SetAdImpressionsCount(int adImpressionsCount) { this.adImpressionsCount = adImpressionsCount; } - public void setAdRevenueNetwork(string adRevenueNetwork) + public void SetAdRevenueNetwork(string adRevenueNetwork) { this.adRevenueNetwork = adRevenueNetwork; } - public void setAdRevenueUnit(string adRevenueUnit) + public void SetAdRevenueUnit(string adRevenueUnit) { this.adRevenueUnit = adRevenueUnit; } - public void setAdRevenuePlacement(string adRevenuePlacement) + public void SetAdRevenuePlacement(string adRevenuePlacement) { this.adRevenuePlacement = adRevenuePlacement; } - public void addCallbackParameter(string key, string value) + public void AddCallbackParameter(string key, string value) { if (callbackList == null) { @@ -56,7 +56,7 @@ public void addCallbackParameter(string key, string value) callbackList.Add(value); } - public void addPartnerParameter(string key, string value) + public void AddPartnerParameter(string key, string value) { if (partnerList == null) { diff --git a/Assets/Adjust/Unity/AdjustAppStoreSubscription.cs b/Assets/Adjust/Unity/AdjustAppStoreSubscription.cs index 73ec83a8..6b64c556 100644 --- a/Assets/Adjust/Unity/AdjustAppStoreSubscription.cs +++ b/Assets/Adjust/Unity/AdjustAppStoreSubscription.cs @@ -23,17 +23,17 @@ public AdjustAppStoreSubscription(string price, string currency, string transact this.receipt = receipt; } - public void setTransactionDate(string transactionDate) + public void SetTransactionDate(string transactionDate) { this.transactionDate = transactionDate; } - public void setSalesRegion(string salesRegion) + public void SetSalesRegion(string salesRegion) { this.salesRegion = salesRegion; } - public void addCallbackParameter(string key, string value) + public void AddCallbackParameter(string key, string value) { if (callbackList == null) { @@ -43,7 +43,7 @@ public void addCallbackParameter(string key, string value) callbackList.Add(value); } - public void addPartnerParameter(string key, string value) + public void AddPartnerParameter(string key, string value) { if (partnerList == null) { diff --git a/Assets/Adjust/Unity/AdjustAttribution.cs b/Assets/Adjust/Unity/AdjustAttribution.cs index 33738874..c0a79bf3 100644 --- a/Assets/Adjust/Unity/AdjustAttribution.cs +++ b/Assets/Adjust/Unity/AdjustAttribution.cs @@ -5,7 +5,6 @@ namespace com.adjust.sdk { public class AdjustAttribution { - public string adid { get; set; } public string network { get; set; } public string adgroup { get; set; } public string campaign { get; set; } @@ -36,7 +35,6 @@ public AdjustAttribution(string jsonString) adgroup = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyAdgroup); creative = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyCreative); clickLabel = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyClickLabel); - adid = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyAdid); costType = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyCostType); try { @@ -66,7 +64,6 @@ public AdjustAttribution(Dictionary dicAttributionData) adgroup = AdjustUtils.TryGetValue(dicAttributionData, AdjustUtils.KeyAdgroup); creative = AdjustUtils.TryGetValue(dicAttributionData, AdjustUtils.KeyCreative); clickLabel = AdjustUtils.TryGetValue(dicAttributionData, AdjustUtils.KeyClickLabel); - adid = AdjustUtils.TryGetValue(dicAttributionData, AdjustUtils.KeyAdid); costType = AdjustUtils.TryGetValue(dicAttributionData, AdjustUtils.KeyCostType); try { diff --git a/Assets/Adjust/Unity/AdjustConfig.cs b/Assets/Adjust/Unity/AdjustConfig.cs index 481472ed..29b2629e 100644 --- a/Assets/Adjust/Unity/AdjustConfig.cs +++ b/Assets/Adjust/Unity/AdjustConfig.cs @@ -1,81 +1,49 @@ using System; +using System.Collections.Generic; namespace com.adjust.sdk { public class AdjustConfig { - public const string AdjustUrlStrategyChina = "china"; - public const string AdjustUrlStrategyIndia = "india"; - public const string AdjustUrlStrategyCn = "cn"; - public const string AdjustUrlStrategyCnOnly = "cn-only"; - - public const string AdjustDataResidencyEU = "data-residency-eu"; - public const string AdjustDataResidencyTR = "data-residency-tr"; - public const string AdjustDataResidencyUS = "data-residency-us"; - - public const string AdjustAdRevenueSourceAppLovinMAX = "applovin_max_sdk"; - public const string AdjustAdRevenueSourceMopub = "mopub"; - public const string AdjustAdRevenueSourceAdMob = "admob_sdk"; - public const string AdjustAdRevenueSourceIronSource = "ironsource_sdk"; - public const string AdjustAdRevenueSourceAdmost = "admost_sdk"; - public const string AdjustAdRevenueSourceUnity = "unity_sdk"; - public const string AdjustAdRevenueSourceHeliumChartboost = "helium_chartboost_sdk"; - public const string AdjustAdRevenueSourcePublisher = "publisher_sdk"; - public const string AdjustAdRevenueSourceTopOn = "topon_sdk"; - public const string AdjustAdRevenueSourceAdx = "adx_sdk"; - public const string AdjustAdRevenueTradPlus = "tradplus_sdk"; - + internal string gameObjectName; internal string appToken; - internal string sceneName; - internal string userAgent; internal string defaultTracker; internal string externalDeviceId; - internal string urlStrategy; - internal long? info1; - internal long? info2; - internal long? info3; - internal long? info4; - internal long? secretId; - internal double? delayStart; - internal bool? isDeviceKnown; - internal bool? sendInBackground; - internal bool? eventBufferingEnabled; - internal bool? coppaCompliantEnabled; - internal bool? playStoreKidsAppEnabled; + internal bool? isSendingInBackgroundEnabled; + internal bool? isCostDataInAttributionEnabled; + internal bool? isDeviceIdsReadingOnceEnabled; + internal bool isDeferredDeeplinkOpeningEnabled; internal bool? allowSuppressLogLevel; - internal bool? needsCost; - internal bool? readDeviceInfoOnceEnabled; - internal bool launchDeferredDeeplink; + internal bool? isDataResidency; + internal bool? shouldUseSubdomains; + internal int? eventDeduplicationIdsMaxSize; + internal List urlStrategyDomains; internal AdjustLogLevel? logLevel; internal AdjustEnvironment environment; - internal Action deferredDeeplinkDelegate; + internal Action attributionChangedDelegate; internal Action eventSuccessDelegate; internal Action eventFailureDelegate; internal Action sessionSuccessDelegate; internal Action sessionFailureDelegate; - internal Action attributionChangedDelegate; - internal Action conversionValueUpdatedDelegate; - internal Action skad4ConversionValueUpdatedDelegate; + internal Action deferredDeeplinkDelegate; + internal Action> skanUpdatedDelegate; + + // iOS specific + internal bool? isAdServicesEnabled; + internal bool? isIdfaReadingEnabled; + internal bool? isSkanAttributionEnabled; + internal bool? isLinkMeEnabled; + internal int? attConsentWaitingInterval; - // Android specific members + // Android specific internal string processName; - internal bool? readImei; - internal bool? preinstallTrackingEnabled; + internal bool? isPreinstallTrackingEnabled; internal string preinstallFilePath; - internal bool? finalAndroidAttributionEnabled; internal string fbAppId; - // iOS specific members - internal bool? allowAdServicesInfoReading; - internal bool? allowIdfaReading; - internal bool? skAdNetworkHandling; - internal bool? linkMeEnabled; - internal int? attConsentWaitingInterval; - // Windows specific members - internal Action logDelegate; public AdjustConfig(string appToken, AdjustEnvironment environment) { - this.sceneName = ""; + this.gameObjectName = ""; this.processName = ""; this.appToken = appToken; this.environment = environment; @@ -83,247 +51,198 @@ public AdjustConfig(string appToken, AdjustEnvironment environment) public AdjustConfig(string appToken, AdjustEnvironment environment, bool allowSuppressLogLevel) { - this.sceneName = ""; + this.gameObjectName = ""; this.processName = ""; this.appToken = appToken; this.environment = environment; this.allowSuppressLogLevel = allowSuppressLogLevel; } - public void setLogLevel(AdjustLogLevel logLevel) + public void SetLogLevel(AdjustLogLevel logLevel) { this.logLevel = logLevel; } - public void setDefaultTracker(string defaultTracker) + public void SetDefaultTracker(string defaultTracker) { this.defaultTracker = defaultTracker; } - public void setExternalDeviceId(string externalDeviceId) + public void SetExternalDeviceId(string externalDeviceId) { this.externalDeviceId = externalDeviceId; } - public void setLaunchDeferredDeeplink(bool launchDeferredDeeplink) - { - this.launchDeferredDeeplink = launchDeferredDeeplink; - } - - public void setSendInBackground(bool sendInBackground) - { - this.sendInBackground = sendInBackground; - } - - public void setEventBufferingEnabled(bool eventBufferingEnabled) - { - this.eventBufferingEnabled = eventBufferingEnabled; - } - - public void setCoppaCompliantEnabled(bool coppaCompliantEnabled) - { - this.coppaCompliantEnabled = coppaCompliantEnabled; - } - - public void setNeedsCost(bool needsCost) - { - this.needsCost = needsCost; - } - - public void setDelayStart(double delayStart) + public void DisableDeferredDeeplinkOpening() { - this.delayStart = delayStart; + this.isDeferredDeeplinkOpeningEnabled = false; } - public void setUserAgent(string userAgent) + public void EnableSendingInBackground() { - this.userAgent = userAgent; + this.isSendingInBackgroundEnabled = true; } - public void setIsDeviceKnown(bool isDeviceKnown) + public void EnableCostDataInAttribution() { - this.isDeviceKnown = isDeviceKnown; + this.isCostDataInAttributionEnabled = true; } - public void setUrlStrategy(String urlStrategy) + public void SetUrlStrategy( + List urlStrategyDomains, + bool shouldUseSubdomains, + bool isDataResidency) { - this.urlStrategy = urlStrategy; + this.urlStrategyDomains = urlStrategyDomains; + this.shouldUseSubdomains = shouldUseSubdomains; + this.isDataResidency = isDataResidency; } - public void setAppSecret(long secretId, long info1, long info2, long info3, long info4) - { - this.secretId = secretId; - this.info1 = info1; - this.info2 = info2; - this.info3 = info3; - this.info4 = info4; - } - - public void setDeferredDeeplinkDelegate(Action deferredDeeplinkDelegate, string sceneName = "Adjust") + public void SetDeferredDeeplinkDelegate( + Action deferredDeeplinkDelegate, + string gameObjectName = "Adjust") { this.deferredDeeplinkDelegate = deferredDeeplinkDelegate; - this.sceneName = sceneName; + this.gameObjectName = gameObjectName; } - public Action getDeferredDeeplinkDelegate() + public Action GetDeferredDeeplinkDelegate() { return this.deferredDeeplinkDelegate; } - public void setAttributionChangedDelegate(Action attributionChangedDelegate, string sceneName = "Adjust") + public void SetAttributionChangedDelegate( + Action attributionChangedDelegate, + string gameObjectName = "Adjust") { this.attributionChangedDelegate = attributionChangedDelegate; - this.sceneName = sceneName; + this.gameObjectName = gameObjectName; } - public Action getAttributionChangedDelegate() + public Action GetAttributionChangedDelegate() { return this.attributionChangedDelegate; } - public void setEventSuccessDelegate(Action eventSuccessDelegate, string sceneName = "Adjust") + public void SetEventSuccessDelegate( + Action eventSuccessDelegate, + string gameObjectName = "Adjust") { this.eventSuccessDelegate = eventSuccessDelegate; - this.sceneName = sceneName; + this.gameObjectName = gameObjectName; } - public Action getEventSuccessDelegate() + public Action GetEventSuccessDelegate() { return this.eventSuccessDelegate; } - public void setEventFailureDelegate(Action eventFailureDelegate, string sceneName = "Adjust") + public void SetEventFailureDelegate( + Action eventFailureDelegate, + string gameObjectName = "Adjust") { this.eventFailureDelegate = eventFailureDelegate; - this.sceneName = sceneName; + this.gameObjectName = gameObjectName; } - public Action getEventFailureDelegate() + public Action GetEventFailureDelegate() { return this.eventFailureDelegate; } - public void setSessionSuccessDelegate(Action sessionSuccessDelegate, string sceneName = "Adjust") + public void SetSessionSuccessDelegate( + Action sessionSuccessDelegate, + string gameObjectName = "Adjust") { this.sessionSuccessDelegate = sessionSuccessDelegate; - this.sceneName = sceneName; + this.gameObjectName = gameObjectName; } - public Action getSessionSuccessDelegate() + public Action GetSessionSuccessDelegate() { return this.sessionSuccessDelegate; } - public void setSessionFailureDelegate(Action sessionFailureDelegate, string sceneName = "Adjust") + public void SetSessionFailureDelegate( + Action sessionFailureDelegate, + string gameObjectName = "Adjust") { this.sessionFailureDelegate = sessionFailureDelegate; - this.sceneName = sceneName; + this.gameObjectName = gameObjectName; } - public Action getSessionFailureDelegate() + public Action GetSessionFailureDelegate() { return this.sessionFailureDelegate; } - // iOS specific methods. - [Obsolete("This is an obsolete method. Apple Search Ads attribution with usage of iAd.framework has been sunset by Apple as of February 7th 2023.")] - public void setAllowiAdInfoReading(bool allowiAdInfoReading) + public void DisableAdServices() { + this.isAdServicesEnabled = false; } - public void setAllowAdServicesInfoReading(bool allowAdServicesInfoReading) + public void DisableIdfaReading() { - this.allowAdServicesInfoReading = allowAdServicesInfoReading; + this.isIdfaReadingEnabled = false; } - public void setAllowIdfaReading(bool allowIdfaReading) + public void DisableSkanAttribution() { - this.allowIdfaReading = allowIdfaReading; + this.isSkanAttributionEnabled = false; } - public void deactivateSKAdNetworkHandling() + public void EnableLinkMe() { - this.skAdNetworkHandling = true; + this.isLinkMeEnabled = true; } - public void setLinkMeEnabled(bool linkMeEnabled) + public void SetSkanUpdatedDelegate( + Action> skanUpdatedDelegate, + string gameObjectName = "Adjust") { - this.linkMeEnabled = linkMeEnabled; + this.skanUpdatedDelegate = skanUpdatedDelegate; + this.gameObjectName = gameObjectName; } - public void setConversionValueUpdatedDelegate(Action conversionValueUpdatedDelegate, string sceneName = "Adjust") + public Action> GetSkanUpdatedDelegate() { - this.conversionValueUpdatedDelegate = conversionValueUpdatedDelegate; - this.sceneName = sceneName; + return this.skanUpdatedDelegate; } - public Action getConversionValueUpdatedDelegate() + public void SetAttConsentWaitingInterval(int numberOfSeconds) { - return this.conversionValueUpdatedDelegate; + this.attConsentWaitingInterval = numberOfSeconds; } - public void setSkad4ConversionValueUpdatedDelegate(Action skad4ConversionValueUpdatedDelegate, string sceneName = "Adjust") + public void SetEventDeduplicationIdsMaxSize(int eventDeduplicationIdsMaxSize) { - this.skad4ConversionValueUpdatedDelegate = skad4ConversionValueUpdatedDelegate; - this.sceneName = sceneName; + this.eventDeduplicationIdsMaxSize = eventDeduplicationIdsMaxSize; } - public Action getSkad4ConversionValueUpdatedDelegate() + // android specific + public void EnablePreinstallTracking() { - return this.skad4ConversionValueUpdatedDelegate; + this.isPreinstallTrackingEnabled = true; } - public void setAttConsentWaitingInterval(int numberOfSeconds) + public void EnableDeviceIdsReadingOnce() { - this.attConsentWaitingInterval = numberOfSeconds; + this.isDeviceIdsReadingOnceEnabled = true; } - // Android specific methods. - public void setProcessName(string processName) + public void SetProcessName(string processName) { this.processName = processName; } - [Obsolete("This is an obsolete method.")] - public void setReadMobileEquipmentIdentity(bool readMobileEquipmentIdentity) - { - // this.readImei = readMobileEquipmentIdentity; - } - - public void setPreinstallTrackingEnabled(bool preinstallTrackingEnabled) - { - this.preinstallTrackingEnabled = preinstallTrackingEnabled; - } - - public void setPreinstallFilePath(string preinstallFilePath) + public void SetPreinstallFilePath(string preinstallFilePath) { this.preinstallFilePath = preinstallFilePath; } - public void setPlayStoreKidsAppEnabled(bool playStoreKidsAppEnabled) - { - this.playStoreKidsAppEnabled = playStoreKidsAppEnabled; - } - - public void setFinalAndroidAttributionEnabled(bool finalAndroidAttributionEnabled) - { - this.finalAndroidAttributionEnabled = finalAndroidAttributionEnabled; - } - - public void setFbAppId(string fbAppId) + public void SetFbAppId(string fbAppId) { this.fbAppId = fbAppId; } - - public void setReadDeviceInfoOnceEnabled(bool readDeviceInfoOnceEnabled) - { - this.readDeviceInfoOnceEnabled = readDeviceInfoOnceEnabled; - } - - // Windows specific methods. - public void setLogDelegate(Action logDelegate) - { - this.logDelegate = logDelegate; - } } } diff --git a/Assets/Adjust/Unity/AdjustEvent.cs b/Assets/Adjust/Unity/AdjustEvent.cs index f4e87ce3..8d2801cf 100644 --- a/Assets/Adjust/Unity/AdjustEvent.cs +++ b/Assets/Adjust/Unity/AdjustEvent.cs @@ -5,34 +5,33 @@ namespace com.adjust.sdk { public class AdjustEvent { - internal string currency; internal string eventToken; - internal string callbackId; - internal string transactionId; - internal string productId; internal double? revenue; + internal string currency; + internal string callbackId; + internal string deduplicationId; internal List partnerList; internal List callbackList; - // iOS specific members + // iOS specific internal string receipt; - internal string receiptBase64; - internal bool isReceiptSet; - // Android specific members + internal string productId; + internal string transactionId; + // Android specific + internal string orderId; internal string purchaseToken; public AdjustEvent(string eventToken) { this.eventToken = eventToken; - this.isReceiptSet = false; } - public void setRevenue(double amount, string currency) + public void SetRevenue(double amount, string currency) { this.revenue = amount; this.currency = currency; } - public void addCallbackParameter(string key, string value) + public void AddCallbackParameter(string key, string value) { if (callbackList == null) { @@ -42,7 +41,7 @@ public void addCallbackParameter(string key, string value) callbackList.Add(value); } - public void addPartnerParameter(string key, string value) + public void AddPartnerParameter(string key, string value) { if (partnerList == null) { @@ -52,43 +51,39 @@ public void addPartnerParameter(string key, string value) partnerList.Add(value); } - public void setCallbackId(string callbackId) + public void SetCallbackId(string callbackId) { this.callbackId = callbackId; } - // iOS / Android mixed - public void setTransactionId(string transactionId) + public void SetDeduplicationId(string deduplicationId) { - this.transactionId = transactionId; + this.deduplicationId = deduplicationId; } - public void setProductId(string productId) + public void SetProductId(string productId) { this.productId = productId; } - // iOS specific methods - [Obsolete("This is an obsolete method. Please use separate setter methods for purchase verification parameters.")] - public void setReceipt(string receipt, string transactionId) + // iOS specific + public void SetTransactionId(string transactionId) { - // this.receipt = receipt; - // this.transactionId = transactionId; - // this.isReceiptSet = true; + this.transactionId = transactionId; } - public void setReceipt(string receipt) + public void SetReceipt(string receipt) { this.receipt = receipt; } - public void setReceiptBase64(string receiptBase64) + // Android specific + public void SetOrderId(string orderId) { - this.receiptBase64 = receiptBase64; + this.orderId = orderId; } - // Android specific methods - public void setPurchaseToken(string purchaseToken) + public void SetPurchaseToken(string purchaseToken) { this.purchaseToken = purchaseToken; } diff --git a/Assets/Adjust/Unity/AdjustEventSuccess.cs b/Assets/Adjust/Unity/AdjustEventSuccess.cs index 3b152532..c5a140c0 100644 --- a/Assets/Adjust/Unity/AdjustEventSuccess.cs +++ b/Assets/Adjust/Unity/AdjustEventSuccess.cs @@ -10,7 +10,6 @@ public class AdjustEventSuccess public string Timestamp { get; set; } public string EventToken { get; set; } public string CallbackId { get; set; } - public Dictionary JsonResponse { get; set; } public AdjustEventSuccess() {} diff --git a/Assets/Adjust/Unity/AdjustPlayStoreSubscription.cs b/Assets/Adjust/Unity/AdjustPlayStoreSubscription.cs index c86e45cb..321fe0c3 100644 --- a/Assets/Adjust/Unity/AdjustPlayStoreSubscription.cs +++ b/Assets/Adjust/Unity/AdjustPlayStoreSubscription.cs @@ -16,7 +16,13 @@ public class AdjustPlayStoreSubscription internal List partnerList; internal List callbackList; - public AdjustPlayStoreSubscription(string price, string currency, string sku, string orderId, string signature, string purchaseToken) + public AdjustPlayStoreSubscription( + string price, + string currency, + string sku, + string orderId, + string signature, + string purchaseToken) { this.price = price; this.currency = currency; @@ -26,12 +32,12 @@ public AdjustPlayStoreSubscription(string price, string currency, string sku, st this.purchaseToken = purchaseToken; } - public void setPurchaseTime(string purchaseTime) + public void SetPurchaseTime(string purchaseTime) { this.purchaseTime = purchaseTime; } - public void addCallbackParameter(string key, string value) + public void AddCallbackParameter(string key, string value) { if (callbackList == null) { @@ -41,7 +47,7 @@ public void addCallbackParameter(string key, string value) callbackList.Add(value); } - public void addPartnerParameter(string key, string value) + public void AddPartnerParameter(string key, string value) { if (partnerList == null) { diff --git a/Assets/Adjust/Unity/AdjustPurchaseVerificationInfo.cs b/Assets/Adjust/Unity/AdjustPurchaseVerificationInfo.cs index beb4d83b..a664d240 100644 --- a/Assets/Adjust/Unity/AdjustPurchaseVerificationInfo.cs +++ b/Assets/Adjust/Unity/AdjustPurchaseVerificationInfo.cs @@ -5,31 +5,24 @@ namespace com.adjust.sdk { public class AdjustPurchaseVerificationInfo { - #region Properties - public int code { get; set; } - public string message { get; set; } - public string verificationStatus { get; set; } - #endregion + public int Code { get; set; } + public string Message { get; set; } + public string VerificationStatus { get; set; } - #region Constructors - public AdjustPurchaseVerificationInfo() - { - } + public AdjustPurchaseVerificationInfo() {} public AdjustPurchaseVerificationInfo(string jsonString) { var jsonNode = JSON.Parse(jsonString); - if (jsonNode == null) { return; } - string stringCode = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyCode); - code = Int32.Parse(stringCode); - message = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyMessage); - verificationStatus = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyVerificationStatus); + string strCode = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyCode); + Code = Int32.Parse(strCode); + Message = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyMessage); + VerificationStatus = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeyVerificationStatus); } - #endregion } } diff --git a/Assets/Adjust/Unity/AdjustThirdPartySharing.cs b/Assets/Adjust/Unity/AdjustThirdPartySharing.cs index 091cacfe..74c84b6e 100644 --- a/Assets/Adjust/Unity/AdjustThirdPartySharing.cs +++ b/Assets/Adjust/Unity/AdjustThirdPartySharing.cs @@ -16,7 +16,7 @@ public AdjustThirdPartySharing(bool? isEnabled) this.partnerSharingSettings = new Dictionary>(); } - public void addGranularOption(string partnerName, string key, string value) + public void AddGranularOption(string partnerName, string key, string value) { // TODO: consider to add some logs about the error case if (partnerName == null || key == null || value == null) @@ -39,7 +39,7 @@ public void addGranularOption(string partnerName, string key, string value) partnerOptions.Add(value); } - public void addPartnerSharingSetting(string partnerName, string key, bool value) + public void AddPartnerSharingSetting(string partnerName, string key, bool value) { // TODO: consider to add some logs about the error case if (partnerName == null || key == null) diff --git a/Assets/Adjust/Unity/AdjustUrlStrategy.cs b/Assets/Adjust/Unity/AdjustUrlStrategy.cs deleted file mode 100644 index 6d4974a9..00000000 --- a/Assets/Adjust/Unity/AdjustUrlStrategy.cs +++ /dev/null @@ -1,30 +0,0 @@ -namespace com.adjust.sdk -{ - [System.Serializable] - public enum AdjustUrlStrategy - { - Default, - DataResidencyEU, - DataResidencyTK, - DataResidencyUS, - India, - China, - } - - public static class AdjustUrlStrategyExtension - { - public static string ToLowerCaseString(this AdjustUrlStrategy strategy) - { - switch (strategy) - { - case AdjustUrlStrategy.India: return "india"; - case AdjustUrlStrategy.China: return "china"; - case AdjustUrlStrategy.DataResidencyEU: return "data-residency-eu"; - case AdjustUrlStrategy.DataResidencyTK: return "data-residency-tr"; - case AdjustUrlStrategy.DataResidencyUS: return "data-residency-us"; - default: return string.Empty; - } - } - } -} - diff --git a/Assets/Adjust/Unity/AdjustUrlStrategy.cs.meta b/Assets/Adjust/Unity/AdjustUrlStrategy.cs.meta deleted file mode 100644 index cd909196..00000000 --- a/Assets/Adjust/Unity/AdjustUrlStrategy.cs.meta +++ /dev/null @@ -1,13 +0,0 @@ -fileFormatVersion: 2 -guid: 034243ca816f644dc97675a908e24e8c -timeCreated: 1617092915 -licenseType: Free -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Adjust/Unity/AdjustUtils.cs b/Assets/Adjust/Unity/AdjustUtils.cs index d8971163..97af48e8 100644 --- a/Assets/Adjust/Unity/AdjustUtils.cs +++ b/Assets/Adjust/Unity/AdjustUtils.cs @@ -25,9 +25,9 @@ public class AdjustUtils public static string KeyCostAmount = "costAmount"; public static string KeyCostCurrency = "costCurrency"; public static string KeyFbInstallReferrer = "fbInstallReferrer"; - public static string KeySkadConversionValue = "fineValue"; - public static string KeySkadCoarseValue = "coarseValue"; - public static string KeySkadLockWindow = "lockWindow"; + public static string KeySkanConversionValue = "fineValue"; + public static string KeySkanCoarseValue = "coarseValue"; + public static string KeySkanLockWindow = "lockWindow"; public static string KeyCode = "code"; public static string KeyVerificationStatus = "verificationStatus"; @@ -265,46 +265,20 @@ public static string TryGetValue(Dictionary dictionary, string k return null; } - public static int GetSkad4ConversionValue(string conversionValueUpdate) + public static Dictionary GetSkanUpdateDataDictionary(string skanUpdateData) { - var jsonNode = JSON.Parse(conversionValueUpdate); - if (jsonNode == null) + Dictionary skanUpdateDataDictionary = new Dictionary(); + var skanUpdateDataNode = JSON.Parse(skanUpdateData); + if (skanUpdateDataNode != null && skanUpdateDataNode.AsObject != null) { - return -1; - } - - string strConversionValue = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeySkadConversionValue); - int conversionValue = 0; - if (Int32.TryParse(strConversionValue, out conversionValue)) - { - return conversionValue; - } - else - { - return -1; - } - } - - public static string GetSkad4CoarseValue(string conversionValueUpdate) - { - var jsonNode = JSON.Parse(conversionValueUpdate); - if (jsonNode == null) - { - return null; - } - string coarseValue = AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeySkadCoarseValue); - return coarseValue; - } - - public static bool GetSkad4LockWindow(string conversionValueUpdate) - { - var jsonNode = JSON.Parse(conversionValueUpdate); - if (jsonNode == null) - { - return false; + Dictionary temp = new Dictionary(); + AdjustUtils.WriteJsonResponseDictionary(skanUpdateDataNode.AsObject, temp); + foreach (KeyValuePair entry in temp) + { + skanUpdateDataDictionary.Add(entry.Key, entry.Value.ToString()); + } } - bool lockWindow = Convert.ToBoolean(AdjustUtils.GetJsonString(jsonNode, AdjustUtils.KeySkadLockWindow)); - return lockWindow; + return skanUpdateDataDictionary; } #if UNITY_ANDROID diff --git a/Assets/Adjust/iOS/ADJAdRevenue.h.meta b/Assets/Adjust/iOS/ADJAdRevenue.h.meta deleted file mode 100644 index 7bf1899b..00000000 --- a/Assets/Adjust/iOS/ADJAdRevenue.h.meta +++ /dev/null @@ -1,24 +0,0 @@ -fileFormatVersion: 2 -guid: f382ac4ce0db3407baf40dd118470093 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - isPreloaded: 0 - isOverridable: 0 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Adjust/iOS/ADJAttribution.h.meta b/Assets/Adjust/iOS/ADJAttribution.h.meta deleted file mode 100644 index 339eebcd..00000000 --- a/Assets/Adjust/iOS/ADJAttribution.h.meta +++ /dev/null @@ -1,21 +0,0 @@ -fileFormatVersion: 2 -guid: 7dddf8beb94ee49a7aba11b4e22e059c -PluginImporter: - serializedVersion: 1 - iconMap: {} - executionOrder: {} - isPreloaded: 0 - platformData: - Any: - enabled: 0 - settings: {} - Editor: - enabled: 0 - settings: - DefaultValueInitialized: true - iOS: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Adjust/iOS/ADJConfig.h b/Assets/Adjust/iOS/ADJConfig.h deleted file mode 100644 index e9b916e8..00000000 --- a/Assets/Adjust/iOS/ADJConfig.h +++ /dev/null @@ -1,299 +0,0 @@ -// -// ADJConfig.h -// adjust -// -// Created by Pedro Filipe on 30/10/14. -// Copyright (c) 2014 adjust GmbH. All rights reserved. -// - -#import - -#import "ADJLogger.h" -#import "ADJAttribution.h" -#import "ADJEventSuccess.h" -#import "ADJEventFailure.h" -#import "ADJSessionSuccess.h" -#import "ADJSessionFailure.h" - -/** - * @brief Optional delegate that will get informed about tracking results. - */ -@protocol AdjustDelegate - -@optional - -/** - * @brief Optional delegate method that gets called when the attribution information changed. - * - * @param attribution The attribution information. - * - * @note See ADJAttribution for details. - */ -- (void)adjustAttributionChanged:(nullable ADJAttribution *)attribution; - -/** - * @brief Optional delegate method that gets called when an event is tracked with success. - * - * @param eventSuccessResponseData The response information from tracking with success - * - * @note See ADJEventSuccess for details. - */ -- (void)adjustEventTrackingSucceeded:(nullable ADJEventSuccess *)eventSuccessResponseData; - -/** - * @brief Optional delegate method that gets called when an event is tracked with failure. - * - * @param eventFailureResponseData The response information from tracking with failure - * - * @note See ADJEventFailure for details. - */ -- (void)adjustEventTrackingFailed:(nullable ADJEventFailure *)eventFailureResponseData; - -/** - * @brief Optional delegate method that gets called when an session is tracked with success. - * - * @param sessionSuccessResponseData The response information from tracking with success - * - * @note See ADJSessionSuccess for details. - */ -- (void)adjustSessionTrackingSucceeded:(nullable ADJSessionSuccess *)sessionSuccessResponseData; - -/** - * @brief Optional delegate method that gets called when an session is tracked with failure. - * - * @param sessionFailureResponseData The response information from tracking with failure - * - * @note See ADJSessionFailure for details. - */ -- (void)adjustSessionTrackingFailed:(nullable ADJSessionFailure *)sessionFailureResponseData; - -/** - * @brief Optional delegate method that gets called when a deferred deep link is about to be opened by the adjust SDK. - * - * @param deeplink The deep link url that was received by the adjust SDK to be opened. - * - * @return Boolean that indicates whether the deep link should be opened by the adjust SDK or not. - */ -- (BOOL)adjustDeeplinkResponse:(nullable NSURL *)deeplink; - -/** - * @brief Optional SKAdNetwork pre 4.0 style delegate method that gets called when Adjust SDK sets conversion value for the user. - * - * @param conversionValue Conversion value used by Adjust SDK to invoke updateConversionValue: API. - */ -- (void)adjustConversionValueUpdated:(nullable NSNumber *)conversionValue; - -/** - * @brief Optional SKAdNetwork 4.0 style delegate method that gets called when Adjust SDK sets conversion value for the user. - * You can use this callback even with using pre 4.0 SKAdNetwork. - * In that case you can expect coarseValue and lockWindow values to be nil. - * - * @param fineValue Conversion value set by Adjust SDK. - * @param coarseValue Coarse value set by Adjust SDK. - * @param lockWindow Lock window set by Adjust SDK. - */ -- (void)adjustConversionValueUpdated:(nullable NSNumber *)fineValue - coarseValue:(nullable NSString *)coarseValue - lockWindow:(nullable NSNumber *)lockWindow; - -@end - -/** - * @brief Adjust configuration object class. - */ -@interface ADJConfig : NSObject - -/** - * @brief SDK prefix. - * - * @note Not to be used by users, intended for non-native adjust SDKs only. - */ -@property (nonatomic, copy, nullable) NSString *sdkPrefix; - -/** - * @brief Default tracker to attribute organic installs to (optional). - */ -@property (nonatomic, copy, nullable) NSString *defaultTracker; - -@property (nonatomic, copy, nullable) NSString *externalDeviceId; - -/** - * @brief Adjust app token. - */ -@property (nonatomic, copy, readonly, nonnull) NSString *appToken; - -/** - * @brief Adjust environment variable. - */ -@property (nonatomic, copy, readonly, nonnull) NSString *environment; - -/** - * @brief Change the verbosity of Adjust's logs. - * - * @note You can increase or reduce the amount of logs from Adjust by passing - * one of the following parameters. Use ADJLogLevelSuppress to disable all logging. - * The desired minimum log level (default: info) - * Must be one of the following: - * - ADJLogLevelVerbose (enable all logging) - * - ADJLogLevelDebug (enable more logging) - * - ADJLogLevelInfo (the default) - * - ADJLogLevelWarn (disable info logging) - * - ADJLogLevelError (disable warnings as well) - * - ADJLogLevelAssert (disable errors as well) - * - ADJLogLevelSuppress (suppress all logging) - */ -@property (nonatomic, assign) ADJLogLevel logLevel; - -/** - * @brief Enable event buffering if your app triggers a lot of events. - * When enabled, events get buffered and only get tracked each - * minute. Buffered events are still persisted, of course. - */ -@property (nonatomic, assign) BOOL eventBufferingEnabled; - -/** - * @brief Set the optional delegate that will inform you about attribution or events. - * - * @note See the AdjustDelegate declaration above for details. - */ -@property (nonatomic, weak, nullable) NSObject *delegate; - -/** - * @brief Enables sending in the background. - */ -@property (nonatomic, assign) BOOL sendInBackground; - -/** - * @brief Enables/disables reading of iAd framework data needed for ASA tracking. - */ -@property (nonatomic, assign) BOOL allowiAdInfoReading DEPRECATED_MSG_ATTRIBUTE("Apple Search Ads attribution with usage of iAd.framework has been sunset by Apple as of February 7th 2023"); - -/** - * @brief Enables/disables reading of AdServices framework data needed for attribution. - */ -@property (nonatomic, assign) BOOL allowAdServicesInfoReading; - -/** - * @brief Enables/disables reading of IDFA parameter. - */ -@property (nonatomic, assign) BOOL allowIdfaReading; - -/** - * @brief Enables delayed start of the SDK. - */ -@property (nonatomic, assign) double delayStart; - -/** - * @brief Define how many seconds to wait for ATT status before sending the first data. - */ -@property (nonatomic, assign) NSUInteger attConsentWaitingInterval; - -/** - * @brief User agent for the requests. - */ -@property (nonatomic, copy, nullable) NSString *userAgent; - -/** - * @brief Set if the device is known. - */ -@property (nonatomic, assign) BOOL isDeviceKnown; - -/** - * @brief Set if cost data is needed in attribution response. - */ -@property (nonatomic, assign) BOOL needsCost; - -/** - * @brief Adjust app secret id. - */ -@property (nonatomic, copy, readonly, nullable) NSString *secretId; - -/** - * @brief Adjust app secret. - */ -@property (nonatomic, copy, readonly, nullable) NSString *appSecret; - -/** - * @brief Adjust set app secret. - */ -- (void)setAppSecret:(NSUInteger)secretId - info1:(NSUInteger)info1 - info2:(NSUInteger)info2 - info3:(NSUInteger)info3 - info4:(NSUInteger)info4; - - -@property (nonatomic, assign, readonly) BOOL isSKAdNetworkHandlingActive; - -- (void)deactivateSKAdNetworkHandling; - -/** - * @brief Adjust url strategy. - */ -@property (nonatomic, copy, readwrite, nullable) NSString *urlStrategy; - -/** - * @brief Enables/disables linkMe - */ -@property (nonatomic, assign) BOOL linkMeEnabled; - -/** - * @brief Get configuration object for the initialization of the Adjust SDK. - * - * @param appToken The App Token of your app. This unique identifier can - * be found it in your dashboard at http://adjust.com and should always - * be 12 characters long. - * @param environment The current environment your app. We use this environment to - * distinguish between real traffic and artificial traffic from test devices. - * It is very important that you keep this value meaningful at all times! - * Especially if you are tracking revenue. - * - * @returns Adjust configuration object. - */ -+ (nullable ADJConfig *)configWithAppToken:(nonnull NSString *)appToken - environment:(nonnull NSString *)environment; - -- (nullable id)initWithAppToken:(nonnull NSString *)appToken - environment:(nonnull NSString *)environment; - -/** - * @brief Configuration object for the initialization of the Adjust SDK. - * - * @param appToken The App Token of your app. This unique identifier can - * be found it in your dashboard at http://adjust.com and should always - * be 12 characters long. - * @param environment The current environment your app. We use this environment to - * distinguish between real traffic and artificial traffic from test devices. - * It is very important that you keep this value meaningful at all times! - * Especially if you are tracking revenue. - * @param allowSuppressLogLevel If set to true, it allows usage of ADJLogLevelSuppress - * and replaces the default value for production environment. - * - * @returns Adjust configuration object. - */ -+ (nullable ADJConfig *)configWithAppToken:(nonnull NSString *)appToken - environment:(nonnull NSString *)environment - allowSuppressLogLevel:(BOOL)allowSuppressLogLevel; - -- (nullable id)initWithAppToken:(nonnull NSString *)appToken - environment:(nonnull NSString *)environment - allowSuppressLogLevel:(BOOL)allowSuppressLogLevel; - -/** - * @brief Check if adjust configuration object is valid. - * - * @return Boolean indicating whether adjust config object is valid or not. - */ -- (BOOL)isValid; - -/** - * @brief Enable COPPA (Children's Online Privacy Protection Act) compliant for the application. - */ -@property (nonatomic, assign) BOOL coppaCompliantEnabled; - -/** - * @brief Enables caching of device ids to read it only once - */ -@property (nonatomic, assign) BOOL readDeviceInfoOnceEnabled; - -@end diff --git a/Assets/Adjust/iOS/ADJConfig.h.meta b/Assets/Adjust/iOS/ADJConfig.h.meta deleted file mode 100644 index 62c3751d..00000000 --- a/Assets/Adjust/iOS/ADJConfig.h.meta +++ /dev/null @@ -1,21 +0,0 @@ -fileFormatVersion: 2 -guid: 0c958f3cabffd44b6a58b8e0621ee82e -PluginImporter: - serializedVersion: 1 - iconMap: {} - executionOrder: {} - isPreloaded: 0 - platformData: - Any: - enabled: 0 - settings: {} - Editor: - enabled: 0 - settings: - DefaultValueInitialized: true - iOS: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Adjust/iOS/ADJEvent.h.meta b/Assets/Adjust/iOS/ADJEvent.h.meta deleted file mode 100644 index 9191a16b..00000000 --- a/Assets/Adjust/iOS/ADJEvent.h.meta +++ /dev/null @@ -1,21 +0,0 @@ -fileFormatVersion: 2 -guid: 426362cccd2154c908b504e138832851 -PluginImporter: - serializedVersion: 1 - iconMap: {} - executionOrder: {} - isPreloaded: 0 - platformData: - Any: - enabled: 0 - settings: {} - Editor: - enabled: 0 - settings: - DefaultValueInitialized: true - iOS: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Adjust/iOS/ADJEventFailure.h.meta b/Assets/Adjust/iOS/ADJEventFailure.h.meta deleted file mode 100644 index f495998c..00000000 --- a/Assets/Adjust/iOS/ADJEventFailure.h.meta +++ /dev/null @@ -1,147 +0,0 @@ -fileFormatVersion: 2 -guid: b274a5403f60c4e7ca731709d03d1ee8 -timeCreated: 1458122523 -licenseType: Free -PluginImporter: - serializedVersion: 2 - iconMap: {} - executionOrder: {} - isPreloaded: 0 - isOverridable: 0 - platformData: - data: - first: - '': Any - second: - enabled: 0 - settings: - Exclude Android: 1 - Exclude Editor: 1 - Exclude Linux: 1 - Exclude Linux64: 1 - Exclude LinuxUniversal: 1 - Exclude OSXIntel: 1 - Exclude OSXIntel64: 1 - Exclude OSXUniversal: 1 - Exclude WebGL: 1 - Exclude Win: 1 - Exclude Win64: 1 - Exclude iOS: 0 - Exclude tvOS: 1 - data: - first: - '': Editor - second: - enabled: 0 - settings: - CPU: AnyCPU - OS: AnyOS - data: - first: - Android: Android - second: - enabled: 0 - settings: - CPU: ARMv7 - data: - first: - Any: - second: - enabled: 0 - settings: {} - data: - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - data: - first: - Facebook: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Facebook: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Standalone: Linux - second: - enabled: 0 - settings: - CPU: x86 - data: - first: - Standalone: Linux64 - second: - enabled: 0 - settings: - CPU: x86_64 - data: - first: - Standalone: LinuxUniversal - second: - enabled: 0 - settings: - CPU: None - data: - first: - Standalone: OSXIntel - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Standalone: OSXIntel64 - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Standalone: OSXUniversal - second: - enabled: 0 - settings: - CPU: None - data: - first: - Standalone: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Standalone: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - iPhone: iOS - second: - enabled: 1 - settings: - CompileFlags: - FrameworkDependencies: - data: - first: - tvOS: tvOS - second: - enabled: 0 - settings: - CompileFlags: - FrameworkDependencies: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Adjust/iOS/ADJEventSuccess.h.meta b/Assets/Adjust/iOS/ADJEventSuccess.h.meta deleted file mode 100644 index 01ed5f32..00000000 --- a/Assets/Adjust/iOS/ADJEventSuccess.h.meta +++ /dev/null @@ -1,147 +0,0 @@ -fileFormatVersion: 2 -guid: 65ff11a24f3b043759b70623a745a004 -timeCreated: 1458122523 -licenseType: Free -PluginImporter: - serializedVersion: 2 - iconMap: {} - executionOrder: {} - isPreloaded: 0 - isOverridable: 0 - platformData: - data: - first: - '': Any - second: - enabled: 0 - settings: - Exclude Android: 1 - Exclude Editor: 1 - Exclude Linux: 1 - Exclude Linux64: 1 - Exclude LinuxUniversal: 1 - Exclude OSXIntel: 1 - Exclude OSXIntel64: 1 - Exclude OSXUniversal: 1 - Exclude WebGL: 1 - Exclude Win: 1 - Exclude Win64: 1 - Exclude iOS: 0 - Exclude tvOS: 1 - data: - first: - '': Editor - second: - enabled: 0 - settings: - CPU: AnyCPU - OS: AnyOS - data: - first: - Android: Android - second: - enabled: 0 - settings: - CPU: ARMv7 - data: - first: - Any: - second: - enabled: 0 - settings: {} - data: - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - data: - first: - Facebook: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Facebook: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Standalone: Linux - second: - enabled: 0 - settings: - CPU: x86 - data: - first: - Standalone: Linux64 - second: - enabled: 0 - settings: - CPU: x86_64 - data: - first: - Standalone: LinuxUniversal - second: - enabled: 0 - settings: - CPU: None - data: - first: - Standalone: OSXIntel - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Standalone: OSXIntel64 - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Standalone: OSXUniversal - second: - enabled: 0 - settings: - CPU: None - data: - first: - Standalone: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Standalone: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - iPhone: iOS - second: - enabled: 1 - settings: - CompileFlags: - FrameworkDependencies: - data: - first: - tvOS: tvOS - second: - enabled: 0 - settings: - CompileFlags: - FrameworkDependencies: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Adjust/iOS/ADJLogger.h.meta b/Assets/Adjust/iOS/ADJLogger.h.meta deleted file mode 100644 index 71c2cd1d..00000000 --- a/Assets/Adjust/iOS/ADJLogger.h.meta +++ /dev/null @@ -1,21 +0,0 @@ -fileFormatVersion: 2 -guid: 79bead718d24d4562b045c8fb25619ab -PluginImporter: - serializedVersion: 1 - iconMap: {} - executionOrder: {} - isPreloaded: 0 - platformData: - Any: - enabled: 0 - settings: {} - Editor: - enabled: 0 - settings: - DefaultValueInitialized: true - iOS: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Adjust/iOS/ADJPurchase.h.meta b/Assets/Adjust/iOS/ADJPurchase.h.meta deleted file mode 100644 index 4564a822..00000000 --- a/Assets/Adjust/iOS/ADJPurchase.h.meta +++ /dev/null @@ -1,24 +0,0 @@ -fileFormatVersion: 2 -guid: ff1d54f5d01f3401a91bed3817d0dc25 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - isPreloaded: 0 - isOverridable: 0 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Adjust/iOS/ADJPurchaseVerificationResult.h.meta b/Assets/Adjust/iOS/ADJPurchaseVerificationResult.h.meta deleted file mode 100644 index 673ca9bb..00000000 --- a/Assets/Adjust/iOS/ADJPurchaseVerificationResult.h.meta +++ /dev/null @@ -1,24 +0,0 @@ -fileFormatVersion: 2 -guid: 534a8868e882b4b99b1a9b98440bfedb -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - isPreloaded: 0 - isOverridable: 0 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Adjust/iOS/ADJSessionFailure.h.meta b/Assets/Adjust/iOS/ADJSessionFailure.h.meta deleted file mode 100644 index d2bdd33c..00000000 --- a/Assets/Adjust/iOS/ADJSessionFailure.h.meta +++ /dev/null @@ -1,147 +0,0 @@ -fileFormatVersion: 2 -guid: cb5e6ddbbcae24783900c75db92ead71 -timeCreated: 1458122523 -licenseType: Free -PluginImporter: - serializedVersion: 2 - iconMap: {} - executionOrder: {} - isPreloaded: 0 - isOverridable: 0 - platformData: - data: - first: - '': Any - second: - enabled: 0 - settings: - Exclude Android: 1 - Exclude Editor: 1 - Exclude Linux: 1 - Exclude Linux64: 1 - Exclude LinuxUniversal: 1 - Exclude OSXIntel: 1 - Exclude OSXIntel64: 1 - Exclude OSXUniversal: 1 - Exclude WebGL: 1 - Exclude Win: 1 - Exclude Win64: 1 - Exclude iOS: 0 - Exclude tvOS: 1 - data: - first: - '': Editor - second: - enabled: 0 - settings: - CPU: AnyCPU - OS: AnyOS - data: - first: - Android: Android - second: - enabled: 0 - settings: - CPU: ARMv7 - data: - first: - Any: - second: - enabled: 0 - settings: {} - data: - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - data: - first: - Facebook: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Facebook: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Standalone: Linux - second: - enabled: 0 - settings: - CPU: x86 - data: - first: - Standalone: Linux64 - second: - enabled: 0 - settings: - CPU: x86_64 - data: - first: - Standalone: LinuxUniversal - second: - enabled: 0 - settings: - CPU: None - data: - first: - Standalone: OSXIntel - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Standalone: OSXIntel64 - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Standalone: OSXUniversal - second: - enabled: 0 - settings: - CPU: None - data: - first: - Standalone: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Standalone: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - iPhone: iOS - second: - enabled: 1 - settings: - CompileFlags: - FrameworkDependencies: - data: - first: - tvOS: tvOS - second: - enabled: 0 - settings: - CompileFlags: - FrameworkDependencies: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Adjust/iOS/ADJSessionSuccess.h.meta b/Assets/Adjust/iOS/ADJSessionSuccess.h.meta deleted file mode 100644 index 9b169a3c..00000000 --- a/Assets/Adjust/iOS/ADJSessionSuccess.h.meta +++ /dev/null @@ -1,147 +0,0 @@ -fileFormatVersion: 2 -guid: 65455f64c4f194d6fb1e959ad638f311 -timeCreated: 1458122523 -licenseType: Free -PluginImporter: - serializedVersion: 2 - iconMap: {} - executionOrder: {} - isPreloaded: 0 - isOverridable: 0 - platformData: - data: - first: - '': Any - second: - enabled: 0 - settings: - Exclude Android: 1 - Exclude Editor: 1 - Exclude Linux: 1 - Exclude Linux64: 1 - Exclude LinuxUniversal: 1 - Exclude OSXIntel: 1 - Exclude OSXIntel64: 1 - Exclude OSXUniversal: 1 - Exclude WebGL: 1 - Exclude Win: 1 - Exclude Win64: 1 - Exclude iOS: 0 - Exclude tvOS: 1 - data: - first: - '': Editor - second: - enabled: 0 - settings: - CPU: AnyCPU - OS: AnyOS - data: - first: - Android: Android - second: - enabled: 0 - settings: - CPU: ARMv7 - data: - first: - Any: - second: - enabled: 0 - settings: {} - data: - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - data: - first: - Facebook: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Facebook: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Standalone: Linux - second: - enabled: 0 - settings: - CPU: x86 - data: - first: - Standalone: Linux64 - second: - enabled: 0 - settings: - CPU: x86_64 - data: - first: - Standalone: LinuxUniversal - second: - enabled: 0 - settings: - CPU: None - data: - first: - Standalone: OSXIntel - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Standalone: OSXIntel64 - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Standalone: OSXUniversal - second: - enabled: 0 - settings: - CPU: None - data: - first: - Standalone: Win - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - Standalone: Win64 - second: - enabled: 0 - settings: - CPU: AnyCPU - data: - first: - iPhone: iOS - second: - enabled: 1 - settings: - CompileFlags: - FrameworkDependencies: - data: - first: - tvOS: tvOS - second: - enabled: 0 - settings: - CompileFlags: - FrameworkDependencies: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Adjust/iOS/ADJSubscription.h.meta b/Assets/Adjust/iOS/ADJSubscription.h.meta deleted file mode 100644 index 67385628..00000000 --- a/Assets/Adjust/iOS/ADJSubscription.h.meta +++ /dev/null @@ -1,24 +0,0 @@ -fileFormatVersion: 2 -guid: 15bc7056a22f34382aea2497343c3509 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - isPreloaded: 0 - isOverridable: 0 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Adjust/iOS/ADJThirdPartySharing.h.meta b/Assets/Adjust/iOS/ADJThirdPartySharing.h.meta deleted file mode 100644 index b5248018..00000000 --- a/Assets/Adjust/iOS/ADJThirdPartySharing.h.meta +++ /dev/null @@ -1,24 +0,0 @@ -fileFormatVersion: 2 -guid: e34005ea3283c4e88bf3dc78e9e845e4 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - isPreloaded: 0 - isOverridable: 0 - platformData: - - first: - Any: - second: - enabled: 1 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Adjust/iOS/Adjust.h b/Assets/Adjust/iOS/Adjust.h deleted file mode 100644 index d4b1039c..00000000 --- a/Assets/Adjust/iOS/Adjust.h +++ /dev/null @@ -1,497 +0,0 @@ -// -// Adjust.h -// Adjust SDK -// -// V4.38.2 -// Created by Christian Wellenbrock (@wellle) on 23rd July 2013. -// Copyright (c) 2012-2021 Adjust GmbH. All rights reserved. -// - -#import "ADJEvent.h" -#import "ADJConfig.h" -#import "ADJAttribution.h" -#import "ADJSubscription.h" -#import "ADJThirdPartySharing.h" -#import "ADJAdRevenue.h" -#import "ADJLinkResolution.h" -#import "ADJPurchase.h" -#import "ADJPurchaseVerificationResult.h" - -typedef void(^AdjustResolvedDeeplinkBlock)(NSString * _Nonnull resolvedLink); - -@interface AdjustTestOptions : NSObject - -@property (nonatomic, copy, nullable) NSString *urlOverwrite; -@property (nonatomic, copy, nullable) NSString *extraPath; -@property (nonatomic, copy, nullable) NSNumber *timerIntervalInMilliseconds; -@property (nonatomic, copy, nullable) NSNumber *timerStartInMilliseconds; -@property (nonatomic, copy, nullable) NSNumber *sessionIntervalInMilliseconds; -@property (nonatomic, copy, nullable) NSNumber *subsessionIntervalInMilliseconds; -@property (nonatomic, copy, nullable) NSNumber *attStatusInt; -@property (nonatomic, copy, nullable) NSString *idfa; -@property (nonatomic, assign) BOOL teardown; -@property (nonatomic, assign) BOOL deleteState; -@property (nonatomic, assign) BOOL noBackoffWait; -@property (nonatomic, assign) BOOL adServicesFrameworkEnabled; -@property (nonatomic, assign) BOOL enableSigning; -@property (nonatomic, assign) BOOL disableSigning; - -@end - -/** - * Constants for our supported tracking environments. - */ -extern NSString * __nonnull const ADJEnvironmentSandbox; -extern NSString * __nonnull const ADJEnvironmentProduction; - -/** - * Constants for supported ad revenue sources. - */ -extern NSString * __nonnull const ADJAdRevenueSourceAppLovinMAX; -extern NSString * __nonnull const ADJAdRevenueSourceMopub; -extern NSString * __nonnull const ADJAdRevenueSourceAdMob; -extern NSString * __nonnull const ADJAdRevenueSourceIronSource; -extern NSString * __nonnull const ADJAdRevenueSourceAdMost; -extern NSString * __nonnull const ADJAdRevenueSourceUnity; -extern NSString * __nonnull const ADJAdRevenueSourceHeliumChartboost; -extern NSString * __nonnull const ADJAdRevenueSourcePublisher; -extern NSString * __nonnull const ADJAdRevenueSourceTopOn; -extern NSString * __nonnull const ADJAdRevenueSourceADX; -extern NSString * __nonnull const ADJAdRevenueSourceTradplus; - -/** - * Constants for country app's URL strategies. - */ -extern NSString * __nonnull const ADJUrlStrategyIndia; -extern NSString * __nonnull const ADJUrlStrategyChina; -extern NSString * __nonnull const ADJUrlStrategyCn; -extern NSString * __nonnull const ADJUrlStrategyCnOnly; -extern NSString * __nonnull const ADJDataResidencyEU; -extern NSString * __nonnull const ADJDataResidencyTR; -extern NSString * __nonnull const ADJDataResidencyUS; - -/** - * @brief The main interface to Adjust. - * - * @note Use the methods of this class to tell Adjust about the usage of your app. - * See the README for details. - */ -@interface Adjust : NSObject - -/** - * @brief Tell Adjust that the application did launch. - * This is required to initialize Adjust. Call this in the didFinishLaunching - * method of your AppDelegate. - * - * @note See ADJConfig.h for more configuration options - * - * @param adjustConfig The configuration object that includes the environment - * and the App Token of your app. This unique identifier can - * be found it in your dashboard at http://adjust.com and should always - * be 12 characters long. - */ -+ (void)appDidLaunch:(nullable ADJConfig *)adjustConfig; - -/** - * @brief Tell Adjust that a particular event has happened. - * - * @note See ADJEvent.h for more event options. - * - * @param event The Event object for this kind of event. It needs a event token - * that is created in the dashboard at http://adjust.com and should be six - * characters long. - */ -+ (void)trackEvent:(nullable ADJEvent *)event; - -/** - * @brief Tell adjust that the application resumed. - * - * @note Only necessary if the native notifications can't be used - * or if they will happen before call to appDidLaunch: is made. - */ -+ (void)trackSubsessionStart; - -/** - * @brief Tell adjust that the application paused. - * - * @note Only necessary if the native notifications can't be used. - */ -+ (void)trackSubsessionEnd; - -/** - * @brief Enable or disable the adjust SDK. This setting is saved for future sessions. - * - * @param enabled The flag to enable or disable the adjust SDK. - */ -+ (void)setEnabled:(BOOL)enabled; - -/** - * @brief Check if the SDK is enabled or disabled. - * - * return Boolean indicating whether SDK is enabled or not. - */ -+ (BOOL)isEnabled; - -/** - * @brief Read the URL that opened the application to search for an adjust deep link. - * - * @param url URL object which contains info about adjust deep link. - */ -+ (void)appWillOpenUrl:(nonnull NSURL *)url; - -/** - * @brief Process the deep link that has opened an app and potentially get a resolved link. - * - * @param deeplink URL object which contains info about adjust deep link. - * @param completionHandler Completion handler where either resolved or echoed deep link will be sent. - */ -+ (void)processDeeplink:(nonnull NSURL *)deeplink - completionHandler:(void (^_Nonnull)(NSString * _Nonnull resolvedLink))completionHandler; - -/** - * @brief Set the device token used by push notifications. - * - * @param deviceToken Apple push notification token for iOS device as NSData. - */ -+ (void)setDeviceToken:(nonnull NSData *)deviceToken; - -/** - * @brief Set the device token used by push notifications. - * This method is only used by Adjust non native SDKs. Don't use it anywhere else. - * - * @param pushToken Apple push notification token for iOS device as NSString. - */ -+ (void)setPushToken:(nonnull NSString *)pushToken; - -/** - * @brief Enable or disable offline mode. Activities won't be sent but they are saved when - * offline mode is disabled. This feature is not saved for future sessions. - * - * @param enabled The flag to enable or disable offline mode. - */ -+ (void)setOfflineMode:(BOOL)enabled; - -/** - * @brief Retrieve iOS device IDFA value. - * - * @return Device IDFA value. - */ -+ (nullable NSString *)idfa; - -/** - * @brief Retrieve iOS device IDFV value. - * - * @return Device IDFV value. - */ -+ (nullable NSString *)idfv; - - -/** - * @brief Get current adjust identifier for the user. - * - * @note Adjust identifier is available only after installation has been successfully tracked. - * - * @return Current adjust identifier value for the user. - */ -+ (nullable NSString *)adid; - -/** - * @brief Get current attribution for the user. - * - * @note Attribution information is available only after installation has been successfully tracked - * and attribution information arrived after that from the backend. - * - * @return Current attribution value for the user. - */ -+ (nullable ADJAttribution *)attribution; - -/** - * @brief Get current Adjust SDK version string. - * - * @return Adjust SDK version string (iosX.Y.Z). - */ -+ (nullable NSString *)sdkVersion; - -/** - * @brief Convert a universal link style URL to a deeplink style URL with the corresponding scheme. - * - * @param url URL object which contains info about adjust deep link. - * @param scheme Desired scheme to which you want your resulting URL object to be prefixed with. - * - * @return URL object in custom URL scheme style prefixed with given scheme name. - */ -+ (nullable NSURL *)convertUniversalLink:(nonnull NSURL *)url scheme:(nonnull NSString *)scheme; - -/** - * @brief Tell the adjust SDK to stop waiting for delayed initialisation timer to complete but rather to start - * upon this call. This should be called if you have obtained needed callback/partner parameters which you - * wanted to put as default ones before the delayedStart value you have set on ADJConfig has expired. - */ -+ (void)sendFirstPackages; - -/** - * @brief Tell adjust to send the request to Google and check if the installation - * belongs to Google AdWords campaign. - * - * @note Deprecated method, should not be used. - */ -+ (void)sendAdWordsRequest; - -/** - * @brief Add default callback parameter key-value pair which is going to be sent with each tracked session and event. - * - * @param key Default callback parameter key. - * @param value Default callback parameter value. - */ -+ (void)addSessionCallbackParameter:(nonnull NSString *)key value:(nonnull NSString *)value; - -/** - * @brief Add default partner parameter key-value pair which is going to be sent with each tracked session. - * - * @param key Default partner parameter key. - * @param value Default partner parameter value. - */ -+ (void)addSessionPartnerParameter:(nonnull NSString *)key value:(nonnull NSString *)value; - -/** - * @brief Remove default callback parameter from the session packages. - * - * @param key Default callback parameter key. - */ -+ (void)removeSessionCallbackParameter:(nonnull NSString *)key; - -/** - * @brief Remove default partner parameter from the session packages. - * - * @param key Default partner parameter key. - */ -+ (void)removeSessionPartnerParameter:(nonnull NSString *)key; - -/** - * @brief Remove all default callback parameters from the session packages. - */ -+ (void)resetSessionCallbackParameters; - -/** - * @brief Remove all default partner parameters from the session packages. - */ -+ (void)resetSessionPartnerParameters; - -/** - * @brief Give right user to be forgotten in accordance with GDPR law. - */ -+ (void)gdprForgetMe; - -/** - * @brief Track ad revenue for given source. - * - * @param source Ad revenue source. - * @param payload Ad revenue payload. - */ -+ (void)trackAdRevenue:(nonnull NSString *)source payload:(nonnull NSData *)payload; - -/** - * @brief Give right user to disable sharing data to any third-party. - */ -+ (void)disableThirdPartySharing; - -/** - * @brief Track third paty sharing with possibility to allow or disallow it. - * - * @param thirdPartySharing Third party sharing choice. - */ -+ (void)trackThirdPartySharing:(nonnull ADJThirdPartySharing *)thirdPartySharing; - -/** - * @brief Track measurement consent. - * - * @param enabled Value of the consent. - */ -+ (void)trackMeasurementConsent:(BOOL)enabled; - -/** - * @brief Track ad revenue. - * - * @param adRevenue Ad revenue object instance containing all the relevant ad revenue tracking data. - */ -+ (void)trackAdRevenue:(nonnull ADJAdRevenue *)adRevenue; - -/** - * @brief Track subscription. - * - * @param subscription Subscription object. - */ -+ (void)trackSubscription:(nonnull ADJSubscription *)subscription; - -/** - * @brief Adjust wrapper for requestTrackingAuthorizationWithCompletionHandler: method. - * - * @param completion Block which value of tracking authorization status will be delivered to. - */ -+ (void)requestTrackingAuthorizationWithCompletionHandler:(void (^_Nullable)(NSUInteger status))completion; - -/** - * @brief Getter for app tracking authorization status. - * - * @return Value of app tracking authorization status. - */ -+ (int)appTrackingAuthorizationStatus; - -/** - * @brief Adjust wrapper for SKAdNetwork's updateConversionValue: method. - * - * @param conversionValue Conversion value you would like SDK to set for given user. - */ -+ (void)updateConversionValue:(NSInteger)conversionValue; - -/** - * @brief Adjust wrapper for SKAdNetwork's updatePostbackConversionValue:completionHandler: method. - * - * @param conversionValue Conversion value you would like SDK to set for given user. - * @param completion Completion handler you can provide to catch and handle any errors. - */ -+ (void)updatePostbackConversionValue:(NSInteger)conversionValue - completionHandler:(void (^_Nullable)(NSError *_Nullable error))completion; - -/** - * @brief Adjust wrapper for SKAdNetwork's updatePostbackConversionValue:coarseValue:completionHandler: method. - * - * @param fineValue Conversion value you would like SDK to set for given user. - * @param coarseValue One of the possible SKAdNetworkCoarseConversionValue values. - * @param completion Completion handler you can provide to catch and handle any errors. - */ -+ (void)updatePostbackConversionValue:(NSInteger)fineValue - coarseValue:(nonnull NSString *)coarseValue - completionHandler:(void (^_Nullable)(NSError *_Nullable error))completion; - -/** - * @brief Adjust wrapper for SKAdNetwork's updatePostbackConversionValue:coarseValue:lockWindow:completionHandler: method. - * - * @param fineValue Conversion value you would like SDK to set for given user. - * @param coarseValue One of the possible SKAdNetworkCoarseConversionValue values. - * @param lockWindow A Boolean value that indicates whether to send the postback before the conversion window ends. - * @param completion Completion handler you can provide to catch and handle any errors. - */ -+ (void)updatePostbackConversionValue:(NSInteger)fineValue - coarseValue:(nonnull NSString *)coarseValue - lockWindow:(BOOL)lockWindow - completionHandler:(void (^_Nullable)(NSError *_Nullable error))completion; - -/** - * @brief Instruct to Adjust SDK to check current state of att_status. - */ -+ (void)checkForNewAttStatus; - -/** - * @brief Get the last deep link which has opened the app. - * - * @return Last deep link which has opened the app. - */ -+ (nullable NSURL *)lastDeeplink; - -/** - * @brief Verify in-app-purchase. - * - * @param purchase Purchase object. - * @param completionHandler Callback where verification result will be repoted. - */ -+ (void)verifyPurchase:(nonnull ADJPurchase *)purchase - completionHandler:(void (^_Nonnull)(ADJPurchaseVerificationResult * _Nonnull verificationResult))completionHandler; - -/** - * @brief Method used for internal testing only. Don't use it in production. - */ -+ (void)setTestOptions:(nullable AdjustTestOptions *)testOptions; - -/** - * Obtain singleton Adjust object. - */ -+ (nullable instancetype)getInstance; - -- (void)appDidLaunch:(nullable ADJConfig *)adjustConfig; - -- (void)trackEvent:(nullable ADJEvent *)event; - -- (void)setEnabled:(BOOL)enabled; - -- (void)teardown; - -- (void)appWillOpenUrl:(nonnull NSURL *)url; - -- (void)processDeeplink:(nonnull NSURL *)deeplink - completionHandler:(void (^_Nonnull)(NSString * _Nonnull resolvedLink))completionHandler; - -- (void)setOfflineMode:(BOOL)enabled; - -- (void)setDeviceToken:(nonnull NSData *)deviceToken; - -- (void)setPushToken:(nonnull NSString *)pushToken; - -- (void)sendFirstPackages; - -- (void)trackSubsessionEnd; - -- (void)trackSubsessionStart; - -- (void)resetSessionPartnerParameters; - -- (void)resetSessionCallbackParameters; - -- (void)removeSessionPartnerParameter:(nonnull NSString *)key; - -- (void)removeSessionCallbackParameter:(nonnull NSString *)key; - -- (void)addSessionPartnerParameter:(nonnull NSString *)key value:(nonnull NSString *)value; - -- (void)addSessionCallbackParameter:(nonnull NSString *)key value:(nonnull NSString *)value; - -- (void)gdprForgetMe; - -- (void)trackAdRevenue:(nonnull NSString *)source payload:(nonnull NSData *)payload; - -- (void)trackSubscription:(nonnull ADJSubscription *)subscription; - -- (BOOL)isEnabled; - -- (nullable NSString *)adid; - -- (nullable NSString *)idfa; - -- (nullable NSString *)sdkVersion; - -- (nullable ADJAttribution *)attribution; - -- (nullable NSURL *)convertUniversalLink:(nonnull NSURL *)url scheme:(nonnull NSString *)scheme; - -- (void)requestTrackingAuthorizationWithCompletionHandler:(void (^_Nullable)(NSUInteger status))completion; - -- (int)appTrackingAuthorizationStatus; - -- (void)updateConversionValue:(NSInteger)conversionValue; - -- (void)updatePostbackConversionValue:(NSInteger)conversionValue - completionHandler:(void (^_Nullable)(NSError *_Nullable error))completion; - -- (void)updatePostbackConversionValue:(NSInteger)fineValue - coarseValue:(nonnull NSString *)coarseValue - completionHandler:(void (^_Nullable)(NSError *_Nullable error))completion; - -- (void)updatePostbackConversionValue:(NSInteger)fineValue - coarseValue:(nonnull NSString *)coarseValue - lockWindow:(BOOL)lockWindow - completionHandler:(void (^_Nullable)(NSError *_Nullable error))completion; - -- (void)trackThirdPartySharing:(nonnull ADJThirdPartySharing *)thirdPartySharing; - -- (void)trackMeasurementConsent:(BOOL)enabled; - -- (void)trackAdRevenue:(nonnull ADJAdRevenue *)adRevenue; - -- (void)checkForNewAttStatus; - -- (nullable NSURL *)lastDeeplink; - -- (void)verifyPurchase:(nonnull ADJPurchase *)purchase - completionHandler:(void (^_Nonnull)(ADJPurchaseVerificationResult * _Nonnull verificationResult))completionHandler; - -@end diff --git a/Assets/Adjust/iOS/Adjust.h.meta b/Assets/Adjust/iOS/Adjust.h.meta deleted file mode 100644 index 4fd2266c..00000000 --- a/Assets/Adjust/iOS/Adjust.h.meta +++ /dev/null @@ -1,21 +0,0 @@ -fileFormatVersion: 2 -guid: 78f041701c2d94787bdb278a5bff4fae -PluginImporter: - serializedVersion: 1 - iconMap: {} - executionOrder: {} - isPreloaded: 0 - platformData: - Any: - enabled: 0 - settings: {} - Editor: - enabled: 0 - settings: - DefaultValueInitialized: true - iOS: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Adjust/iOS/AdjustSdk.a b/Assets/Adjust/iOS/AdjustSdk.a deleted file mode 100644 index 9e7cc05114802966f34671184a6ae763c965b730..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6972752 zcmeFa34Bvk_Bj61lq8fi4SSKcq)@OdE$KpOSu|-1q*x%dz<`KJ+6Ef!5|S1QZfR3! zi=ahOJAP3MqB4%oR7D48`Px!cM06@{3_4CLh{%9eM2FE)e&@V*UY3`av^q22@Av=t z&-*kz@1A?^x##ZZF6X|ZKm7K;8HS0FFpM0a6nA5Q!O-1B@F9Xuf{O``qi{*&{u{a9AowW3QIQO@|9J_MOz;|l z_d$G!-!zzm*Atvga2&x86`cRm1S<#@5FAeM3&>&Q_a4Dt5OfgyHN}@n?jZz^%D8ab z3EoIBhhPlB-a#DQvjn#iTtzT};F}cBx0KG02tG})iQq+|D z-a_zJ3g1fkWFz-3^50MJ_XN8Mo+Bus_}YgsjN-46%x{4Y!nX-tA~-yX!)Fk@o?tV< z4uYQ(Odx*O5xj%oNrG`u>oJ~11aBw!Yl43wsEFq1W)d_Lyqn;E6a0?g3>8OjBX~c- z*9d+`Fg=E&yMf?Vf=?4XLGTK}nQG!o@Iiua5d5Ct#GxGB5`sGjK2Pwk1k<1`V){!7 z{ujY_34Tj3emF;`CsHJ*b%BbY)^M(~3;&cB`D?F1JQoJ=r^V5)|rZzTS!32rC+dV)g;E+Lo=9W%-^ zo#;1{`#j09pWN>ej3M|O(Lck}0l#G9Fy>W)UyNrM-Jgds-z9OdU;+m#2ri$2J2#EP|B~Pa!n?@*8*c1s1X~H-OmHs2mxymhI!7N*_@U%J zMgGkMe@5^M$cJ)eXE2O0GJ$z6lY_GfmJ>Vxe9-@6f`f_vF7khg+$+id1mRB+{yu_s zg0)02z#}It*TB!Hapfk~Nu!h`UgFoV9$z6I4=XMf4lkhJRyqoaP5u8f&?~wa1zkmyuNAMHkyN=vV1fL>!lAx62d5!4jLi$eJH;tJ<@RtNV1YaX) zCHPl@t=BP3>-lNS`vm0#GYFOvG!#I8IX#70N6@l}bKgNQlVA(^KTGg9!Ak^365V)m z%L(=XUVA=;Nm|Uog#_;>xQG0oC-+SR|3G*NxgT8udepX5<^dB2Um$pb;QK&_{uc>q zh`xZ}W`eI0{ET1%g)bynL(skqNOgpAmcs=-V!5GHC?Q z5L8$>{4#QHBbW>L+Ql=NB!XoC%}a6@8q9_QeNmA)$*j*?XtI{vY+YwFS)JAj7kTHe z&=-pMrkaau?B%74YbuIu&i+X&OUrHfrMAjy`&xVd^d;qXAT27rxj)9Gwhi_Y+hS{l zZD5qkHaYsGTwAQKtg75pQB~v0FYS-5y>zYBU@a-L4TN$-zuYQa)z{XThv4eP>)dPul1II6*+!xJTrVm|N+uvae9i*hvD%I!53hB8Q7aaEN#i+pEQB`20x1dFO1 zHKH<^YKqJ4t}?94!D20|ax8%?7x8dfOC9Ak(6)m8mRH)VH?bah)@o~^&1Hx7QnG2@ z@?hMu!eHF;A{IBVa)TXGQ~~YB0hT+jU0YTLR^ zhBAAlH3-Qi#GkBkNo6@FsUJ4KveXWN1G|*cn`$uEMUcyEuIeQY6i(RDuwhcoR*-xH z&!Gkn&YR~|T8p9e_8+vmx~SS(4INA+pF4av8yrum zt=v{^LwaG?B|>X=p#(+tb(QwYb^Xd=W91z%buH8rleN14tifKf-^eSga$&fsTD$gV zR(t=s;Ig@}AA<~oOt+TjS1z)bLj$yxR8^LW)}Vm0a@7?7a}26&R%dC|Mqxi1Tmseh z3Y+sMO38+Wf_7H_$mG>H%a=gMywPd*){%fdnH7@?B-q0*rx>%@T#T*9TxxTbIPH$= zDyKOk-E2$GHg8DFl3c5mjK`iUux*adE*A}$sWsbXm^WlYu+RkAz~A*#Bgi(}*zlR! zV&K8cxHObJKJo#^SW@NKWG=InJ8VwM7cM?bZYV#HCA>FOS2N~swX-TD^Dy3-T42Bq zAAJ8qYTI=-=#&Gy+MuEeCSdDor4wH-ePN-@S zrMQM0VA*^h7_s<>CL&NVWbHaAd1K;bxDeOcAbwn|iR`j264mDBd4lE1Fh;T%} zBDuwr53sh1Dj6bd9gxw`Tn1bph(5&hEU1k+K-Vs_x@<57fLT|G6)Wn%;}Quxu)Gbc zMv3HttMq0=xxM7(0gFZ>Ihzfj899Z+zgQeF{?}sL@u2dLsQCAP${Rrtp z<$Dla2(378p^&oN>Z)F3v$|@WHk_Wpu;c>34xl2rDhwT})P!^negcF20Yss9I<353 z;2WPphvHP)GP|=B8d&wFBA7fwR*Q2H9sFr<7oD->EesbVl4VN_OA5GkH9^N6l5}y=lH!|eC7}0k zyavR@kH{~)xRReX)2rk!E}G|bRyjjy_CI+_kdg6IRehLC{8Li}U-*GeNpL!m4s(~> zP}7MtuSnrpW)6_fH$B1G%ukzg`FQ+mScFd*A6q~3yct=P12A{V%>K!V3uFW73oD$L zx*xhMzIa&STr;wO@xWVxSZIH-O3JO3>&(__vvq^jUXF`1W~Xg^jooQ;!3@%AGp|Mc zp4H9FYx#8~oFImpUWW4<*wix=XRdI<^M~SNr>|joU>+iyFq7DRyxBQ!SO#2S_0I<6 zWu>_pSD6GlLxH`*UR@Nhgyc7~<-6tU?3Ja*SK_di}2p`gjh>dS3<~fkR zZ*Ghc_fK6yGqwS!!`>J|@2><2W5Z#<0ChCD!%$TktX~H4Muq4{kUMZ& zD!jt)6$NOkD{U|v{4qhoOq_j;Mdn5QPMW=;T{Uah+F{*2#A<<;4)vN`8%}_WY~D%` zqUKQ`XbR#Q#^NF<4XF7%L4ZcUd$B=9DsA`~FYAk|GxpFGm8WsxDiNsb{VtjC0eqx+ zwrc1*gQpUFg`yCpw$d60r{RapVK1q7GSDAssCj@Oa@^knl|EcMp}6g?1+Y#5bC-2h z)zvoPin32v^^%)#%gqJ5bNz{GcP$g@?RngWz&{fdBsEky9HAF%NKkCee5Uj#Dblj) zHZ0}$M@#e20p%^x7T7A+g=x$ruy0dfK)i8vzQ_Tk+@HYJv~)m=q57KYvMQ&2Gdsp( z)VTc@q5~kwfJ3Fr%Ff^NgLXH9YDnM|x)%Ww-FT=4s4%p?!TKi!#`PkY*Yo?YK}8of zW_#E*%&*?YxAUqSXtyDNe5;|v7%?@tG(|@M!Q-t~nStGXg6gCVh+OW+M zSTurq5{5y@8V{Q<{HmC5=npyihMTm9ViV8|ybQ!=?Xb({w>1|gJs~IaFgyFFnc!X@ z&CmaNUcQO-KhKMwqQZnBa3UCL3IoL+a`M&xyaYpsnfI^^gxy&IoLPXHP*v`~m*m%3 z1^Np%s08&nkd}Isurxk?1FXU#9sKgbf+B8%egNEj#LKL%n}q?yt3I1$0bV{XVLAB7 z1d#{aaPNu&JNd+AjLaI zL{wTovT`H~QG-dQ5H%J$XpRrxh5OYUKR;ngX-EtlFZ{+QZtx=S0Sx^D`hG|I@bsXE z=X2)+si_5JaiIKAG~qP_L3DN(>H?ge#^y}uln+>c5JUlGFLpXWD0g@*LBP{t6;})d zWTLu2=oC6JD?slJe<;#h6<{L=r`Scd3abN@{ou6^VG^sW;GiciN#W+XcpVQ6!q?=W z&iDV8GLr7wLIA-6lMqh-_$lH1RF0n#+`l*Puj8NTzkUt<{s7_&)fZzg9LkT>i!k1_ z{2E5X=)afmpF(sT2wGbR>VJYLQq7@OPee%9!KAmQ-0BoR6$)E`!nF;YPOz(dv`1NF ztHu>xes(QTdV+#;hp2q3OzhUMcfpVn=ck2HWzNN8?;?kB0=<2s15KXAdsJeEOK4$E zDh09j2^~}hVQ51wqX~n+>Tt=;e*IEVFX@%K#A$=A{xGN2y_BVNG`C-Qc|vbN@WmNg z3VxUySWY{*fq~`UKW_)kW(SlVPB@fi4L)cl%wJlh`VlGQSClY?HLk!zc7kdi7#TM8 ze$-fJVBZ(E?|~y|{mpJNv-xvseod!PY$EO}&_HiIsb?2%vY_+AYhQHSFU zLG?!%)>d0$V~>@?X~^K>6;g*#NQ7igPJXNeRW-ruf5GJ3ks06OfS~mY1Hk#+kZV9e zv@V-dzs|P|DJcIy@&T0pziSr5ZKV3or@~e(D66pJBEOHNo9w4}!AL`#l-IEJW;fxIees&NmQuUTRG5Yccz-_N#K zU@(Uh&P??qx6@W)gM;GzP`Rw-Hke?n6KlhPar!NO!;HGW*!`%z)>?ul;m;mw8C&Q< zYBa85hg+l$u@W76W0><1>3(^&6{q?B%_FFv<_UqW-=iqB%2n*j)NbsLZNQ3H28iHY z!GKN(>NK~8LGNi4d$9pD|QW zWAO9CW1=n_AoOqmc~iB$#APU}LNg-qGj?Jj>FD6V!0(+QT{eBN97}=W9l&QdBssU?Lu#54#LlU@i9U!HKpx;06~f=;5{u z5fvstc%(Cg(maAFMQ`c|q{78V`-b2NVgOZTh`}|0h+SW^IYn>O5F_;0dqOwOkZtmR z;lxx38(0nv6|20wYNOtJp+SD-+Nweu9P13aLm+QqK#+Ve^dAtRU0*sNrVa<3$A-)e+RdnJzpRNoD$r8E%ht*J30e44OE34;;-r?X&H!V&s!$W=| z!x1k=snraM3%4z2~2He0F7 zz+U;n_O`(k(0jmzA$SZJE9R2Ql73|ZLshsPMC|-FpEkIT0_tv|51@_@H6h_wudOVU|b3vFVXw0N3e=Ewum4} zygsmqC349QY|^5RjzLq+U=3muUBLCD39qR85r$~)eiW5rmw@^CyV$Fz!lj5^ViM0i zFCWzHg6G%16;ILlh0`C0H!*b$!0jspinxMLfdg z7f({-g7ffTb`d7iNZ9|?T=U*D7F7CPAJnb$E5LS|-ExGHLsXsRuQ5Yvy3s7u;!OZ& zqBWIUOIXwI@Ny6}-Uk+rFyyw9U(_L*jUUCpH8%J0TOb@7sKov1SY^0u+`zKWr0-HpbLOX zQW3mfA)xcSY9)AF3#8o$+wSZ!)u4YaMtsAO#b4F1|YBADuXHP{R->8(?1` zkfi_U#nLG*0iB--WEo|#j*a0n&W7x6@Bn?$EfmFhB5#+W%G1V@i-r_9@!DT)8_{7r|qW@ZwIP?h&0}t;8p6mx$RV)_16Jf4~jU#dZFq@anTM6GG5kB=O1Ux*y zvMCG`jfhCbjevj5=BnbGO3ZMVPZ_riDd5NR$)Nz(qd95A35D`$ zC_z|$_*^FW&Vqatl|Vi=|5$#QfkOF`i65Ky$dG4@@9>1kKP-=G_5&G$@|YozFM447 zyqPFWua5XxSZNq07WiQ~^g()Mg!2bfzHoyr-1rW~BIMU5kgt~bX{LtCzhZkeyF0_h zVm22Ptbp$s@y~wZ*QVhxZb5o^IvzrOsVIegO&cME{EQPgkCWuDnaqb2hm>A>1t8sRhL8$s7seJLOw58!~p-L09`WtFuoMu<$LpC@xPR_HsTnCpfk+p7ymgj2I(~L6Yzr*4K;8x z|0dR7Bt8R}kOaiJ+}Qky{%86XMW(aJIluW8DhN2#n3I>aVZ?+{HoE@5n+7smrrt!@o&9G&&NL)cgz`Pyz=UQLryY0<9yE*sdIyIM>O&+ zXzq)7VYspLT*S5!QB7)i@BBE@^RYJO1((Fw`FW&q@O#@vq&1l&F)tKJJRipZJ_7JE z2oY)YbV>6)uYM2lL~Puuv{Q zv~2l`pRHVVy|uUm&X=q!v)^=cc|~QFV?A8zT(er%i$X3K&7nSa8GCB??PRJY9xLvKk zC!+L-;+YW|!~7=AYm#(lL+q5~DJ^NYw%@Q*^Xd`c+YGXm156)(WU!`qK9e{#sWmQf zBK#Y3wQ|e87K^j=22Iksdd;Xa3iS-e|DrM3^?zV|+kSiI7tFyaa(j33E z#9ljReA3S+FoVvuP2l|U-u!AweynmtNBzB-^LAQ$20h33O7rg5hVK64 zk;07FWs~lGE$ORTwQS7swFd}(sWEIvMB>7mnCjDzy7)EnQv_OaeCnWc(}90#i;>9f0c-?8xMsV`%dlSaO! zF-*9XW3gpW%f34n&Kv)Xqa}Gy95c%D@4P0%Kga^}|ZtoC!+V>F2sET20#+*@&pY3z%}< zzP&@6q_b3!`#ZXnyE@(XyCOSBxF^dzo$g%t`X9qAg^GL;;8^E`%U9r$v@+2O>7lsO ziE$_Q#GPakK1z)LurA@KKEds<$Tu)e8;tUeWzr4FjV^_JLz(oJ7Uvko>^ zYvh}Caz@1*ivMU&^jUqvAxT0H1n-SI*%p7OE}>h}Cf~Hb(aAJzYHM`FHrA9$Yg-yO zwlz9q<(q5eo64l?_sd<{MkjDU`zDQzDSfYZMsOX3= zjcw}1%#-U*>eTphE%Qg&+sQw`+Z{}Sq))1gnA8?ipQBK?S{fZ?jZR2-ZDX}VzByUG zi8)jke?p@9us8msI{~u2N0M;7Gycsz(I*q*&Pw8$%`J^U=5Cd5Ry3|(*_h>)Z>oiW ze736_H*4iC;8W(=WR%~QEN5as+C%z;H}}MyC4pnHfSfH-H)MNDBM@&cle&@{9c_)k z+}SF(K)S|#+<^&)mp({!M_ivZ;WT7XTl`7MILw*Exb99qulTGxjhUQ483iwpjco2g zwto%1$Da?od^9t9o@YXPIu#oOcX4%;7oRhV1QKvkpk+9O=S<+of}V@0oL;F8du% zPAl*+j6G(UbrvXV8TBQ#>Y_vSi7uu>tLihwbYuhNE>9d2Ik&+xXSX4z+b|Y_G)U*Z z1Ng2v%*|TWWwm@mhYVlb^73}s8F$QAnizPw(5J0nxl}QEoue33rXpjvhKIZEl)hFGuQ%ua)3`BYmg`Blr+TOV`!XhzRrJeu4++hmF-gO3F z$4Ayg}EhRt}FSj#wHiPfs*XQXEZBv`mUbC1m(Dw{}QpUmi5O&6A~& z*Sh7;>4pq+CCUdBz1~eVr?WOP|w^zFT)Khnp&V~x9gPds!0-JS7=@Fn^cYXbBx*h+dwpGb^9 zy9c|g6V`+k-JR3_5iz+TBBdc>>^}}o|Gg)Be^>TD4$avmoqfcR)7mwsT{3&0bnY&w zN7C8og>^O$t(!7jk$>@sAxbWJ}doeP=W(X}n>@)omZi>Ymk$>K3z-m+0G zuZe9m$3o6DZfeDT$ki&(f;N=hxY+`2OP=Lu+<1AA6WW%h(F{!%Ith2<$g;j6FX@In z<{omOL-tbNkS{c%l%O?o1tY9@y93UKf9y?XaO=Ib$94 zHAEe?M>k|ohs*+E^r=2>Q=RG?a;i`Dxi;ofdogCRF>yp$;s}4{uRz}ed?26eqEGLM zdvj013FwCFqM?_%y)N!(V%(A5(Oir@)_Gm3^Ol$kJu*lIG@a9G{J$_pF?5(=>-G_2 zax-&VcYl27m$Rn7{^_qbuev7n5%a5=@vBC^bnf%axmO;#_kFYTPd`jK_1Uj4-SWeO z_rCvY&8jtzylvL+O*c+@;Vghc^XUC02R(bZ z*@R+}+cEMnhUrlKBI#hBR#psbImU%6m#x!Y(hrMdXHSvC+YQg&S)qQqs>JkS>u~R7w`{j}N zjyg@0)Qa)3H1-w8bgG7>u?n26Gj2=72IJog->TC^4PK83pkd&7t>4dA#3$hI{eEMy|ucnkw%BNK)`!9=T!KMI?M)mq||mO>k&I%l5&O7Q7N^h}h0_mqfNjMrqqD+uGbwd*YhXBXo5s5#{5P zu2R-KB^f*I?r+Kr@fAI?V~@@~X7?ZKhS#y4fg z^t^(o8y5fOgY`{YJDbZ-v=^kjKV<%tmrFBFHt#AK4CVF=^!3j{-exG=aff^3){c;SFAA>B}mJ=mCILsjQnRK41mN^K1E7=0#HhWc>)N6^_O#vigKtkpKp{yjSmACS(0 zK@vLEV|^nwSmd{q$!DUPBcJI;jRQ5uWch~6gMjTuccU2;nOM*}pbM>=_BnJ!J*uxe zROhwQ;v>+L?}>8|H$30fWwI!|Wz-c5Qz-3R2p*5#)jKG+FL!t-IkA ztG0Y%g8qL(=W%_)X&A_Q<39ocjALfEd*&YSjBV)3-fqY_)-~r~XAbBr??~qyGagtE zO1DM6p49}$eDDf&ynPx_B5=I;#-yrLt4?WE;QXpb_F0eWv`KYYJK^K=);Lr%dqgE7$IZlXYc&te{=H%DL21q|PtLKGzlYL?#DZqM8T0{1;}~n-4(aR$&+OeG zk7v$y4?9X8n%(4?wY_UPV!Ed9l3oLHc1Y*$>zaMAYtAu82NMqk*8`QLF8(8H97G2L z^jeFR9q&Ljt87tSU`ymwiwabpmq7Rq)h93%nqV<}lZIh_33b|;VAL3zlw$@v(~X)5 zb=!CDd@HX_om@I6Ej{@ds9-#6c-DY91p2QZ5C#~W}ZTLbq#!gmp?;cI;Ue)B+R_{Oh>r72vZ zF;%hKuE2=>Ch11_B$?CfvTwGT@(mi+#-nB7PxSx zcR0#zniBlph6YZ>V=imbGE=pwT1_&GO-aktf-5yWCpAr*KAB-AWnihmI%9ob?F7Y> zrl<*uKW5eUl}%9S0Ngr35i_&C&)umwG+dUUTxNPhyE0-%mnHgrrDxuV4CVcGfLM^# zWl21#^xS6w#ItW`9Ybbxb)>zgl)i7uP`sJp>Ct5<7H4{Tj2V${+nGjL+^g$%$2Qdk z{Ye17J#td=gsiOJWj*l1%x7o4kUl!&h4$xOTpIhUuddN5q-n9z^kiv9wrBT=6X#Ff zaN_uf?;SmT!$&=5kAL*xnfZy`n&@{d(S_EM=Wcf8Pnha@bnHY6j?%w?et06lAyJ_C zZ3M-3rK1(vR2TFlIo)0LXX0MrX2YG>^tgUwROTs*>QfVRM=__dQ;PW%bf;s^+dgkuxs+XePduUGrD1M_>p6XEb_NYGXkwNfN@Lv}Lde^g5`a(!-c z`=P0SC{Dh1?+E?iUHZg#Bty#=$=+#?UTmt2bhp0HIk^6$>}sI@Qp+&I0FGa9q-AMT zByNW>OF$v1s;IO(s^ISZY7N##sNz_24ATu$r)rkv>h%zxGK(2oKl6n4U|n2C=T@ug z46Gb5Inf&qx2bd0%6~8;BaUy8j7ihprH+)IiS;==%d@vx4kn(JYFll_`kn?ws{2g+ zXQ{0l4tMAvV4h@D#7zf#+Yejr*K6wQqMjTXnH;-6wou<*U$+g^rX-C-ovM}|a}WDo z+vb@PIfBWRE4I!o*Tv;B>IlW?-JNS3vXhcS<7Fe5LxXO1FNpjv$;5B1t&P_!l9>jT zdi;#oEKO`8qmVQVIn$HcB)!0NI;BxeZ$wVVg!(s-?PX~;$M(ZG9X|- z*%X;g*Jx=gcF5K!j7-Cj6_Sj$yla(dX)%&P?rur_`lv41;l#)ehoL^oq8qHaK|N%n ze%je-o~7z|jrJ*>M00~_NNrv_im>(J%Ot|yEmrB?p%HGi?qJ*K&+FH8E0f=fk*;dZ z(@88K_yRTaT;zglcAahPomM!$jWNyA_1tPb;Xc^FKo&%-SGZTzKPqkb)#zEezRiGF zA4z1^4sNO2RyR`Cixj&R%(*R+#OGsMUX=FsH4l}ZR_L|0Th^%Se-_&~)RPOY3F9ql&DHQ6W9jh%7jW1h08UQn*o%2#il*6K+yj6T+Rzg}6Nb0WP(kH~bz z8O!S}GNk-a0|e5zNLRb9$%CP4)Ii*;LgI#8BrZf^M-&nlCIYc%DiXJDLE`6;xN{T| zpGRWZjY!O>koYhXcV#1Sb|Vs>L*lx4B?x(-OAf@fmwO;7?6Y3O?aQS@#cCLO?_feR zHdworLIWKp-KBxHK+wMyE;e!wxUOV{XesVFuaRBQ8qTg`%u@65{ z00-Mp0saYSupPGn!(@Q$nt}#ipks>za0KvU39pz2IKbl?!YROmh%CJ#iD4!KUJmXr z0FN>vAH-_`k9@xdJjTP~fzL|7$Adc#;>UP+d=21X^2B5V9>wMPYzBNHxaR;~!{dR^ ze*vD|a{wHs6X_cu!`=t{RfNN|vUq?Kf$3;~5R?ta)6W4s%AtoJpWX&|UkP~Re*^q* z4Ib%n&Qt+-Tu*nv5B(9Z0GtPYn654GMf?-ww9_6?T@F*|xiNuOQ4`27%p*)Z;|M2)P0iVeu0rL1C zOWy{0fO~`d^Hcc@gY;v4<)8leY^MAY(*FtYSWf)I^9hBY3i&vdCkDvV+X2sR90G0) zHXX&nQu+FgOOyO*f(Y!)mXkM&eG>;+m`ne4_J7#uId8}R}xhq^#zGC;J~Qnye9QXs%&HR>5(dRIqHe z+AHB}Hn3e?4xcf#A=X^sf?KaEOH1$ufs!!9U@uo)FE+pMoK|0(on_9-OtGTcpJK0a<)Esc;^O8jRnF;nP|G#F#s-s-b<-Ev ztBp0q(`&${Zj;$nir=^2FdYsxO^1Nf!988iUcfuuKQpFt85DT-s$zioX7(jADC6k( z6PI)B1z%Mq;pqMI&W|oQ^Wad1&E`iTo_z&kb)P#!#Lpo4qgm5RxXo{Kxg9PJu$H^H zpkmE3a0*Iiv8GWtGfnGUfiqE2NmA27M*?kMtnqUJe2tN7{eIZs<{v07WF>brOMJ#G zE@wso z{8%s9T*ydj)e^N*u4n*|%pGsK;5cI!A*8v2TB0diws5xR=mtSM2=@naEkZZ2zC>U(!mDizH$aMyUgQ}xsQM3*p=g+L>OknYCOK^t#WrYu zrKuHFr8Ur1h>kG~JGc^O(s~#gyo1t#eKsM*#!7$s;Gu~bpo$SDg4E1#p6QSeqG}?P zKR!S9yn4EJW?Gg8A4?QphJjjB70Xxbyt)D!G^1g?*?IqEXm6pO{W{Jk8NU)fYh9$A{n{g9AKG1&RR}1_|Hr|U3 z1m~GKwU1Z`)7wJ)a4i9!gTT-K2~KaxT7QN@`Pzw}g_xWm`IF@meS@zU2!|>!9pOayaROtNIT-e= zNA--D$y@MTW6b0o8W!BAWx+!_7CdHR!P6ENJnvw^ZEoY8Y#TJ*35@4;8}DShvMX=H z;qWVO!}mfE^0S= z{+_%s#@KwsD4o~g=~Of?YX7U!cqee%VN@8K7acU-na!O?&u@Mi&Y|nCyt8P_h3e}H zn!hmKS<_m;om|&nc`x9&`W5hNGd3Uc!-H`^LGu*|ZfyPwGHL$XqUO&(+YHGx-g(=8 zI`ZyI?Cg2nHDe%vvFT3NB`Zc~|?`JUuXnkO8?lulSQWM!OS;HF{Kmiz=kFL4G zrqXAjkl*}6;AwlZQD6-eyeI8_h6=3oz=`uh(}w21a8g1p2u|T+EJY?`^LH;n<>yQm zz*68YsIF;OjLjdV9oIK^up*-=g!fqg36{&6EXo9ARR0@pZu4pqziV;{RVoAv=3rl zD2Q)|T2RpZO+oXwX&p#?rOW8~PE&Il(8QDy#2B$WhZQuRg)}Go3bTtPE3rE4@Rd2( zYA@v$L>O)m&fNrC<=l-g9DWvKcgOplo8%2xCD_5VNvDu42-=v8W_mTRD40TRS4RhvX6lNQ#P;~iQ_$SRaFt93M*|{K zSo4l6k0d_cHRgvwJ0HJeVON(SGXL06cSKE~2}-Pq8M2!*`FP~WCZ4uykhP8Dd?oMA z(~37QF8Rfn*!`{W9I36<#2(Q^4?3Y+C7F^?ta@iyu0B1h{PRV zE^+T{y1!8p<rr4*A$719N}0 zlCvnWM7hT?cQ8iXxN^-spvGMp=U(S|l(VNeEb;dp#i%{exA3MG4R8oG`+y+_tVq0; z0}PzeKhLP)7;6O_-&d>pm>4*A`6<{-u;*?WFeI3}OR9sjws4^HDKK5}%=tZ-9CT%O zcY#d;h&8v>1BWl?9O#4tTG#B7LWil3p#x!L{jnV>bB;)KV8e2xD+f++9jHS?g>C~d z&p9S-mz{FQthb;Q3B1&T35f*`ea2jbmu}SsH`<|mrB20f&siS_6z#z=rOuuE7$tPIeuk>wH}Ro*4B4t53gTWuhR{$FRRzg z8y;b=*Q5-Ov_GgZ!iL0u?0h``vvxk#Ks%pPU|^$RdxH*{@4asb9I3x#QbAvFUK=xY zule$zLdBr#6@$>$C>9Nh&}zuh=vrBa#zF^7Q3rKH%Kc4u;M^x3?^gA8t3CyPU#Wj z&cwV44X^zo_4iMH_3W)bJo&&Ur!M}zrr_-ojYCGz%V-aL(`%g_upkrx<|vfp?RY1QQ@3& zPtOo(BD=r@<~d`eSqp*R?0wJm4C{^M4Aj}E9$orSXU{M{d!WHHU(jFPQU~i&3iz93 zY0Mn=?il6tosklDZh_*MO2i`XF_yu=Y}eGHI3-H0K@?an6^|}aZGF%f5rH!bR-%iAFV<;?4_=A{9mBvv>9f+O zX2q6|9~^-aF=(OmwQ{E7lrMv{8{Lm4!BUyw$%m#7eX+P=JDvFvhQB^)|-Y{!+(p%4d zYdPDTq+qiIGrVE-igC(o{H6Zz^{6e0)BK8eSo0^6$%>LRHRcFcN4`ClzNOBe=J->q zYP28b4T~e8+6@b54jH-iS^s);W$lH|_Tl*sU+T}Cw~TCfE>;nVeA)8&WuxqAP20;l z4PqFyHhb`;b0ZrL7@K&SrY6nMk?-W{8kfzA-L6kzI=Dqmtes%5^<<3n>?k)Y1j~T| z>#ujWNgf}fV-IU`I4}~M@@iY}APrl_EY3YRw(zwQ^_LOc!YGUDh*bV!e!AsWiNYO$ z?D4TgY+W{e%CgnH@kqx;UM0L|5f*xFy7ohT7u$zV;v*=4HN0+ z0>Xc=D0^~D^hcIB#*$4)4JKqFRJUDHM#+@}WDiPsWJb2f$+#sFj?#@LYVRJEt!q)~ z7^tTVhz<`V`JN9n(eFW8AR~1w4%70xvAgv-Ooy9Apa-O7VS{u=nOwuJ_Oe_tbDmkR zlYIg!%p5zYooM#9QuV@WCPGJn!R!s9o+W>6HX~^P9496k(LF4kklJHGrEyqQQTCv8 zBAC_gp;y&1#PV#+se9Ph~khsc}3ewh*hW9HZpld z?73`drjAg`ZrvV^YKFyg2E%Thb;hk~TQ}n2rLpJsOJ}zbp{lQAFGo11TY8=&{Kg%V zi5%N!bUicU^=D?BdS=E~&pcoJ%*5Y4Gb5*c#xL5p6pjHKz#fh|%HU0g^fL|x=3Y;6 zF`bZJ(@lA!YvNESC80pdO^`=}R@XDD>j$r{AF{eWdUd^Ib$!I@`pDJwgH}%(@xk7q zQ%vQHVHjCwy++aaz@JYa_-+ns(07+=#KJ$``Q_%;MYk>a?Bap%o|>SD+uL@`(NaIF z%Ni9GEuXSKGw#W!-fy7vS@!rqvKmXOEBcIQG@?OP#CqHvP z{?WF>o4;T9XvJ?L_ujwfu1u4Z&E_M61{=q>PfF4>A8KuJCyjUQ{rOPl$yF~`T>J1t zG6wW{RX|8#c#6J86&*sYDP+Be_0AZOt&OZuD(Wy802yw9KUOaoe`%zGmF1UG?;>PyBgSZsC-I6<2@ya_!t> z@4fYxqTkNBaLr$hgSQy+u0OQr?EYO3s$V;2Ty{fgY2Mzel?RfeI^9pFynZ1%b#Z0t z!ke}|d2ZXU-c%ip`m1XClB&CZ{l_n2On07rWtaxr*MICH|6>=)8l?aG>>^LhMC1MN z#*7(<809OV|AN(RXEe?NJ6ZGjz>}|jQGa%kE0^vKvWx7?`;T2@CG4O4-?5AA&pM7_*3QA643wezzTJlu5p(yy ztT=Qp8c!x~*D!klyZ?~lkOvTVPu{MX^Gj{L?wLbM&&V4xl&zLGv=&2FmwV{TO6l6N z4CRSu0HK)K<(_y_DSf;;L-|qh8`@fBR#(rA_muTt9n)lYE9-~9p~*h3?97yE4Pb<6 za`rtWZ<1UkVnyj^SLuj*byds633Y>yHtl%hS8qIaVaHQxu?J4KWD@UA>dbDa! zn#Pl^^?-eTrYVF`<$LbvlO2IZm9?;U^8a<4%C%5-!y^~4HkEk3;gU%uKicc!#Av>fiZD>hcC zsIN;s&@c?}(TaM>^!B{&3r!z`wfMN-##=k2aKX)QCfrrq)Y$lKv0H6cwydfLv%yiv zm~2lm!0etWXKRzYq9yZW&nXY7yVFe0wkDZIAsIDV2}XX4Okm^}nI_#QQFP8I*JVp2 z$A+n;Bc|^v=rtuL);Z-NV@=tN+P|qoeUfUy|-qyf-wkzfnrz5#XtX{T9 z$G1)dpKUTWj^fvE0v{zfbfXXNRUYI5_Y8XOG6ZI2>KK1wDxS^3Qyr^iX_wI?P-bDk z$S#wSg2CPXPBgg7LcCf&4o}6x`CScX|290*z?Khc8Yxq!nA{Br0U%^@`3W zeIl4dx~0a*X63ZUUS@tiTYcBg*tG12!65P;ZG$D2vyF7bHfx&e$WZde>}Jgta(Gs& zn=Q?5n4!ZK9LUvyaxpS6mrO=W#8}Lvt*80@T9orDpyTDlw2a7z(3MSKUYHK2dsnrA zjpmmi&{Lkd+q;_d7vXiE^qLV7X^~@;=SfzBQ8C#BbSU_ThptsjjXVr&*mFLsw=zm7 z1C3kaD}zM8_;6y?u=cxQIO9T_Vl2<`Xj3dZEX6Z9*2+y9GH_tV%4W5Cs=7?_nm);; z;b}>O55%+C;@QwDPmE2EJ;9llGL3hr3)@a|j)PlnSFeC#V#`RT+0W$#Fh<@QI8y?U zuMaqL%Uh}&6l;orqAJu!Ls8|~zPm?%C%nAFl^M#2GLPMw)9QhR+Ki!-zJzvs+SiUR zt4*t*x=2qA)@v;-iD$POdg02QVz`}6A^UCju*KS9Qyvucmu)e*vKVc#!wC2xRAYhw53O^7@W*$S_2&vlUD(;kBQFj4J<)JZ+ivbqPg9^6F< z9rQr#irD>ar=`Y*%Iv&v)h0%rUfTq=w?JoUj>`EJGdNndb!@##xpquMBGz0ydbWBi z+SN*--h$O?2Lo2CgJU~7@3*Ewp>;r^m5)h~0`g~Q7^_tFKnR9eui@$zYr8t_h_Y7t zfjj&4=+>gYxaaItoi+TGrD9lH*1I9Iz;4Yk4RBZno1x8OzliycWxf)A_#n)MUlVv< z4bTk`ZCM`ycs;=3@WV&zcODYy@%cN@j0boXH0TKc*~N7Ylo2!l+;p1@cs1eCmUSB7 z(Kd7u;GvnY^oXAacs$T<13aE@L_UZw0z94pa{?au@pv2Hkq&J?l{`KP=m4J#?z;hh zHID~A4+0(!L%jfaYz;i0-vAzMERO>o&o%J)Hvx})&jKFX0*^llcx*#o0bb*W{|@k} z;2sWV0;Url2_{3uM*3X9V?H4t#4iN=Byg7k{%SwG1Mnz6p6%iBXw%yY_$h#Y7Vwja z9`T2W&j)_=$p0+hrvhCBln;hu*7NBEoO?!{g##72vTxJOMwxJ|O=WiGLTo`}6N6 zJ|_V0&;LBpese_vF~8Z1z;NBk^d#Y`}5BSJo1l<2;{#O@K7a~ zNr1=t#ikb+Q~@64PXWBY{9B2CF5vz7KTP~r3i$sH@R*O)fam)qOz+o#$M6k){4rfa zpp!xQe=guZ0q`ituK~~JKk_jX{UHJUM#7&E;O{2<=K}l_fS(2YBcbEY0m$d)*F--T z@c!wIhRze^EE3=+65cMr&n5gF0{n8o&jddA0Y1ww-tB;&4DQzfpX`T!9`IN$Ujd#k zmj-a;Pp5BlL#3x$pS9RKk67XhEiBLVXGe>eShXwNDC3-Qi}c9kd+ z?=67GagTraeE6~SKQ`a~Rr&Dmmh%m$Q&=DQhtHo->CJ}rBUax+(f?R{FYw3ynt%S) z@`RE|HCXxl_Uhv|cK- z!FTL!`1xp8wG+NpfCkc~X5MfiO%JmkXv@>{7lR7 zi6?qJg{hV86rdVsOIWGdXc!9^5&?*@CS zJ?O#>mPxsNtqnhG2XzKMgOuvf+Ot{w1}j|Y2N>3YMr?3PN6_6I{+@y>Jp7GjePm!* zSGg|WRu0zBD+JgM1c(4`Utn>o-LMG{I>o<+y`3afKB1*RcnYr#!5YK-<%Ic(|bAgqF&1IO+`9hZjw))k48F_D*sp8+l3I@?~)(T?L7Q%Oy z!S+EIb6AF)#Y0e)(EDyhF&NB6Mm?BCxT>A-xr+a}n^Cy@3bgXA=)ZRRT~5MTaB~Q6 z)$-ME&V#Su0pZvh9(ak0ul|KK4EJLbT*(EZ@U`442q65zi`VmTIS^dU(a@XA$l%_9 zt>xhee3cx=(gD?Spc`N{?#icP&v` zx?dp#>yCb&!6gLBV~7|t!(@CKT>e8EqZnx9G`wLxPGmyF!e0axq`QWo4{A_e{go>jKaF}|3T#j? ze#jAMuq2OAhxIln_KF1h1fO{C!FAvP`Yt;xi(k$J^W^`(-Oq&gD803E5d05(5RXq1 z2ZH?f5@s#(|{h=yiFar z>U!l0pAPT+Q6`UkyKD!0hZK;p=_>&Ea3@Dk>4nV;x^D`J;6Z#f{2nAaOgH=RbaXEj z((Q)d38JHG9DMw8xgBJrI}E?ii4OCDeRzIEhv_*Fzi){S^MieOxb5BDx$Zz29!fWRmIVGh4&C%{N>Zw83z zuK}0{5btG0IST+zfUV19fXH7>5Nkg2{R}b{%4E?&fIv6*Nq`_){38H?guOQm{O7I( zH}cEo{AIAMjdU_x$3&cn3uj?Tk@++h8Ip~I86S;pN{tj~E z{me*@>B8qe_~HF*I>=Of*1!+l`^lX_?jCaA2jTGkHVs=-pl+jlP_X>{Im6Kn4Vl0H z<~@kZFMF9faQM5sfxo}|?*cdOWBL1IJM(wnByi_I{Qmy41pcc9{z&Uj|CE5fQb0dQ z;GQU;zaVhGCUB<<+>F=)um4?XtY+;$^?|FPSbfz`D+;0Bh)@nle-a5dP%V)Wn;(m< zK8X^Bm`Dd)ZO71T7=*-iz>=HIC1p38*IMo6LAe&NmL25FDeEZ502c^I4Dm&f02%!j ztNd3RL(zEg>>|&AFYN1QMj4nv>uRjdQi{lXlV8Y10sqVjp1rY`^>LXNVhtxOg>Mn3 zKQdZ#VZyC2aVyASNrD%l!bVJMGn5CS^ZB%#aK714srWU@aCBMWJkw@`^X2b4WZQFa z3Bmk2TAn85$F|HZjaU>JCKH|Q#;udwF~5I@j+66aD}JU`PuhPe?Lh~Jaw zy@;2aJ0cR!VZk_+`9e9DNQ8~7n#c+?!= z{u4ibVGz-cnoQigK1f_!+!3&a~E~R;CR$qmf_Pe($&~;1~WLM?9;A4*_OBzq!q!nc(#Dt7;s9 zP`(~wq@(Z$Nj?Y2M=BQi@Zq^d1uS3O=@piT26QQW`1$AMe&q{)k7FkBTfnhplssc{ z2d9^l50`h4M3`PT@jF5Fa3%1=@@Rqd;#@}fP<^rE#m@K$`K_b_EM*i>3zdZGF<}CM zfBPu6<2BrQ`ek|_O$YH)5UQ2Xl6YvS z-wMT&&p-S)njJnfCQR@6d%2K&dcO_kCu|?^Nd&mk4Azl1+F^IcT#)AF-|1?)$kw`>8SPhf3mKzEGX`qGt&w!hcR+>_~j~Le~BYzM}(} z)&p=SEX*&k8k*pT4<-PAuaS8Y) z+y;B8jjP{CrwyjV4>K&TsL|09xLDCb)CbI`0NL1EBUcpRRi4}(igZ0?a~ItGcotdFJ&ACs zqOtiTe?Mlx6_Km;H?H{%N%<=%`KuaZ;hsp~>!7qYJWzt#PErn{$m2HoA?&;9-FPbRPXy;rYZy{dXuT~%E* zBbbEq5oJ1eS=O|L)jfeSE=Ia>z(h1)S?gJHu#e}b=Cg0ex3**m*EW;lzL;R-_q2S2 zHooNd;e6}Y1pFh!WM*;72Jc4x_t}be@f34!=9(WWY_t!oX69jMSa)HG3x>|l53-!! zWIEf}MxEXY2N;Et`Nf!XknS#1&a*-=V1ye|5f$d_A%?`iZfyP;F4_E()eOt}8NtF9 zsLw)8&Ru0d&=Y|*Eiytl5my5E-M6vsTZ8*H+~pKL}gd^8Su#@jrAG;glq{TkE`nrP+87 zDXPW>u|RR6^9b2BkzgjlMFbZUtR(0lcr(Gf2|i5l8G@Yz_Y-`F;Ku~NB`Czs zaX34U8(}hyFo_6);y%ve_=@x$kFkjK*J-?jlF2E@1i9XQImtH9*y@>W^UPJbcYdBD zN8ypHB9x@UadQO4Si6oX7p_N;@GOpp2v0Z{6hzjNv!C=5$6=&6Z}%)7wk|--cV#?c zK3_!RC!#Dd-)AWBVmVRri{(biFXo$)U(81(zgW(c{9?IN@{8qA$uE{mCBIlsmHcA4 zRq~7FSjjJzYbC!}&XxRPxmWT>Q~oRY#d@ja7we6ZU#v$;ez9ID`NevsK2}5jM8YfOPbIufA;*A%*GDXTfZ4>ijQCi+4VKVze9&z^=yo6U)jsGq`=H^Qpl%z+{(S z>u*V2*JJ|ozw9#b|K0way^OIdMF5oT%69vvq^8alUSruu=Q0 z#^8(6v+5JK);Js{UB512U-+|w^3t{(&CwT~c{s^ni0$f#)Wvr7NE3q0J~rv>?E!v% zJ*wL>g-z+5TRs(eP1yl`m3!?+8|+qGjV9A3L!+Trj~4a4_Pea+KC->`jlscseSd?; zUi%J5lQ}}U*FI7f92_2*5h^{N~=I z>vzymmuN8P=iCw+(sj$wknCHBgmm3nHhhat*X-P~J=f7R-|E=9J^G`N;Nbc5ABy&` zcqrWe_J^YUw?8!8|MiD1@c-_iA^!ch4fapk)+cO<$rL**v5&!!bnh_3pX2=;hjC0o zSz<$mrPVa||?T^aiKjL8`+gN{7oue(6^{o8Ff z{j%@mo6}7-Yg?BNtA5Zt?{HteJ}J9-(BLD%$Gh}Z%L4k`UKsd%vfmX+weJP!#)k&9 zaI2$(gM;6Xz4gdGQ`-#F?d1XO{TY{XJ|CLv)b~w5> znm+5p%|T_o5`N&1z4rgDd+k3U?6qH=obnP|YZ_*XlYa+y+`l98Sajr(=Ex)5koTjb-mMveozWe3Yfu%}P-O{PQRrV4 zTVEa=R8{DIU2OgGrur3)^~pQyD-1!`nu4&xup{dI=03;GLppRrx)Ja#h;I1e4#d_r8DK{sW^!O|I>EjU<&`q zTtves%&bAyBiKQXoo`Ujy~>|qfT>g083s+83;~^WZJUgddyLV+BSV}CS^7J3r?zDU z-_vvIM_KxNmaI0he$(&z+=6ZH{rb7uoYQMo=z}W5>vIhCc6gnI2iRWuv~RxWmi>mX zkFBBKwgsNb4*fJc3>%2zhz=Ya@^=&4^7Giq-q=|GRAcDL)(=Bg9X-FWxxc+;;9=~u zFYXu$mw8+l^)Bx_4_hO#$^J3k|E;QtI>3@Ic{HiYHRJJ+iP)NNJMLTS{L#yJ*BmCTwCYFt+f-`W9OvSnu#xTj%!R$t@BU) zxnoin4*c++^mrkXDLJB`I%s)z{qoamR<;CH#|EuztS>XxueAEZJC?TuRl#do{Z~{o zgTQN+fel{S5>&mgulz6r>}<*>7F(zmOYZ-UE$B^Q9~;7Os>-*mL(iIW3c&szA}5c;_>^zTNtEh`Q(IiU~zD%*=>uNFQYeL*+#+?p2tzW3iv zy_!wEo7)1d(p)}?4c@}OYt3`3?Qg`P4x+^>TI=nN^#hhM%_%rai$Zf84gt#)qo~+J zzsE@rhOpx9(63MSK9(JdGZOwT94WztjUHTO4Z5x{XhI=tqwGTQ%f8ms&={Feuyv3A zfxaEb`VYAJjg^;Ax$%v?r=j0WC?%DNC-?>4?Doa#QaJxx(1qxWnec5=* z+N(CV@>VN{HxtgV$KP7NtJk3DtuLGK8i|D$JkKj;|2l)PwLiCd5?5t8o4v8UD=pK= zzZ2XqYOXMxQ(DV(~(;SX|$Qcy8Uz&hf4-KxZktbkuMD%u9 z0!}pI$k+g8@);@r{c26 z=q?%0;=QYD+hysx{p!f**JV5x@4L0OMyB)j{K)9TGM*Fr@@mah(zsr~CNlb68PCD} zAJ*o|^!ctdGP+yFQ}t?IZLUmC{}qwZ$7DQLy!K&jjZ99`s>tZ$GM-;vJ5{T@QL4}U zTHTD`>k{-Rws=J_55c(|DIsH0!dJ!g4CF@+__FqJxV^3|#^1~@7UIk9;N5Kpd|3@LJStjc0J`mL*6ZI`b86=|GcCT4?Glyd}oW-?a`X8(Y*asJHj0Ynk zn~Y!17LVXy4q^U;me)-U_tx>l9;TkBQ0M+xVtu(idy2GvKKg-USisyt_}0Y1aSlTm zH$5RE0D@y*X%y<|SIfBr?T#s#4!4iE;^Ve{YntULdbNF5VC`4K&3-J)Ow2tv@AFTL z?Q!(Rz^TBHOWJzKJgB1Mvkd(2r_J~nafSkDXOz5_G;ilN0dUsC8 z4q5n!u`avcaDJ$V_hi>kYCUY-dGBxwXMmt!mbe2etxt4hPn9Na?)PmMuQAu%YS1~r z#XH4-6E!ae`k#<0`ttk!>-z*A$y}{tJ`Xm)i6(o423`>I{cYG@jTxC0!QoGZA%}L! za;W+OD7HbS*p(Mq{4dkbDl}kGBrZO4e!SpubK>?u(-__my#BkgTTfeC?;jrS*8ga; z^=Nz7l*~rAq06S3L+)uG&j}-Lg8nzJ?$OKt?C^HJZt#YFdH9;d!nJR44I@~Ly#8|+ z^%@uv@~l+Zt6U-g|^3$9sOcW@$*^o6-_{ z@V(xb#f6NM>OcIg^W!cG|4vq7KOT4G^TxJpss5*Pb{@B;$cp0rZu|EghICm~>O87! z#`>@8{JwW*h)l8b>wAX=ejrn9V(43AL*itL-4+>_99|$(Y;x+AM~$z`6gytF^RRW( zz0x}J#3%MOomQD*{a!nI#hT_iY5Q^e{hi}O{X=DnO|Rb@7WlJFvAaXxiVKOCDRxnm zaZ>nUnPNNAtbaFl$rO9Hvh8Q<9+}1N{?c)vy;0^_Pra?nudR_akOhD79~j!%N2=J% zl|k{wAalLcO9uQsJ-ov2bGMgl3%zh{P|v8ksEdR7xmf0>Zz{92^cd3bc=Up(Fgw=0 z8u_xu$`QAc3wh*~m5yV&VCIa43tlaH!Q`-YlLVB|aXh9oZawp9O>>ZeV{&f=gN%*f6yxD|&g&;{F;C&zOvGs7n9RXnn?DC9yWBFrpS-08 zu^WICF2?!cH#PqNr??bfkXb#Y!EE8$ti&hCJotTk2)=+^>rYremZAZB!g4Y_QuI@F z@19&Zd(CB6Ft2CzMHRzzT&HLc9ZS)pKLm{%&RNCz0Rwl63!l6HtRc{oGtik3>>=}7 z%hq=2X&2&w+vd|g!!Km29~UUo^9@VC0%JeU$fk$cCFIeox9V#fIY+yI;~X4%?Up<4 zsT;H*fD56?9xlK%giC+)$KikT;QaW3UE!XbDI+{NdpxGbxpKq~Pnl2en&6@5kvmU% zrs(s2d7ddcau?^BqBlAMR8o{O@`c-!Y5)F}y6~+?yHGmu(!!^`dZbE<4ymQ+*^#@f zBRH#t3@T*k8_9G293VMF3o`pf1oV0m{i1>z#uI<7zk7`{#y3MgVB(}@3x=(Dk zV|A!ub@NU0vwJKso$z~heRF7XVXb&OX^;OR7uJ6+f7{p59GceRKZo#h!q?F4O-8-H z?%CeQ;?|~h8$yR4i)(y7{PV`z)TYMgO(*hN@`ar$(0{7#e1R7dOmv$b`iX;X{Rif?iwuw(NpfK@_pO6&5k))Q zLKqiCyaV&hbPKG5Zqo-YZWbBBPIZg7p&uHC2*ExYXgAX>a@R_?!_Kd$p<7s|Nn|*` zx}9!oLqG4P+Xv6TUUz{@UjyBKbbgyz#D;!o6|n>DHFOIlo9K2}4Hx9* z4_Fv2-bU^*(=9Z!irDk3Yv>k*tch-+L%W-|n{J^xH$spL9Sn2}9n5t5QUB~{%Hv@n zyG(_1AI#j?d=ri`c_4G+$nk5_Ugi4e-R13`*9+(7^EIQ0XADKnXb~7ug|?0yf6wbe z6%rT`d)qYvW-H0r4{*0>sb!Iv{@LHvsW7 zzX^z+`7J>FG7fW#Uc}G*HlFdDeuP_uV+$Jb7r3Y~YLVXWo$W6<_-yhM9Lq6l=+C?} zDvk*(ju}}TGpaZyt~e&4I3~F`CZsqftvF^%am>`>nCZna7Z=CODvp_39CK-L%oW8k zR~N?&ERM-5j#*qBb4_tfNpVbBam=dXm?6b6LyI@AE53hQ@e|#}uMPA+ZVhnsv!7lY z@qnGH-~50*I40sjyMD&z2kqf85nJts8JoA-V`Cy7vKwb?e#o8@6S2*1nz4DC-4YY= zuswUm=7;SIVz`LY7&_na*+X}gyl~-HNgqD< zNS`}$?a`kMFU^|x#Lkl92gAnPWb$k13~wLWU~r`D3+^@N!mnl>da@|(+KaDF|JYVO z_{j%v8PV9>a;Ir1RA}d-F{=bI6|+0!xpcpH|Gt95j5(p=m9)2HPDqE&7_m zr|K8l45Km(vmDWvn%DYub4Lw<3qG-(DL)bNm%V8V90`MkBkvY`skob#zhl9wTyw+X zydc{hAKY^F&|CEnU;go3BMtX7m^bg4cFW4U?;F1PtF+Z`Zwuc3Qjzhc=Hbf^ZyP$a z=kj}Q%kvw0aPigKF8cJ%r?0CC#2p*@B=Zt4HP^vh@6`TfL)>p%W3Ar-~(A&720G4h$cnPqR!oW1#w?b(~`RXt-1 z2F+U6v!U?(t+$M{UXD~&=+78N*!pTt-&^WZ z_GiZH`rh)|$eX_F$DT$W49GYyzVOhEistzFUD7soRYB~ieh2#u8S-T3 zrwK`8!v6Bgm*tZ}sgP*f6JW=<_EJUJ&(2YXeqB2xk_4*YHv?PDp&X ze)3}fj*6X=SItP%t!;W}eB@^V;j8ayyd>+X7sHqCduq2~eb&=2$3C|2>Al9iS%0Uuj->G zCVa5UKQ86y+6PBPUjNfH^K)~JO@7l}{p|L*+0VZ=^v%YP3oifr;^kfctornwug^@% zywsEW17DWz{eH*JF%OUVYm4cY@-+T%%7*a;sh7W5dQb6=LwA$G)C?8QY+llL>7KHuAI~X!`@SJ}-Fvj^@`eGOVCp<4Sj4(>8ym_Tb}9Y`)Opw!8uE!s*Wt5ao>vWyX)_}_RD8u?l0SC{$g|W zOK;cTzv>rVtf3}wXp5mXbZTt$nmxGH)afWZoM_D?09s;&|3?K zt{e6A@u3?M4i*l(DectpVT}jpE*-n$NZA)-cYb*5(zxe7fBK8K7fu~qI___0PJJ=1 z&F{QoV@I#V4TjzQ48qx!PvAWvG1w8g>uBWS{<_Hx=_z%c8>TvfR#xM5@Z}+&aA9BR zL%(x`CWcHM!cG@#j$CZ)!L!vy?DL4xB(}bWVJMpAg*cKj{Vj0QG$*`@1Kb zFy-W6(^zc1Mr=^k=^hZf!cm_ST)#ZLzHC$d%1t$6FsFHf#SN@03uFO5T(SKrH?Zhp$ z5p}hbHq=J!?40PDCT5tSy4P9vDW5YL(~!75M<~} zIOV-La+MjU$VVYhanG$p`TY@P*Vh@9v4K}!z{W=Q9$UGrJNMneu`eHp?Qvf8#bv`S zx5W1BNU@*H2$+{~iGe<)n4NcxEx)3u$~HD#4aI*-Y{OQFRn3U2I;fwY$$`9Su z_gj?4JtMa)4`0O_(o6B-5-&W_ccE$t!c zgCYwV%`zA?a~Y#GwX}zH4jz+l>}(Cp8nn-d$(6vw;8zoCyG@C~vyy7NEqDUR#?$!P z?uB>)u;MAXw!08d0Cqf0sO_#!4EP|VEyRq79qpr9+e7?ExB5lwGdAc(w0Oe@1S9OLPCMqy6XR=0CHv zJagFS@&_YEnD|d<{@c&x#9oK8GY*q-d-pTlx})+|IHckF#^J$LyPEV<^&!V<7O(DG z>lbXsF!Vix3O5ArX=r~6#~SXciw@XBCmg2l?>}fe9e21VeLsKPAsgCWwD#yFYsUKL zZtb|U`Sje}y;g^L6f39f$~E8{2*h<>z;ymRNVc8*&K&%Q<7AHux2DtCp@y(2=N&UX+ZmW)?2E(h zwtn5G$8)dmZPoP+4losGn5OdwX*x#UGc3F$xTFV;|66A;j2~(k78vBe+Uhv(HGNh= zU;Wf!e(WU5+{8TV7@SC$rt8U0qQuFAKc^oKsGA;8u&djOb3W~PX@1c?R^!~s0DVC1 zb*9aZWWT9J8KzG{>pF|4hivG9BRgY8MdOf4M!(Ux*>SMJu^~JXXPN3|S+fjVO-yMH z2cCv4J5L|3*UuH=T`I=g?25PZNWfNiybr9G#@o2r@ruLIHMnmh&KY%V?(3h=PD6Cg zro%4j{Ib2EVell4@;x&-t2ha;m8IZQFpnbPST^?u=7t(2mQ5Y%SKji+F`x! zfCz_Kn(F5B^ig_!nULxm#Z(^+oQiWHnRaJSPS8EuS2rj=B^(ESZfU4Z2(IhTmrhv! zM0FWR)_}w#N@q>p_k`a#lY|ufJ7D=rdwMqkFj$YMiKh*`3hXHIsttF85nK zzs8Y0TCaaj2)9!Vx7;1hF;NEY zD-SY8*G)Cx6kXm1b*~vOF@?;3p*A6VYM`r37^k4PA4NsqQ~T3~jxpwVDl4Wbk5b0` zXqvLMb*olFP{*A$@u=%v*FVx~tKKmGaDpjkRPmtU!v^dKIdoUA zMQeM7fNCEEYTMsHEu0SOj&Yzyg~LxAO$3z-WI=YdL11S%lN0N2WcP!@ac`<+%-2}K zoZE*<*skLP_F-|gwIhnaR3n5KgP4%dIX=1|7R$+Qc%#}OOvqtg$PHW|?oazO-I`89 zb8~+tWJ3qjb1qkl`z@<)fx!99do}f9LM~-4EqydRS@EE&+o6^J7^Y!k4<_UpCZu^_ zn*sNKVH)brXBr;kgWuW@jQRv(MzQKQrXtuDErUnAlvjCWp6(R*@oXJ`bgv{PTb(A0gwH)_LwX>iwvO-V+5~ zcwYtCn-2H&@9b$d7CNhXUi?s4u>WHP#;1k_u03zHwX5IP{kB|ufqva(FI)3)_<2k~ zd((&yM_BHdVu*bD*7jXE5PlZC*CqQdX&rTg$#TtzT4z+eaSM7`cedQswBU@Rwfo}0 z^Csq5Q*gTU*yZEeANx+%{PrCoBdc&iJ9@TP49!`+@H798k46v5`m&*hwRPKf{Vm{` zgF$t%S4tFH)$Udi$URW(%FiW=ZOCdJ-D^2~?ogzeKO6dH zUDv>cgY=~}ck4O_wG8UsQnN*OWYFP3+4t4lr~78m=|OGx*EH!G28RzeK2r05?*73k zgPR_$*{a(yc;R6E<2BoK`v+GKc05tjqB}Nt)8LbTs(DoRkHI?!TX)txuDdnj@Zhdz zYyPBrB;xd7)AKd0y0(b$h}IWsp4Pn;krH9}Tg`Uei3n&SoI`yZmO9`J!KUl+jH!6; zbF4RJefBK;*qFpZ{Mg0d4*UxHa-0+JB>337L)dxPs0NUogUT*U@VhR?&#ueBGY)V( zI`?e72m3ODGjQBm;31B)0k0=KJJY8qZsRH%Raw0zVSZF907yc*YQnWrHAb9|6zgiSi?WkHz!%5`Ly< zI`C{yzQ{0P?*TDhEATAd6yRB&Gdz=D1N;a)UjaOeU&L<%9%Rk|JhLe;2kCtY_;5Vm z4?Np{Rpfskc(#~jC-5wO5q}1F_WTC$EE`1p`8fQQ>GLh{Qhic@M>O037@z4S@?Qx& zOK%$R7fSGTz%%{wfj3C-4+1|7&$Ylad7_+`fM@YO47@bnPl0Fgy$rn64j}^ty}t%t zv;&K16!0v3C^DDDBg)Sr{&?V}{MQhFwt{~H@NE0Ya^P7F5anzmIX5Zf>;j(I^9kUk z_B;waOV?iDrRnm+fd@>FuYflIit?j@XL|QRp_1As19&Ds9(bwzT;Q4f*}zNXuLhp+ zEeBqj-X`D~UnB5R`*e_;XB2Wi0v<`=-T)q1!RyJ&^G_rnC|9{+%aKQ+5Hda4kCi)? zt~$U9;8}Q9_gTH+@xZm>$LySipIB}g|1ZF^@HYGyo#zk6`PpDX)ZC5uiTbefny&_) z@!yW0m|slJwZJp`Jc*wHKPD#_dTs`u`L5US!y}ImfSeBCQ8lz0z8ZN41Ush2SaJbH$W%I6XP8RJj;&@ffw_U={XB{CZC-TE|qTsp2_FG!3E^) z09Zr(D-`@}4^_s$0eGoC+kr>&xQBsf`N_)xVju7{o`S!D_)8W1O~k)O!T(p{Z&vWXLHvJF@Sh_7 zLkj+0P@1LpGX;MP@GQMO{N?Gri1;Ibm!|hh;-8@4uOR-J3jSM&UwPj5BgD_n`^K#+ zzg{AKc4mY$f8Qtmrxg7EApZRd{_~JnmfnvP{6-*Ide18OEyOUXJn@$+_zwfmrxJL$4sIy$aE&hf&BV|48bXsTlv_mjGVm(j|5pnBz~Msq_Q%T( zZe8+6SL@@Xru_tpdM~@b@b49}|AN0{;u)_bTw`qYyAVf2hD43ICG< zpGkNGj4$o0;Ht!~S9-+z8W=@-L$+^@#H)oc4<}~5hUA6N-6>{b+$j+HNZTdVM z-K!!cE}loK$%#wI@o}hY9FD=j$!#S#+M^&xJeg26mPGAXlHB@2MHpp4MNzRE=V^<$ z@jO*-jksj(7$&Ikr)cx1s`1AgwFATpMpS4NpWr2gU=U>p!4|5S5wDu+crVG0S50@k zmxRZwraZw*$`e#mp5P_r392bi@RITb)s!cANqK^5$`ib#JV7<(iC$8ksG9ObFDXw{ zO?jf1lqagDJkd+a6ID~5=q2Teswq$MlJX?glqY#fd6H_%lf0xnNj2q3UQ(W}-pG7j-1vA;w-+~Fuz;dYj~CLeTBpY+<&@@Klb>T-X0KS8 zlg|zu5?znkt(NdjkXtQ@`&Y)Lu-g2~v!}VwXU{Uvo0r2v%+8qS(fGK$Hbp#lw&09q zMo~?eI{1_(D#FBQIGwNN?yh3o1fc|J29}&Rr5d-7qUJi0N;R;e z1`D-vf{%jaKH5r6W{T0H?xA*Nny2EhR}a_53&@^3J6mv^=K1sI3ZWIaxD=sed7y>z z;(-8gF#@f8N6Udy3NW3*}5` z%C%e6Ec4W9Svl0;7Z+D8i_6EU*f`6%EUvQLR-hZbNGaFgBf4h;dxHw zRnj=-RpPVe1h-&8AG2G0fkeKWjsNI3F1IW{uB5co&TOC-x9oVstJFAf5ae{}`HX3T zazN7u*DG^yXl8Cj>9V5yocvPzN;M&@8P$@W$RjTZSN>vVJJF3bAF;kUi zc&ai=PFPf>^MYKBu6l}O&8n6ZYJ%uYP*pB>>#9nIDjBX*Fx542AJ*ty0&9cSB?zso zR_NKn39G7P*YS?3R4DI0#Z;9;($K2XAt6(8+NnB^c<8A*)mGs?6;+kP-L$HbnF_9x zBh~FEI|NnYZ_1h9m{(DT5AcN#_^VTrbCQ$B=CUvR$KtTYRD8v699u5zgiu;Gj_p8D zKCaS+Z4Q=tva{8o5L zK|A0z+@y*S-bKauzB%V=)>IyG7Mimb7iz*a^72To=)$J8kh5DC(= z5X6mFk0#kmG!xW=q<9IEsvabs-oVw$MqGTnMxX>Q5ydBJ1R~q0$E0C|cyCsS*Dyo8 zH#@{@7$U)&ArdqUk>Je`2^xk-@Meev4MQY&Gem-hArib9B0<9tiQWv6s9}giZ-z+J zFhrs^LnLY#BGH>65;Y8w=*yGy*KZH+F@{1EW zO1!|IjKU!w_$9nX^-0z!EXf)*Cpk$&{&?4Xna^1rK|#$ib=iv-brHl&E2_#ZQz{@B zBw53-$rF4;$KJp+L{i<=)YSDNrV*a1w`O?dtC+f&3FH>Nh;a=;X-J?Ro~8uZTbPCn z^0S&U-0xr-0?7UN5WwECGz5^-))XMTg=qw)L1!<4=~YW3JUM^O@RFA?4GF#qqH8ip zBfN(v5Nh@WU!~0bnx-xob3#HDkxa;HPYRI?#pH-O7865S1kvp%5Phu&K{T-kLF}<838|vH^&n`aJXI^@sah#d)k=A)R?1VgQl6@n@>H#q zr)s4f(?=S4iwPu6idNz=iKH1uEBS09Ni4X$`PFBV1QwyIqT0Gs#IngG*PAInE5mnZ zii^rC)CUTLkqg<>6F*Rj(SckxBtdH$85oaqA=nxD(|+b!qD78I4|=3#u8MK;!su?!oKi*t*y&8@9qEI%qcwz4F*Dz~VZ z@gd&avL&{Pu^18_OCEo6d~%!-fvSqii}H#v3bAr*QAu%8iLHEWVNpSWtz;~`Qbkez zSQc&ZShT)iE-4*bR*Lx(^i;<#%dIHn#?CJ1(`e=YOaINpLp0~7lj7Jt!?SC!KgS(d z*u#Uq1bB8~2`IZf=*x+Yt!Px~4j-N?@GtlXzt>0jH++OY<|F(G zAL0M$BYY71U=f#={Ra|VEB_2W!jJP2KGjEfi;wVgeT2{T5q_zU@YnhXU+05R7E~l&3>+~T(!HwV=4jkLdL0`nao;`b3tf!ngRKM0Q zy-#3zZNN<^8)Lwef!}!IWA&K7M827|K^p=$_P8nFW}d?2R^WF*u^^Yq1&-w;xk6|@ z{w=uI5g(N=RlZ%|JHFJnyf4A`3h{Z9*B|MB>Kx=v0^e=tAg=&?*Peqswja-x=OAx8 z_|nfo-n-x%aSrkV{P0cvImjCWz7y97cJ^k!`QUql_`K!s_2B!sF{mwz&?cn=~>XSG7v9{wK;`5dttPSWm2YDd@ z*dyi~_>#c4_8j=G1YhAf=*N8EY~o{nioZmEFtrxi<6F@l*yjb^rV#`O6J&erFnj<( zwige3K0)v!f`PdV(_m zufi4^CcvxF?O}U7;d$l=Kzzm-#rA^Afjn$`%=XfW>IoRcZUGtJ36xpJcMOp6y$TqN zZD@7_vh9HWO8BP%S@_2QS$I}=;K!qG24ve>u|2S`H$v1Zq89=V!t>RDOfK6~3!nW* zWf46Y5PL2}vAWOb(SX=HBWf_wneV_}I8kTdYZ#sF`Gqzm>Np^a{~#c~os8N;bhd{W z_5_OBLG&g-eCr=|C(+jfV(*`*I--{VqHISoAIjuk4v6g!qUI8v`Cxo26qP{q7(je7 z6lEZKFFsVFJ%EA0*8^S&{?&jef>A2~QADB^1G0S11iS+D$$%^$;{hRO<_JKTE(&?aT@E_? zzLfDJElkxY3n0RTrT{JkGy+}<7)#IqI1$fmpCm?yuH1Y;0B$bf7Z83P;WGgDfDZiv z+X(I?*h;X4U=zVj1RDu95Off%CTJ&ENYF|Uy7BR46SNRC5lkUyBp6H3Kro!3o?tLR z0A4PGEL|)-@+r^&cp07@P?BgIf*irqh?K>9lHhTI-2|Cm!(U(*!94`q z2(|#CyazVXGwUy2f^;_!-a+_kz--_P32!C*LO}HWLM?C+7eQs7}g)RE9Vgl{AKPQW?9w-COG@S6aq0pCD)2jQy$rvqO| zcq`!-0?q*5LU`rw=_2$ftwwhXGNR zL%RsShwyEH6M)}I_*TNV044+9MEFgFZv-3W5k7_RMnL$W&{)D72pFDqkwl1zMAlMzzcydB)paI3jyIf zLbC~PA-oAN2KW@h8wno^I1+dR;ll~92OI%>FyT4EpN1b94*W?#magM~OwVq>VZa|I zd>7&O01gGdjqp1O-wGHFd<)^52)_x?0DL1Llixsi2Ox@IXf@&Ogf{_B0zL(h`LA$5 zT)f|7;e+wO^kc{j;2jWxqy$G!ZlqkR!pQg=>A8XAZKCH702#fBo+?$mH6A}`9lBl-!_=R%5K9Cu5i_{DLy ze4>lvYE?uxpxm;{LUeK5>@uQ@<78h^{H#4^*GY?MwC zO(42Bjxr^v*AA5FnK^~(w(laY}?74xSSHTYKc_BT|r{|sYJQOk*-Ad2R z^xQ(vkCMDi^jt^rH_r!?AbxjH&glwDSgj@4wUPfjyvgdZ^S2k#ygDc zc{uc!()%i&*&e%6`cQ?u=?eN~$V(}IzJmV=g}xUl=q#)>{7(vg&ezgx?i^ML5RbUl zaMrxp{1J+TcCR5Bo}(aXP8z$We0@gm{U zGDquMeaUhyOcBey`}-1wK=I>!VpRV&L#C0&S7ruBO7%uf^h!PNb_j`?&E*-t_WLO!O8s(JM8WWe&yUu<#g^cWm=y1g zn&_39;FTILQZ;RF6q{4oA~3vD42vHZpI~rbM)$2jxEKCoHC%F1lEILGT@r)<)?UI_ zw{fKq!@YLqt6%WStix*y|DJ-^V~(ANz!~tvg}FE`77SX~;k)ocgKHrRgKG~xvmoq; zxjFvI$*I7Hzw`hgte|&4i+3MQ6YfNLh9*C56ni%e;2a_kgE=`%^0CcQb-vABkyDYI zr<8Y$tPT!1808;w=wza_DBlYu|DWT!G3hA1Jku*Ia1@nP z>eoW@cG9>CoAhM*8Tb2f$E7da6p7?ROdg|@XDtvIn}~mBG1>23KmP0&Lc0LT6Th?c zC@=gWVBnrY`Yl}M3d-MTq?gHKpOSdUn^Gx+A46%o^M-Sh$39Eo8I|d^R|(-8Nz9&A zl)rMZuBV)wyz+9_6RRKWn-w=gtoLGeFbWlIo=KS{WIy`M)KebECa!U{l8}Wr3i3`O zKbYz$=F+I34_{u&#m`KY`n6umi(_->{1sd)$ZP8M6US%N?-AjUndV_Cwaj~{Y1Z|ke63fkzZP16M`ZASy`8glLo-WlDzJdg5@2M z=k0<&p!ZyXODQk7SSYbaNQkvUS%T%#DL;yqQ1u3{v zSObXb_*y}p{DdzP8zs?S&)LN%R-olU{Vq+M6k#R>t+NC_=d~qX5EaQB8G0(&FCd!=w{uF-Xex> z*3AeJF?6$TMjsJFH}kSB&VN{HcU$6rI1VK^%f{%KL(Z^Omg+D^U2 z`9b^-mfBsxizIfa{nBVz--D0DIqmRH+_YJo)4DAiMci@s?MaLChSQeX$^2r=%D$HM zSPKN@YIhk0ftHN|Vq@iDUhOa56Y}{+gOG~#SVI7Q=kBuu_!|oE7H0=YS?gIn;j)}(&1c`BfIkEE?wr{LOArUwJ}A=|Wm8 zFoVQ4rv$3o5-e@bvwTwc#Np}3EN3@UhN*J48v;ZIM9ed~^5gfd-n?ufvAoI18e~er zB3>*dnn@_Uyuo1@G7}7hB9A&FHIYD6n&|hTgW36}Xo_E1Xv|?d-gH$?S0zLFds8eF zfLYFy9_A2=l+qlizoH^2#=j{~%&2g#dd!zzSGM3O!+BaPx}AKM~6cti9LxPfD0F)=NFt*Nt|r?Q+ssVh&FfD++d`A>Ofk5WL&|JPgpzcvB$vVR{g z;nI2Xwu?Lr+>5Koy4$af15Tr74?=t!&+q~Kud;{mulpAC;ZG-W~I5zsNi@x}WIqv2G9Uy3i8y9iSJ*ypk6p(Gv^J3*4XBZmqvz5Bh2% z8IJk}h@xkApO1IkM=Z{Ek&&7y=d?Bwgv=KTAm0qa5u!2tn%v^oi~_*|*du^8dH>FB z2_clyKmHy%4eq`+OnG z+&T-c=Z_bc|9w0Bf9(f<7Y)(xeURbz(UWGwW4~`p{r=VaSG~=@WoTkvcIIy$tw9eA zZ|*`e#BLVrHUH+pnoK7;+-OIs^YU zv!PTT2lcyEM|0FW{H{hO%egnhISsw(1$(3eJFvUzz|J|P#XU-u5w?TL#^Ck>^oWrl z8sV|5j}ivAKRtU$k{|gX!HSNC+8xEsdLCJ{zX?HHjc#x>@%H^Z*jiuZoUwN%|aY-HH)wnYqRj*<@KdL z9&=jm`3KRV3scXY=5gg6%7$nOS*D1(y7d7Ds=Kq*rafTXW>*#0vB32eEO2V)epK@_vQp`Y@K!R5o z>vL9|#Tj6sq$BrSC@MD_`$Xa+_pFUQ#xvmjF~j*Gm|!uJXfb6RnAsEh0(=4H zWf8hLeCCLS!ix!AF_B7q$5ShB%=|RAP`NUkC;8kFi?cM_#3Cq6*kwA;N@^+0Cv_RF zBF^UPOK+&bsu6Q?_Oy_Z-?Lb+e!(nPavfzixf2dDv>R`*p!Jo83^K)yzZL;vEW zE(!;lAD%>^n1hwo5S1k>c%%FEso5~Kq&YqW5dP# z5X~yqC+60K1w>yA_03~hZxoguh`j@)Q;?Sk$u!`vC;aDI1WYAZ_)3n~Q=zo7xq5WC zuo?p{o$rFVit)FxEaSg+SybUy`NmsqdXyDSyj>p^T0SB8XUnj9Fw1Fc%W~cz_A#h2 z;pLziRw?3=qA!^}bM6)-<3FWh=9*)bbI9I8Pex1~Sg}%R7vkU-N2y2Ss!8O{1b4yS zK$U^mbd%_%WXb{AgMW41xU4bLIgMj$)jDt!Ohpa1diQNOoA7Z(2AUyjJu?k@Rd|R+ z#C$5G{Xeuf;u;R-8KPKZf^USYyI~IkuD>Cc|8D@=EuI(3zdpk|Slpc|zWuZ~Pg&N_ zM&vVMT{Yn?NfG7?!e< z@ka@C*N*?+N}#0Nq+nD{(iV%|Cp5Uu;qr1anM$*752JVo`0Q%lO;x&G6!jv|(^YqM z5KBPrMK2s}K6{^#cmQFn3~#}1Ibw0){kq#< zxl(|5-2SQsF2|R@%35EEH#=Hd#``OBQEu&6|3h?9Dhi_G2M@)3lPCuMC`H{Lsrn-3 zg(R-Yvi?TtqjXiSb~&jT`bRnWzg|vUB>|n?pT&~2alkf%q;DAS@()zKu{^_7Iow4W z)d={{zC=^&3c%NIlyzC_FTOwX0i=Bls*-{rv}7!rHSbhrt2+X|uks?RNMdU%l_jQy zb+6dFxX@!0gldLS@2yB&C+kNDYP%~Y+>6GWgvIq%VsW04)J6@X&$-|aqkFvWqrLi% z7+oltLdkJ8eE1+h@?v@v-A1A8;svQhEYq^WtSJ2+FQzG8ikjG4RxLjAA|(vph>bfI z`3UQWsrAG=iTwKlN|pE$5A7$4+Kb;qphmudf=mOMviD>*BFR(5cQ|nj!25usbbJn( zwkuLnn1B2DpZv8@W#uS8s?Sd#iq;VNzrsY9YqT3SNOIXg$a`V+nXAA_ypqt(`RpeZ zPsYaZRP83gtM_bJm*z5cPv+{L2t69o(>>NB8yZIJY$*Kz^_TeK2)E`+96$Oe8xUjD zjYO8=MILS%)DYq!2}4aT8#N1uHl{^UDML;v1(MP|CKRvR*^BGgYUI4GAbKC6k9<0 zLTckxtrlnRXORyb7Uv~+JEjk(F2UQecpGkUrsEa!I=pmJ4Pd6^OA@BDF@SYMs1WQ; z)K$>nmQcL#wU=lWmxp2N7=GY0^Tt>UCX52vQrpY)2yLKTLFEp@N0hGD%ybFOGq+?O zGDDn05ZoL8rIKW{+WisLrSn8BRvAeB+RoU_^;NOR^XJ$;1k4pkzCRR_E;v3#OUtj! zkoyrIYPw!?lxix6wK1Y1s4r9&i}N+n`Cz#$c^UNc-bzh%G$HSU>IcnNHa0 zpv$WKTnf#Nz*_WOm#4M^ z6BC*jzGj%*y2dTc&gk9?T{`XVxO1ivks7F*06HQuO;WHqK zO|rNk56;Z(Az9-%0C~t>3SFHLsRk28kLBuk^A=W#kk4<-jDaL}T0{+@ypL!WiqWtI z6#QF^L?5y_E0S-W3LDjSD(vbW1A21Ysj$B6>kn6!O54y=VftzK7{=W&`PO04x#|#h z8B`F|xGDH|p+?Z}Lk$NyHvi^K`5!8O|4KBjib!+Lb@=*!9jcUA&lPjXypw*8Z3UuQ zZ(Y?$UT;Mqd>Q9MQ?%ZNpmwO&cf3!cPs~emRZbPRpvFesA2HdkO3p^Rga=`L6^mGV zmYP`O4@%ly!mT-&8J2;mw^t-2p?@G>h#|g4vH31Z)Xf8=bl4hl(LY$D6@2 zyp}*7I&D}p#S8snkega6P(_kE;x+Gt-Qn)$@XJ=Q%E0|TAZgyk*GwuN@*b4yo9f+J z&J!}yF18$F8uF90kq}uk%^DMF0C1bb?!c#{d~pL=aLoAsg}?bPI(HXV7@|Lf57dkIF0A=d>(`II7U=+b3{5; z8;pvs37s?KXnRCUDI_@!D4hsx@mFW|BW`3sQ?sM^|;rei%x~k!n@_jw4#ib0RmY1G( zI@kPWwsYs7AZPdrE?dZ7Ax$y2>bND6a)XVLvPWYF{_9-%8Ojbzy3F{zj;q(rAls_x zd9L~AnP#;-_AFQ7>~Ngq5odMWA}l{ztDA+p*L8yGD3~{!%5zH!@=B{Ydl|NI&S&S~ za=CVUacNaiNzSs|>Kq(x%PlLlSLSiK1~2?DS(b0(9~l7~gE7v^6703a z-xb=5iz=7p;YMV!Fu4 z&9jvh7|aEim6jEh8|K=USK7)e42vsEc_}5!GlLl40boJ@GhsEE3+xNJS3HKGcvO08WxwbBb5!<-;9iAs3{Xr4>2Y?7C=i5wc`n#wCUln+>^I zQEJGuNwW)&h#0w$%S*GPa2Mv5+YCZj;ecr5Iv=Sr*9%Hllo(3O42VlAQe;!0#~AV| zD-0t{hVopLAeLN1aV`p1A(zc>^ez#BLU>Ij%3j_|KKEHNV^BFWiVCv$5HX}R^DpAH zhYcFy68Gt(M*)fdBK@>QK=pD_gd36WpD8@E4bY^QNbgVd9#SIiMfzZ(_tc;dCpwN0 zkzHc=M51fyH^qm13(@($nIr~L{?$ZBPfd1-^kN_KtB9^;-&I5pkx6&kXFbui?7PJW z{RyIL>Hj>@`)b6$pXfNUMRtklf6oW~D<5=!p($kD6WJxok0bhE8P#o{OrmSq?^2>` zrN6*O_~kz6tBB6_J(OOe{_BVyEhXY!q`ypbg9iO`q7T!chh8EOur@_@iSpx#&W|HW zI7IqoM8_H^*(K7iC%RVsTTk=|S!j3q9wzz_4f<3rwNA7qVNP4609b; ziQrCxhY6l07(QF3KEEd>!~B!#*Oqy5IzH4Mt~X^U?L1ZD+mGa<(g}fW$etI&Ka0W@%HVPu#EBtA-LH zq_T5(pG=W6hmY4ESt;BV33e@TP?xCVdE z#p>yeBfK)b6E*m=H2CLe@LxgrISM=H6aI1q-mbxay$1gV4gPyH_#fBc->t#_i3b07 z8vKDv1UoC!JAm-Y^u`jtKw$?1#Dof>`2WeoS1jR^R&kRL`b;16D}B(bebDQD(C;F8 z3F*%UK!YXed&md9mFU-Mgx~Lj{;3aoV4F1+0@M8#nheH2M z!YkulMED04{HrwZO@vq4txW^}0pXSL{-S}8T&AAy7ZP5nr&)vl3c@S(EF-)!U)F2z z-$(eT6!tkl_`fRfCkg+e0v}W&q^nDTPa*sV3VbEuzfs`-N_b_u_7h%NPTtnQzfX8& zzI>~}&+(_cV8~LT<ih_0j4N-mB<83s%wo&-#NY_?;ksrA*%+enqg|uk{~)_zA&o zfA|T(4qARftDX6G`490uL+OXK{K`)9H_Gj}1*_8Ua;kX^_fKi)qI>&l>~6SLXQ^;e#iQ%dMz@ zb`_Q7(1Rt^EO}1j*m0x`%MPDJI&HaSY^sPi2;HY~1-4?$A( z_EN%-A;Y9`vSVyfyTruhNE4JJPeG0sg>&R8z%<9yRl@hIq_W75aW8gr>U4elhUaJq@!lE()WPH`2Z@W#&5)Qq7e zM~&CJ-Bcub58%_zY7%`^OL?tS5g^MtKIeEQEH*%G5G~2$UB!C-R6Yk?&(cy(G$~46 z?ukK;^imgy-wTJlvJk%}jfuaGYvNaKo2mn^{w19*lk{*F1^ig|3t zI=jp!%s%s|^xXVHTLIQsloo@QVYAt>m|^Ku9JRePjl(=Xe{OL}zKty^am`!97qV&l zX;rq83c8=?%2U432@G!Jw2}h1mnwi~Ef*YC0heEDU&(}Dh9+mW-ByD3Dvd2>fm19O z)k$MVu))n@8iCeF@Ve8%!)z4>|D0V}UO3wrTmvW?` z*{nn$Hw#E?y@m&eu<}Gx4i-kRl_^B`5F)I@&BWz+fP88dA{4w;el z$VI4b&s|wunv1NVayOqX+FRM3bCqiFhkMemD#lZMKuyv-vur~GC_yZEB7Ltt*orH3^hUKHn@Ckm%;lZAs5xN)uA1SOvweWGfOD@4)#?MTc~mjpyP0Q8AI2>tL(ImXr{! zq;grFt&Hh0wX_uOgtwYPc3MSQrEMmvGpcsl;@skL*8`lB==EGqiX~YzG4G*Rq2moB z#bWIij!Vy9Iv?F-SX1uQR^I*nQ2RHDk zL{Tb7>Qtx8Z@*sinqyx1eBZzSe*gUD(WBRzy`Ounwbx#I?X~xQ0n-8#=>8wf|93Q$ zvituM620M|1FwD3$o+dnT?gtx?Hu{Y2)?7)@|b8RXFufCt}%fB!=C>Gh{*N@(|2t6 zL}Fezh{w{v^xtfsov=1$@w)H?nZZb z?+!~_hpjRZ2_@S(z)$cM^7yZa0T+R<$a||W$^(+yBOx@pnSqk+?a=nD znRX5kYxFDlCRYi6Lq*L5jHCXOg@})bWl5U?65*8WfM@}K1?^_q+d;_=GAtdcp(Wg~A_Y=>t+hpQ`AS zj6T)SCw!g-f8cux_(MnjAAJvofqsYYFyIdh`5*k?9{QBY`+xC~-FwK+6J_UBcs0ckzl--NU?m=bup0ayR*}bL?dVeRocaYsv z%Fc^r_Y1OnN7+52>|RlJk0`r0l-(1`?geG{fUuMK5fyb z?ENj-`&zR1zhv)w$==s;L-DiGr|i9~K=ixpy{kXa@3Qx*HlW{S?@bk;-(~MV<)QBd z3DNRP=<_N1l)XRw51kE}Og1YvGnokf z)3+dJmF05^!h+~#QCoP)uav|r9OTb)!h32EsW?1~@Jfk=bBWq&$sPXnE6nNGPIKYj z&Pg5yFAqTzG>8z5#ZtbZ1TANg6SJJe3i3q#R7G9Yvq09`u36PhkDP(HYzG=M zj)n6VPMoJP(f8*s`-ViO5(}3WW{3sJ_K@Y zoLT)Z&%3=!cZa9uI84Oh)I4}QkeZnbarb8)t-rwsH#e4IwUV+)hcj>e+NqNBQ*mec zW*<<>v?TeoYAvYm{Z)_mY8~(NYd7p1G^S`v)(!$Ak~Cwqa^}%33b`5<$|flybL{=@Sj?c*T*opoGJU1f{L!Wcs8g2Ct(326XQ5c!JV4 zKQevFV}1|trMOa?r36_V}t;7{0RH}p3{rbny^jd?f7bO#@MUc2QDDD;Rnp>ex& z6%!~LXL(l-$6A-OgGi>k2w1!>F|M9%wmTGhcRvHyK4%WGWqhzci=P+)skLsy1$b>B zwwTN^VC4q<0ZnNw#I<`ZAhsM?MQ6ohs=F^N~G-z~lTraWPeQlpu=# zbVEqEc9jB@W#4d$Kx(+pw14Ux$7|B>>EILU`%CmQjhL(fc#`~)vw}ns9Z8;j@jCDM zUbuR&YeB6op7#pDj#L~p0UZ(Z-tXnt@d>-{X$?|noSVGQ2$ZbnKXVbx80YqF`fSLb z#RgwkbT!%ps6q(0|8m2gt8W#B4gRi^@gC3m&g!+nd{mlDLtm$g; z+wS6$ceiO>=%;Z=eHGM&0|c#htwB(Glb5{@ZVS47ALzbgUv~$t zYocS0uvy zUa=ik0`z;~(se*Zq~8N45Dj+L@57lLAUJf8fd;~J<)9(Ydrx8q6{stm6}8;P$zIkqNf%Ji3ne9?>az(i#0O(De;S*HhXb zDqRR|Svl_MVR6L8a5h8Dv3?3Spg2=ap#p;5By9(Cf!319)7e!%2?D;D%riEG-GpR$ z4jJJhbL8t##jpki62T*@M~$%Wbc^FT?8iOl6B-`rktnp52wme;N6#|^Ql>^E>?K0o zT*qt?_-e~xm4N}Yi-CPW^k9MUi8YB@M`5?OMhAps-T6$vM1CF6dKE?_5(;=c!YiZmS!)? zsBY4AV`d=D{i|-6sVV2H+F=t@Pp|8Uki%V`56BlNLbINLr{pUXn(!qXLL?V4gsOi0+95d0qqU%PWbW*d~gg!u{wBL=_i!WQ?7v2ln6p~ zrFHp&xJW@lBq1e5kQhfwvm~WL^?ajF9R0D0(bH13&QjW46Iy4f+F&W|2H*I(yYb^L z<5oVcA7=zuDXmWtI0{LrN~9DXXf9Y6nUSnSN@J0D#=WJ+O*r~1zHvR5)={d~-WfmZ~+B8sDy?H34oM<5u_aO*k=uCltix3)WeZ(jqhBd4e?P28^WjLiBzU zT5mV4iEsQ^OlvZs^_K$Xv{$&mjCiqtDIz$+1j&_?F^xgmSWHRXA|^NL{q1IwPQDE0@Mo%cerA z{xJ+9E)ZJHj-|pDoe7N-;<&8h4A)Gy%Wk%zSmIKa;nKo(Y9vr8gJKGFpEA%zi4jx! z;war>N(@K6k3kt3q71hX|H-HHvef$_F^+Xn;!=fkYh*LU1Xs|!gl$;GX0{NVp%J?J zCw~fLt3E=dycAJlAobxP%7{PZB}@GST|I_Q`NW~T@`t&7%%^+fb64_Ab0g{y83H>%18?lH0frke*)zUb+JJnVMYVrNK^+CT{y#&e5Wpn zYa_w%q`ONMVFoC_&1MQSoM1xYx*L?&x!wjH1W1IqEhRvega$BO1mmYTRtwwhBHO8| zjwxolK|ttxpkzMfB@|6pfv6d3uesl0>p{i%E)qn8HbY)wg-Dhjvdk&-ziUL-t89XWyorXY?Za1;p=^hjwbq}0fa4PK-KAt@2+g6L1XjUI#fYeMV7 z8H46`OVu8ONeAY8TD}0p2VOBLO-T?RC~)MFQd2<05X1`w>+=PUR6!bp1m-W`mg+^? zWJ!Y5p)JPs?#6dZ!JJjQfir%C(}R%-`SO#Uu+CBtClmnY3B@E1fQ|1FQ#ui1h^N*e zrVVk8d--Y|LZipH@u2*b39Y4$1`}N4CQ!~Xeg!%RkO=WgN`NXZ%w!0s{vHI7Qsbwk zw8tD;SE(@%Xt*9I=_QDV9H~vP-PCzi{J@`p*bE(1qkM#m2vibp5|j>o$I)?{M0JsP z4z5Bia}g9ODxG=|28@T4i~mRP{QoB#=0nzoIhK$YH^b})Y#K&w2D3uK{O-YQg#UMj zJ(l1G8RiVYwIt4CmOn0zXqfi~`O3nVt7T7wR6$A38t5*Ez}FV*N7L=_Ot8d5-e3)b zf8J_bHcQW3p+UjaGLwtv(g=3$UfIfgJ9m1favk_TTN!81r4z&ISz3}zeq^>X!In8r z;qYD-^-h;BJtvf9PQGR9OEr$%BK91IkMdy5qiU_L_g~PVz&&iPG|tYwc&l=KudiM? zelOkkp#rzwTxk(;+>DK4g3A|07h#4Yyugu?!MfljSYIq~jUzC@KiJO&$rU7c$pe$9 zlcNIW={q6mLkn?;PFfF0cg`{K_DJGu+{)fMU z_{<~42}$vEQc4T)J&%+ILW;B@QhT0CO5l+u*LUfr^L2c1x{-Xf^lsf7T;qPQPJ!9V zR~x0fbvsRv=?_+LuJIDjYeTAKRFx{KO7xKGH3sDsLmh-lutL2S;bA6`rCM=(old~H z+o-|a=mucRH>&3vzp68W_5sGA_DpYo$`i30U|zhQ9iQNCzr4MqPS2=ak-MB zBb2f7OV)ZSDM?STk`7P&xWIV0NtM6KMV2b8*bt>hNO?J=3RZy;9_2l<97HoLLH1nm-0H2WQl8GQO)6#0nb7LwZ3z(@jg~8?}Nw1Vl)_(JSut z5!Gufl~R^!shG%-6FtCzm&?ihu#vSq_&Oelk)ONM+PSoJIPAcg$!)H2CvTKnI?nhx z5P>j%#a9CnAe|4VD~;W{Qt4gXS%%;1r{;TDws=^I>ZX3Lcge|c&XY{N&2|%mIRY;( zPPYk$jclh9wws8}1gkK}4Zh=@cC(rJ07d{wg0on%)$vQ#N_v*RFw37KXG}fdhk{g) z|5%dN6_Xr6IAsdbI3TAYImQXre^E>TVU{jf38HttAdx4~jsg9Z^<93*2B{RVDh=kt z29E|wLLB9jm;$U3-9`B@q}mH74`5^w&wBPd62qn#^wjj!|`9gJC_eM)_hsK{@B3R4<)rf3z|PK)t|rl=!=gJOKQ^< zZ@u|e@>8YY!6&C@56mGi9t4Rg%4DU`FQ?3uAUX&HN{vvb$xi-mrOyUtnczDFEoKqL zlv@<5h%b*|1Qjj==k#7DI84b?qBj*e)28O*MC`4KRvPc8c`1RM7=n)T$ULKkPMq6N zHI9WIjE6yk`QPez*;myH=nxNp=yU={;Gh{`+O;O1iU$Qy08SrrDcj#)Y!Xf2q37kW zO82u&)XEIa+`+jPC}jbayr))pHa?`AAg{Gn;9-?c$J=If5&;6VgdkWYEA0gH>ux^UoEYaraPyA^wW6N}id$`3g7)<_@c5W?ZSs zU73-IbYG|ft8`uYCOOOyM!=f0fJ&8%DSrr`(3SDX&r~5QRV|!|zeZFx0SJht4Xfm% zo2TF82qR$Lh?N>??ZO&&O$Efb3b0E4+s z?&~w;2kzaxJxV_@1E-waz|+5r5m)e?_87W~5jT9yCv!7KT(5_ry$~a=%)z;Wn}iWp zw_uMF-Owx()>7&xmAh>syq-XGIX|gQq!Lmlx{nTARLOBqrAL^7`x0QA@fb63t1B}M zpJE11bKc@y`Z>(Nwfd~e{tGj34$DanUt%x=_u#lDHw-gyKRO!7(U^hrzDkMwf*rW8 zizni5VFoVYY_9%ej3pNq8$G6CE!lF?C$j)!$@V{}_7}01T;fvOosO~O{pEX<%rTan z^vp6M1#8J4$-FvhJ!as%PWxo;!id|wPSakD75A5mm_zNxxMjl9iTEZ=@0{Io^?R_r zdvC;H4|XSMV7ea8h$s9@ z^yWY;P=o{>(>ol~>>-~m1b7xoXLt-z$AJfCFA;)g7!puEldb=#00T@JotYC10^50D z*6EGTx&#MNmHWmFGsdXID^VPNz34Fp<}*#?$<293S0;~gyKE3x#(0{H5t^cAy+|+F z#S1T|+byDw6}iXA4E%~P9Eb=kIBNVsn5#|vNGTAHTFBu7|GG-X29kVFeV&OEvfQs? z)cX<3iDzRCa{PsOOLmKzJh!TPzM?976Na10OL0LK{~Ctdvv|&}deI9^XO}yPa@=bR zy5w}b%fGJn!BD;nlMWG@^#>ij@M2wqmnEB-UtqRbqJL zbVaHc%uKo{F4wkZ==m_^jaE>jvW7?AC=V;!r)?cWe}S1VYbFO)F>+G!6-c9#v_-oG z()Y(0ZD4ZX-M9-Fhy1y;g%I{-GLHqXy3(-Fcb2oaUi<_D3t1+LmlLK8;q3A-u%|0TaaMQHV$D1^v#C4g6vkzfI9q(H_XYPzLE=^AbnXWyvW~#agRG)ak=$$ ztU=o2E>_^c`Yq>0Sv_%k>szp}xcG}KZXh9n*^~&v0$T7nmW-yh?aQVeiMl@ZGrcS^Vpm&UO#+D(iXAF`ey75m$AC3{P&z zN{4xuBwbjWh*QNUamg51_eUOA@*cBLZW-W`d)zO65<-H~I=7rUV!vN8aC?+AH+M*U1Vd_XBzKBc#bve zoWm}e?S?rDaEE|FAjj;K5r7}e?cGO{vm=oSXHH@bq?2YCoW`6@Q{unVoEaG$P zSy+#b-rY~(ej4o!*f$+h(97o!=@8B$-9Q$BeT#bzXYm^_zEC;&z7hVdnkODMuXGUz z%bja@8x!3N?rAguSmEH7QuOymI1@Bq`=R?x873Ma}^?WglaDmIXXC@68#g^>5 zSW$|NWVzGs8*LfH^zlrts!sO5n7|YE1V}uOk@(fzhN0(&UBR{ji7gn3cS|n*cMB=vM{E&KT_>X|Zrx=N|4_y>cn-6|F+fU*DBkzZ0yRP?N1 z8q76+>|A?O-A{4}20Z^q1_QkvQoLka!m(u{t=YjM0TP{%0VO zg^^g95`R`A!mcg#wfz*6AM&Q?eSLkF3Og2KisPSvVxKUI)#?`6ke#rK^#R2?Fp5R2 z44PnDl7<G9q5jF*_`-gB*=Qi@e<%ZW~g8k zJ3b#M_7$U8o`LQZvISPLc|fsO7{$t02ZKxz6dO1Ze@Oyi*Tc{bU@@#> z)i_T{2F#-htiW!qv`V zOqu%%X!8@JP5jy*Awz_jhi2_S3{=M%&6Se9`qllA zW4hL`saV*ll%Q(HMQqNI0APApm`N(o?IKpU5&)yi!vgm&lAg{iyh9*2vT}Cu1Citd z$&M;t$MfsN;DAc*NX26WIGsWUCgS$<<0K%k$(k^DtOl!eA*jZlnRE(|i&bsWJQ zFqyS`f{-ciZ-K^DQh&oQPyqh+Wsm$^;!jHWQ9p!T^4@C=P;exS74KUmTxp=b#TdIo zdw^nsg_T-wDXt#^Nsjbf9!c*xI?7qadSPzGN_2RWCUw$5(<1wRaDFbgJsFt=(n5K? zlf5S9(N8jJ!HOW~2s*P*dgfytVO3s`y=^--jJeIOVfSOXUC5(PvwaF+a@7GWfc{YI2N7HGoH-OtT47Y)foi1VlSAGvGe7W;F zA6`Ln2Q}7MWQV8|f#HGakqe%(e;Ti=5H@0*bL*xu7X^Dc=i~@_e=7B;5WrckT=+b< z8Myj>jH@?n$*mrjaR%PIgOBv)$xhO%nN?Sf*`IvkwiYaSB@54=M7-@+<-{CI;p`ZI`MRu@kdf(>mzA zUMU7+`dc%1y)`EWV@4?82!O?6VBUVaPFQ5G#K3kR2e7pm*sY*l;Nbl;MrivP0E@%G zy#E-dpi4BsjJH`e=z?+l|3>r;(vX;36Y7QC9UnOe_Nsz9`SS#^+odq>5cW*&9{|h8!Xjt5FAR+Y+~kD19tzAA zVTJb2xD?6t$DU499!eC5u-tCXbdLxXVY$5r+{9RJUj74=Qguvd%_;>hKVHt*BK9!* zs7vNd%yg{U=CfW&C}&V`pFV!id#Z=6eEzX;o>h@G`4@J%o&sQ=SlDW-qUm2SX^PoU z0Lav?W75MPm5Bn@R*Y>E11_Dc!yW-%uLRCA38R0);-fAKi?I5iZu(1|eFzhEG?#&H zVqqiaK{qQf-OOFP=Y$z?F~+?dE(2I42Bw@2x*34&rt0J($1-d;?UvNA1F_vKJ((yF zW4pO=85kyQxnb&>@j#lBdmqyVIk`!qd`@2WuxXY`26m^qH3pbqDaHi7&znA}6Dlz# zu!;vJz{1R4H62x9W3S|z)&XvT7;a&2feFrHOc3=Pm>>*e0?pf#pPAeaWyl|XRWAj* zIIIbdpP|pRrK2RrAU`}HbuJ@hGexfFS2^g@W`KYR72gYbUH~U(NpD-|oUCl?;-WrfnLIk~Vr{>zjC~wtI7i{C(V~ z{)9^s7Dz1RVEu{R4Ib2gFh}2_n&=Jm%w)N1yP$_P{TjY5&`G0$Mw{K^$(2TCb;#Ky z5>9VL6sa0`f>#noZ*vzuu_>}20_oD|C6-xhu+1_(ma9Ch^}Wr?WlFuqqlfI^?Ul{C zYQJ3&I@AU=a4^HO{3WpaQ;b2)nws_Kgq8Alb(JMRvDugdMa`L0!Ld-ZvAo@*%5`m7 z#CE(AIO3J1d%;t|9@+-8htB=02&@{;nBj4F-V81XF+#m>6g6uRhcK(%?pMu8I_yg% z@3_(Q8vkh`x!r?_HGTJ0|8zzL*lH3Wu=Gfee$!Tp()GS$j(!(5Pc5EA?#4vT%0XQ+ znMlRRZU0AgHidw_PdffX@qBhC=E$@Cr>c%-#&7f7ok+;y|AkG7=o!x%MA)4AO@7^D z4=-#lPBjK?py$Xtkc(MDSlID^wvpWQ7K` z;Kv`J?10s`ig6*3m=5E?hXr0+Vw7!}_o_{mjuasI8-o0BYhw})Vk4#CKOBoF&TpEv z*H#R8!e)d&Ql9Zm4g8gm7)~YNkCdn8(sBxm01>4O!L_1z$~-&H+(Cugjx`_|qdk5P5;4*TW7zjtcix*L))-9LLb

UvpxR3f_2!wr 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