Skip to content
Browse files

Merge pull request #215 from reactiveui/xamarin-mobile

Create Suspension Hosts for iOS and Android
  • Loading branch information...
2 parents d19c8c4 + 6f133ff commit ceadaa15e28be1b13922551b048488e1eee04e88 Paul Betts committed
Showing with 11,243 additions and 210 deletions.
  1. +112 −0 AndroidPlayground/AndroidPlayground.csproj
  2. +67 −0 AndroidPlayground/App.cs
  3. +21 −0 AndroidPlayground/AppBootstrapper.cs
  4. +19 −0 AndroidPlayground/Assets/AboutAssets.txt
  5. +112 −0 AndroidPlayground/MainActivity.cs
  6. +6 −0 AndroidPlayground/Properties/AndroidManifest.xml
  7. +28 −0 AndroidPlayground/Properties/AssemblyInfo.cs
  8. +44 −0 AndroidPlayground/Resources/AboutResources.txt
  9. +2,064 −0 AndroidPlayground/Resources/Resource.designer.cs
  10. BIN AndroidPlayground/Resources/drawable/Icon.png
  11. +11 −0 AndroidPlayground/Resources/layout/Main.axml
  12. +14 −0 AndroidPlayground/Resources/layout/Secondary.axml
  13. +5 −0 AndroidPlayground/Resources/values/Strings.xml
  14. +103 −0 AndroidPlayground/SecondaryActivity.cs
  15. +77 −0 ReactiveUI.Android/ActivityRoutedViewHost.cs
  16. +12 −0 ReactiveUI.Android/ReactiveUI.Android.csproj
  17. +1 −0 ReactiveUI.Cocoa/ReactiveUI.Cocoa_Monotouch.csproj
  18. +80 −0 ReactiveUI.Cocoa/RouterUINavigationController.cs
  19. +8 −2 ReactiveUI.Cocoa/TargetActionCommandBinder.cs
  20. +141 −0 ReactiveUI.Mobile/AutoSuspendActivityHelper.cs
  21. +149 −0 ReactiveUI.Mobile/AutoSuspendAppDelegate.cs
  22. +42 −0 ReactiveUI.Mobile/BundleSuspensionDriver.cs
  23. +9 −0 ReactiveUI.Mobile/Geolocation.cs
  24. +62 −0 ReactiveUI.Mobile/JsonSuspensionDriver.cs
  25. +160 −0 ReactiveUI.Mobile/ReactiveUI.Mobile_Monodroid.csproj
  26. +93 −0 ReactiveUI.Mobile/ReactiveUI.Mobile_Monotouch.csproj
  27. +6 −0 ReactiveUI.Mobile/ServiceLocationRegistration.cs
  28. +17 −3 ReactiveUI.Mobile/SuspensionHost.cs
  29. +2 −0 ReactiveUI/Properties/AssemblyInfo.cs
  30. +8 −0 ReactiveUI/ReactiveUI_Monodroid.csproj
  31. +6 −1 ReactiveUI/ReactiveUI_Monotouch.csproj
  32. +7 −1 ReactiveUI_Android.sln
  33. +426 −0 ReactiveUI_Mono.sln
  34. +18 −0 ReactiveUI_Monotouch.sln
  35. BIN ext/WP80/Xamarin.Mobile.dll
  36. +54 −29 ext/WP80/Xamarin.Mobile.xml
  37. BIN ext/ios/Xamarin.Mobile.dll
  38. +1,480 −0 ext/ios/Xamarin.Mobile.xml
  39. BIN ext/monodroid/ActionBarSherlock.dll
  40. BIN ext/monodroid/Xamarin.Mobile.dll
  41. +1,480 −0 ext/monodroid/Xamarin.Mobile.xml
  42. BIN ext/winrt/Xamarin.Mobile.dll
  43. +54 −29 ext/winrt/Xamarin.Mobile.xml
  44. +67 −0 iOSPlayground/AppBootstrapper.cs
  45. +32 −19 iOSPlayground/AppDelegate.cs
  46. +2 −0 iOSPlayground/Info.plist
  47. +3,865 −0 iOSPlayground/TinyIoC.cs
  48. +8 −0 iOSPlayground/iOSPlayground.csproj
  49. +48 −2 iOSPlayground/iOSPlaygroundViewController.cs
  50. +16 −8 iOSPlayground/iOSPlaygroundViewController.designer.cs
  51. +207 −116 iOSPlayground/iOSPlaygroundViewController.xib
View
112 AndroidPlayground/AndroidPlayground.csproj
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>10.0.0</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}</ProjectGuid>
+ <ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <OutputType>Library</OutputType>
+ <RootNamespace>AndroidPlayground</RootNamespace>
+ <AndroidApplication>True</AndroidApplication>
+ <AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
+ <AndroidResgenClass>Resource</AndroidResgenClass>
+ <MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
+ <MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
+ <AssemblyName>AndroidPlayground</AssemblyName>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ <AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug</OutputPath>
+ <DefineConstants>DEBUG;</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <AndroidLinkMode>None</AndroidLinkMode>
+ <ConsolePause>false</ConsolePause>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>none</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release</OutputPath>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <ConsolePause>false</ConsolePause>
+ <AndroidLinkMode>SdkOnly</AndroidLinkMode>
+ <AndroidUseSharedRuntime>false</AndroidUseSharedRuntime>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Xml" />
+ <Reference Include="System.Core" />
+ <Reference Include="Mono.Android" />
+ <Reference Include="ActionBarSherlock">
+ <HintPath>..\ext\monodroid\ActionBarSherlock.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.Core">
+ <HintPath>..\ext\monodroid\System.Reactive.Core.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.Interfaces">
+ <HintPath>..\ext\monodroid\System.Reactive.Interfaces.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.Linq">
+ <HintPath>..\ext\monodroid\System.Reactive.Linq.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.PlatformServices">
+ <HintPath>..\ext\monodroid\System.Reactive.PlatformServices.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.Providers">
+ <HintPath>..\ext\monodroid\System.Reactive.Providers.dll</HintPath>
+ </Reference>
+ <Reference Include="Xamarin.Mobile">
+ <HintPath>..\ext\monodroid\Xamarin.Mobile.dll</HintPath>
+ </Reference>
+ <Reference Include="Mono.Android.Support.v4" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="MainActivity.cs" />
+ <Compile Include="Resources\Resource.designer.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="SecondaryActivity.cs" />
+ <Compile Include="AppBootstrapper.cs" />
+ <Compile Include="App.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="Resources\AboutResources.txt" />
+ <None Include="Assets\AboutAssets.txt" />
+ <None Include="Properties\AndroidManifest.xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <AndroidResource Include="Resources\layout\Main.axml" />
+ <AndroidResource Include="Resources\values\Strings.xml" />
+ <AndroidResource Include="Resources\drawable\Icon.png" />
+ <AndroidResource Include="Resources\layout\Secondary.axml" />
+ </ItemGroup>
+ <Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
+ <ItemGroup>
+ <ProjectReference Include="..\ReactiveUI.Android\ReactiveUI.Android.csproj">
+ <Project>{F5A6E11B-B074-4A0B-B937-267D840E31DF}</Project>
+ <Name>ReactiveUI.Android</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\ReactiveUI.Routing\ReactiveUI.Routing_Monodroid.csproj">
+ <Project>{E92E477B-BB94-43C1-984E-E177EF9FEDB7}</Project>
+ <Name>ReactiveUI.Routing_Monodroid</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\ReactiveUI.Xaml\ReactiveUI.Xaml_Monodroid.csproj">
+ <Project>{E92A477B-BB94-43C1-984E-E177EF9FEDB7}</Project>
+ <Name>ReactiveUI.Xaml_Monodroid</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\ReactiveUI\ReactiveUI_Monodroid.csproj">
+ <Project>{F92A477B-BB94-43C1-984E-E177EF9FEDB7}</Project>
+ <Name>ReactiveUI_Monodroid</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\ReactiveUI.Mobile\ReactiveUI.Mobile_Monodroid.csproj">
+ <Project>{A92E477B-BB94-43C1-984E-E177EF9FEDB1}</Project>
+ <Name>ReactiveUI.Mobile_Monodroid</Name>
+ </ProjectReference>
+ </ItemGroup>
+</Project>
View
67 AndroidPlayground/App.cs
@@ -0,0 +1,67 @@
+using System;
+using ReactiveUI;
+using System.Collections.Generic;
+using System.Linq;
+using ReactiveUI.Routing;
+
+namespace AndroidPlayground
+{
+ public class App
+ {
+ static App _Current;
+ public static App Current {
+ get { return (_Current = _Current ?? new App()); }
+ }
+
+ public FuncServiceLocator Locator { get; protected set; }
+
+ protected App()
+ {
+ var locator = new FuncServiceLocator();
+
+ RxApp.ConfigureServiceLocator(
+ (t,s) => locator.GetAllServices(t,s).FirstOrDefault(),
+ (t,s) => locator.GetAllServices(t,s).ToArray(),
+ (c,t,s) => locator.Register(() => Activator.CreateInstance(c), t, s));
+
+ locator.Register(() => typeof(MainView), typeof(IViewFor<MainViewModel>));
+ locator.Register(() => typeof(SecondaryView), typeof(IViewFor<SecondaryViewModel>));
+
+ RxApp.Register(typeof(AppBootstrapper), typeof(IApplicationRootState));
+
+ Locator = locator;
+ }
+ }
+
+ public class FuncServiceLocator
+ {
+ readonly Dictionary<Tuple<Type, string>, List<Func<object>>> _registry = new Dictionary<Tuple<Type, string>, List<Func<object>>>();
+
+ public void Register(Func<object> factory, Type type, string contract = null)
+ {
+ var pair = Tuple.Create(type, contract ?? "");
+ if (!_registry.ContainsKey(pair)) _registry[pair] = new List<Func<object>>();
+
+ _registry[pair].Add(factory);
+ }
+
+ public IEnumerable<object> GetAllServices(Type type, string contract = null)
+ {
+ var pair = Tuple.Create(type, contract ?? "");
+ if (!_registry.ContainsKey(pair)) {
+ return Enumerable.Empty<object>();
+ }
+
+ return _registry[pair].Select(x => x());
+ }
+
+ public void ClearRegistration(Type type, string contract = null)
+ {
+ var pair = Tuple.Create(type, contract ?? "");
+ if (_registry.ContainsKey(pair)) {
+ _registry.Remove(pair);
+ }
+ }
+ }
+}
+
View
21 AndroidPlayground/AppBootstrapper.cs
@@ -0,0 +1,21 @@
+using System;
+using ReactiveUI.Routing;
+using ReactiveUI.Mobile;
+
+namespace AndroidPlayground
+{
+ public class AppBootstrapper : IApplicationRootState
+ {
+ public IRoutingState Router { get; protected set; }
+
+ public AppBootstrapper()
+ {
+ Router = new RoutingState();
+ Router.Navigate.Execute(new MainViewModel(this));
+
+ App.Current.Locator.Register(() => this, typeof(IScreen));
+ App.Current.Locator.Register(() => this, typeof(IApplicationRootState));
+ }
+ }
+}
+
View
19 AndroidPlayground/Assets/AboutAssets.txt
@@ -0,0 +1,19 @@
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with you package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ InputStream input = Assets.Open ("my_asset.txt");
+ }
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
View
112 AndroidPlayground/MainActivity.cs
@@ -0,0 +1,112 @@
+using System;
+
+using Android.App;
+using Android.Content;
+using Android.Runtime;
+using Android.Views;
+using Android.Widget;
+using Android.OS;
+using ActionbarSherlock.App;
+using ReactiveUI;
+using ReactiveUI.Routing;
+using System.ComponentModel;
+using ReactiveUI.Android;
+using ReactiveUI.Mobile;
+
+namespace AndroidPlayground
+{
+ [Activity (Label = "AndroidPlayground", MainLauncher = true)]
+ public class MainView : SherlockActivity, IViewFor<MainViewModel>, INotifyPropertyChanged
+ {
+ int count = 1;
+ readonly ActivityRoutedViewHost routeHelper;
+ readonly AutoSuspendActivityHelper suspendHelper;
+
+ #region Boring copy-paste code I want to die
+ MainViewModel _ViewModel;
+ public MainViewModel ViewModel {
+ get { return _ViewModel; }
+ set {
+ if (_ViewModel == value) return;
+ _ViewModel = value;
+ if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("ViewModel"));
+ }
+ }
+
+ object IViewFor.ViewModel {
+ get { return ViewModel; }
+ set { ViewModel = (MainViewModel)value; }
+ }
+
+ public event PropertyChangedEventHandler PropertyChanged;
+ #endregion
+
+ public MainView()
+ {
+ // NB: This is dumb.
+ Console.WriteLine(App.Current);
+ RxApp.DeferredScheduler = new AndroidUIScheduler(this);
+
+ suspendHelper = new AutoSuspendActivityHelper(this);
+ suspendHelper.SuspensionHost.SetupDefaultSuspendResume();
+
+ routeHelper = new ActivityRoutedViewHost(this);
+ }
+
+ protected override void OnCreate(Bundle bundle)
+ {
+ base.OnCreate(bundle);
+ suspendHelper.OnCreate(bundle);
+
+ // Set our view from the "main" layout resource
+ SetContentView(Resource.Layout.Main);
+
+ // Get our button from the layout resource,
+ // and attach an event to it
+ Button button = FindViewById<Button>(Resource.Id.myButton);
+
+ button.Click += (o,e) => {
+ ViewModel.HostScreen.Router.Navigate.Execute(new SecondaryViewModel(ViewModel.HostScreen));
+ };
+
+ this.OneWayBind(ViewModel, x => x.UrlPathSegment, x => x.ActionBar.Title);
+ }
+
+ public override bool OnKeyUp(Keycode keyCode, KeyEvent e)
+ {
+ return routeHelper.OnKeyUp(keyCode, e);
+ }
+
+ protected override void OnResume()
+ {
+ base.OnResume();
+ suspendHelper.OnResume();
+ }
+
+ protected override void OnPause()
+ {
+ base.OnPause();
+ suspendHelper.OnPause();
+ }
+
+ protected override void OnSaveInstanceState(Bundle outState)
+ {
+ base.OnSaveInstanceState(outState);
+ suspendHelper.OnSaveInstanceState(outState);
+ }
+ }
+
+ public class MainViewModel : ReactiveObject, IRoutableViewModel
+ {
+ public string UrlPathSegment {
+ get { return "Main!"; }
+ }
+
+ public IScreen HostScreen { get; protected set; }
+
+ public MainViewModel(IScreen hostScreen)
+ {
+ HostScreen = hostScreen ?? RxApp.GetService<IScreen>();
+ }
+ }
+}
View
6 AndroidPlayground/Properties/AndroidManifest.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="AndroidPlayground.AndroidPlayground">
+ <uses-sdk />
+ <application android:label="AndroidPlayground">
+ </application>
+</manifest>
View
28 AndroidPlayground/Properties/AssemblyInfo.cs
@@ -0,0 +1,28 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Android.App;
+
+// Information about this assembly is defined by the following attributes.
+// Change them to the values specific to your project.
+
+[assembly: AssemblyTitle("AndroidPlayground")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("paul")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
+// The form "{Major}.{Minor}.*" will automatically update the build and revision,
+// and "{Major}.{Minor}.{Build}.*" will update just the revision.
+
+[assembly: AssemblyVersion("1.0.0")]
+
+// The following attributes are used to specify the signing key for the assembly,
+// if desired. See the Mono documentation for more information about signing.
+
+//[assembly: AssemblyDelaySign(false)]
+//[assembly: AssemblyKeyFile("")]
+
View
44 AndroidPlayground/Resources/AboutResources.txt
@@ -0,0 +1,44 @@
+Images, layout descriptions, binary blobs and string dictionaries can be included
+in your application as resource files. Various Android APIs are designed to
+operate on the resource IDs instead of dealing with images, strings or binary blobs
+directly.
+
+For example, a sample Android app that contains a user interface layout (main.axml),
+an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png)
+would keep its resources in the "Resources" directory of the application:
+
+Resources/
+ drawable/
+ icon.png
+
+ layout/
+ main.axml
+
+ values/
+ strings.xml
+
+In order to get the build system to recognize Android resources, set the build action to
+"AndroidResource". The native Android APIs do not operate directly with filenames, but
+instead operate on resource IDs. When you compile an Android application that uses resources,
+the build system will package the resources for distribution and generate a class called "R"
+(this is an Android convention) that contains the tokens for each one of the resources
+included. For example, for the above Resources layout, this is what the R class would expose:
+
+public class R {
+ public class drawable {
+ public const int icon = 0x123;
+ }
+
+ public class layout {
+ public const int main = 0x456;
+ }
+
+ public class strings {
+ public const int first_string = 0xabc;
+ public const int second_string = 0xbcd;
+ }
+}
+
+You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main
+to reference the layout/main.axml file, or R.strings.first_string to reference the first
+string in the dictionary file values/strings.xml.
View
2,064 AndroidPlayground/Resources/Resource.designer.cs
2,064 additions, 0 deletions not shown because the diff is too large. Please use a local Git client to view these changes.
View
BIN AndroidPlayground/Resources/drawable/Icon.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
11 AndroidPlayground/Resources/layout/Main.axml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+ <Button
+ android:id="@+id/myButton"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/hello" />
+</LinearLayout>
View
14 AndroidPlayground/Resources/layout/Secondary.axml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:minWidth="25px"
+ android:minHeight="25px">
+ <TextView
+ android:text="Secondary Page"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/textView1" />
+</LinearLayout>
View
5 AndroidPlayground/Resources/values/Strings.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="hello">Navigate Me</string>
+ <string name="app_name">AndroidPlayground</string>
+</resources>
View
103 AndroidPlayground/SecondaryActivity.cs
@@ -0,0 +1,103 @@
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using Android.App;
+using Android.Content;
+using Android.OS;
+using Android.Runtime;
+using Android.Views;
+using Android.Widget;
+using ActionbarSherlock.App;
+using ReactiveUI;
+using ReactiveUI.Routing;
+using ReactiveUI.Android;
+using ReactiveUI.Mobile;
+using System.ComponentModel;
+
+namespace AndroidPlayground
+{
+ [Activity (Label = "SecondaryActivity")]
+ public class SecondaryView : SherlockActivity, IViewFor<SecondaryViewModel>
+ {
+ readonly ActivityRoutedViewHost routeHelper;
+ readonly AutoSuspendActivityHelper suspendHelper;
+
+ #region Boring copy-paste code I want to die
+ SecondaryViewModel _ViewModel;
+ public SecondaryViewModel ViewModel {
+ get { return _ViewModel; }
+ set {
+ if (_ViewModel == value) return;
+ _ViewModel = value;
+ if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("ViewModel"));
+ }
+ }
+
+ object IViewFor.ViewModel {
+ get { return ViewModel; }
+ set { ViewModel = (SecondaryViewModel)value; }
+ }
+
+ public event PropertyChangedEventHandler PropertyChanged;
+ #endregion
+
+ public SecondaryView()
+ {
+ // NB: Super Dumb
+ Console.WriteLine(App.Current);
+ RxApp.DeferredScheduler = new AndroidUIScheduler(this);
+
+ routeHelper = new ActivityRoutedViewHost(this);
+ suspendHelper = new AutoSuspendActivityHelper(this);
+ }
+
+ protected override void OnCreate(Bundle bundle)
+ {
+ base.OnCreate(bundle);
+ suspendHelper.OnCreate(bundle);
+
+ SetContentView(Resource.Layout.Secondary);
+ }
+
+ public override bool OnKeyUp(Keycode keyCode, KeyEvent e)
+ {
+ return routeHelper.OnKeyUp(keyCode, e);
+ }
+
+ protected override void OnResume()
+ {
+ base.OnResume();
+ suspendHelper.OnResume();
+ }
+
+ protected override void OnPause()
+ {
+ base.OnPause();
+ suspendHelper.OnPause();
+ }
+
+ protected override void OnSaveInstanceState(Bundle outState)
+ {
+ base.OnSaveInstanceState(outState);
+ suspendHelper.OnSaveInstanceState(outState);
+ }
+ }
+
+ public class SecondaryViewModel : ReactiveObject, IRoutableViewModel
+ {
+ public string UrlPathSegment {
+ get { return "Secondary!"; }
+ }
+
+ public IScreen HostScreen { get; protected set; }
+
+ public SecondaryViewModel(IScreen hostScreen)
+ {
+ HostScreen = hostScreen ?? RxApp.GetService<IScreen>();
+ }
+ }
+}
+
View
77 ReactiveUI.Android/ActivityRoutedViewHost.cs
@@ -0,0 +1,77 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reactive.Linq;
+using System.Text;
+using Android.App;
+using Android.Content;
+using Android.OS;
+using Android.Runtime;
+using Android.Views;
+using Android.Widget;
+using System.Reflection;
+using ReactiveUI.Routing;
+using System.Threading;
+using ActionbarSherlock.App;
+
+namespace ReactiveUI.Android
+{
+ public sealed class ActivityRoutedViewHost : IDisposable
+ {
+ IDisposable _inner;
+ IScreen _hostScreen;
+
+ public ActivityRoutedViewHost(Activity hostActivity)
+ {
+ var keyUp = hostActivity.GetType()
+ .GetMethods(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.NonPublic | BindingFlags.Instance)
+ .FirstOrDefault(x => x.Name == "OnKeyUp");
+
+ if (keyUp == null) {
+ throw new Exception("You must override OnKeyUp and call theRoutedViewHost.OnKeyUp");
+ }
+
+ var viewFor = hostActivity as IViewFor;
+ if (viewFor == null) {
+ throw new Exception("You must implement IViewFor<TheViewModelClass>");
+ }
+
+ bool firstSet = false;
+ _inner = _hostScreen.Router.ViewModelObservable()
+ .Where(x => x != null)
+ .Subscribe(vm => {
+ if (!firstSet) {
+ viewFor.ViewModel = vm;
+ firstSet = true;
+ return;
+ }
+
+ var view = RxRouting.ResolveView(vm);
+ if (view.GetType() != typeof(Type)) {
+ throw new Exception("Views in Android must be the Type of an Activity");
+ }
+
+ hostActivity.StartActivity((Type)view);
+ });
+ }
+
+ public bool OnKeyUp(Keycode keyCode, KeyEvent e)
+ {
+ if (keyCode != Keycode.Back) return false;
+
+ if (!_hostScreen.Router.NavigateBack.CanExecute(null)) return false;
+
+ if (_inner == null) return false;
+
+ _hostScreen.Router.NavigateBack.Execute(null);
+ return true;
+ }
+
+ public void Dispose()
+ {
+ var disp = Interlocked.Exchange(ref _inner, null);
+ if (disp != null) disp.Dispose();
+ }
+ }
+}
+
View
12 ReactiveUI.Android/ReactiveUI.Android.csproj
@@ -55,12 +55,16 @@
<Reference Include="System.Reactive.Providers">
<HintPath>..\ext\monodroid\System.Reactive.Providers.dll</HintPath>
</Reference>
+ <Reference Include="ActionBarSherlock">
+ <HintPath>..\ext\monodroid\ActionBarSherlock.dll</HintPath>
+ </Reference>
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
<ItemGroup>
<Compile Include="AndroidUIScheduler.cs" />
<Compile Include="ServiceLocationRegistration.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="ActivityRoutedViewHost.cs" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
<ItemGroup>
@@ -68,5 +72,13 @@
<Project>{F92A477B-BB94-43C1-984E-E177EF9FEDB7}</Project>
<Name>ReactiveUI_Monodroid</Name>
</ProjectReference>
+ <ProjectReference Include="..\ReactiveUI.Routing\ReactiveUI.Routing_Monodroid.csproj">
+ <Project>{E92E477B-BB94-43C1-984E-E177EF9FEDB7}</Project>
+ <Name>ReactiveUI.Routing_Monodroid</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\ReactiveUI.Xaml\ReactiveUI.Xaml_Monodroid.csproj">
+ <Project>{E92A477B-BB94-43C1-984E-E177EF9FEDB7}</Project>
+ <Name>ReactiveUI.Xaml_Monodroid</Name>
+ </ProjectReference>
</ItemGroup>
</Project>
View
1 ReactiveUI.Cocoa/ReactiveUI.Cocoa_Monotouch.csproj
@@ -66,6 +66,7 @@
<Compile Include="RoutedViewHost.cs" />
<Compile Include="TargetActionCommandBinder.cs" />
<Compile Include="ViewModelViewHost.cs" />
+ <Compile Include="RouterUINavigationController.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ReactiveUI.Xaml\ReactiveUI.Xaml_Monotouch.csproj">
View
80 ReactiveUI.Cocoa/RouterUINavigationController.cs
@@ -0,0 +1,80 @@
+using System;
+using ReactiveUI.Routing;
+using MonoTouch.UIKit;
+using ReactiveUI;
+using ReactiveUI.Cocoa;
+using System.Reactive.Linq;
+using System.Reactive.Concurrency;
+using System.Reactive.Disposables;
+using MonoTouch.Foundation;
+using System.ComponentModel;
+
+namespace ReactiveUI.Routing
+{
+ public class RouterUINavigationController : UINavigationController
+ {
+ readonly IRoutingState router;
+
+ public RouterUINavigationController(IRoutingState router)
+ {
+ this.router = router;
+
+ router.Navigate.Subscribe (x => {
+ var view = RxRouting.ResolveView(x);
+ view.ViewModel = x;
+
+ this.PushViewController((UIViewController)view, true);
+ });
+
+ router.NavigateBack.Subscribe(_ => this.PopViewControllerAnimated(true));
+ router.NavigateAndReset.Subscribe (x => {
+ this.PopToRootViewController(false);
+ router.Navigate.Execute(x);
+ });
+
+ this.Delegate = new RouterUINavigationControllerDelegate(this, router);
+ }
+
+ bool dontPopWhileYouPop = false;
+
+ [Export("navigationBar:shouldPopItem:")]
+ bool navigationBarShouldPopItem(UINavigationBar navigationBar, UINavigationItem item)
+ {
+ if (dontPopWhileYouPop) return true;
+
+ RxApp.DeferredScheduler.Schedule (() => {
+ if (!router.NavigateBack.CanExecute(null) || dontPopWhileYouPop) return;
+ dontPopWhileYouPop = true;
+ router.NavigateBack.Execute(null);
+ });
+
+ return false;
+ }
+
+ class RouterUINavigationControllerDelegate : UINavigationControllerDelegate
+ {
+ IRoutingState router;
+ RouterUINavigationController parent;
+ IDisposable prevBackWireup = Disposable.Empty;
+
+ public RouterUINavigationControllerDelegate(RouterUINavigationController parent, IRoutingState router)
+ {
+ this.parent = parent;
+ this.router = router;
+ }
+
+ public override void DidShowViewController (UINavigationController navigationController, UIViewController viewController, bool animated)
+ {
+ var viewFor = viewController as IViewFor;
+ if (viewFor != null) {
+ var vm = router.GetCurrentViewModel();
+ viewFor.ViewModel = vm;
+ viewController.Title = vm.UrlPathSegment;
+ }
+
+ parent.dontPopWhileYouPop = false;
+ }
+ }
+ }
+}
+
View
10 ReactiveUI.Cocoa/TargetActionCommandBinder.cs
@@ -58,14 +58,20 @@ public IDisposable BindCommandToObject(ICommand command, object target, IObserva
});
var sel = new Selector("theAction:");
+#if UIKIT
+ var ctl = (UIControl)target;
+ ctl.AddTarget(ctlDelegate, sel, UIControlEvent.TouchUpInside);
+ var actionDisp = Disposable.Create(() => ctl.RemoveTarget(ctlDelegate, sel, UIControlEvent.TouchUpInside));
+#else
Reflection.GetValueSetterOrThrow(target.GetType(), "Action")(target, sel);
-
var targetSetter = Reflection.GetValueSetterOrThrow(target.GetType(), "Target");
targetSetter(target, ctlDelegate);
+ var actionDisp = Disposable.Create(() => targetSetter(target, null));
+#endif
var enabledSetter = Reflection.GetValueSetterForProperty(target.GetType(), "Enabled");
var disp = new CompositeDisposable(
- Disposable.Create(() => targetSetter(target, null)),
+ actionDisp,
commandParameter.Subscribe(x => latestParam = x),
Observable.FromEventPattern<EventHandler, EventArgs>(x => command.CanExecuteChanged += x, x => command.CanExecuteChanged -= x)
.Select(_ => command.CanExecute(latestParam))
View
141 ReactiveUI.Mobile/AutoSuspendActivityHelper.cs
@@ -0,0 +1,141 @@
+using System;
+using System.Linq;
+using System.Reactive;
+using System.Reactive.Linq;
+using System.Reactive.Subjects;
+using Android.App;
+using Android.OS;
+using System.Reflection;
+
+namespace ReactiveUI.Mobile
+{
+ class AndroidSuspensionHost : ISuspensionHost
+ {
+ internal static ISuspensionHost inner { get; set; }
+ internal static Bundle latestBundle { get; set; }
+
+ static AndroidSuspensionHost()
+ {
+ inner = new SuspensionHost();
+ }
+
+ public IObservable<Unit> IsLaunchingNew { get { return inner.IsLaunchingNew; } }
+ public IObservable<Unit> IsResuming { get { return inner.IsResuming; } }
+ public IObservable<Unit> IsUnpausing { get { return inner.IsUnpausing; } }
+ public IObservable<IDisposable> ShouldPersistState { get { return inner.ShouldPersistState; } }
+ public IObservable<Unit> ShouldInvalidateState { get { return inner.ShouldInvalidateState; } }
+
+ public void SetupDefaultSuspendResume(ISuspensionDriver driver = null)
+ {
+ inner.SetupDefaultSuspendResume(driver);
+ }
+ }
+
+ public class RootState : ReactiveObject
+ {
+ static RootState _Current = new RootState();
+ public static RootState Current { get { return _Current; } }
+
+ protected RootState() { }
+
+ IApplicationRootState _ViewModel;
+ public IApplicationRootState ViewModel {
+ get { return _ViewModel; }
+ set { this.RaiseAndSetIfChanged(ref _ViewModel, value); }
+ }
+
+ public static T As<T>() where T : IApplicationRootState
+ {
+ return (T)Current.ViewModel;
+ }
+ }
+
+ public class AutoSuspendActivityHelper : IEnableLogger
+ {
+ readonly Subject<Bundle> onCreate = new Subject<Bundle>();
+ readonly Subject<Unit> onResume = new Subject<Unit>();
+ readonly Subject<Unit> onPause = new Subject<Unit>();
+ readonly Subject<Bundle> onSaveInstanceState = new Subject<Bundle>();
+
+ public ISuspensionHost SuspensionHost { get; set; }
+
+ public AutoSuspendActivityHelper(Activity hostActivity)
+ {
+ var methodsToCheck = new[] {
+ "OnCreate", "OnResume", "OnPause", "OnSaveInstanceState",
+ };
+
+ var missingMethod = methodsToCheck
+ .Select(x => {
+ var methods = hostActivity.GetType().GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
+ return Tuple.Create(x, methods.FirstOrDefault(y => y.Name == x));
+ })
+ .FirstOrDefault(x => x.Item2 == null);
+
+ if (missingMethod != null) {
+ throw new Exception(String.Format("Your activity must implement {0} and call AutoSuspendActivityHelper.{0}", missingMethod.Item1));
+ }
+
+ Observable.Merge(onCreate, onSaveInstanceState)
+ .Subscribe(x => AndroidSuspensionHost.latestBundle = x);
+
+ var host = new SuspensionHost();
+ host.IsLaunchingNew = onCreate.Select(_ => Unit.Default);
+ host.IsResuming = onResume;
+ host.IsUnpausing = onResume;
+
+ bool hasRecentlyCrashed = false;
+ host.SetupDefaultSuspendResumeFunc = new Action<ISuspensionDriver>(driver => {
+ driver = driver ?? RxApp.GetService<ISuspensionDriver>();
+
+ // TODO: Handle crashes here
+
+ host.ShouldInvalidateState
+ .SelectMany(_ => driver.InvalidateState())
+ .LoggedCatch(this, Observable.Return(Unit.Default), "Tried to invalidate app state")
+ .Subscribe(_ => this.Log().Info("Invalidated app state"));
+
+ host.ShouldPersistState
+ .SelectMany(x => driver.SaveState(RootState.Current.ViewModel).Finally(x.Dispose))
+ .LoggedCatch(this, Observable.Return(Unit.Default), "Tried to persist app state")
+ .Subscribe(_ => this.Log().Info("Persisted application state"));
+
+ host.IsResuming
+ .SelectMany(x => driver.LoadState<IApplicationRootState>())
+ .LoggedCatch(this,
+ Observable.Defer(() => Observable.Return(RxApp.GetService<IApplicationRootState>())),
+ "Failed to restore app state from storage, creating from scratch")
+ .ObserveOn(RxApp.DeferredScheduler)
+ .Subscribe(x => RootState.Current.ViewModel = x);
+
+ host.IsLaunchingNew.Subscribe(_ => {
+ RootState.Current.ViewModel = RxApp.GetService<IApplicationRootState>();
+ });
+ });
+
+ SuspensionHost = host;
+ AndroidSuspensionHost.inner = host;
+ }
+
+ public void OnCreate(Bundle bundle)
+ {
+ onCreate.OnNext(bundle);
+ }
+
+ public void OnResume()
+ {
+ onResume.OnNext(Unit.Default);
+ }
+
+ public void OnPause()
+ {
+ onResume.OnNext(Unit.Default);
+ }
+
+ public void OnSaveInstanceState(Bundle outState)
+ {
+ onSaveInstanceState.OnNext(outState);
+ }
+ }
+}
+
View
149 ReactiveUI.Mobile/AutoSuspendAppDelegate.cs
@@ -0,0 +1,149 @@
+using System;
+using System.Linq;
+using System.Reactive;
+using System.Reactive.Linq;
+using MonoTouch.Foundation;
+using MonoTouch.UIKit;
+using System.Reactive.Subjects;
+using System.Collections.Generic;
+using System.Reactive.Disposables;
+using ReactiveUI.Routing;
+
+namespace ReactiveUI.Mobile
+{
+ class CocoaSuspensionHost : ISuspensionHost
+ {
+ public IObservable<Unit> IsLaunchingNew { get { return ((AutoSuspendAppDelegate)UIApplication.SharedApplication.Delegate).SuspensionHost.IsLaunchingNew; } }
+ public IObservable<Unit> IsResuming { get { return ((AutoSuspendAppDelegate)UIApplication.SharedApplication.Delegate).SuspensionHost.IsResuming; } }
+ public IObservable<Unit> IsUnpausing { get { return ((AutoSuspendAppDelegate)UIApplication.SharedApplication.Delegate).SuspensionHost.IsUnpausing; } }
+ public IObservable<IDisposable> ShouldPersistState { get { return ((AutoSuspendAppDelegate)UIApplication.SharedApplication.Delegate).SuspensionHost.ShouldPersistState; } }
+ public IObservable<Unit> ShouldInvalidateState { get { return ((AutoSuspendAppDelegate)UIApplication.SharedApplication.Delegate).SuspensionHost.ShouldInvalidateState; } }
+
+ public void SetupDefaultSuspendResume(ISuspensionDriver driver = null)
+ {
+ var app = (AutoSuspendAppDelegate) UIApplication.SharedApplication.Delegate;
+ app.setupDefaultSuspendResume(driver);
+ }
+ }
+
+ public abstract class AutoSuspendAppDelegate : UIApplicationDelegate, IEnableLogger
+ {
+ readonly Subject<UIApplication> _finishedLaunching = new Subject<UIApplication>();
+ readonly Subject<UIApplication> _activated = new Subject<UIApplication>();
+ readonly Subject<UIApplication> _backgrounded = new Subject<UIApplication>();
+ readonly Subject<UIApplication> _willTerminate = new Subject<UIApplication>();
+
+ internal SuspensionHost SuspensionHost;
+
+ readonly Subject<IApplicationRootState> _viewModelChanged = new Subject<IApplicationRootState>();
+ IApplicationRootState _ViewModel;
+
+ public IApplicationRootState ViewModel {
+ get { return _ViewModel; }
+ set {
+ if (_ViewModel == value) return;
+ _ViewModel = value;
+ _viewModelChanged.OnNext(value);
+ }
+ }
+
+ public IDictionary<string, string> LaunchOptions { get; protected set; }
+
+ public AutoSuspendAppDelegate()
+ {
+ var host = new SuspensionHost();
+ host.IsLaunchingNew = Observable.Never<Unit>();
+ host.IsResuming = _finishedLaunching.Select(_ => Unit.Default);
+ host.IsUnpausing = _activated.Select(_ => Unit.Default);
+
+ var untimelyDeath = new Subject<Unit>();
+ AppDomain.CurrentDomain.UnhandledException += (o,e) => untimelyDeath.OnNext(Unit.Default);
+
+ host.ShouldInvalidateState = untimelyDeath;
+ host.ShouldPersistState = _willTerminate.Merge(_backgrounded).SelectMany(app => {
+ var taskId = app.BeginBackgroundTask(new NSAction(() => untimelyDeath.OnNext(Unit.Default)));
+
+ // NB: We're being force-killed, signal invalidate instead
+ if (taskId == UIApplication.BackgroundTaskInvalid) {
+ untimelyDeath.OnNext(Unit.Default);
+ return Observable.Empty<IDisposable>();
+ }
+
+ return Observable.Return(
+ Disposable.Create(() => app.EndBackgroundTask(taskId)));
+ });
+
+ SuspensionHost = host;
+ }
+
+ public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
+ {
+ if (launchOptions != null) {
+ LaunchOptions = launchOptions.Keys.ToDictionary(k => k.ToString(), v => launchOptions[v].ToString());
+ } else {
+ LaunchOptions = new Dictionary<string, string>();
+ }
+
+ // NB: This is run in-context (i.e. not scheduled), so by the time this
+ // statement returns, UIWindow should be created already
+ _finishedLaunching.OnNext(application);
+
+ return true;
+ }
+
+ public override void OnActivated(UIApplication application)
+ {
+ _activated.OnNext(application);
+ }
+
+ public override void DidEnterBackground(UIApplication application)
+ {
+ _backgrounded.OnNext(application);
+ }
+
+ public override void WillTerminate(UIApplication application)
+ {
+ _willTerminate.OnNext(application);
+ }
+
+ internal void setupDefaultSuspendResume(ISuspensionDriver driver)
+ {
+ driver = driver ?? RxApp.GetService<ISuspensionDriver>();
+
+ var window = new UIWindow(UIScreen.MainScreen.Bounds);
+ _viewModelChanged.Subscribe(vm => {
+ var frame = RxApp.GetService<UIViewController>("InitialPage");
+ var viewFor = frame as IViewFor;
+ if (viewFor != null) {
+ viewFor.ViewModel = vm;
+ }
+
+ window.RootViewController = frame;
+ window.MakeKeyAndVisible();
+ });
+
+ SuspensionHost.ShouldInvalidateState
+ .SelectMany(_ => driver.InvalidateState())
+ .LoggedCatch(this, Observable.Return(Unit.Default), "Tried to invalidate app state")
+ .Subscribe(_ => this.Log().Info("Invalidated app state"));
+
+ SuspensionHost.ShouldPersistState
+ .SelectMany(x => driver.SaveState(ViewModel).Finally(x.Dispose))
+ .LoggedCatch(this, Observable.Return(Unit.Default), "Tried to persist app state")
+ .Subscribe(_ => this.Log().Info("Persisted application state"));
+
+ SuspensionHost.IsResuming
+ .SelectMany(x => driver.LoadState<IApplicationRootState>())
+ .LoggedCatch(this,
+ Observable.Defer(() => Observable.Return(RxApp.GetService<IApplicationRootState>())),
+ "Failed to restore app state from storage, creating from scratch")
+ .ObserveOn(RxApp.DeferredScheduler)
+ .Subscribe(x => ViewModel = x);
+
+ SuspensionHost.IsLaunchingNew.Subscribe(_ => {
+ ViewModel = RxApp.GetService<IApplicationRootState>();
+ });
+ }
+ }
+}
+
View
42 ReactiveUI.Mobile/BundleSuspensionDriver.cs
@@ -0,0 +1,42 @@
+using System;
+using System.Reactive;
+using System.Reactive.Linq;
+using Newtonsoft.Json;
+
+namespace ReactiveUI.Mobile
+{
+ public class BundleSuspensionDriver : ISuspensionDriver
+ {
+ public IObservable<T> LoadState<T>() where T : class, IApplicationRootState
+ {
+ try {
+ return Observable.Return(JsonConvert.DeserializeObject<T>(
+ AndroidSuspensionHost.latestBundle.GetString("__state")));
+ } catch (Exception ex) {
+ return Observable.Throw<T>(ex);
+ }
+ }
+
+ public IObservable<Unit> SaveState<T>(T state) where T : class, IApplicationRootState
+ {
+ try {
+ AndroidSuspensionHost.latestBundle.PutString("__state", JsonConvert.SerializeObject(state));
+ return Observable.Return(Unit.Default);
+
+ } catch(Exception ex) {
+ return Observable.Throw<Unit>(ex);
+ }
+ }
+
+ public IObservable<Unit> InvalidateState()
+ {
+ try {
+ AndroidSuspensionHost.latestBundle.PutString("__state", "");
+ return Observable.Return(Unit.Default);
+
+ } catch(Exception ex) {
+ return Observable.Throw<Unit>(ex);
+ }
+ }
+ }
+}
View
9 ReactiveUI.Mobile/Geolocation.cs
@@ -37,7 +37,12 @@ public static IObservable<Position> Listen(int minUpdateTime, double minUpdateDi
}
var ret = Observable.Create<Position>(subj => {
+#if ANDROID
+ var geo = new Geolocator(Android.App.Application.Context);
+#else
var geo = new Geolocator();
+#endif
+
var disp = new CompositeDisposable();
bool isDead = false;
@@ -72,7 +77,11 @@ public static IObservable<Position> GetPosition(bool includeHeading = false)
#if !WP7 && !WP8
var ret = Observable.Create<Position>(subj => {
+#if ANDROID
+ var geo = new Geolocator(Android.App.Application.Context);
+#else
var geo = new Geolocator();
+#endif
var cts = new CancellationTokenSource();
var disp = new CompositeDisposable();
View
62 ReactiveUI.Mobile/JsonSuspensionDriver.cs
@@ -0,0 +1,62 @@
+using System;
+using System.Reactive.Linq;
+using Newtonsoft.Json;
+using MonoTouch.Foundation;
+using System.Reactive;
+using System.IO;
+using System.Text;
+
+namespace ReactiveUI.Mobile
+{
+ public class AppSupportJsonSuspensionDriver : ISuspensionDriver
+ {
+ public IObservable<T> LoadState<T>() where T : class, IApplicationRootState
+ {
+ try {
+ var target = Path.Combine(CreateAppDirectory(NSSearchPathDirectory.ApplicationSupportDirectory), "state.json");
+ return Observable.Return(JsonConvert.DeserializeObject<T>(File.ReadAllText(target, Encoding.UTF8)));
+ } catch (Exception ex) {
+ return Observable.Throw<T>(ex);
+ }
+ }
+
+ public IObservable<Unit> SaveState<T>(T state) where T : class, IApplicationRootState
+ {
+ try {
+ var target = Path.Combine(CreateAppDirectory(NSSearchPathDirectory.ApplicationSupportDirectory), "state.json");
+ File.WriteAllText(target, JsonConvert.SerializeObject(state));
+
+ return Observable.Return(Unit.Default);
+
+ } catch(Exception ex) {
+ return Observable.Throw<Unit>(ex);
+ }
+ }
+
+ public IObservable<Unit> InvalidateState()
+ {
+ try {
+ var target = Path.Combine(CreateAppDirectory(NSSearchPathDirectory.ApplicationSupportDirectory), "state.json");
+ File.Delete(target);
+
+ return Observable.Return(Unit.Default);
+
+ } catch(Exception ex) {
+ return Observable.Throw<Unit>(ex);
+ }
+ }
+
+ string CreateAppDirectory(NSSearchPathDirectory targetDir, string subDir = "Data")
+ {
+ NSError err;
+
+ var fm = new NSFileManager();
+ var url = fm.GetUrl(targetDir, NSSearchPathDomain.All, null, true, out err);
+ var ret = Path.Combine(url.RelativePath, NSBundle.MainBundle.BundleIdentifier, subDir);
+ if (!Directory.Exists(ret)) Directory.CreateDirectory(ret);
+
+ return ret;
+ }
+ }
+}
+
View
160 ReactiveUI.Mobile/ReactiveUI.Mobile_Monodroid.csproj
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>10.0.0</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{A92E477B-BB94-43C1-984E-E177EF9FEDB1}</ProjectGuid>
+ <ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <OutputType>Library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>ReactiveUI.Mobile</RootNamespace>
+ <AssemblyName>ReactiveUI.Mobile_Monodroid</AssemblyName>
+ <FileAlignment>512</FileAlignment>
+ <SccProjectName>
+ </SccProjectName>
+ <SccLocalPath>
+ </SccLocalPath>
+ <SccAuxPath>
+ </SccAuxPath>
+ <SccProvider>
+ </SccProvider>
+ <CodeContractsAssemblyMode>1</CodeContractsAssemblyMode>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>True</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>False</Optimize>
+ <OutputPath>bin\Debug\Monodroid</OutputPath>
+ <DefineConstants>DEBUG;TRACE; MONO; ANDROID</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <CodeContractsEnableRuntimeChecking>False</CodeContractsEnableRuntimeChecking>
+ <CodeContractsRuntimeOnlyPublicSurface>True</CodeContractsRuntimeOnlyPublicSurface>
+ <CodeContractsRuntimeThrowOnFailure>False</CodeContractsRuntimeThrowOnFailure>
+ <CodeContractsRuntimeCallSiteRequires>False</CodeContractsRuntimeCallSiteRequires>
+ <CodeContractsRunCodeAnalysis>False</CodeContractsRunCodeAnalysis>
+ <CodeContractsNonNullObligations>False</CodeContractsNonNullObligations>
+ <CodeContractsBoundsObligations>True</CodeContractsBoundsObligations>
+ <CodeContractsArithmeticObligations>False</CodeContractsArithmeticObligations>
+ <CodeContractsContainerAnalysis>False</CodeContractsContainerAnalysis>
+ <CodeContractsRedundantAssumptions>False</CodeContractsRedundantAssumptions>
+ <CodeContractsRunInBackground>True</CodeContractsRunInBackground>
+ <CodeContractsShowSquigglies>False</CodeContractsShowSquigglies>
+ <CodeContractsUseBaseLine>False</CodeContractsUseBaseLine>
+ <CodeContractsEmitXMLDocs>False</CodeContractsEmitXMLDocs>
+ <CodeContractsCustomRewriterAssembly />
+ <CodeContractsCustomRewriterClass />
+ <CodeContractsLibPaths />
+ <CodeContractsExtraRewriteOptions />
+ <CodeContractsExtraAnalysisOptions />
+ <CodeContractsBaseLineFile />
+ <CodeContractsCacheAnalysisResults>False</CodeContractsCacheAnalysisResults>
+ <CodeContractsRuntimeCheckingLevel>Full</CodeContractsRuntimeCheckingLevel>
+ <CodeContractsReferenceAssembly>%28none%29</CodeContractsReferenceAssembly>
+ <CodeAnalysisRuleSet>ExtendedCorrectnessRules.ruleset</CodeAnalysisRuleSet>
+ <RunCodeAnalysis>false</RunCodeAnalysis>
+ <CodeContractsPointerObligations>False</CodeContractsPointerObligations>
+ <AndroidLinkMode>None</AndroidLinkMode>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>True</Optimize>
+ <OutputPath>bin\Release\Monodroid</OutputPath>
+ <DefineConstants>TRACE; MONO; ANDROID</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <CodeContractsEnableRuntimeChecking>False</CodeContractsEnableRuntimeChecking>
+ <CodeContractsRuntimeOnlyPublicSurface>False</CodeContractsRuntimeOnlyPublicSurface>
+ <CodeContractsRuntimeThrowOnFailure>True</CodeContractsRuntimeThrowOnFailure>
+ <CodeContractsRuntimeCallSiteRequires>False</CodeContractsRuntimeCallSiteRequires>
+ <CodeContractsRunCodeAnalysis>True</CodeContractsRunCodeAnalysis>
+ <CodeContractsNonNullObligations>False</CodeContractsNonNullObligations>
+ <CodeContractsBoundsObligations>False</CodeContractsBoundsObligations>
+ <CodeContractsArithmeticObligations>False</CodeContractsArithmeticObligations>
+ <CodeContractsContainerAnalysis>False</CodeContractsContainerAnalysis>
+ <CodeContractsRedundantAssumptions>False</CodeContractsRedundantAssumptions>
+ <CodeContractsRunInBackground>True</CodeContractsRunInBackground>
+ <CodeContractsShowSquigglies>True</CodeContractsShowSquigglies>
+ <CodeContractsUseBaseLine>False</CodeContractsUseBaseLine>
+ <CodeContractsEmitXMLDocs>False</CodeContractsEmitXMLDocs>
+ <CodeContractsCustomRewriterAssembly />
+ <CodeContractsCustomRewriterClass />
+ <CodeContractsLibPaths />
+ <CodeContractsExtraRewriteOptions />
+ <CodeContractsExtraAnalysisOptions />
+ <CodeContractsBaseLineFile />
+ <CodeContractsCacheAnalysisResults>True</CodeContractsCacheAnalysisResults>
+ <CodeContractsRuntimeCheckingLevel>Full</CodeContractsRuntimeCheckingLevel>
+ <CodeContractsReferenceAssembly>%28none%29</CodeContractsReferenceAssembly>
+ <AndroidLinkMode>SdkOnly</AndroidLinkMode>
+ <AndroidUseSharedRuntime>False</AndroidUseSharedRuntime>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Runtime.Serialization" />
+ <Reference Include="System.Xml.Linq" />
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="System.Reactive.Core">
+ <HintPath>..\ext\monodroid\System.Reactive.Core.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.Interfaces">
+ <HintPath>..\ext\monodroid\System.Reactive.Interfaces.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.Linq">
+ <HintPath>..\ext\monodroid\System.Reactive.Linq.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.PlatformServices">
+ <HintPath>..\ext\monodroid\System.Reactive.PlatformServices.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.Providers">
+ <HintPath>..\ext\monodroid\System.Reactive.Providers.dll</HintPath>
+ </Reference>
+ <Reference Include="Xamarin.Mobile">
+ <HintPath>..\ext\monodroid\Xamarin.Mobile.dll</HintPath>
+ </Reference>
+ <Reference Include="Mono.Android" />
+ <Reference Include="Mono.Android.Support.v4" />
+ <Reference Include="Newtonsoft.Json">
+ <HintPath>..\ext\Newtonsoft.Json.dll</HintPath>
+ </Reference>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="Interfaces.cs" />
+ <Compile Include="ServiceLocationRegistration.cs" />
+ <Compile Include="SuspensionHost.cs" />
+ <Compile Include="AutoSuspendActivityHelper.cs" />
+ <Compile Include="Geolocation.cs" />
+ <Compile Include="BundleSuspensionDriver.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" />
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
+ Other similar extension points exist, see Microsoft.Common.targets.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+ <Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
+ <ItemGroup>
+ <ProjectReference Include="..\ReactiveUI\ReactiveUI_Monodroid.csproj">
+ <Project>{F92A477B-BB94-43C1-984E-E177EF9FEDB7}</Project>
+ <Name>ReactiveUI_Monodroid</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\ReactiveUI.Xaml\ReactiveUI.Xaml_Monodroid.csproj">
+ <Project>{E92A477B-BB94-43C1-984E-E177EF9FEDB7}</Project>
+ <Name>ReactiveUI.Xaml_Monodroid</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\ReactiveUI.Routing\ReactiveUI.Routing_Monodroid.csproj">
+ <Project>{E92E477B-BB94-43C1-984E-E177EF9FEDB7}</Project>
+ <Name>ReactiveUI.Routing_Monodroid</Name>
+ </ProjectReference>
+ </ItemGroup>
+</Project>
View
93 ReactiveUI.Mobile/ReactiveUI.Mobile_Monotouch.csproj
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>10.0.0</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{9091337A-9E94-4DBD-801E-15E10DB72FFC}</ProjectGuid>
+ <ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <OutputType>Library</OutputType>
+ <RootNamespace>ReactiveUI.Mobile</RootNamespace>
+ <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>
+ <AssemblyName>ReactiveUI.Mobile_Monotouch</AssemblyName>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>True</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>False</Optimize>
+ <OutputPath>bin\Debug\Monotouch</OutputPath>
+ <DefineConstants>DEBUG; MONO; UIKIT</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <ConsolePause>False</ConsolePause>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>none</DebugType>
+ <Optimize>True</Optimize>
+ <OutputPath>bin\Release\Monotouch</OutputPath>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <ConsolePause>False</ConsolePause>
+ <DefineConstants>MONO; UIKIT</DefineConstants>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Xml" />
+ <Reference Include="System.Core" />
+ <Reference Include="monotouch" />
+ <Reference Include="System.Reactive.Core">
+ <HintPath>..\ext\ios\System.Reactive.Core.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.Interfaces">
+ <HintPath>..\ext\ios\System.Reactive.Interfaces.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.Linq">
+ <HintPath>..\ext\ios\System.Reactive.Linq.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Reactive.PlatformServices">
+ <HintPath>..\ext\ios\System.Reactive.PlatformServices.dll</HintPath>
+ </Reference>
+ <Reference Include="System.Runtime.Serialization" />
+ <Reference Include="Xamarin.Mobile">
+ <HintPath>..\ext\ios\Xamarin.Mobile.dll</HintPath>
+ </Reference>
+ <Reference Include="Newtonsoft.Json">
+ <HintPath>..\ext\Newtonsoft.Json.dll</HintPath>
+ </Reference>
+ </ItemGroup>
+ <ItemGroup>
+ <Folder Include="Resources\" />
+ <Folder Include="Properties\" />
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+ <ItemGroup>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="ServiceLocationRegistration.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="Geolocation.cs" />
+ <Compile Include="Interfaces.cs" />
+ <Compile Include="SuspensionHost.cs" />
+ <Compile Include="AutoSuspendAppDelegate.cs" />
+ <Compile Include="JsonSuspensionDriver.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\ReactiveUI\ReactiveUI_Monotouch.csproj">
+ <Project>{9091337A-9E94-4DBD-801E-05E1FDA78FFC}</Project>
+ <Name>ReactiveUI_Monotouch</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\ReactiveUI.Xaml\ReactiveUI.Xaml_Monotouch.csproj">
+ <Project>{9891337A-9E94-4DBD-801E-05E1FDA78FFC}</Project>
+ <Name>ReactiveUI.Xaml_Monotouch</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\ReactiveUI.Routing\ReactiveUI.Routing_Monotouch.csproj">
+ <Project>{9091337B-9E94-4DBD-801E-05E1FDA78FFC}</Project>
+ <Name>ReactiveUI.Routing_Monotouch</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\ReactiveUI.Cocoa\ReactiveUI.Cocoa_Monotouch.csproj">
+ <Project>{9091337A-9E94-4DBD-801E-15E1FDA78FFC}</Project>
+ <Name>ReactiveUI.Cocoa_Monotouch</Name>
+ </ProjectReference>
+ </ItemGroup>
+</Project>
View
6 ReactiveUI.Mobile/ServiceLocationRegistration.cs
@@ -16,6 +16,12 @@ public void Register()
#elif WINRT
RxApp.Register(typeof(WinRTSuspensionHost), typeof (ISuspensionHost));
RxApp.Register(typeof(WinRTAppDataDriver), typeof (ISuspensionDriver));
+#elif UIKIT
+ RxApp.Register(typeof(CocoaSuspensionHost), typeof(ISuspensionHost));
+ RxApp.Register(typeof(AppSupportJsonSuspensionDriver), typeof(ISuspensionDriver));
+#elif ANDROID
+ RxApp.Register(typeof(AndroidSuspensionHost), typeof(ISuspensionHost));
+ RxApp.Register(typeof(BundleSuspensionDriver), typeof(ISuspensionDriver));
#endif
}
}
View
20 ReactiveUI.Mobile/SuspensionHost.cs
@@ -4,19 +4,33 @@
namespace ReactiveUI.Mobile
{
- public class SuspensionHost
+ public class SuspensionHost : ISuspensionHost
{
public IObservable<Unit> IsLaunchingNew { get; set; }
public IObservable<Unit> IsResuming { get; set; }
public IObservable<Unit> IsUnpausing { get; set; }
public IObservable<IDisposable> ShouldPersistState { get; set; }
public IObservable<Unit> ShouldInvalidateState { get; set; }
+ public Action<ISuspensionDriver> SetupDefaultSuspendResumeFunc { get; set; }
public SuspensionHost()
{
+#if UIKIT
+ var message = "Your AppDelegate class needs to derive from AutoSuspendAppDelegate";
+#elif ANDROID
+ var message = "Your Activities need to instantiate AutoSuspendActivityHelper";
+#else
+ var message = "Your App class needs to derive from AutoSuspendApplication";
+#endif
+
IsLaunchingNew = IsResuming = IsUnpausing = ShouldInvalidateState =
- Observable.Throw<Unit>(new Exception("Your App class needs to derive from AutoSuspendApplication"));
- ShouldPersistState = Observable.Throw<IDisposable>(new Exception("Your App class needs to derive from AutoSuspendApplication"));
+ Observable.Throw<Unit>(new Exception(message));
+ ShouldPersistState = Observable.Throw<IDisposable>(new Exception(message));
+ }
+
+ public void SetupDefaultSuspendResume(ISuspensionDriver driver = null)
+ {
+ SetupDefaultSuspendResumeFunc(driver);
}
}
}
View
2 ReactiveUI/Properties/AssemblyInfo.cs
@@ -41,3 +41,5 @@
[assembly: InternalsVisibleTo("ReactiveUI.Android_Monodroid")]
[assembly: InternalsVisibleTo("ReactiveUI.Mobile_WinRT")]
[assembly: InternalsVisibleTo("ReactiveUI.Mobile_WP8")]
+[assembly: InternalsVisibleTo("ReactiveUI.Mobile_Monotouch")]
+[assembly: InternalsVisibleTo("ReactiveUI.Mobile_Monodroid")]
View
8 ReactiveUI/ReactiveUI_Monodroid.csproj
@@ -130,6 +130,7 @@
<Compile Include="OrderedComparer.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ReactiveCollection.cs" />
+ <Compile Include="ReactiveCollectionMixins.cs" />
<Compile Include="ReactiveNotifyPropertyChangedMixin.cs" />
<Compile Include="ReactiveObject.cs" />
<Compile Include="MakeObjectReactiveHelper.cs" />
@@ -146,6 +147,10 @@
<Compile Include="CallerMemberNameAttribute.cs" />
<Compile Include="CollectionDebugView.cs" />
<Compile Include="VariadicTemplates.cs" />
+ <Compile Include="Rx-Shim\AwaitableAsyncSubject.cs" />
+ <Compile Include="Rx-Shim\GetAwaiter.cs" />
+ <Compile Include="Rx-Shim\ImmutableList.cs" />
+ <Compile Include="PropertyBinding.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
@@ -162,4 +167,7 @@
</Target>
-->
<Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
+ <ItemGroup>
+ <Folder Include="Rx-Shim\" />
+ </ItemGroup>
</Project>
View
7 ReactiveUI/ReactiveUI_Monotouch.csproj
@@ -52,6 +52,7 @@
</ItemGroup>
<ItemGroup>
<Folder Include="Resources\" />
+ <Folder Include="Rx-Shim\" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>
@@ -80,6 +81,10 @@
<Compile Include="VariadicTemplates.cs" />
<Compile Include="RxApp.cs" />
<Compile Include="CollectionDebugView.cs" />
- <Compile Include="CallerMemberNameAttribute.cs" />
+ <Compile Include="PropertyBinding.cs" />
+ <Compile Include="Rx-Shim\AwaitableAsyncSubject.cs" />
+ <Compile Include="Rx-Shim\GetAwaiter.cs" />
+ <Compile Include="Rx-Shim\ImmutableList.cs" />
+ <Compile Include="ReactiveCollectionMixins.cs" />
</ItemGroup>
</Project>
View
8 ReactiveUI_Android.sln
@@ -9,12 +9,18 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveUI.Xaml_Monodroid",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveUI.Routing_Monodroid", "ReactiveUI.Routing\ReactiveUI.Routing_Monodroid.csproj", "{E92E477B-BB94-43C1-984E-E177EF9FEDB7}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AndroidPlayground", "AndroidPlayground\AndroidPlayground.csproj", "{D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Release|Any CPU.Build.0 = Release|Any CPU
{E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -33,6 +39,6 @@ Global
{F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
- StartupItem = ReactiveUI\ReactiveUI_Monodroid.csproj
+ StartupItem = AndroidPlayground\AndroidPlayground.csproj
EndGlobalSection
EndGlobal
View
426 ReactiveUI_Mono.sln
@@ -22,6 +22,30 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveUI.NLog_Mono", "Rea
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XamarinMacPlayground", "XamarinMacPlayground\XamarinMacPlayground.csproj", "{F59E041D-0598-43FD-A6D5-52A25BAB8158}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveUI_Monodroid", "ReactiveUI\ReactiveUI_Monodroid.csproj", "{F92A477B-BB94-43C1-984E-E177EF9FEDB7}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveUI_Monotouch", "ReactiveUI\ReactiveUI_Monotouch.csproj", "{9091337A-9E94-4DBD-801E-05E1FDA78FFC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveUI.Xaml_Monodroid", "ReactiveUI.Xaml\ReactiveUI.Xaml_Monodroid.csproj", "{E92A477B-BB94-43C1-984E-E177EF9FEDB7}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveUI.Xaml_Monotouch", "ReactiveUI.Xaml\ReactiveUI.Xaml_Monotouch.csproj", "{9891337A-9E94-4DBD-801E-05E1FDA78FFC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveUI.Routing_Monodroid", "ReactiveUI.Routing\ReactiveUI.Routing_Monodroid.csproj", "{E92E477B-BB94-43C1-984E-E177EF9FEDB7}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveUI.Routing_Monotouch", "ReactiveUI.Routing\ReactiveUI.Routing_Monotouch.csproj", "{9091337B-9E94-4DBD-801E-05E1FDA78FFC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveUI.Mobile_Monotouch", "ReactiveUI.Mobile\ReactiveUI.Mobile_Monotouch.csproj", "{9091337A-9E94-4DBD-801E-15E10DB72FFC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveUI.Cocoa_Monotouch", "ReactiveUI.Cocoa\ReactiveUI.Cocoa_Monotouch.csproj", "{9091337A-9E94-4DBD-801E-15E1FDA78FFC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AndroidPlayground", "AndroidPlayground\AndroidPlayground.csproj", "{D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveUI.Android", "ReactiveUI.Android\ReactiveUI.Android.csproj", "{F5A6E11B-B074-4A0B-B937-267D840E31DF}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "iOSPlayground", "iOSPlayground\iOSPlayground.csproj", "{420CF325-38B9-4B30-8978-D519EC40B6A8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReactiveUI.Mobile_Monodroid", "ReactiveUI.Mobile\ReactiveUI.Mobile_Monodroid.csproj", "{A92E477B-BB94-43C1-984E-E177EF9FEDB1}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -31,106 +55,508 @@ Global
Release|Mixed Platforms = Release|Mixed Platforms
Release|x86 = Release|x86
AppStore|Any CPU = AppStore|Any CPU
+ Debug|iPhoneSimulator = Debug|iPhoneSimulator
+ Release|iPhoneSimulator = Release|iPhoneSimulator
+ Debug|iPhone = Debug|iPhone
+ Release|iPhone = Release|iPhone
+ Ad-Hoc|iPhone = Ad-Hoc|iPhone
+ AppStore|iPhone = AppStore|iPhone
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
{0913BF79-061F-4667-ADF9-8E6CDA6D1213}.AppStore|Any CPU.ActiveCfg = AppStore|Any CPU
{0913BF79-061F-4667-ADF9-8E6CDA6D1213}.AppStore|Any CPU.Build.0 = AppStore|Any CPU
+ {0913BF79-061F-4667-ADF9-8E6CDA6D1213}.AppStore|iPhone.ActiveCfg = AppStore|Any CPU
+ {0913BF79-061F-4667-ADF9-8E6CDA6D1213}.AppStore|iPhone.Build.0 = AppStore|Any CPU
{0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Debug|x86.ActiveCfg = Debug|Any CPU
{0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Debug|x86.Build.0 = Debug|Any CPU
{0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Release|iPhone.Build.0 = Release|Any CPU
+ {0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Release|x86.ActiveCfg = Release|Any CPU
{0913BF79-061F-4667-ADF9-8E6CDA6D1213}.Release|x86.Build.0 = Release|Any CPU
+ {292A477B-BB94-43C1-984E-E177EF9FEDB7}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {292A477B-BB94-43C1-984E-E177EF9FEDB7}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
{292A477B-BB94-43C1-984E-E177EF9FEDB7}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
{292A477B-BB94-43C1-984E-E177EF9FEDB7}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+ {292A477B-BB94-43C1-984E-E177EF9FEDB7}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+ {292A477B-BB94-43C1-984E-E177EF9FEDB7}.AppStore|iPhone.Build.0 = Debug|Any CPU
{292A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{292A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {292A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {292A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {292A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {292A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{292A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{292A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{292A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|x86.ActiveCfg = Debug|Any CPU
{292A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|x86.Build.0 = Debug|Any CPU
{292A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{292A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {292A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {292A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|iPhone.Build.0 = Release|Any CPU
+ {292A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {292A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{292A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{292A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{292A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|x86.ActiveCfg = Release|Any CPU
{292A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|x86.Build.0 = Release|Any CPU
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.AppStore|Any CPU.ActiveCfg = AppStore|iPhone
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.AppStore|Any CPU.Build.0 = AppStore|iPhone
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.AppStore|iPhone.ActiveCfg = AppStore|iPhone
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.AppStore|iPhone.Build.0 = AppStore|iPhone
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Debug|iPhone.ActiveCfg = Debug|iPhone
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Debug|iPhone.Build.0 = Debug|iPhone
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Debug|Mixed Platforms.ActiveCfg = Debug|iPhoneSimulator
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Debug|Mixed Platforms.Build.0 = Debug|iPhoneSimulator
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Debug|x86.ActiveCfg = Debug|iPhoneSimulator
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Debug|x86.Build.0 = Debug|iPhoneSimulator
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Release|Any CPU.Build.0 = Release|iPhoneSimulator
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Release|iPhone.ActiveCfg = Release|iPhone
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Release|iPhone.Build.0 = Release|iPhone
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Release|Mixed Platforms.ActiveCfg = Release|iPhoneSimulator
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Release|Mixed Platforms.Build.0 = Release|iPhoneSimulator
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Release|x86.ActiveCfg = Release|iPhoneSimulator
+ {420CF325-38B9-4B30-8978-D519EC40B6A8}.Release|x86.Build.0 = Release|iPhoneSimulator
+ {482DE1CC-A08C-49F7-AB36-445DC9724482}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {482DE1CC-A08C-49F7-AB36-445DC9724482}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
{482DE1CC-A08C-49F7-AB36-445DC9724482}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
{482DE1CC-A08C-49F7-AB36-445DC9724482}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+ {482DE1CC-A08C-49F7-AB36-445DC9724482}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+ {482DE1CC-A08C-49F7-AB36-445DC9724482}.AppStore|iPhone.Build.0 = Debug|Any CPU
{482DE1CC-A08C-49F7-AB36-445DC9724482}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{482DE1CC-A08C-49F7-AB36-445DC9724482}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {482DE1CC-A08C-49F7-AB36-445DC9724482}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {482DE1CC-A08C-49F7-AB36-445DC9724482}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {482DE1CC-A08C-49F7-AB36-445DC9724482}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {482DE1CC-A08C-49F7-AB36-445DC9724482}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{482DE1CC-A08C-49F7-AB36-445DC9724482}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{482DE1CC-A08C-49F7-AB36-445DC9724482}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{482DE1CC-A08C-49F7-AB36-445DC9724482}.Debug|x86.ActiveCfg = Debug|Any CPU
{482DE1CC-A08C-49F7-AB36-445DC9724482}.Debug|x86.Build.0 = Debug|Any CPU
{482DE1CC-A08C-49F7-AB36-445DC9724482}.Release|Any CPU.ActiveCfg = Release|Any CPU
{482DE1CC-A08C-49F7-AB36-445DC9724482}.Release|Any CPU.Build.0 = Release|Any CPU
+ {482DE1CC-A08C-49F7-AB36-445DC9724482}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {482DE1CC-A08C-49F7-AB36-445DC9724482}.Release|iPhone.Build.0 = Release|Any CPU
+ {482DE1CC-A08C-49F7-AB36-445DC9724482}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {482DE1CC-A08C-49F7-AB36-445DC9724482}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{482DE1CC-A08C-49F7-AB36-445DC9724482}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{482DE1CC-A08C-49F7-AB36-445DC9724482}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{482DE1CC-A08C-49F7-AB36-445DC9724482}.Release|x86.ActiveCfg = Release|Any CPU
{482DE1CC-A08C-49F7-AB36-445DC9724482}.Release|x86.Build.0 = Release|Any CPU
+ {67038157-092E-4D72-BAF4-049EB1532264}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {67038157-092E-4D72-BAF4-049EB1532264}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
{67038157-092E-4D72-BAF4-049EB1532264}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
{67038157-092E-4D72-BAF4-049EB1532264}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+ {67038157-092E-4D72-BAF4-049EB1532264}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+ {67038157-092E-4D72-BAF4-049EB1532264}.AppStore|iPhone.Build.0 = Debug|Any CPU
{67038157-092E-4D72-BAF4-049EB1532264}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{67038157-092E-4D72-BAF4-049EB1532264}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {67038157-092E-4D72-BAF4-049EB1532264}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {67038157-092E-4D72-BAF4-049EB1532264}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {67038157-092E-4D72-BAF4-049EB1532264}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {67038157-092E-4D72-BAF4-049EB1532264}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{67038157-092E-4D72-BAF4-049EB1532264}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{67038157-092E-4D72-BAF4-049EB1532264}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{67038157-092E-4D72-BAF4-049EB1532264}.Debug|x86.ActiveCfg = Debug|Any CPU
{67038157-092E-4D72-BAF4-049EB1532264}.Debug|x86.Build.0 = Debug|Any CPU
{67038157-092E-4D72-BAF4-049EB1532264}.Release|Any CPU.ActiveCfg = Release|Any CPU
{67038157-092E-4D72-BAF4-049EB1532264}.Release|Any CPU.Build.0 = Release|Any CPU
+ {67038157-092E-4D72-BAF4-049EB1532264}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {67038157-092E-4D72-BAF4-049EB1532264}.Release|iPhone.Build.0 = Release|Any CPU
+ {67038157-092E-4D72-BAF4-049EB1532264}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {67038157-092E-4D72-BAF4-049EB1532264}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{67038157-092E-4D72-BAF4-049EB1532264}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{67038157-092E-4D72-BAF4-049EB1532264}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{67038157-092E-4D72-BAF4-049EB1532264}.Release|x86.ActiveCfg = Release|Any CPU
{67038157-092E-4D72-BAF4-049EB1532264}.Release|x86.Build.0 = Release|Any CPU
+ {67038157-092E-4D72-BAF4-949EB1532264}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {67038157-092E-4D72-BAF4-949EB1532264}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
{67038157-092E-4D72-BAF4-949EB1532264}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
{67038157-092E-4D72-BAF4-949EB1532264}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+ {67038157-092E-4D72-BAF4-949EB1532264}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+ {67038157-092E-4D72-BAF4-949EB1532264}.AppStore|iPhone.Build.0 = Debug|Any CPU
{67038157-092E-4D72-BAF4-949EB1532264}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{67038157-092E-4D72-BAF4-949EB1532264}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {67038157-092E-4D72-BAF4-949EB1532264}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {67038157-092E-4D72-BAF4-949EB1532264}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {67038157-092E-4D72-BAF4-949EB1532264}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {67038157-092E-4D72-BAF4-949EB1532264}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{67038157-092E-4D72-BAF4-949EB1532264}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{67038157-092E-4D72-BAF4-949EB1532264}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{67038157-092E-4D72-BAF4-949EB1532264}.Debug|x86.ActiveCfg = Debug|Any CPU
{67038157-092E-4D72-BAF4-949EB1532264}.Debug|x86.Build.0 = Debug|Any CPU
{67038157-092E-4D72-BAF4-949EB1532264}.Release|Any CPU.ActiveCfg = Release|Any CPU
{67038157-092E-4D72-BAF4-949EB1532264}.Release|Any CPU.Build.0 = Release|Any CPU
+ {67038157-092E-4D72-BAF4-949EB1532264}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {67038157-092E-4D72-BAF4-949EB1532264}.Release|iPhone.Build.0 = Release|Any CPU
+ {67038157-092E-4D72-BAF4-949EB1532264}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {67038157-092E-4D72-BAF4-949EB1532264}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{67038157-092E-4D72-BAF4-949EB1532264}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{67038157-092E-4D72-BAF4-949EB1532264}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{67038157-092E-4D72-BAF4-949EB1532264}.Release|x86.ActiveCfg = Release|Any CPU
{67038157-092E-4D72-BAF4-949EB1532264}.Release|x86.Build.0 = Release|Any CPU
+ {761AC9BA-4A9C-440C-9B6C-2569978F0610}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {761AC9BA-4A9C-440C-9B6C-2569978F0610}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
{761AC9BA-4A9C-440C-9B6C-2569978F0610}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
{761AC9BA-4A9C-440C-9B6C-2569978F0610}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+ {761AC9BA-4A9C-440C-9B6C-2569978F0610}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+ {761AC9BA-4A9C-440C-9B6C-2569978F0610}.AppStore|iPhone.Build.0 = Debug|Any CPU
{761AC9BA-4A9C-440C-9B6C-2569978F0610}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{761AC9BA-4A9C-440C-9B6C-2569978F0610}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {761AC9BA-4A9C-440C-9B6C-2569978F0610}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {761AC9BA-4A9C-440C-9B6C-2569978F0610}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {761AC9BA-4A9C-440C-9B6C-2569978F0610}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {761AC9BA-4A9C-440C-9B6C-2569978F0610}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{761AC9BA-4A9C-440C-9B6C-2569978F0610}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{761AC9BA-4A9C-440C-9B6C-2569978F0610}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{761AC9BA-4A9C-440C-9B6C-2569978F0610}.Debug|x86.ActiveCfg = Debug|Any CPU
{761AC9BA-4A9C-440C-9B6C-2569978F0610}.Debug|x86.Build.0 = Debug|Any CPU
{761AC9BA-4A9C-440C-9B6C-2569978F0610}.Release|Any CPU.ActiveCfg = Release|Any CPU
{761AC9BA-4A9C-440C-9B6C-2569978F0610}.Release|Any CPU.Build.0 = Release|Any CPU
+ {761AC9BA-4A9C-440C-9B6C-2569978F0610}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {761AC9BA-4A9C-440C-9B6C-2569978F0610}.Release|iPhone.Build.0 = Release|Any CPU
+ {761AC9BA-4A9C-440C-9B6C-2569978F0610}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {761AC9BA-4A9C-440C-9B6C-2569978F0610}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{761AC9BA-4A9C-440C-9B6C-2569978F0610}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{761AC9BA-4A9C-440C-9B6C-2569978F0610}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{761AC9BA-4A9C-440C-9B6C-2569978F0610}.Release|x86.ActiveCfg = Release|Any CPU
{761AC9BA-4A9C-440C-9B6C-2569978F0610}.Release|x86.Build.0 = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.AppStore|Any CPU.Build.0 = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.AppStore|iPhone.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|x86.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|iPhone.Build.0 = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|x86.ActiveCfg = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|x86.Build.0 = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.AppStore|Any CPU.Build.0 = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.AppStore|iPhone.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Debug|x86.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Release|iPhone.Build.0 = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Release|x86.ActiveCfg = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E10DB72FFC}.Release|x86.Build.0 = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.AppStore|Any CPU.Build.0 = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.AppStore|iPhone.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Debug|x86.Build.0 = Debug|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Release|iPhone.Build.0 = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Release|x86.ActiveCfg = Release|Any CPU
+ {9091337A-9E94-4DBD-801E-15E1FDA78FFC}.Release|x86.Build.0 = Release|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.AppStore|Any CPU.Build.0 = Release|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.AppStore|iPhone.Build.0 = Debug|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Debug|x86.Build.0 = Debug|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Release|iPhone.Build.0 = Release|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Release|x86.ActiveCfg = Release|Any CPU
+ {9091337B-9E94-4DBD-801E-05E1FDA78FFC}.Release|x86.Build.0 = Release|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.AppStore|Any CPU.Build.0 = Release|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.AppStore|iPhone.Build.0 = Debug|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Debug|x86.Build.0 = Debug|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|iPhone.Build.0 = Release|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|x86.ActiveCfg = Release|Any CPU
+ {9891337A-9E94-4DBD-801E-05E1FDA78FFC}.Release|x86.Build.0 = Release|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.AppStore|Any CPU.Build.0 = Release|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.AppStore|iPhone.ActiveCfg = Release|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.AppStore|iPhone.Build.0 = Release|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Debug|x86.Build.0 = Debug|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Release|iPhone.Build.0 = Release|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Release|x86.ActiveCfg = Release|Any CPU
+ {A92E477B-BB94-43C1-984E-E177EF9FEDB1}.Release|x86.Build.0 = Release|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.AppStore|Any CPU.Build.0 = Release|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.AppStore|iPhone.Build.0 = Debug|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Debug|x86.Build.0 = Debug|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Release|iPhone.Build.0 = Release|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Release|x86.ActiveCfg = Release|Any CPU
+ {D444AA58-1C6B-4CEE-B5F5-76145E0B86E5}.Release|x86.Build.0 = Release|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.AppStore|Any CPU.Build.0 = Release|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.AppStore|iPhone.Build.0 = Debug|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|x86.Build.0 = Debug|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|iPhone.Build.0 = Release|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|x86.ActiveCfg = Release|Any CPU
+ {E92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|x86.Build.0 = Release|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.AppStore|Any CPU.Build.0 = Release|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.AppStore|iPhone.Build.0 = Debug|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|x86.Build.0 = Debug|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Release|iPhone.Build.0 = Release|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Release|x86.ActiveCfg = Release|Any CPU
+ {E92E477B-BB94-43C1-984E-E177EF9FEDB7}.Release|x86.Build.0 = Release|Any CPU
+ {F59E041D-0598-43FD-A6D5-52A25BAB8158}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {F59E041D-0598-43FD-A6D5-52A25BAB8158}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
{F59E041D-0598-43FD-A6D5-52A25BAB8158}.AppStore|Any CPU.ActiveCfg = AppStore|Any CPU
{F59E041D-0598-43FD-A6D5-52A25BAB8158}.AppStore|Any CPU.Build.0 = AppStore|Any CPU
+ {F59E041D-0598-43FD-A6D5-52A25BAB8158}.AppStore|iPhone.ActiveCfg = AppStore|Any CPU
+ {F59E041D-0598-43FD-A6D5-52A25BAB8158}.AppStore|iPhone.Build.0 = AppStore|Any CPU
{F59E041D-0598-43FD-A6D5-52A25BAB8158}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F59E041D-0598-43FD-A6D5-52A25BAB8158}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F59E041D-0598-43FD-A6D5-52A25BAB8158}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {F59E041D-0598-43FD-A6D5-52A25BAB8158}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {F59E041D-0598-43FD-A6D5-52A25BAB8158}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {F59E041D-0598-43FD-A6D5-52A25BAB8158}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{F59E041D-0598-43FD-A6D5-52A25BAB8158}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{F59E041D-0598-43FD-A6D5-52A25BAB8158}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{F59E041D-0598-43FD-A6D5-52A25BAB8158}.Debug|x86.ActiveCfg = Debug|Any CPU
{F59E041D-0598-43FD-A6D5-52A25BAB8158}.Debug|x86.Build.0 = Debug|Any CPU
{F59E041D-0598-43FD-A6D5-52A25BAB8158}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F59E041D-0598-43FD-A6D5-52A25BAB8158}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F59E041D-0598-43FD-A6D5-52A25BAB8158}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {F59E041D-0598-43FD-A6D5-52A25BAB8158}.Release|iPhone.Build.0 = Release|Any CPU
+ {F59E041D-0598-43FD-A6D5-52A25BAB8158}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {F59E041D-0598-43FD-A6D5-52A25BAB8158}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{F59E041D-0598-43FD-A6D5-52A25BAB8158}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{F59E041D-0598-43FD-A6D5-52A25BAB8158}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{F59E041D-0598-43FD-A6D5-52A25BAB8158}.Release|x86.ActiveCfg = Release|Any CPU
{F59E041D-0598-43FD-A6D5-52A25BAB8158}.Release|x86.Build.0 = Release|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.AppStore|Any CPU.Build.0 = Release|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.AppStore|iPhone.Build.0 = Debug|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Debug|x86.Build.0 = Debug|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Release|iPhone.Build.0 = Release|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Release|x86.ActiveCfg = Release|Any CPU
+ {F5A6E11B-B074-4A0B-B937-267D840E31DF}.Release|x86.Build.0 = Release|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.AppStore|Any CPU.Build.0 = Release|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.AppStore|iPhone.Build.0 = Debug|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Debug|x86.Build.0 = Debug|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|iPhone.Build.0 = Release|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|x86.ActiveCfg = Release|Any CPU
+ {F92A477B-BB94-43C1-984E-E177EF9FEDB7}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
EndGlobalSection