diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..f6bca79
Binary files /dev/null and b/.DS_Store differ
diff --git a/Agents/AgentHost.cs b/Agents/AgentHost.cs
new file mode 100755
index 0000000..e47cd77
--- /dev/null
+++ b/Agents/AgentHost.cs
@@ -0,0 +1,85 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+using System.Diagnostics;
+using System.Windows;
+using PhoneVoIPApp.BackEnd;
+using PhoneVoIPApp.BackEnd.OutOfProcess;
+
+namespace PhoneVoIPApp.Agents
+{
+ ///
+ /// A static class that does process-level initialization/deinitializations.
+ ///
+ public static class AgentHost
+ {
+ #region Methods
+
+ ///
+ /// Indicates that an agent started running.
+ ///
+ internal static void OnAgentStarted()
+ {
+ // Initialize the native code - this only needs to be done once per process,s
+ // but the method below will effectively be a no-op if called more than once.
+ BackEnd.Globals.Instance.StartServer(RegistrationHelper.OutOfProcServerClassNames);
+ }
+
+ #endregion
+
+ #region Private members
+
+ ///
+ /// Class constructor
+ ///
+ static AgentHost()
+ {
+ // Subscribe to the unhandled exception event
+ Deployment.Current.Dispatcher.BeginInvoke(delegate
+ {
+ Application.Current.UnhandledException += AgentHost.OnUnhandledException;
+ });
+
+ // Create the singleton video renderer
+ AgentHost.videoRenderer = new VideoRenderer();
+
+ AgentHost.mtProtoUpdater = new MTProtoUpdater();
+
+ // Store a pointer to the video renderer in the native Globals singleton,
+ // so that the renderer can be used by native code in this process.
+ Globals.Instance.VideoRenderer = AgentHost.videoRenderer;
+
+ Globals.Instance.MTProtoUpdater = AgentHost.mtProtoUpdater;
+ }
+
+ ///
+ /// Code to execute on unhandled exceptions.
+ ///
+ private static void OnUnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
+ {
+ Debug.WriteLine("[AgentHost] An unhandled exception of type {0} has occurred. Error code: 0x{1:X8}. Message: {2}",
+ e.ExceptionObject.GetType(), e.ExceptionObject.HResult, e.ExceptionObject.Message);
+
+ if (Debugger.IsAttached)
+ {
+ // An unhandled exception has occurred; break into the debugger
+ Debugger.Break();
+ }
+ }
+
+ #endregion
+
+ #region Private
+
+ // The singleton video renderer
+ static VideoRenderer videoRenderer;
+
+ static MTProtoUpdater mtProtoUpdater;
+
+ #endregion
+ }
+}
diff --git a/Agents/Agents.csproj b/Agents/Agents.csproj
new file mode 100755
index 0000000..7bd5e67
--- /dev/null
+++ b/Agents/Agents.csproj
@@ -0,0 +1,128 @@
+
+
+
+ Debug
+ AnyCPU
+ 10.0.20506
+ 2.0
+ {820034C1-645D-4340-8813-D980C1EF77DE}
+ {C089C8C0-30E0-4E22-80C0-CE093F111A43};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}
+ Library
+ Properties
+ PhoneVoIPApp.Agents
+ PhoneVoIPApp.Agents
+ WindowsPhone
+ v8.1
+
+
+ false
+ true
+ 12.0
+ true
+
+ en-US
+
+
+ true
+ full
+ false
+ Bin\Debug
+ DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE
+ true
+ true
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ Bin\Release
+ TRACE;SILVERLIGHT;WINDOWS_PHONE
+ true
+ true
+ prompt
+ 4
+
+
+ true
+ full
+ false
+ Bin\x86\Debug
+ DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE
+ true
+ true
+ prompt
+ 4
+
+
+
+ pdbonly
+ true
+ Bin\x86\Release
+ TRACE;SILVERLIGHT;WINDOWS_PHONE
+ true
+ true
+ prompt
+ 4
+
+
+
+ true
+ full
+ false
+ Bin\ARM\Debug
+ DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE
+ true
+ true
+ prompt
+ 4
+
+
+
+ pdbonly
+ true
+ Bin\ARM\Release
+ TRACE;SILVERLIGHT;WINDOWS_PHONE
+ true
+ true
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {C8D75245-FFCF-4932-A228-C9CC8BB60B03}
+ BackEnd
+
+
+ {e79d5093-8038-4a5f-8a98-ca38c0d0886f}
+ Telegram.Api.WP8
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Agents/CallInProgressAgentImpl.cs b/Agents/CallInProgressAgentImpl.cs
new file mode 100755
index 0000000..6633af3
--- /dev/null
+++ b/Agents/CallInProgressAgentImpl.cs
@@ -0,0 +1,172 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+using Microsoft.Phone.Networking.Voip;
+using PhoneVoIPApp.BackEnd;
+using Telegram.Api;
+using Telegram.Api.Aggregator;
+using Telegram.Api.Extensions;
+using Telegram.Api.Services;
+using Telegram.Api.Services.Cache;
+using Telegram.Api.Services.Connection;
+using Telegram.Api.Services.Updates;
+using Telegram.Api.TL;
+using Telegram.Api.TL.Functions.Updates;
+using Telegram.Api.Transport;
+
+namespace PhoneVoIPApp.Agents
+{
+ ///
+ /// An agent that is launched when the first call becomes active and is canceled when the last call ends.
+ ///
+ public class CallInProgressAgentImpl : VoipCallInProgressAgent
+ {
+ public static bool Suppress { get; set; }
+
+ private bool _logEnabled = true;
+
+ private void Log(string message, Action callback = null)
+ {
+ if (!_logEnabled) return;
+
+ Telegram.Logs.Log.Write(string.Format("[CallInProgressAgentImpl] {0} {1}", GetHashCode(), message), callback.SafeInvoke);
+#if DEBUG
+ //PushUtils.AddToast("push", message, string.Empty, string.Empty, null, null);
+#endif
+ }
+
+ private readonly object _initConnectionSyncRoot = new object();
+
+ private TLInitConnection GetInitConnection()
+ {
+ return TLUtils.OpenObjectFromMTProtoFile(_initConnectionSyncRoot, Constants.InitConnectionFileName) ??
+ new TLInitConnection78
+ {
+ Flags = new TLInt(0),
+ DeviceModel = new TLString("unknown"),
+ AppVersion = new TLString("background task"),
+ SystemVersion = new TLString("8.10.0.0")
+ };
+ }
+
+ private static IMTProtoService _mtProtoService;
+
+ private static IMTProtoService MTProtoService
+ {
+ get
+ {
+ return _mtProtoService;
+
+ }
+ set
+ {
+ _mtProtoService = value;
+
+ }
+ }
+
+ private static ITransportService _transportService;
+
+ private void InitializeServiceAsync(System.Action callback)
+ {
+ Debug.WriteLine("[CallInProgressAgentImpl {0}] _mtProtoService == null {1}", GetHashCode(), _mtProtoService == null);
+
+ if (MTProtoService == null)
+ {
+ var deviceInfoService = new Telegram.Api.Services.DeviceInfo.DeviceInfoService(GetInitConnection(), true, "BackgroundDifferenceLoader", 1);
+ var cacheService = new MockupCacheService();
+ var updatesService = new MockupUpdatesService();
+
+ _transportService = new TransportService();
+ var connectionService = new ConnectionService(deviceInfoService);
+ var publicConfigService = new MockupPublicConfigService();
+
+ var mtProtoService = new MTProtoService(deviceInfoService, updatesService, cacheService, _transportService, connectionService, publicConfigService);
+ mtProtoService.Initialized += (o, e) =>
+ {
+ //Log(string.Format("[MTProtoUpdater {0}] Initialized", GetHashCode()));
+ Thread.Sleep(1000);
+ callback.SafeInvoke();
+ };
+ mtProtoService.InitializationFailed += (o, e) =>
+ {
+ //Log(string.Format("[MTProtoUpdater {0}] InitializationFailed", GetHashCode()));
+ };
+ mtProtoService.Initialize();
+
+ MTProtoService = mtProtoService;
+ }
+ else
+ {
+ callback.SafeInvoke();
+ }
+ }
+
+ ///
+ /// Constructor
+ ///
+ public CallInProgressAgentImpl()
+ : base()
+ {
+ _timer = new Timer(OnTimer);
+ }
+
+ private Timer _timer;
+
+ private void OnTimer(object state)
+ {
+ Log(string.Format("OnTimer call_id={0} suppress={1}", Globals.Instance.CallController != null ? Globals.Instance.CallController.CallId.ToString() : "null", Suppress));
+ Debug.WriteLine("[CallInProgressAgentImpl {0}] OnTick.", GetHashCode());
+
+ //InitializeServiceAsync(() =>
+ //{
+ // var getStateAction = new TLGetState();
+ // var actions = new List { getStateAction };
+ // MTProtoService.SendActionsAsync(actions, (request, result) =>
+ // {
+ // Log("[CallInProgressAgentImpl] getState result=" + result);
+ // },
+ // error =>
+ // {
+ // Log("[CallInProgressAgentImpl] getState error=" + error);
+ // });
+ //});
+ }
+
+ ///
+ /// The first call has become active.
+ ///
+ protected override void OnFirstCallStarting()
+ {
+ Debug.WriteLine("[CallInProgressAgentImpl {0}] The first call has started.", GetHashCode());
+
+ Log("Start timer");
+ // Indicate that an agent has started running
+ AgentHost.OnAgentStarted();
+ _timer.Change(TimeSpan.FromSeconds(5.0), TimeSpan.FromSeconds(5.0));
+ }
+
+ ///
+ /// The last call has ended.
+ ///
+ protected override void OnCancel()
+ {
+ Debug.WriteLine("[CallInProgressAgentImpl {0}] The last call has ended. Calling NotifyComplete", GetHashCode());
+
+ if (MTProtoService != null) MTProtoService.Stop();
+ Log("Stop timer");
+ _timer.Change(Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);
+
+ // This agent is done
+ base.NotifyComplete();
+ }
+ }
+}
diff --git a/Agents/ForegroundLifetimeAgentImpl.cs b/Agents/ForegroundLifetimeAgentImpl.cs
new file mode 100755
index 0000000..3775111
--- /dev/null
+++ b/Agents/ForegroundLifetimeAgentImpl.cs
@@ -0,0 +1,57 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+using Microsoft.Phone.Networking.Voip;
+using System.Diagnostics;
+using System.Threading;
+using Microsoft.Phone.Scheduler;
+
+namespace PhoneVoIPApp.Agents
+{
+ ///
+ /// An agent that is invoked when the UI process calls Microsoft.Phone.Networking.Voip.VoipBackgroundProcess.Launched()
+ /// and is canceled when the UI leaves the foreground.
+ ///
+ public sealed class ForegroundLifetimeAgentImpl : VoipForegroundLifetimeAgent
+ {
+ public ForegroundLifetimeAgentImpl()
+ : base()
+ {
+
+ }
+
+ ///
+ /// A method that is called as a result of
+ ///
+ protected override void OnLaunched()
+ {
+ Debug.WriteLine("[ForegroundLifetimeAgentImpl] The UI has entered the foreground.");
+
+ // Indicate that an agent has started running
+ AgentHost.OnAgentStarted();
+ }
+
+ protected override void OnCancel()
+ {
+ Debug.WriteLine("[ForegroundLifetimeAgentImpl] The UI is leaving the foreground");
+
+ // Make sure that this process has finished becoming ready before trying to complete this agent.
+ // Otherwise, the process may exit without telling the UI that it is ready (and therefore make the UI unresponsive)
+ uint currentProcessId = PhoneVoIPApp.BackEnd.Globals.GetCurrentProcessId();
+ string backgroundProcessReadyEventName = PhoneVoIPApp.BackEnd.Globals.GetBackgroundProcessReadyEventName(currentProcessId);
+ using (EventWaitHandle backgroundProcessReadyEvent = new EventWaitHandle(initialState: false, mode: EventResetMode.ManualReset, name: backgroundProcessReadyEventName))
+ {
+ backgroundProcessReadyEvent.WaitOne();
+ Debug.WriteLine("[ForegroundLifetimeAgentImpl] Background process {0} is ready", currentProcessId);
+ }
+
+ // This agent is done
+ Debug.WriteLine("[ForegroundLifetimeAgentImpl] Calling NotifyComplete");
+ base.NotifyComplete();
+ }
+ }
+}
diff --git a/Agents/MTProtoUpdater.cs b/Agents/MTProtoUpdater.cs
new file mode 100755
index 0000000..3b80875
--- /dev/null
+++ b/Agents/MTProtoUpdater.cs
@@ -0,0 +1,90 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+using System;
+using System.Diagnostics;
+using PhoneVoIPApp.BackEnd;
+using Telegram.Api;
+using Telegram.Api.Aggregator;
+using Telegram.Api.Extensions;
+using Telegram.Api.TL;
+
+namespace PhoneVoIPApp.Agents
+{
+ internal class MTProtoUpdater : IMTProtoUpdater, IHandle
+ {
+ private static bool _logEnabled = true;
+
+ private static readonly int _id = new Random().Next(999);
+
+ private static void Log(string message, Action callback = null)
+ {
+ if (!_logEnabled) return;
+
+ Telegram.Logs.Log.Write(string.Format("::MTProtoUpdater {0} {1}", _id, message), callback.SafeInvoke);
+#if DEBUG
+ //PushUtils.AddToast("push", message, string.Empty, string.Empty, null, null);
+#endif
+ }
+
+ private readonly object _initConnectionSyncRoot = new object();
+
+ private TLInitConnection GetInitConnection()
+ {
+ return TLUtils.OpenObjectFromMTProtoFile(_initConnectionSyncRoot, Constants.InitConnectionFileName) ??
+ new TLInitConnection
+ {
+ DeviceModel = new TLString("unknown"),
+ AppVersion = new TLString("background task"),
+ SystemVersion = new TLString("8.10.0.0")
+ };
+ }
+
+ public void Start(int pts, int date, int qts)
+ {
+ Log(string.Format("[MTProtoUpdater {0}] Start timer", GetHashCode()));
+
+ CallInProgressAgentImpl.Suppress = true;
+ }
+
+ public void Stop()
+ {
+ Log(string.Format("[MTProtoUpdater {0}] Stop timer", GetHashCode()));
+
+ CallInProgressAgentImpl.Suppress = false;
+ }
+
+ public void ReceivedCall(long id, long accessHash)
+ {
+ }
+
+ public void DiscardCall(long id, long accessHash)
+ {
+
+ }
+
+ public static void Handle(TLUpdateBase updateBase)
+ {
+ var updatePhoneCall = updateBase as TLUpdatePhoneCall;
+ if (updatePhoneCall != null)
+ {
+ var phoneCallDiscarded = updatePhoneCall.PhoneCall as TLPhoneCallDiscarded61;
+ //if (phoneCallDiscarded != null && Globals.Instance.CallController.CallId == phoneCallDiscarded.Id.Value)
+ //{
+ // Globals.Instance.CallController.EndCall();
+ //}
+ }
+
+ //Globals.Instance.CallController.HandleUpdatePhoneCall();
+ }
+
+ void IHandle.Handle(TLUpdateBase message)
+ {
+ Handle(message);
+ }
+ }
+}
diff --git a/Agents/Properties/AssemblyInfo.cs b/Agents/Properties/AssemblyInfo.cs
new file mode 100755
index 0000000..c66bad7
--- /dev/null
+++ b/Agents/Properties/AssemblyInfo.cs
@@ -0,0 +1,44 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Resources;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Agents")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Agents")]
+[assembly: AssemblyCopyright("Copyright © 2012")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("77ef4b49-898d-4cfc-b8d7-ef7338a0da79")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: NeutralResourcesLanguageAttribute("en-US")]
diff --git a/Agents/PushPayload.cs b/Agents/PushPayload.cs
new file mode 100755
index 0000000..e34225a
--- /dev/null
+++ b/Agents/PushPayload.cs
@@ -0,0 +1,93 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+namespace PhoneVoIPApp.Agents {
+ using System.Xml.Serialization;
+
+
+ ///
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17613")]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="WPNotification")]
+ [System.Xml.Serialization.XmlRootAttribute(Namespace="WPNotification", IsNullable=false)]
+ public partial class Notification {
+
+ private string nameField;
+
+ ///
+ [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+ public string Name {
+ get {
+ return this.nameField;
+ }
+ set {
+ this.nameField = value;
+ }
+ }
+
+ private string numberField;
+
+ ///
+ [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
+ public string Number {
+ get {
+ return this.numberField;
+ }
+ set {
+ this.numberField = value;
+ }
+ }
+
+ private string locKey;
+
+ ///
+ [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
+ public string LocKey
+ {
+ get
+ {
+ return this.locKey;
+ }
+ set
+ {
+ this.locKey = value;
+ }
+ }
+
+ private string locArguments;
+
+ ///
+ [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
+ public string LocArguments
+ {
+ get
+ {
+ return this.locArguments;
+ }
+ set
+ {
+ this.locArguments = value;
+ }
+ }
+
+ private string data;
+
+ ///
+ [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
+ public string Data
+ {
+ get
+ {
+ return this.data;
+ }
+ set
+ {
+ this.data = value;
+ }
+ }
+ }
+}
diff --git a/Agents/PushPayload.xml b/Agents/PushPayload.xml
new file mode 100755
index 0000000..a0fe862
--- /dev/null
+++ b/Agents/PushPayload.xml
@@ -0,0 +1,5 @@
+
+
+ Kim Abercrombie
+ +1-555-555-1234
+
diff --git a/Agents/PushUtils.cs b/Agents/PushUtils.cs
new file mode 100755
index 0000000..a1416be
--- /dev/null
+++ b/Agents/PushUtils.cs
@@ -0,0 +1,788 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+#define INTERACTIVE_NOTIFICATIONS
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Runtime.Serialization.Json;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using Windows.Data.Xml.Dom;
+using Windows.Storage;
+#if WNS_PUSH_SERVICE
+using Windows.UI.Notifications;
+#endif
+using Telegram.Api.Helpers;
+
+namespace PhoneVoIPApp.Agents
+{
+ public static class PushUtils2
+ {
+
+ private static readonly Dictionary _locKeys = new Dictionary
+ {
+ {"PINNED_AUDIO", "pinned a voice message"},
+ {"PINNED_CONTACT", "pinned a contact"},
+ {"PINNED_DOC", "pinned a file"},
+ {"PINNED_GAME", "pinned a game"},
+ {"PINNED_GEO", "pinned a map"},
+ {"PINNED_GIF", "pinned a GIF"},
+ {"PINNED_INVOICE", "pinned an invoice"},
+ {"PINNED_NOTEXT", "pinned a message"},
+ {"PINNED_PHOTO", "pinned a photo"},
+ {"PINNED_STICKER", "pinned a sticker"},
+ {"PINNED_TEXT", "pinned \"{1}\""},
+ {"PINNED_VIDEO", "pinned a video"},
+
+ {"MESSAGE_FWDS", "forwarded you {1} messages"},
+ {"MESSAGE_TEXT", "{1}"},
+ {"MESSAGE_NOTEXT", "sent you a message"},
+ {"MESSAGE_PHOTO", "sent you a photo"},
+ {"MESSAGE_VIDEO", "sent you a video"},
+ {"MESSAGE_DOC", "sent you a document"},
+ {"MESSAGE_GIF", "sent you a GIF"},
+ {"MESSAGE_AUDIO", "sent you a voice message"},
+ {"MESSAGE_CONTACT", "shared a contact with you"},
+ {"MESSAGE_GEO", "sent you a map"},
+ {"MESSAGE_STICKER", "sent you a sticker"},
+ {"MESSAGE_GAME", "invited you to play {1}"},
+ {"MESSAGE_INVOICE", "sent you an invoice for {1}"},
+
+ {"CHAT_MESSAGE_FWDS", "{0} forwarded {2} messages to the group"},
+ {"CHAT_MESSAGE_TEXT", "{0}: {2}"},
+ {"CHAT_MESSAGE_NOTEXT", "{0} sent a message to the group"},
+ {"CHAT_MESSAGE_PHOTO", "{0} sent a photo to the group"},
+ {"CHAT_MESSAGE_VIDEO", "{0} sent a video to the group"},
+ {"CHAT_MESSAGE_DOC", "{0} sent a document to the group"},
+ {"CHAT_MESSAGE_GIF", "{0} sent a GIF to the group"},
+ {"CHAT_MESSAGE_AUDIO", "{0} sent a voice message to the group"},
+ {"CHAT_MESSAGE_CONTACT", "{0} shared a contact in the group"},
+ {"CHAT_MESSAGE_GEO", "{0} sent a map to the group"},
+ {"CHAT_MESSAGE_STICKER", "{0} sent a sticker to the group"},
+ {"CHAT_MESSAGE_GAME", "{0} invited the group to play {2}"},
+ {"CHAT_MESSAGE_INVOICE", "{0} sent an invoice for {2}"},
+
+ {"CHANNEL_MESSAGE_FWDS", "posted {1} forwarded messages"},
+ {"CHANNEL_MESSAGE_TEXT", "{1}"},
+ {"CHANNEL_MESSAGE_NOTEXT", "posted a message"},
+ {"CHANNEL_MESSAGE_PHOTO", "posted a photo"},
+ {"CHANNEL_MESSAGE_VIDEO", "posted a video"},
+ {"CHANNEL_MESSAGE_DOC", "posted a document"},
+ {"CHANNEL_MESSAGE_GIF", "posted a GIF"},
+ {"CHANNEL_MESSAGE_AUDIO", "posted a voice message"},
+ {"CHANNEL_MESSAGE_CONTACT", "posted a contact"},
+ {"CHANNEL_MESSAGE_GEO", "posted a map"},
+ {"CHANNEL_MESSAGE_STICKER", "posted a sticker"},
+ {"CHANNEL_MESSAGE_GAME", "invited you to play {1}"},
+
+ {"CHAT_CREATED", "{0} invited you to the group"},
+ {"CHAT_TITLE_EDITED", "{0} edited the group's name"},
+ {"CHAT_PHOTO_EDITED", "{0} edited the group's photo"},
+ {"CHAT_ADD_MEMBER", "{0} invited {2} to the group"},
+ {"CHAT_ADD_YOU", "{0} invited you to the group"},
+ {"CHAT_DELETE_MEMBER", "{0} kicked {2} from the group"},
+ {"CHAT_DELETE_YOU", "{0} kicked you from the group"},
+ {"CHAT_LEFT", "{0} has left the group"},
+ {"CHAT_RETURNED", "{0} has returned to the group"},
+ {"GEOCHAT_CHECKIN", "{0} has checked-in"},
+ {"CHAT_JOINED", "{0} has joined the group"},
+
+ {"CONTACT_JOINED", "{0} joined the App!"},
+ {"AUTH_UNKNOWN", "New login from unrecognized device {0}"},
+ {"AUTH_REGION", "New login from unrecognized device {0}, location: {1}"},
+
+ {"CONTACT_PHOTO", "updated profile photo"},
+
+ {"ENCRYPTION_REQUEST", "You have a new message"},
+ {"ENCRYPTION_ACCEPT", "You have a new message"},
+ {"ENCRYPTED_MESSAGE", "You have a new message"},
+
+ {"DC_UPDATE", "Open this notification to update app settings"},
+
+ {"LOCKED_MESSAGE", "You have a new message"}
+ };
+
+ private static void AppendTile(XmlDocument toTile, XmlDocument fromTile)
+ {
+ var fromTileNode = toTile.ImportNode(fromTile.GetElementsByTagName("binding").Item(0), true);
+ toTile.GetElementsByTagName("visual")[0].AppendChild(fromTileNode);
+ }
+
+ private static void UpdateTile(string caption, string message)
+ {
+#if WNS_PUSH_SERVICE
+ var tileUpdater = TileUpdateManager.CreateTileUpdaterForApplication("xcee0f789y8059y4881y8883y347265c01f93x");
+ //tileUpdater.EnableNotificationQueue(false);
+ tileUpdater.EnableNotificationQueue(true);
+ tileUpdater.EnableNotificationQueueForSquare150x150(false);
+ //tileUpdater.EnableNotificationQueueForWide310x150(true);
+
+ var wideTileXml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileWide310x150IconWithBadgeAndText);
+ SetImage(wideTileXml, "IconicSmall110.png");
+ SetText(wideTileXml, caption, message);
+
+ var squareTile150Xml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileSquare150x150IconWithBadge);
+ SetImage(squareTile150Xml, "IconicTileMedium202.png");
+ AppendTile(wideTileXml, squareTile150Xml);
+
+ var squareTile71Xml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileSquare71x71IconWithBadge);
+ SetImage(squareTile71Xml, "IconicSmall110.png");
+ AppendTile(wideTileXml, squareTile71Xml);
+
+ try
+ {
+ tileUpdater.Update(new TileNotification(wideTileXml));
+ }
+ catch (Exception ex)
+ {
+ Telegram.Logs.Log.Write(ex.ToString());
+ }
+#endif
+ }
+
+ private static void UpdateBadge(int badgeNumber)
+ {
+#if WNS_PUSH_SERVICE
+ var badgeUpdater = BadgeUpdateManager.CreateBadgeUpdaterForApplication("xcee0f789y8059y4881y8883y347265c01f93x");
+ if (badgeNumber == 0)
+ {
+ badgeUpdater.Clear();
+ return;
+ }
+
+ var badgeXml = BadgeUpdateManager.GetTemplateContent(BadgeTemplateType.BadgeNumber);
+
+ var badgeElement = (XmlElement)badgeXml.SelectSingleNode("/badge");
+ badgeElement.SetAttribute("value", badgeNumber.ToString());
+
+ try
+ {
+ badgeUpdater.Update(new BadgeNotification(badgeXml));
+ }
+ catch (Exception ex)
+ {
+ Telegram.Logs.Log.Write(ex.ToString());
+ }
+#endif
+ }
+
+ private static bool IsMuted(Data data)
+ {
+ return data.mute == "1";
+ }
+
+ private static bool IsServiceNotification(Data data)
+ {
+ return data.loc_key == "DC_UPDATE";
+ }
+
+ private static void RemoveToastGroup(string groupname)
+ {
+#if WNS_PUSH_SERVICE
+ ToastNotificationManager.History.RemoveGroup(groupname);
+#endif
+ }
+
+ private static string GetCaption(Data data)
+ {
+ var locKey = data.loc_key;
+ if (locKey == null)
+ {
+ return "locKey=null";
+ }
+
+ if (locKey.StartsWith("CHAT") || locKey.StartsWith("GEOCHAT"))
+ {
+ return data.loc_args[1];
+ }
+
+ if (locKey.StartsWith("MESSAGE"))
+ {
+ return data.loc_args[0];
+ }
+
+ if (locKey.StartsWith("CHANNEL"))
+ {
+ return data.loc_args[0];
+ }
+
+ if (locKey.StartsWith("PINNED"))
+ {
+ return data.loc_args[0];
+ }
+
+ if (locKey.StartsWith("AUTH")
+ || locKey.StartsWith("CONTACT")
+ || locKey.StartsWith("ENCRYPTED")
+ || locKey.StartsWith("ENCRYPTION")
+ || locKey.StartsWith("PHONE"))
+ {
+ return "Telegram";
+ }
+
+#if DEBUG
+ return locKey;
+#else
+ return "Telegram";
+#endif
+ }
+
+ private static string GetSound(Data data)
+ {
+ return data.sound;
+ }
+
+ private static string GetGroup(Data data)
+ {
+ return data.group;
+ }
+
+ private static string GetTag(Data data)
+ {
+ return data.tag;
+ }
+
+ private static string GetLaunch(Data data)
+ {
+ var locKey = data.loc_key;
+ if (locKey == null) return null;
+
+ var path = "/Views/ShellView.xaml";
+ if (locKey == "DC_UPDATE")
+ {
+ path = "/Views/Additional/SettingsView.xaml";
+ }
+
+ var customParams = new List { "Action=" + locKey };
+ if (data.custom != null)
+ {
+ customParams.AddRange(data.custom.GetParams());
+ }
+
+ return string.Format("{0}?{1}", path, string.Join("&", customParams));
+ }
+
+ private static string GetMessage(Data data)
+ {
+ var locKey = data.loc_key;
+ if (locKey == null)
+ {
+ Telegram.Logs.Log.Write("::PushNotificationsBackgroundTask locKey=null text=" + data.text);
+ return string.Empty;
+ }
+
+ string locValue = "";
+ if (_locKeys.TryGetValue(locKey, out locValue))
+ {
+
+ }
+ //var resourceLoader = ResourceLoader.GetForViewIndependentUse("TelegramClient.Tasks/Resources");
+ //locValue = resourceLoader.GetString(locKey);
+
+ if (locValue != "")
+ {
+ return string.Format(locValue, data.loc_args).Replace("\r\n", "\n").Replace("\n", " ");
+ }
+ var builder = new StringBuilder();
+ if (data.loc_args != null)
+ {
+ builder.AppendLine("loc_args");
+ foreach (var locArg in data.loc_args)
+ {
+ builder.AppendLine(locArg);
+ }
+ }
+ Telegram.Logs.Log.Write(string.Format("::PushNotificationsBackgroundTask missing locKey={0} locArgs={1}", locKey, builder.ToString()));
+
+ //if (locKey.StartsWith("CHAT") || locKey.StartsWith("GEOCHAT"))
+ //{
+ // return data.text;
+ //}
+
+ //if (locKey.StartsWith("MESSAGE"))
+ //{
+ // if (locKey == "MESSAGE_TEXT")
+ // {
+ // return data.loc_args[1];
+ // }
+
+ // return data.text; //add localization string here
+ //}
+
+#if DEBUG
+ return data.text;
+#else
+ return string.Empty;
+#endif
+ }
+
+ public static void UpdateToastAndTiles(RootObject rootObject)
+ {
+ if (rootObject == null) return;
+ if (rootObject.data == null) return;
+
+ if (rootObject.data.loc_key == null)
+ {
+ var groupname = GetGroup(rootObject.data);
+ RemoveToastGroup(groupname);
+ return;
+ }
+
+ var caption = GetCaption(rootObject.data);
+ var message = GetMessage(rootObject.data);
+ var sound = GetSound(rootObject.data);
+ var launch = GetLaunch(rootObject.data);
+ var tag = GetTag(rootObject.data);
+ var group = GetGroup(rootObject.data);
+
+ if (!IsMuted(rootObject.data) && !Notifications.IsDisabled)
+ {
+ AddToast(rootObject, caption, message, sound, launch, tag, group);
+ }
+ if (!IsServiceNotification(rootObject.data))
+ {
+ UpdateTile(caption, message);
+ }
+ UpdateBadge(rootObject.data.badge);
+ }
+
+ private static void SetToastImage(XmlDocument document, string imageSource, bool isUserPlaceholder)
+ {
+ var imageElements = document.GetElementsByTagName("image");
+ if (imageSource == null)
+ {
+ ((XmlElement)imageElements[0]).SetAttribute("src", isUserPlaceholder ? "ms-appx:///Images/W10M/user_placeholder.png" : "ms-appx:///Images/W10M/group_placeholder.png");
+ }
+ else
+ {
+ ((XmlElement)imageElements[0]).SetAttribute("src", "ms-appdata:///local/" + imageSource);
+ }
+ }
+
+ private static void SetImage(XmlDocument document, string imageSource)
+ {
+ var imageElements = document.GetElementsByTagName("image");
+ ((XmlElement)imageElements[0]).SetAttribute("src", imageSource);
+ }
+
+ private static void SetSound(XmlDocument document, string soundSource)
+ {
+ //return;
+
+ if (!Regex.IsMatch(soundSource, @"^sound[1-6]$", RegexOptions.IgnoreCase))
+ {
+ return;
+ }
+
+ var toastNode = document.SelectSingleNode("/toast");
+ ((XmlElement)toastNode).SetAttribute("duration", "long");
+ var audioElement = document.CreateElement("audio");
+ audioElement.SetAttribute("src", "ms-appx:///Sounds/" + soundSource + ".wav");
+ audioElement.SetAttribute("loop", "false");
+
+ toastNode.AppendChild(audioElement);
+ }
+
+ private static void SetLaunch(RootObject rootObject, XmlDocument document, string launch)
+ {
+ if (string.IsNullOrEmpty(launch))
+ {
+ return;
+ }
+ if (rootObject != null
+ && rootObject.data != null
+ && rootObject.data.system != null
+ && rootObject.data.system.StartsWith("10")) //10.0.10572.0 or less
+ {
+ try
+ {
+ var currentVersion = new Version(rootObject.data.system);
+ var minVersion = new Version("10.0.10572.0");
+ if (currentVersion < minVersion)
+ {
+ return;
+ }
+ }
+ catch (Exception ex)
+ {
+ Telegram.Logs.Log.Write(ex.ToString());
+ }
+ }
+ //launch = "/Views/ShellView.xaml";
+ var toastNode = document.SelectSingleNode("/toast");
+ ((XmlElement)toastNode).SetAttribute("launch", launch);
+ }
+
+ private static void SetText(XmlDocument document, string caption, string message)
+ {
+ var toastTextElements = document.GetElementsByTagName("text");
+ toastTextElements[0].InnerText = caption ?? string.Empty;
+ toastTextElements[1].InnerText = message ?? string.Empty;
+ }
+
+ private static string GetArguments(string peer, string peerId, bool needAccessHash, Custom custom)
+ {
+ string arguments = null;
+
+ if (custom.mtpeer != null && custom.mtpeer.ah != null || !needAccessHash)
+ {
+ arguments = string.Format("{0}={1}", peer, peerId);
+
+ if (custom.mtpeer != null && custom.mtpeer.ah != null)
+ {
+ arguments += string.Format(" access_hash={0}", custom.mtpeer.ah);
+ }
+
+ if (custom.msg_id != null)
+ {
+ arguments += string.Format(" msg_id={0}", custom.msg_id);
+ }
+ }
+
+ return arguments;
+ }
+
+ private static void GetArgumentsAndImageSource(RootObject rootObject, out string arguments, out string imageSource)
+ {
+ arguments = null;
+ imageSource = null;
+
+ if (rootObject != null)
+ {
+ var data = rootObject.data;
+ if (data != null)
+ {
+ var custom = data.custom;
+ if (custom != null)
+ {
+ if (custom.from_id != null)
+ {
+ int fromId;
+ if (Int32.TryParse(custom.from_id, out fromId))
+ {
+ arguments = GetArguments("from_id", custom.from_id, true, custom);
+ }
+ }
+ else if (custom.chat_id != null)
+ {
+ int chatId;
+ if (Int32.TryParse(custom.chat_id, out chatId))
+ {
+ arguments = GetArguments("chat_id", custom.chat_id, false, custom);
+ }
+ }
+ else if (custom.channel_id != null)
+ {
+ int channelId;
+ if (Int32.TryParse(custom.channel_id, out channelId))
+ {
+ if (data.loc_key != null
+ && data.loc_key.StartsWith("CHAT"))
+ {
+ arguments = GetArguments("channel_id", custom.channel_id, true, custom);
+ }
+ }
+ }
+
+ imageSource = GetImageSource(custom);
+ }
+ }
+ }
+ }
+
+ private static void SetActions(XmlDocument document, string arguments)
+ {
+ if (arguments == null) return;
+
+ //var resourceLoader = ResourceLoader.GetForViewIndependentUse("TelegramClient.Tasks/Resources");
+
+ //"" +
+ //"" +
+ //"" +
+ //""
+
+ var toastNode = document.SelectSingleNode("/toast");
+ var actionsElement = document.CreateElement("actions");
+
+ var inputElement = document.CreateElement("input");
+ inputElement.SetAttribute("id", "message");
+ inputElement.SetAttribute("type", "text");
+ inputElement.SetAttribute("placeHolderContent", "Type reply"); //resourceLoader.GetString("TypeReply"));
+ actionsElement.AppendChild(inputElement);
+
+ var replyAction = document.CreateElement("action");
+ replyAction.SetAttribute("activationType", "background");
+ replyAction.SetAttribute("content", "Reply"); //resourceLoader.GetString("Reply"));
+ replyAction.SetAttribute("arguments", "action=reply " + arguments);
+ replyAction.SetAttribute("hint-inputId", "message");
+ replyAction.SetAttribute("imageUri", "Images/W10M/ic_send_2x.png");
+ actionsElement.AppendChild(replyAction);
+
+ var muteAction = document.CreateElement("action");
+ muteAction.SetAttribute("activationType", "background");
+ muteAction.SetAttribute("content", "Mute 1 hour"); //resourceLoader.GetString("Mute1Hour"));
+ muteAction.SetAttribute("arguments", "action=mute " + arguments);
+ actionsElement.AppendChild(muteAction);
+
+ var disableAction = document.CreateElement("action");
+ disableAction.SetAttribute("activationType", "background");
+ disableAction.SetAttribute("content", "Disable"); //resourceLoader.GetString("Disable"));
+ disableAction.SetAttribute("arguments", "action=disable " + arguments);
+ actionsElement.AppendChild(disableAction);
+
+ toastNode.AppendChild(actionsElement);
+ }
+
+ public static void AddToast(RootObject rootObject, string caption, string message, string sound, string launch, string tag, string group)
+ {
+#if WNS_PUSH_SERVICE
+
+#if INTERACTIVE_NOTIFICATIONS
+
+ var toastNotifier = ToastNotificationManager.CreateToastNotifier("xcee0f789y8059y4881y8883y347265c01f93x"); //("xcee0f789y8059y4881y8883y347265c01f93x");
+ //toastNotifier.Setting =
+ Version version = Environment.OSVersion.Version;
+ if (rootObject.data.system != null && rootObject.data.system != null)
+ {
+ Version.TryParse(rootObject.data.system, out version);
+ }
+ var toastXml = new XmlDocument();
+ if (version != null && version.Major >= 10)
+ {
+ string arguments;
+ string imageSource;
+ GetArgumentsAndImageSource(rootObject, out arguments, out imageSource);
+
+ var xml =
+ "" +
+ "" +
+ "" +
+ "" +
+ "" +
+ "" +
+ "" +
+ "" +
+ "";
+
+ toastXml.LoadXml(xml);
+ SetToastImage(toastXml, imageSource, arguments != null && arguments.StartsWith("from_id"));
+ SetActions(toastXml, arguments);
+ }
+ else
+ {
+ toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);
+ }
+
+ SetText(toastXml, caption, message);
+ SetLaunch(rootObject, toastXml, launch);
+
+ if (!string.IsNullOrEmpty(sound)
+ && !string.Equals(sound, "default", StringComparison.OrdinalIgnoreCase))
+ {
+ SetSound(toastXml, sound);
+ }
+
+ try
+ {
+ var toast = new ToastNotification(toastXml);
+ if (tag != null) toast.Tag = tag;
+ if (group != null) toast.Group = group;
+ //RemoveToastGroup(group);
+ toastNotifier.Show(toast);
+ }
+ catch (Exception ex)
+ {
+ Telegram.Logs.Log.Write(ex.ToString());
+ }
+#else
+ var toastNotifier = ToastNotificationManager.CreateToastNotifier();
+
+ var toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);
+ SetText(toastXml, caption, message);
+ SetLaunch(toastXml, launch);
+
+ if (!string.IsNullOrEmpty(sound)
+ && !string.Equals(sound, "default", StringComparison.OrdinalIgnoreCase))
+ {
+ SetSound(toastXml, sound);
+ }
+
+ try
+ {
+ var toast = new ToastNotification(toastXml);
+ if (tag != null) toast.Tag = tag;
+ if (group != null) toast.Group = group;
+ //RemoveToastGroup(group);
+ toastNotifier.Show(toast);
+ }
+ catch (Exception ex)
+ {
+ Telegram.Logs.Log.Write(ex.ToString());
+ }
+#endif
+
+#endif
+ }
+
+ public static T GetRootObject(string payload) where T : class
+ {
+ var serializer = new DataContractJsonSerializer(typeof(T));
+ T rootObject;
+ using (var stream = new MemoryStream(Encoding.Unicode.GetBytes(payload)))
+ {
+ rootObject = serializer.ReadObject(stream) as T;
+ }
+
+ return rootObject;
+ }
+
+ private static async Task IsFileExists(string fileName)
+ {
+ bool fileExists = true;
+ Stream fileStream = null;
+ StorageFile file = null;
+
+ try
+ {
+ file = await ApplicationData.Current.LocalFolder.GetFileAsync(fileName);
+ fileStream = await file.OpenStreamForReadAsync();
+ fileStream.Dispose();
+ }
+ catch (FileNotFoundException)
+ {
+ // If the file dosn't exits it throws an exception, make fileExists false in this case
+ fileExists = false;
+ }
+ finally
+ {
+ if (fileStream != null)
+ {
+ fileStream.Dispose();
+ }
+ }
+
+ return fileExists;
+ }
+
+ private static string GetImageSource(Custom custom)
+ {
+ string imageSource = null;
+ if (custom.mtpeer != null)
+ {
+ var location = custom.mtpeer.ph;
+ if (location != null)
+ {
+ var fileName = String.Format("{0}_{1}_{2}.jpg",
+ location.volume_id,
+ location.local_id,
+ location.secret);
+
+ if (IsFileExists(fileName).Result)
+ {
+ imageSource = fileName;
+ }
+ }
+ }
+
+ return imageSource;
+ }
+
+ public static string GetImageSource(MTPeer mtpeer)
+ {
+ string imageSource = null;
+ if (mtpeer != null)
+ {
+ var location = mtpeer.ph;
+ if (location != null)
+ {
+ var fileName = String.Format("{0}_{1}_{2}.jpg",
+ location.volume_id,
+ location.local_id,
+ location.secret);
+
+ if (IsFileExists(fileName).Result)
+ {
+ imageSource = fileName;
+ }
+ }
+ }
+
+ return imageSource;
+ }
+ }
+
+ public sealed class Photo
+ {
+ public string volume_id { get; set; }
+ public string local_id { get; set; }
+ public string secret { get; set; }
+ public int dc_id { get; set; }
+ }
+
+ public sealed class MTPeer
+ {
+ public string ah { get; set; }
+ public Photo ph { get; set; }
+ }
+
+ public sealed class Custom
+ {
+ public string msg_id { get; set; }
+ public string from_id { get; set; }
+ public string chat_id { get; set; }
+ public string channel_id { get; set; }
+ public MTPeer mtpeer { get; set; }
+ public string call_id { get; set; }
+ public string call_ah { get; set; }
+
+ public string group
+ {
+ get
+ {
+ if (chat_id != null) return "c" + chat_id;
+ if (channel_id != null) return "c" + chat_id;
+ if (from_id != null) return "u" + from_id;
+ return null;
+ }
+ }
+
+ public string tag { get { return msg_id; } }
+
+ public IEnumerable GetParams()
+ {
+ if (msg_id != null) yield return "msg_id=" + msg_id;
+ if (from_id != null) yield return "from_id=" + from_id;
+ if (chat_id != null) yield return "chat_id=" + chat_id;
+ if (channel_id != null) yield return "channel_id=" + channel_id;
+ }
+ }
+
+ public sealed class Data
+ {
+ public Custom custom { get; set; }
+ public string sound { get; set; }
+ public string mute { get; set; }
+ public int badge { get; set; }
+ public string loc_key { get; set; }
+ public string[] loc_args { get; set; }
+ public int random_id { get; set; }
+ public int user_id { get; set; }
+ public string text { get; set; }
+ public string system { get; set; }
+
+ public string group { get { return custom != null ? custom.group : null; } }
+ public string tag { get { return custom != null ? custom.tag : null; } }
+ }
+
+ public sealed class RootObject
+ {
+ public int date { get; set; }
+ public Data data { get; set; }
+ }
+}
diff --git a/Agents/RegistrationHelper.cs b/Agents/RegistrationHelper.cs
new file mode 100755
index 0000000..691a724
--- /dev/null
+++ b/Agents/RegistrationHelper.cs
@@ -0,0 +1,19 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.34011
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace PhoneVoIPApp.BackEnd.OutOfProcess {
+
+
+ internal sealed class RegistrationHelper {
+
+ internal static string[] OutOfProcServerClassNames = new string[] {
+ "PhoneVoIPApp.BackEnd.OutOfProcess.Server"};
+ }
+}
diff --git a/Agents/ScheduledAgentImpl.cs b/Agents/ScheduledAgentImpl.cs
new file mode 100755
index 0000000..9e529be
--- /dev/null
+++ b/Agents/ScheduledAgentImpl.cs
@@ -0,0 +1,354 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Net;
+using System.Text;
+using System.Threading;
+using System.Xml.Serialization;
+using Windows.Data.Xml.Dom;
+using Windows.UI.Notifications;
+using Microsoft.Phone.Networking.Voip;
+using Microsoft.Phone.Scheduler;
+using PhoneVoIPApp.BackEnd;
+using Telegram.Api;
+using Telegram.Api.Aggregator;
+using Telegram.Api.Services;
+using Telegram.Api.Services.Cache;
+using Telegram.Api.Services.Connection;
+using Telegram.Api.Services.Location;
+using Telegram.Api.Services.Updates;
+using Telegram.Api.TL;
+using Telegram.Api.TL.Functions.Phone;
+using Telegram.Api.Transport;
+
+namespace PhoneVoIPApp.Agents
+{
+ public class ScheduledAgentImpl : ScheduledTaskAgent
+ {
+ private readonly Mutex _appOpenMutex = new Mutex(false, Constants.TelegramMessengerMutexName);
+
+ private static bool _logEnabled = true;
+
+ private static readonly int _id = new Random().Next(999);
+
+ private static void Log(string message, Action callback = null)
+ {
+ if (!_logEnabled) return;
+
+ Telegram.Logs.Log.WriteSync = true;
+ Telegram.Logs.Log.Write(string.Format("::ScheduledAgentImpl {0} {1}", _id, message), callback);
+#if DEBUG
+ //PushUtils.AddToast("push", message, string.Empty, string.Empty, null, null);
+#endif
+ }
+
+ public ScheduledAgentImpl()
+ {
+ }
+
+ //private static void SetText(XmlDocument document, string caption, string message)
+ //{
+ // var toastTextElements = document.GetElementsByTagName("text");
+ // toastTextElements[0].InnerText = caption ?? string.Empty;
+ // toastTextElements[1].InnerText = message ?? string.Empty;
+ //}
+
+ private static void SetText(XmlDocument document, string caption, string message)
+ {
+ var toastTextElements = document.GetElementsByTagName("text");
+ toastTextElements[0].InnerText = caption ?? string.Empty;
+ toastTextElements[1].InnerText = message ?? string.Empty;
+ }
+
+ protected override void OnInvoke(ScheduledTask task)
+ {
+ Debug.WriteLine("[ScheduledAgentImpl {0}] ScheduledAgentImpl has been invoked with argument of type {1}.", GetHashCode(), task.GetType());
+
+ // Indicate that an agent has started running
+ AgentHost.OnAgentStarted();
+
+ Log(string.Format("start with argument of type {0}", task.GetType()));
+ if (!_appOpenMutex.WaitOne(0))
+ {
+ Log("cancel");
+ Complete();
+ return;
+ }
+ _appOpenMutex.ReleaseMutex();
+
+ var incomingCallTask = task as VoipHttpIncomingCallTask;
+ if (incomingCallTask != null)
+ {
+ isIncomingCallAgent = true;
+
+ var messageBody = HttpUtility.HtmlDecode(Encoding.UTF8.GetString(incomingCallTask.MessageBody, 0, incomingCallTask.MessageBody.Length));
+ Notification pushNotification = null;
+ try
+ {
+ using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(messageBody ?? string.Empty)))
+ {
+ var xs = new XmlSerializer(typeof(Notification));
+ pushNotification = (Notification)xs.Deserialize(ms);
+ }
+ }
+ catch (Exception ex)
+ {
+ Log(string.Format("cannot deserialize message_body={0}", messageBody));
+#if DEBUG
+ var toastNotifier = ToastNotificationManager.CreateToastNotifier();
+
+ var toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);
+ SetText(toastXml, "Notification Exception", string.Empty);
+
+ try
+ {
+ var toast = new ToastNotification(toastXml);
+ //RemoveToastGroup(group);
+ toastNotifier.Show(toast);
+ }
+ catch (Exception ex2)
+ {
+ Telegram.Logs.Log.Write(ex.ToString());
+ }
+#endif
+ }
+
+ if (pushNotification != null)
+ {
+ var rootObject = PushUtils2.GetRootObject(pushNotification.Data);
+ if (rootObject != null
+ && rootObject.data != null)
+ {
+ if (rootObject.data.custom != null
+ && rootObject.data.custom.from_id != null
+ && rootObject.data.custom.call_id != null
+ && rootObject.data.custom.call_ah != null)
+ {
+ var contactImage = PushUtils2.GetImageSource(rootObject.data.custom.mtpeer) ?? string.Empty;
+ var contactName = rootObject.data.loc_args != null && rootObject.data.loc_args.Length > 0
+ ? rootObject.data.loc_args[0]
+ : string.Empty;
+ Debug.WriteLine("[{0}] Incoming call from caller {1}, id {2}", incomingCallAgentId,
+ contactName, rootObject.data.custom.from_id);
+
+ long contactId = 0;
+ long callId = 0;
+ long callAccessHash = 0;
+ if (long.TryParse(rootObject.data.custom.from_id, out contactId)
+ && long.TryParse(rootObject.data.custom.call_id, out callId)
+ && long.TryParse(rootObject.data.custom.call_ah, out callAccessHash))
+ {
+ if (string.Equals(rootObject.data.loc_key, "PHONE_CALL_REQUEST",
+ StringComparison.OrdinalIgnoreCase))
+ {
+ if (BackEnd.Globals.Instance.CallController.CallStatus == CallStatus.InProgress)
+ {
+ OnIncomingCallDialogDismissed(callId, callAccessHash, true);
+ return;
+ }
+
+ // Initiate incoming call processing
+ // If you want to pass in additional information such as pushNotification.Number, you can
+ var incomingCallProcessingStarted =
+ BackEnd.Globals.Instance.CallController.OnIncomingCallReceived(contactName,
+ contactId, contactImage, callId, callAccessHash,
+ OnIncomingCallDialogDismissed);
+ if (incomingCallProcessingStarted)
+ {
+ // will Complete() at OnIncomingCallDialogDismissed
+ return;
+ }
+
+ //PushUtils2.AddToast(rootObject, "Caption", "Message", "", "", "tag", "group");
+ }
+ else if (string.Equals(rootObject.data.loc_key, "PHONE_CALL_DECLINE",
+ StringComparison.OrdinalIgnoreCase))
+ {
+ var currentCallId = BackEnd.Globals.Instance.CallController.CallId;
+ if (currentCallId == callId)
+ {
+ Log(string.Format("PHONE_CALL_DECLINE CallController.EndCall call_id={0}", callId));
+ var result = BackEnd.Globals.Instance.CallController.EndCall();
+ Log(string.Format("PHONE_CALL_DECLINE CallController.EndCall call_id={0} result={1}", callId, result));
+ }
+ }
+ }
+ }
+ else if (string.Equals(rootObject.data.loc_key, "GEO_LIVE_PENDING"))
+ {
+ ProcessLiveLocations();
+ }
+ else
+ {
+ //PushUtils2.UpdateToastAndTiles(rootObject);
+ }
+ }
+ }
+
+ Complete();
+ return;
+ }
+ else
+ {
+ VoipKeepAliveTask keepAliveTask = task as VoipKeepAliveTask;
+ if (keepAliveTask != null)
+ {
+ this.isIncomingCallAgent = false;
+
+ // Refresh tokens, get new certs from server, etc.
+ BackEnd.Globals.Instance.DoPeriodicKeepAlive();
+ this.Complete();
+ }
+ else
+ {
+ throw new InvalidOperationException(string.Format("Unknown scheduled task type {0}", task.GetType()));
+ }
+ }
+ }
+
+ // This is a request to complete this agent
+ protected override void OnCancel()
+ {
+ Debug.WriteLine("[{0}] Cancel requested.", this.isIncomingCallAgent ? ScheduledAgentImpl.incomingCallAgentId : ScheduledAgentImpl.keepAliveAgentId);
+ this.Complete();
+ }
+
+ private readonly object _initConnectionSyncRoot = new object();
+
+ private TLInitConnection GetInitConnection()
+ {
+ return TLUtils.OpenObjectFromMTProtoFile(_initConnectionSyncRoot, Constants.InitConnectionFileName) ??
+ new TLInitConnection
+ {
+ DeviceModel = new TLString("unknown"),
+ AppVersion = new TLString("background task"),
+ SystemVersion = new TLString("8.10.0.0")
+ };
+ }
+
+ // This method is called when the incoming call processing is complete
+ private void OnIncomingCallDialogDismissed(long callId, long callAccessHash, bool rejected)
+ {
+ Debug.WriteLine("[IncomingCallAgent] Incoming call processing is now complete.");
+
+ if (rejected)
+ {
+ var deviceInfoService = new Telegram.Api.Services.DeviceInfo.DeviceInfoService(GetInitConnection(), true, "BackgroundDifferenceLoader", 1);
+ var cacheService = new MockupCacheService();
+ var updatesService = new MockupUpdatesService();
+ var transportService = new TransportService();
+ var connectionService = new ConnectionService(deviceInfoService);
+ var publicConfigService = new MockupPublicConfigService();
+
+ var manualResetEvent = new ManualResetEvent(false);
+ var mtProtoService = new MTProtoService(deviceInfoService, updatesService, cacheService, transportService, connectionService, publicConfigService);
+ mtProtoService.Initialized += (o, e) =>
+ {
+ var peer = new TLInputPhoneCall
+ {
+ Id = new TLLong(callId),
+ AccessHash = new TLLong(callAccessHash)
+ };
+
+ var getStateAction = new TLDiscardCall
+ {
+ Peer = peer,
+ Duration = new TLInt(0),
+ Reason = new TLPhoneCallDiscardReasonBusy(),
+ ConnectionId = new TLLong(0)
+ };
+ var actions = new List { getStateAction };
+
+ mtProtoService.SendActionsAsync(actions,
+ (request, result) =>
+ {
+ manualResetEvent.Set();
+ },
+ error =>
+ {
+ manualResetEvent.Set();
+ });
+ };
+ mtProtoService.InitializationFailed += (o, e) =>
+ {
+ manualResetEvent.Set();
+ };
+ mtProtoService.Initialize();
+
+#if DEBUG
+ manualResetEvent.WaitOne();
+#else
+ manualResetEvent.WaitOne(TimeSpan.FromSeconds(10.0));
+#endif
+
+ mtProtoService.Stop();
+ }
+
+ this.Complete();
+ }
+
+ private void ProcessLiveLocations()
+ {
+ var deviceInfoService = new Telegram.Api.Services.DeviceInfo.DeviceInfoService(GetInitConnection(), true, "BackgroundDifferenceLoader", 1);
+ var cacheService = new MockupCacheService();
+ var updatesService = new MockupUpdatesService();
+ var transportService = new TransportService();
+ var connectionService = new ConnectionService(deviceInfoService);
+ var publicConfigService = new MockupPublicConfigService();
+
+ var manualResetEvent = new ManualResetEvent(false);
+ var eventAggregator = new TelegramEventAggregator();
+ var mtProtoService = new MTProtoService(deviceInfoService, updatesService, cacheService, transportService, connectionService, publicConfigService);
+ mtProtoService.Initialized += (o, e) =>
+ {
+ var liveLocationsService = new LiveLocationService(mtProtoService, eventAggregator);
+
+ liveLocationsService.Load();
+
+ liveLocationsService.UpdateAll();
+
+ manualResetEvent.Set();
+ };
+ mtProtoService.InitializationFailed += (o, e) =>
+ {
+ manualResetEvent.Set();
+ };
+ mtProtoService.Initialize();
+
+ var timeout =
+#if DEBUG
+ Timeout.InfiniteTimeSpan;
+#else
+ TimeSpan.FromSeconds(30.0);
+#endif
+
+ var result = manualResetEvent.WaitOne(timeout);
+ }
+
+ // Complete this agent.
+ private void Complete()
+ {
+ Debug.WriteLine("[{0}] Calling NotifyComplete", this.isIncomingCallAgent ? ScheduledAgentImpl.incomingCallAgentId : ScheduledAgentImpl.keepAliveAgentId);
+
+ Log(string.Format("[{0}] Calling NotifyComplete", this.isIncomingCallAgent ? ScheduledAgentImpl.incomingCallAgentId : ScheduledAgentImpl.keepAliveAgentId));
+
+ // This agent is done
+ base.NotifyComplete();
+ }
+
+ // Strings used in tracing
+ private const string keepAliveAgentId = "KeepAliveAgent";
+ private const string incomingCallAgentId = "IncomingCallAgent";
+
+ // Indicates if this agent instance is handling an incoming call or not
+ private bool isIncomingCallAgent;
+ }
+}
diff --git a/Agents/VideoMediaStreamSource.cs b/Agents/VideoMediaStreamSource.cs
new file mode 100755
index 0000000..2bfaa8d
--- /dev/null
+++ b/Agents/VideoMediaStreamSource.cs
@@ -0,0 +1,222 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Windows.Media;
+using System.Threading;
+
+namespace PhoneVoIPApp.Agents
+{
+ public class VideoMediaStreamSource : MediaStreamSource, IDisposable
+ {
+ public class VideoSample
+ {
+ public VideoSample(Windows.Storage.Streams.IBuffer _buffer, UInt64 _hnsPresentationTime, UInt64 _hnsSampleDuration)
+ {
+ buffer = _buffer;
+ hnsPresentationTime = _hnsPresentationTime;
+ hnsSampleDuration = _hnsSampleDuration;
+ }
+
+ public Windows.Storage.Streams.IBuffer buffer;
+ public UInt64 hnsPresentationTime;
+ public UInt64 hnsSampleDuration;
+ }
+
+ private const int maxQueueSize = 4;
+ private int _frameWidth;
+ private int _frameHeight;
+ private bool isDisposed = false;
+ private Queue _sampleQueue;
+
+ private object lockObj = new object();
+ private ManualResetEvent shutdownEvent;
+
+ private int _outstandingGetVideoSampleCount;
+
+ private MediaStreamDescription _videoDesc;
+ private Dictionary _emptySampleDict = new Dictionary();
+
+ public VideoMediaStreamSource(Stream audioStream, int frameWidth, int frameHeight)
+ {
+ _frameWidth = frameWidth;
+ _frameHeight = frameHeight;
+ shutdownEvent = new ManualResetEvent(false);
+ _sampleQueue = new Queue(VideoMediaStreamSource.maxQueueSize);
+ _outstandingGetVideoSampleCount = 0;
+ BackEnd.Globals.Instance.TransportController.VideoMessageReceived += TransportController_VideoMessageReceived;
+ }
+
+ public void Dispose()
+ {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ public void Shutdown()
+ {
+ shutdownEvent.Set();
+ lock (lockObj)
+ {
+ if (_outstandingGetVideoSampleCount > 0)
+ {
+ // ReportGetSampleCompleted must be called after GetSampleAsync to avoid memory leak. So, send
+ // an empty MediaStreamSample here.
+ MediaStreamSample msSamp = new MediaStreamSample(
+ _videoDesc,
+ null,
+ 0,
+ 0,
+ 0,
+ 0,
+ _emptySampleDict);
+ ReportGetSampleCompleted(msSamp);
+ _outstandingGetVideoSampleCount = 0;
+ }
+ }
+ }
+
+ protected virtual void Dispose(bool disposing)
+ {
+ if (!this.isDisposed)
+ {
+ if (disposing)
+ {
+ BackEnd.Globals.Instance.TransportController.VideoMessageReceived -= TransportController_VideoMessageReceived;
+ }
+ isDisposed = true;
+ }
+ }
+
+ void TransportController_VideoMessageReceived(Windows.Storage.Streams.IBuffer ibuffer, UInt64 hnsPresenationTime, UInt64 hnsSampleDuration)
+ {
+ lock (lockObj)
+ {
+ if (_sampleQueue.Count >= VideoMediaStreamSource.maxQueueSize)
+ {
+ // Dequeue and discard oldest
+ _sampleQueue.Dequeue();
+ }
+
+ _sampleQueue.Enqueue(new VideoSample(ibuffer, hnsPresenationTime, hnsSampleDuration));
+ SendSamples();
+ }
+
+ }
+
+ private void SendSamples()
+ {
+ while (_sampleQueue.Count() > 0 && _outstandingGetVideoSampleCount > 0)
+ {
+ if (!(shutdownEvent.WaitOne(0)))
+ {
+ VideoSample vs = _sampleQueue.Dequeue();
+ Stream s = System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.AsStream(vs.buffer);
+
+ // Send out the next sample
+ MediaStreamSample msSamp = new MediaStreamSample(
+ _videoDesc,
+ s,
+ 0,
+ s.Length,
+ (long)vs.hnsPresentationTime,
+ (long)vs.hnsSampleDuration,
+ _emptySampleDict);
+
+ ReportGetSampleCompleted(msSamp);
+ _outstandingGetVideoSampleCount--;
+ }
+ else
+ {
+ // If video rendering is shutting down we should no longer deliver frames
+ return;
+ }
+ }
+ }
+
+ private void PrepareVideo()
+ {
+ // Stream Description
+ Dictionary streamAttributes =
+ new Dictionary();
+
+ // Select the same encoding and dimensions as the video capture
+ streamAttributes[MediaStreamAttributeKeys.VideoFourCC] = "H264";
+ streamAttributes[MediaStreamAttributeKeys.Height] = _frameHeight.ToString();
+ streamAttributes[MediaStreamAttributeKeys.Width] = _frameWidth.ToString();
+
+ MediaStreamDescription msd =
+ new MediaStreamDescription(MediaStreamType.Video, streamAttributes);
+
+ _videoDesc = msd;
+ }
+
+ private void PrepareAudio()
+ {
+ }
+
+ protected override void OpenMediaAsync()
+ {
+ // Init
+ Dictionary sourceAttributes =
+ new Dictionary();
+ List availableStreams =
+ new List();
+
+ PrepareVideo();
+
+ availableStreams.Add(_videoDesc);
+
+ // a zero timespan is an infinite video
+ sourceAttributes[MediaSourceAttributesKeys.Duration] =
+ TimeSpan.FromSeconds(0).Ticks.ToString(CultureInfo.InvariantCulture);
+
+ sourceAttributes[MediaSourceAttributesKeys.CanSeek] = false.ToString();
+
+ // tell Silverlight that we've prepared and opened our video
+ ReportOpenMediaCompleted(sourceAttributes, availableStreams);
+ }
+
+ protected override void GetSampleAsync(MediaStreamType mediaStreamType)
+ {
+ if (mediaStreamType == MediaStreamType.Audio)
+ {
+ }
+ else if (mediaStreamType == MediaStreamType.Video)
+ {
+ lock (lockObj)
+ {
+ _outstandingGetVideoSampleCount++;
+ SendSamples();
+ }
+ }
+ }
+
+ protected override void CloseMedia()
+ {
+ }
+
+ protected override void GetDiagnosticAsync(MediaStreamSourceDiagnosticKind diagnosticKind)
+ {
+ throw new NotImplementedException();
+ }
+
+ protected override void SwitchMediaStreamAsync(MediaStreamDescription mediaStreamDescription)
+ {
+ throw new NotImplementedException();
+ }
+
+ protected override void SeekAsync(long seekToTime)
+ {
+ ReportSeekCompleted(seekToTime);
+ }
+ }
+}
diff --git a/Agents/VideoRenderer.cs b/Agents/VideoRenderer.cs
new file mode 100755
index 0000000..23ff741
--- /dev/null
+++ b/Agents/VideoRenderer.cs
@@ -0,0 +1,103 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+using Microsoft.Phone.Media;
+using PhoneVoIPApp.BackEnd;
+using System;
+using System.Diagnostics;
+using System.Windows;
+
+namespace PhoneVoIPApp.Agents
+{
+ ///
+ /// A class that renders video from the background process.
+ /// Note, the MediaElement that actually displays the video is in the UI process -
+ /// this class receives video from the remote party and writes it to a media streamer.
+ /// The media streamer handles connecting the rendered video stream to the media element that
+ /// displays it in the UI process.
+ ///
+ internal class VideoRenderer : IVideoRenderer
+ {
+ ///
+ /// Constructor
+ ///
+ internal VideoRenderer()
+ {
+ }
+
+ #region IVideoRenderer methods
+
+ ///
+ /// Start rendering video.
+ /// Note, this method may be called multiple times in a row.
+ ///
+ public void Start()
+ {
+ if (this.isRendering)
+ return; // Nothing more to be done
+
+ Deployment.Current.Dispatcher.BeginInvoke(() =>
+ {
+ try
+ {
+ Debug.WriteLine("[VideoRenderer::Start] Video rendering setup");
+ StartMediaStreamer();
+ this.isRendering = true;
+ }
+ catch (Exception err)
+ {
+ Debug.WriteLine("[VideoRenderer::Start] " + err.Message);
+ }
+ });
+ }
+
+ private void StartMediaStreamer()
+ {
+ if (mediaStreamer == null)
+ {
+ mediaStreamer = MediaStreamerFactory.CreateMediaStreamer(123);
+ }
+
+ // Using default resolution of 640x480
+ mediaStreamSource = new VideoMediaStreamSource(null, 640, 480);
+ mediaStreamer.SetSource(mediaStreamSource);
+ }
+
+ ///
+ /// Stop rendering video.
+ /// Note, this method may be called multiple times in a row.
+ ///
+ public void Stop()
+ {
+ Deployment.Current.Dispatcher.BeginInvoke(() =>
+ {
+ if (!this.isRendering)
+ return; // Nothing more to be done
+
+ Debug.WriteLine("[VoIP Background Process] Video rendering stopped.");
+ mediaStreamSource.Shutdown();
+ mediaStreamSource.Dispose();
+ mediaStreamSource = null;
+ mediaStreamer.Dispose();
+ mediaStreamer = null;
+
+ this.isRendering = false;
+ });
+ }
+
+ #endregion
+
+ #region Private members
+
+ // Indicates if rendering is already in progress or not
+ private bool isRendering;
+ private VideoMediaStreamSource mediaStreamSource;
+ private MediaStreamer mediaStreamer;
+
+ #endregion
+ }
+}
diff --git a/BackEnd/ApiLock.cpp b/BackEnd/ApiLock.cpp
new file mode 100755
index 0000000..5f1b902
--- /dev/null
+++ b/BackEnd/ApiLock.cpp
@@ -0,0 +1,17 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+#include "ApiLock.h"
+
+namespace PhoneVoIPApp
+{
+ namespace BackEnd
+ {
+ // A mutex used to protect objects accessible from the API surface exposed by this DLL
+ std::recursive_mutex g_apiLock;
+ }
+}
diff --git a/BackEnd/ApiLock.h b/BackEnd/ApiLock.h
new file mode 100755
index 0000000..1c47cd7
--- /dev/null
+++ b/BackEnd/ApiLock.h
@@ -0,0 +1,18 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+#pragma once
+#include
+
+namespace PhoneVoIPApp
+{
+ namespace BackEnd
+ {
+ // A mutex used to protect objects accessible from the API surface exposed by this DLL
+ extern std::recursive_mutex g_apiLock;
+ }
+}
diff --git a/BackEnd/BackEnd.vcxproj b/BackEnd/BackEnd.vcxproj
new file mode 100755
index 0000000..1c6fa15
--- /dev/null
+++ b/BackEnd/BackEnd.vcxproj
@@ -0,0 +1,218 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ ARM
+
+
+ Release
+ Win32
+
+
+ Release
+ ARM
+
+
+
+ {c8d75245-ffcf-4932-a228-c9cc8bb60b03}
+ PhoneVoIPApp.BackEnd
+ en-US
+ $(VCTargetsPath11)
+ 11.0
+ Windows Phone
+ 8.0
+ true
+ BackEnd
+ Windows Phone Silverlight
+ 8.1
+
+
+
+ DynamicLibrary
+ true
+ v120
+ win32
+
+
+ DynamicLibrary
+ true
+ v120
+ arm32
+
+
+ DynamicLibrary
+ false
+ true
+ v120
+ win32
+
+
+ DynamicLibrary
+ false
+ true
+ v120
+ arm32
+
+
+
+
+
+
+
+ false
+
+
+ $(RootNamespace)
+ PostBuildEvent
+ $(SolutionDir)$(PlatformTarget)\$(Configuration)\$(MSBuildProjectName)\
+ $(PlatformTarget)\$(Configuration)\
+
+
+ $(RootNamespace)
+ PostBuildEvent
+ $(SolutionDir)$(PlatformTarget)\$(Configuration)\$(MSBuildProjectName)\
+ $(PlatformTarget)\$(Configuration)\
+
+
+ $(RootNamespace)
+ PostBuildEvent
+ $(SolutionDir)$(PlatformTarget)\$(Configuration)\$(MSBuildProjectName)\
+ $(PlatformTarget)\$(Configuration)\
+
+
+ $(RootNamespace)
+ PostBuildEvent
+ $(SolutionDir)$(PlatformTarget)\$(Configuration)\$(MSBuildProjectName)\
+ $(PlatformTarget)\$(Configuration)\
+
+
+
+ _WINRT_DLL;WIN32_LEAN_AND_MEAN;%(PreprocessorDefinitions)
+
+
+
+
+ _WINRT_DLL;WIN32_LEAN_AND_MEAN;NDEBUG;%(PreprocessorDefinitions)
+
+
+
+
+ _WINRT_DLL;WIN32_LEAN_AND_MEAN;%(PreprocessorDefinitions)
+
+
+
+
+ _WINRT_DLL;WIN32_LEAN_AND_MEAN;NDEBUG;%(PreprocessorDefinitions)
+
+
+
+
+ NotUsing
+ $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)
+ true
+ true
+ true
+ true
+
+
+ Console
+ false
+ windowsphonecore.lib;runtimeobject.lib;PhoneAudioSes.lib;%(AdditionalDependencies)
+
+ ole32.lib;%(IgnoreSpecificDefaultLibraries)
+ true
+ true
+ true
+ true
+
+
+
+ pushd "$(OutDir)"
+ WinMdIdl.exe "$(OutDir)$(RootNamespace).winmd"
+ MIdl.exe /env $(MidlEnv) /winrt /ns_prefix /metadata_dir "$(TargetPlatformSdkMetadataLocation)" /out "$(SolutionDir)$(ProjectName)ProxyStub" "$(OutDir)$(RootNamespace).idl"
+ MIdl.exe /env $(MidlEnv) /winrt /ns_prefix /metadata_dir "$(TargetPlatformSdkMetadataLocation)" /out "$(SolutionDir)$(ProjectName)ProxyStub" "$(OutDir)$(RootNamespace).OutOfProcess.idl"
+ popd
+
+
+ $(OutDir)$(RootNamespace).idl;$(OutDir)$(RootNamespace).OutOfProcess.idl;$(SolutionDir)$(ProjectName)ProxyStub\dlldata.c;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace)_i.c;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace)_p.c;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace).h;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace).OutOfProcess.h;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace).OutOfProcess_i.c;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace).OutOfProcess_p.c;%(Outputs)
+
+
+
+ pushd "$(OutDir)"
+ WinMdIdl.exe "$(OutDir)$(RootNamespace).winmd"
+ MIdl.exe /env $(MidlEnv) /winrt /ns_prefix /metadata_dir "$(TargetPlatformSdkMetadataLocation)" /out "$(SolutionDir)$(ProjectName)ProxyStub" "$(OutDir)$(RootNamespace).idl"
+ MIdl.exe /env $(MidlEnv) /winrt /ns_prefix /metadata_dir "$(TargetPlatformSdkMetadataLocation)" /out "$(SolutionDir)$(ProjectName)ProxyStub" "$(OutDir)$(RootNamespace).OutOfProcess.idl"
+ popd
+
+
+ $(OutDir)$(RootNamespace).idl;$(OutDir)$(RootNamespace).OutOfProcess.idl;$(SolutionDir)$(ProjectName)ProxyStub\dlldata.c;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace)_i.c;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace)_p.c;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace).h;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace).OutOfProcess.h;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace).OutOfProcess_i.c;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace).OutOfProcess_p.c;%(Outputs)
+
+
+
+ pushd "$(OutDir)"
+ WinMdIdl.exe "$(OutDir)$(RootNamespace).winmd"
+ MIdl.exe /env $(MidlEnv) /winrt /ns_prefix /metadata_dir "$(TargetPlatformSdkMetadataLocation)" /out "$(SolutionDir)$(ProjectName)ProxyStub" "$(OutDir)$(RootNamespace).idl"
+ MIdl.exe /env $(MidlEnv) /winrt /ns_prefix /metadata_dir "$(TargetPlatformSdkMetadataLocation)" /out "$(SolutionDir)$(ProjectName)ProxyStub" "$(OutDir)$(RootNamespace).OutOfProcess.idl"
+ popd
+
+
+ $(OutDir)$(RootNamespace).idl;$(OutDir)$(RootNamespace).OutOfProcess.idl;$(SolutionDir)$(ProjectName)ProxyStub\dlldata.c;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace)_i.c;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace)_p.c;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace).h;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace).OutOfProcess.h;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace).OutOfProcess_i.c;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace).OutOfProcess_p.c;%(Outputs)
+
+
+
+ pushd "$(OutDir)"
+ WinMdIdl.exe "$(OutDir)$(RootNamespace).winmd"
+ MIdl.exe /env $(MidlEnv) /winrt /ns_prefix /metadata_dir "$(TargetPlatformSdkMetadataLocation)" /out "$(SolutionDir)$(ProjectName)ProxyStub" "$(OutDir)$(RootNamespace).idl"
+ MIdl.exe /env $(MidlEnv) /winrt /ns_prefix /metadata_dir "$(TargetPlatformSdkMetadataLocation)" /out "$(SolutionDir)$(ProjectName)ProxyStub" "$(OutDir)$(RootNamespace).OutOfProcess.idl"
+ popd
+
+
+ $(OutDir)$(RootNamespace).idl;$(OutDir)$(RootNamespace).OutOfProcess.idl;$(SolutionDir)$(ProjectName)ProxyStub\dlldata.c;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace)_i.c;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace)_p.c;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace).h;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace).OutOfProcess.h;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace).OutOfProcess_i.c;$(SolutionDir)$(ProjectName)ProxyStub\$(RootNamespace).OutOfProcess_p.c;%(Outputs)
+
+
+
+
+ true
+
+
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {21f10158-c078-4bd7-a82a-9c4aeb8e2f8e}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BackEnd/BackEndAudio.cpp b/BackEnd/BackEndAudio.cpp
new file mode 100755
index 0000000..4fdd077
--- /dev/null
+++ b/BackEnd/BackEndAudio.cpp
@@ -0,0 +1,459 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+#include "BackEndAudio.h"
+#include "ApiLock.h"
+#include "BackEndNativeBuffer.h"
+
+using namespace PhoneVoIPApp::BackEnd;
+using namespace Windows::System::Threading;
+
+// Begin of audio helpers
+//size_t inline GetWaveFormatSize(const WAVEFORMATEX& format)
+//{
+// return (sizeof WAVEFORMATEX) + (format.wFormatTag == WAVE_FORMAT_PCM ? 0 : format.cbSize);
+//}
+//
+//void FillPcmFormat(WAVEFORMATEX& format, WORD wChannels, int nSampleRate, WORD wBits)
+//{
+// format.wFormatTag = WAVE_FORMAT_PCM;
+// format.nChannels = wChannels;
+// format.nSamplesPerSec = nSampleRate;
+// format.wBitsPerSample = wBits;
+// format.nBlockAlign = format.nChannels * (format.wBitsPerSample / 8);
+// format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
+// format.cbSize = 0;
+//}
+//
+//size_t BytesFromDuration(int nDurationInMs, const WAVEFORMATEX& format)
+//{
+// return size_t(nDurationInMs * FLOAT(format.nAvgBytesPerSec) / 1000);
+//}
+//
+//size_t SamplesFromDuration(int nDurationInMs, const WAVEFORMATEX& format)
+//{
+// return size_t(nDurationInMs * FLOAT(format.nSamplesPerSec) / 1000);
+//}
+//// End of audio helpers
+//
+//BOOL WaveFormatCompare(const WAVEFORMATEX& format1, const WAVEFORMATEX& format2)
+//{
+// size_t cbSizeFormat1 = GetWaveFormatSize(format1);
+// size_t cbSizeFormat2 = GetWaveFormatSize(format2);
+//
+// return (cbSizeFormat1 == cbSizeFormat2) && (memcmp(&format1, &format2, cbSizeFormat1) == 0);
+//}
+//
+//BackEndAudio::BackEndAudio() :
+// m_pDefaultRenderDevice(NULL),
+// m_pRenderClient(NULL),
+// m_pClock(NULL),
+// m_pVolume(NULL),
+// m_nMaxFrameCount(0),
+// m_pwfx(NULL),
+// m_pDefaultCaptureDevice(NULL),
+// m_pCaptureClient(NULL),
+// m_sourceFrameSizeInBytes(0),
+// hCaptureEvent(NULL),
+// hShutdownEvent(NULL),
+// m_CaptureThread(nullptr),
+// transportController(nullptr),
+// started(false)
+//{
+// this->onTransportMessageReceivedHandler = ref new MessageReceivedEventHandler(this, &BackEndAudio::OnTransportMessageReceived);
+//}
+//
+//void BackEndAudio::OnTransportMessageReceived(Windows::Storage::Streams::IBuffer^ stream, UINT64, UINT64)
+//{
+// BYTE* pBuffer = NativeBuffer::GetBytesFromIBuffer(stream);
+// int size = stream->Length;
+//
+// while (m_pRenderClient && size && pBuffer)
+// {
+// HRESULT hr = E_FAIL;
+// unsigned int padding = 0;
+//
+// hr = m_pDefaultRenderDevice->GetCurrentPadding(&padding);
+// if (SUCCEEDED(hr))
+// {
+// BYTE* pRenderBuffer = NULL;
+// unsigned int incomingFrameCount = size / m_sourceFrameSizeInBytes;
+// unsigned int framesToWrite = m_nMaxFrameCount - padding;
+//
+// if (framesToWrite > incomingFrameCount)
+// {
+// framesToWrite = incomingFrameCount;
+// }
+//
+// if (framesToWrite)
+// {
+// hr = m_pRenderClient->GetBuffer(framesToWrite, &pRenderBuffer);
+//
+// if (SUCCEEDED(hr))
+// {
+// unsigned int bytesToBeWritten = framesToWrite * m_sourceFrameSizeInBytes;
+//
+// memcpy(pRenderBuffer, pBuffer, bytesToBeWritten);
+//
+// // Release the buffer
+// m_pRenderClient->ReleaseBuffer(framesToWrite, 0);
+//
+// pBuffer += bytesToBeWritten;
+// size -= bytesToBeWritten;
+// }
+// }
+// }
+// }
+//}
+//
+//void BackEndAudio::Start()
+//{
+// // Make sure only one API call is in progress at a time
+// std::lock_guard lock(g_apiLock);
+//
+// if (started)
+// return;
+//
+// HRESULT hr = InitCapture();
+// if (SUCCEEDED(hr))
+// {
+// hr = InitRender();
+// }
+//
+// if (SUCCEEDED(hr))
+// {
+// hr = StartAudioThreads();
+// }
+//
+// if (FAILED(hr))
+// {
+// Stop();
+// throw ref new Platform::COMException(hr, L"Unable to start audio");
+// }
+//
+// started = true;
+//}
+//
+//void BackEndAudio::Stop()
+//{
+// // Make sure only one API call is in progress at a time
+// std::lock_guard lock(g_apiLock);
+//
+// if (!started)
+// return;
+//
+// // Shutdown the threads
+// if (hShutdownEvent)
+// {
+// SetEvent(hShutdownEvent);
+// }
+//
+// if (m_CaptureThread != nullptr)
+// {
+// m_CaptureThread->Cancel();
+// m_CaptureThread->Close();
+// m_CaptureThread = nullptr;
+// }
+//
+// if (m_pDefaultRenderDevice)
+// {
+// m_pDefaultRenderDevice->Stop();
+// }
+//
+// if (m_pDefaultCaptureDevice)
+// {
+// m_pDefaultCaptureDevice->Stop();
+// }
+//
+// if (m_pVolume)
+// {
+// m_pVolume->Release();
+// m_pVolume = NULL;
+// }
+// if (m_pClock)
+// {
+// m_pClock->Release();
+// m_pClock = NULL;
+// }
+//
+// if (m_pRenderClient)
+// {
+// m_pRenderClient->Release();
+// m_pRenderClient = NULL;
+// }
+//
+//
+//
+// if (m_pDefaultRenderDevice)
+// {
+// m_pDefaultRenderDevice->Release();
+// m_pDefaultRenderDevice = NULL;
+// }
+//
+// if (m_pDefaultCaptureDevice)
+// {
+// m_pDefaultCaptureDevice->Release();
+// m_pDefaultCaptureDevice = NULL;
+// }
+//
+// if (m_pCaptureClient)
+// {
+// m_pCaptureClient->Release();
+// m_pCaptureClient = NULL;
+// }
+//
+// if (m_pwfx)
+// {
+// CoTaskMemFree((LPVOID)m_pwfx);
+// m_pwfx = NULL;
+// }
+//
+// if (hCaptureEvent)
+// {
+// CloseHandle(hCaptureEvent);
+// hCaptureEvent = NULL;
+// }
+//
+// if (hShutdownEvent)
+// {
+// CloseHandle(hShutdownEvent);
+// hShutdownEvent = NULL;
+// }
+//
+// started = false;
+//}
+//
+//void BackEndAudio::CaptureThread(Windows::Foundation::IAsyncAction^ operation)
+//{
+// HRESULT hr = m_pDefaultCaptureDevice->Start();
+// BYTE *pLocalBuffer = new BYTE[MAX_RAW_BUFFER_SIZE];
+// HANDLE eventHandles[] = {
+// hCaptureEvent, // WAIT_OBJECT0
+// hShutdownEvent // WAIT_OBJECT0 + 1
+// };
+//
+// if (SUCCEEDED(hr) && pLocalBuffer)
+// {
+// unsigned int uAccumulatedBytes = 0;
+// while (SUCCEEDED(hr))
+// {
+// DWORD waitResult = WaitForMultipleObjectsEx(SIZEOF_ARRAY(eventHandles), eventHandles, FALSE, INFINITE, FALSE);
+// if (WAIT_OBJECT_0 == waitResult)
+// {
+// BYTE* pbData = nullptr;
+// UINT32 nFrames = 0;
+// DWORD dwFlags = 0;
+// if (SUCCEEDED(hr))
+// {
+// hr = m_pCaptureClient->GetBuffer(&pbData, &nFrames, &dwFlags, nullptr, nullptr);
+// unsigned int incomingBufferSize = nFrames * m_sourceFrameSizeInBytes;
+//
+// if (MAX_RAW_BUFFER_SIZE - uAccumulatedBytes < incomingBufferSize)
+// {
+// // Send what has been accumulated
+// if (transportController)
+// {
+// transportController->WriteAudio(pLocalBuffer, uAccumulatedBytes);
+// }
+//
+// // Reset our counter
+// uAccumulatedBytes = 0;
+// }
+//
+// memcpy(pLocalBuffer + uAccumulatedBytes, pbData, incomingBufferSize);
+// uAccumulatedBytes += incomingBufferSize;
+// }
+//
+// if (SUCCEEDED(hr))
+// {
+// hr = m_pCaptureClient->ReleaseBuffer(nFrames);
+// }
+// }
+// else if (WAIT_OBJECT_0 + 1 == waitResult)
+// {
+// // We're being asked to shutdown
+// break;
+// }
+// else
+// {
+// // Unknown return value
+// DbgRaiseAssertionFailure();
+// }
+// }
+// }
+// delete[] pLocalBuffer;
+//}
+//
+//HRESULT BackEndAudio::StartAudioThreads()
+//{
+// hShutdownEvent = CreateEventEx(NULL, NULL, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS);
+// if (!hShutdownEvent)
+// {
+// return HRESULT_FROM_WIN32(GetLastError());
+// }
+//
+// m_CaptureThread = ThreadPool::RunAsync(ref new WorkItemHandler(this, &BackEndAudio::CaptureThread), WorkItemPriority::High, WorkItemOptions::TimeSliced);
+// return S_OK;
+//}
+//
+//BackEndAudio::~BackEndAudio()
+//{
+// if (transportController)
+// {
+// transportController->AudioMessageReceived -= onTransportMessageReceivedHandlerToken;
+// transportController = nullptr;
+// }
+//}
+//
+//HRESULT BackEndAudio::InitRender()
+//{
+// HRESULT hr = E_FAIL;
+//
+// LPCWSTR pwstrRendererId = GetDefaultAudioRenderId(AudioDeviceRole::Communications);
+//
+// if (NULL == pwstrRendererId)
+// {
+// hr = E_FAIL;
+// }
+//
+// hr = ActivateAudioInterface(pwstrRendererId, __uuidof(IAudioClient2), (void**)&m_pDefaultRenderDevice);
+//
+// // Set the category through SetClientProperties
+// AudioClientProperties properties = {};
+// if (SUCCEEDED(hr))
+// {
+// properties.cbSize = sizeof AudioClientProperties;
+// properties.eCategory = AudioCategory_Communications;
+// hr = m_pDefaultRenderDevice->SetClientProperties(&properties);
+// }
+//
+// WAVEFORMATEX* pwfx = nullptr;
+// if (SUCCEEDED(hr))
+// {
+// hr = m_pDefaultRenderDevice->GetMixFormat(&pwfx);
+// }
+//
+// WAVEFORMATEX format = {};
+// if (SUCCEEDED(hr))
+// {
+// FillPcmFormat(format, pwfx->nChannels, pwfx->nSamplesPerSec, pwfx->wBitsPerSample);
+// hr = m_pDefaultRenderDevice->Initialize(AUDCLNT_SHAREMODE_SHARED,
+// 0,
+// 2000 * 10000, // Seconds in hns
+// 0, // periodicity
+// &format,
+// NULL);
+// }
+//
+// if (SUCCEEDED(hr))
+// {
+// hr = m_pDefaultRenderDevice->GetService(__uuidof(IAudioRenderClient), (void**)&m_pRenderClient);
+// }
+//
+// // Check for other supported GetService interfaces as well
+// if (SUCCEEDED(hr))
+// {
+// hr = m_pDefaultRenderDevice->GetService(__uuidof(IAudioClock), (void**)&m_pClock);
+// }
+//
+// if (SUCCEEDED(hr))
+// {
+// hr = m_pDefaultRenderDevice->GetService(__uuidof(ISimpleAudioVolume), (void**)&m_pVolume);
+// }
+//
+// if (SUCCEEDED(hr))
+// {
+// hr = m_pDefaultRenderDevice->GetBufferSize(&m_nMaxFrameCount);
+// }
+//
+// if (SUCCEEDED(hr))
+// {
+// hr = m_pDefaultRenderDevice->Start();
+// }
+//
+// if (pwstrRendererId)
+// {
+// CoTaskMemFree((LPVOID)pwstrRendererId);
+// }
+//
+// return hr;
+//}
+//
+//HRESULT BackEndAudio::InitCapture()
+//{
+// HRESULT hr = E_FAIL;
+//
+// LPCWSTR pwstrCaptureId = GetDefaultAudioCaptureId(AudioDeviceRole::Communications);
+//
+// if (NULL == pwstrCaptureId)
+// {
+// hr = E_FAIL;
+// }
+//
+// hr = ActivateAudioInterface(pwstrCaptureId, __uuidof(IAudioClient2), (void**)&m_pDefaultCaptureDevice);
+//
+// if (SUCCEEDED(hr))
+// {
+// hr = m_pDefaultCaptureDevice->GetMixFormat(&m_pwfx);
+// }
+//
+// // Set the category through SetClientProperties
+// AudioClientProperties properties = {};
+// if (SUCCEEDED(hr))
+// {
+// properties.cbSize = sizeof AudioClientProperties;
+// properties.eCategory = AudioCategory_Communications;
+// hr = m_pDefaultCaptureDevice->SetClientProperties(&properties);
+// }
+//
+// if (SUCCEEDED(hr))
+// {
+// WAVEFORMATEX format = {};
+// if (SUCCEEDED(hr))
+// {
+//
+// FillPcmFormat(format, m_pwfx->nChannels, m_pwfx->nSamplesPerSec, m_pwfx->wBitsPerSample);
+//
+// m_sourceFrameSizeInBytes = (format.wBitsPerSample / 8) * format.nChannels;
+// hr = m_pDefaultCaptureDevice->Initialize(AUDCLNT_SHAREMODE_SHARED, 0x88140000, 1000 * 10000, 0, &format, NULL);
+// }
+// }
+//
+// if (SUCCEEDED(hr))
+// {
+// hCaptureEvent = CreateEventEx(NULL, NULL, 0, EVENT_ALL_ACCESS);
+// if (NULL == hCaptureEvent)
+// {
+// hr = HRESULT_FROM_WIN32(GetLastError());
+// }
+// }
+//
+// if (SUCCEEDED(hr))
+// {
+// hr = m_pDefaultCaptureDevice->SetEventHandle(hCaptureEvent);
+// }
+//
+// if (SUCCEEDED(hr))
+// {
+// hr = m_pDefaultCaptureDevice->GetService(__uuidof(IAudioCaptureClient), (void**)&m_pCaptureClient);
+// }
+//
+// if (pwstrCaptureId)
+// {
+// CoTaskMemFree((LPVOID)pwstrCaptureId);
+// }
+// return hr;
+//}
+//
+//void BackEndAudio::SetTransport(BackEndTransport^ transport)
+//{
+// transportController = transport;
+// if (transportController != nullptr)
+// {
+// onTransportMessageReceivedHandlerToken = transportController->AudioMessageReceived += onTransportMessageReceivedHandler;
+// }
+//}
diff --git a/BackEnd/BackEndAudio.h b/BackEnd/BackEndAudio.h
new file mode 100755
index 0000000..bf59fd8
--- /dev/null
+++ b/BackEnd/BackEndAudio.h
@@ -0,0 +1,78 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+#pragma once
+#include "windows.h"
+
+#define MAX_RAW_BUFFER_SIZE 1024*128
+
+#include
+#include
+#include
+
+#include "BackEndTransport.h"
+
+namespace PhoneVoIPApp
+{
+ namespace BackEnd
+ {
+ //public ref class BackEndAudio sealed
+ //{
+ //public:
+ // // Constructor
+ // BackEndAudio();
+
+ // // Destructor
+ // virtual ~BackEndAudio();
+
+ // void SetTransport(BackEndTransport^ transport);
+ //
+ // void Start();
+ // void Stop();
+
+ //private:
+ // HRESULT InitRender();
+ // HRESULT InitCapture();
+ // HRESULT StartAudioThreads();
+ // void CaptureThread(Windows::Foundation::IAsyncAction^ operation);
+ // void OnTransportMessageReceived(Windows::Storage::Streams::IBuffer^ stream, UINT64, UINT64);
+ //
+ // BackEndTransport^ transportController;
+
+ // PhoneVoIPApp::BackEnd::MessageReceivedEventHandler^ onTransportMessageReceivedHandler;
+ // Windows::Foundation::EventRegistrationToken onTransportMessageReceivedHandlerToken;
+
+ // int m_sourceFrameSizeInBytes;
+
+ // WAVEFORMATEX* m_pwfx;
+
+ // // Devices
+ // IAudioClient2* m_pDefaultRenderDevice;
+ // IAudioClient2* m_pDefaultCaptureDevice;
+
+ // // Actual render and capture objects
+ // IAudioRenderClient* m_pRenderClient;
+ // IAudioCaptureClient* m_pCaptureClient;
+
+ // // Misc interfaces
+ // IAudioClock* m_pClock;
+ // ISimpleAudioVolume* m_pVolume;
+
+ // // Audio buffer size
+ // UINT32 m_nMaxFrameCount;
+ // HANDLE hCaptureEvent;
+
+ // // Event for stopping audio capture/render
+ // HANDLE hShutdownEvent;
+
+ // Windows::Foundation::IAsyncAction^ m_CaptureThread;
+
+ // // Has audio started?
+ // bool started;
+ //};
+ }
+}
diff --git a/BackEnd/BackEndCapture.cpp b/BackEnd/BackEndCapture.cpp
new file mode 100755
index 0000000..57f10ab
--- /dev/null
+++ b/BackEnd/BackEndCapture.cpp
@@ -0,0 +1,266 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+#include "BackEndCapture.h"
+#include "ApiLock.h"
+#include
+
+using namespace PhoneVoIPApp::BackEnd;
+using namespace Windows::System::Threading;
+using namespace Microsoft::WRL;
+using namespace Windows::Foundation;
+using namespace Platform;
+using namespace Windows::Phone::Media::Capture;
+using namespace Windows::Storage::Streams;
+using namespace Concurrency;
+
+BackEndCapture::BackEndCapture() :
+ started(false),
+ videoOnlyDevice(nullptr),
+ pVideoSink(NULL),
+ pVideoDevice(NULL),
+ cameraLocation(CameraSensorLocation::Front)
+{
+ hStopCompleted = CreateEventEx(NULL, NULL, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS);
+ if (!hStopCompleted)
+ {
+ throw ref new Platform::Exception(HRESULT_FROM_WIN32(GetLastError()), L"Could not create shutdown event");
+ }
+
+ hStartCompleted = CreateEventEx(NULL, NULL, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS);
+ if (!hStartCompleted)
+ {
+ throw ref new Platform::Exception(HRESULT_FROM_WIN32(GetLastError()), L"Could not create start event");
+ }
+}
+
+void BackEndCapture::Start(CameraLocation newCameraLocation)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (started)
+ return;
+ if(newCameraLocation == CameraLocation::Front)
+ {
+ cameraLocation = Windows::Phone::Media::Capture::CameraSensorLocation::Front;
+ }
+ else if(newCameraLocation == CameraLocation::Back)
+ {
+ cameraLocation = Windows::Phone::Media::Capture::CameraSensorLocation::Back;
+ }
+
+ InitCapture();
+
+ started = true;
+}
+
+void BackEndCapture::Stop()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+ ::OutputDebugString(L"+[BackendCapture::Stop] => Trying to stop capture\n");
+ if (!started)
+ {
+ ::OutputDebugString(L"-[BackendCapture::Stop] => finished stopping capture\n");
+ return;
+ }
+ if (videoOnlyDevice)
+ {
+ OutputDebugString(L"Destroying VideoCaptureDevice\n");
+
+ try
+ {
+ videoOnlyDevice->StopRecordingAsync()->Completed = ref new AsyncActionCompletedHandler([this] (IAsyncAction ^action, Windows::Foundation::AsyncStatus status){
+ if(status == Windows::Foundation::AsyncStatus::Completed)
+ {
+ OutputDebugString(L"[BackendCapture::StopRecordingAsync] Video successfully stopped.\n");
+ }
+ else
+ {
+ OutputDebugString(L"[BackEndCapture::StopRecordingAsync] Error occurred while stopping recording.\n");
+ }
+ this->videoCaptureAction = nullptr;
+ this->videoOnlyDevice = nullptr;
+ started = false;
+ SetEvent(hStopCompleted);
+ });
+ }
+ catch(...)
+ {
+ // A Platform::ObjectDisposedException can be raised if the app has had its access
+ // to video revoked (most commonly when the app is going out of the foreground)
+ OutputDebugString(L"Exception caught while destroying video capture\n");
+ this->videoCaptureAction = nullptr;
+ this->videoOnlyDevice = nullptr;
+ started = false;
+ SetEvent(hStopCompleted);
+ }
+
+ if (pVideoDevice)
+ {
+ pVideoDevice->Release();
+ pVideoDevice = NULL;
+ }
+
+ if (pVideoSink)
+ {
+ pVideoSink->Release();
+ pVideoSink = NULL;
+ }
+ }
+ ::OutputDebugString(L"-[BackendCapture::Stop] => finished stopping capture\n");
+}
+
+BackEndCapture::~BackEndCapture()
+{
+ if(m_ToggleThread)
+ {
+ m_ToggleThread->Cancel();
+ m_ToggleThread->Close();
+ m_ToggleThread = nullptr;
+ }
+}
+
+void BackEndCapture::InitCapture()
+{
+ ::OutputDebugString(L"+[BackendCapture::InitCapture] => Initializing Capture\n");
+ Windows::Foundation::Size dimensions;
+ dimensions.Width = 640;
+ dimensions.Height = 480;
+ Collections::IVectorView ^availableSizes = AudioVideoCaptureDevice::GetAvailableCaptureResolutions(this->cameraLocation);
+ Collections::IIterator ^availableSizesIterator = availableSizes->First();
+
+ IAsyncOperation ^openOperation = nullptr;
+ while(!openOperation && availableSizesIterator->HasCurrent)
+ {
+ // TODO: You should select the appropriate resolution that's supported here,
+ // TODO: and then setup your renderer with that selected res.
+ // TODO: This shows how to iterate through all supported resolutions. We're assuming 640x480 support
+ if(availableSizesIterator->Current.Height == 480 && availableSizesIterator->Current.Width == 640)
+ {
+ openOperation = AudioVideoCaptureDevice::OpenForVideoOnlyAsync(this->cameraLocation, dimensions);
+ }
+ availableSizesIterator->MoveNext();
+ }
+
+ openOperation->Completed = ref new AsyncOperationCompletedHandler([this] (IAsyncOperation ^operation, Windows::Foundation::AsyncStatus status)
+ {
+ if(status == Windows::Foundation::AsyncStatus::Completed)
+ {
+ std::lock_guard lock(g_apiLock);
+
+ ::OutputDebugString(L"+[BackendCapture::InitCapture] => OpenAsyncOperation started\n");
+
+ auto videoDevice = operation->GetResults();
+
+ this->videoOnlyDevice = videoDevice;
+ IAudioVideoCaptureDeviceNative *pNativeDevice = NULL;
+ HRESULT hr = reinterpret_cast(videoDevice)->QueryInterface(__uuidof(IAudioVideoCaptureDeviceNative), (void**) &pNativeDevice);
+
+ if (NULL == pNativeDevice || FAILED(hr))
+ {
+ throw ref new FailureException("Unable to QI IAudioVideoCaptureDeviceNative");
+ }
+
+ // Save off the native device
+ this->pVideoDevice = pNativeDevice;
+
+ // Create the sink
+ MakeAndInitialize(&(this->pVideoSink), transportController);
+ this->pVideoSink->SetTransport(this->transportController);
+ pNativeDevice->SetVideoSampleSink(this->pVideoSink);
+
+ // Use the same encoding format as in VideoMediaStreamSource.cs
+ videoDevice->VideoEncodingFormat = CameraCaptureVideoFormat::H264;
+
+ SetEvent(hStartCompleted);
+
+ // Start recording to our sink
+ this->videoCaptureAction = videoDevice->StartRecordingToSinkAsync();
+ videoCaptureAction->Completed = ref new AsyncActionCompletedHandler([this] (IAsyncAction ^asyncInfo, Windows::Foundation::AsyncStatus status)
+ {
+ if(status == Windows::Foundation::AsyncStatus::Completed)
+ {
+ ::OutputDebugString(L"[BackendCapture::InitCapture] => StartRecordingToSinkAsync completed\n");
+ }
+ else if(status == Windows::Foundation::AsyncStatus::Error || status == Windows::Foundation::AsyncStatus::Canceled)
+ {
+ ::OutputDebugString(L"[BackendCapture::InitCapture] => StartRecordingToSinkAsync did not complete\n");
+ }
+ });
+
+ ::OutputDebugString(L"-[BackendCapture::InitCapture] => OpenAsyncOperation Completed\n");
+ }
+ else if(status == Windows::Foundation::AsyncStatus::Canceled)
+ {
+ ::OutputDebugString(L"[BackendCapture::InitCapture] => OpenAsyncOperation Canceled\n");
+ }
+ else if(status == Windows::Foundation::AsyncStatus::Error)
+ {
+ ::OutputDebugString(L"[BackendCapture::InitCapture] => OpenAsyncOperation encountered an error.\n");
+ }
+ });
+ ::OutputDebugString(L"-[BackendCapture::InitCapture] => Initializing Capture\n");
+}
+
+void BackEndCapture::ToggleCamera()
+{
+ std::lock_guard lock(g_apiLock);
+
+ if(m_ToggleThread)
+ {
+ m_ToggleThread->Cancel();
+ m_ToggleThread->Close();
+ m_ToggleThread = nullptr;
+ }
+
+ m_ToggleThread = ThreadPool::RunAsync(ref new WorkItemHandler(this, &BackEndCapture::ToggleCameraThread), WorkItemPriority::High, WorkItemOptions::TimeSliced);
+}
+
+
+void BackEndCapture::ToggleCameraThread(Windows::Foundation::IAsyncAction^ operation)
+{
+ ::OutputDebugString(L"+[BackendCapture::ToggleCamera] => Toggling camera \n");
+ CameraLocation newCameraLocation;
+ ResetEvent(hStopCompleted);
+ Stop();
+ DWORD waitResult = WaitForSingleObjectEx(hStopCompleted, INFINITE, FALSE);
+ if(waitResult == WAIT_OBJECT_0)
+ {
+ ResetEvent(hStartCompleted);
+ if(cameraLocation == Windows::Phone::Media::Capture::CameraSensorLocation::Back)
+ {
+ newCameraLocation = CameraLocation::Front;
+ }
+ else
+ {
+ newCameraLocation = CameraLocation::Back;
+ }
+ Start(newCameraLocation);
+ }
+ else
+ {
+ throw ref new Platform::Exception(HRESULT_FROM_WIN32(waitResult), L"Error waiting for capture to stop when toggling cameras");
+ }
+
+ waitResult = WaitForSingleObjectEx(hStartCompleted, INFINITE, FALSE);
+ if(waitResult == WAIT_OBJECT_0)
+ {
+ CameraLocationChanged(newCameraLocation);
+ }
+ else
+ {
+ throw ref new Platform::Exception(HRESULT_FROM_WIN32(waitResult), L"Error waiting for capture to start when toggling cameras");
+ }
+ ::OutputDebugString(L"-[BackendCapture::ToggleCamera] => Toggling camera \n");
+}
+
+void BackEndCapture::SetTransport(BackEndTransport^ transport)
+{
+ transportController = transport;
+}
diff --git a/BackEnd/BackEndCapture.h b/BackEnd/BackEndCapture.h
new file mode 100755
index 0000000..d97aea3
--- /dev/null
+++ b/BackEnd/BackEndCapture.h
@@ -0,0 +1,110 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+#pragma once
+#include "windows.h"
+#include "implements.h"
+#include "ICallControllerStatusListener.h"
+#include "BackEndTransport.h"
+#include
+#include
+
+namespace PhoneVoIPApp
+{
+ namespace BackEnd
+ {
+ public delegate void CameraLocationChangedEventHandler(PhoneVoIPApp::BackEnd::CameraLocation);
+
+ class CaptureSampleSink :
+ public Microsoft::WRL::RuntimeClass<
+ Microsoft::WRL::RuntimeClassFlags,
+ ICameraCaptureSampleSink>
+ {
+ DWORD m_dwSampleCount;
+ BackEndTransport ^m_transport;
+
+ public:
+
+ STDMETHODIMP RuntimeClassInitialize(BackEndTransport ^transportController)
+ {
+ m_dwSampleCount = 0;
+ m_transport = transportController;
+ return S_OK;
+ }
+
+ DWORD GetSampleCount()
+ {
+ return m_dwSampleCount;
+ }
+
+ IFACEMETHODIMP_(void)
+ OnSampleAvailable(
+ ULONGLONG hnsPresentationTime,
+ ULONGLONG hnsSampleDuration,
+ DWORD cbSample,
+ BYTE* pSample)
+ {
+ m_dwSampleCount++;
+ if (m_transport)
+ {
+ m_transport->WriteVideo(pSample, cbSample, hnsPresentationTime, hnsSampleDuration);
+ }
+ }
+
+ void SetTransport(BackEndTransport ^transport)
+ {
+ m_transport = transport;
+ }
+ };
+
+ public ref class BackEndCapture sealed
+ {
+ public:
+ // Constructor
+ BackEndCapture();
+
+ void SetTransport(BackEndTransport^ transport);
+
+ void Start(CameraLocation cameraLocation);
+ void Stop();
+
+ void ToggleCamera();
+
+ event CameraLocationChangedEventHandler^ CameraLocationChanged;
+
+ private:
+ // Destructor
+ ~BackEndCapture();
+
+ void InitCapture();
+
+ void ToggleCameraThread(Windows::Foundation::IAsyncAction^ operation);
+
+ // Has capture started?
+ bool started;
+
+ // Events to signal whether capture has stopped/started
+ HANDLE hStopCompleted;
+ HANDLE hStartCompleted;
+
+ Windows::Foundation::IAsyncAction^ m_ToggleThread;
+
+ // Transport
+ BackEndTransport^ transportController;
+
+ // Native sink and video device
+ CaptureSampleSink *pVideoSink;
+ IAudioVideoCaptureDeviceNative *pVideoDevice;
+
+ Windows::Phone::Media::Capture::CameraSensorLocation cameraLocation;
+
+ Windows::Phone::Media::Capture::AudioVideoCaptureDevice ^videoOnlyDevice;
+ Windows::Foundation::IAsyncAction ^videoCaptureAction;
+
+ };
+ }
+}
diff --git a/BackEnd/BackEndNativeBuffer.h b/BackEnd/BackEndNativeBuffer.h
new file mode 100755
index 0000000..50fd638
--- /dev/null
+++ b/BackEnd/BackEndNativeBuffer.h
@@ -0,0 +1,108 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+#pragma once
+#include "windows.h"
+#include
+#include
+#include
+#include
+#include
+
+namespace PhoneVoIPApp
+{
+ namespace BackEnd
+ {
+
+ ///
+ /// The purpose of this class is to transform byte buffers into an IBuffer
+ ///
+ class NativeBuffer : public Microsoft::WRL::RuntimeClass<
+ Microsoft::WRL::RuntimeClassFlags< Microsoft::WRL::RuntimeClassType::WinRtClassicComMix >,
+ ABI::Windows::Storage::Streams::IBuffer,
+ Windows::Storage::Streams::IBufferByteAccess,
+ Microsoft::WRL::FtmBase>
+ {
+
+ public:
+ virtual ~NativeBuffer()
+ {
+ if (m_pBuffer && m_bIsOwner)
+ {
+ delete[] m_pBuffer;
+ m_pBuffer = NULL;
+ }
+ }
+
+ STDMETHODIMP RuntimeClassInitialize(UINT totalSize)
+ {
+ m_uLength = totalSize;
+ m_uFullSize = totalSize;
+ m_pBuffer = new BYTE[totalSize];
+ m_bIsOwner = TRUE;
+ return S_OK;
+ }
+
+ STDMETHODIMP RuntimeClassInitialize(BYTE* pBuffer, UINT totalSize, BOOL fTakeOwnershipOfPassedInBuffer)
+ {
+ m_uLength = totalSize;
+ m_uFullSize = totalSize;
+ m_pBuffer = pBuffer;
+ m_bIsOwner = fTakeOwnershipOfPassedInBuffer;
+ return S_OK;
+ }
+
+ STDMETHODIMP Buffer( BYTE **value)
+ {
+ *value = m_pBuffer;
+ return S_OK;
+ }
+
+ STDMETHODIMP get_Capacity(UINT32 *value)
+ {
+ *value = m_uFullSize;
+ return S_OK;
+ }
+
+ STDMETHODIMP get_Length(UINT32 *value)
+ {
+ *value = m_uLength;
+ return S_OK;
+ }
+
+ STDMETHODIMP put_Length(UINT32 value)
+ {
+ if(value > m_uFullSize)
+ {
+ return E_INVALIDARG;
+ }
+ m_uLength = value;
+ return S_OK;
+ }
+
+ static Windows::Storage::Streams::IBuffer^ GetIBufferFromNativeBuffer(Microsoft::WRL::ComPtr spNativeBuffer)
+ {
+ auto iinspectable = reinterpret_cast(spNativeBuffer.Get());
+ return reinterpret_cast(iinspectable);
+ }
+ static BYTE* GetBytesFromIBuffer(Windows::Storage::Streams::IBuffer^ buffer)
+ {
+ auto iinspectable = (IInspectable*)reinterpret_cast(buffer);
+ Microsoft::WRL::ComPtr spBuffAccess;
+ HRESULT hr = iinspectable->QueryInterface(__uuidof(Windows::Storage::Streams::IBufferByteAccess), (void **)&spBuffAccess);
+ UCHAR * pReadBuffer;
+ spBuffAccess->Buffer(&pReadBuffer);
+ return pReadBuffer;
+ }
+ private:
+ UINT32 m_uLength;
+ UINT32 m_uFullSize;
+ BYTE* m_pBuffer;
+ BOOL m_bIsOwner;
+ };
+ }
+}
diff --git a/BackEnd/BackEndTransport.cpp b/BackEnd/BackEndTransport.cpp
new file mode 100755
index 0000000..c17052c
--- /dev/null
+++ b/BackEnd/BackEndTransport.cpp
@@ -0,0 +1,74 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+#include "BackEndTransport.h"
+#include "BackEndNativeBuffer.h"
+#include
+
+using namespace PhoneVoIPApp::BackEnd;
+using namespace Platform;
+using namespace Windows::Foundation;
+using namespace Windows::Storage::Streams;
+using namespace Windows::System::Threading;
+using namespace Microsoft::WRL;
+using namespace Microsoft::WRL::Details;
+
+BackEndTransport::BackEndTransport()
+{
+}
+
+
+void BackEndTransport::WriteAudio(BYTE* bytes, int byteCount)
+{
+ Write(bytes, byteCount, TransportMessageType::Audio, 0, 0);
+}
+
+void BackEndTransport::WriteVideo(BYTE* bytes, int byteCount, UINT64 hnsPresenationTime, UINT64 hnsSampleDuration)
+
+{
+ Write(bytes, byteCount, TransportMessageType::Video, hnsPresenationTime, hnsSampleDuration);
+}
+
+void BackEndTransport::Write(BYTE* bytes, int byteCount, TransportMessageType::Value dataType, UINT64 hnsPresenationTime, UINT64 hnsSampleDuration)
+{
+
+ static const int MaxPacketSize = 10*1024*1024;
+
+ int bytesToSend = byteCount;
+
+ while (bytesToSend)
+ {
+ int chunkSize = bytesToSend > MaxPacketSize ? MaxPacketSize : bytesToSend;
+ ComPtr spNativeBuffer = NULL;
+ if (dataType == TransportMessageType::Audio)
+ {
+ MakeAndInitialize(&spNativeBuffer, bytes, chunkSize, FALSE);
+ AudioMessageReceived(NativeBuffer::GetIBufferFromNativeBuffer(spNativeBuffer), hnsPresenationTime, hnsSampleDuration);
+ }
+ else
+ {
+ // Temporarily duplicating this for sample so that MSS can own this
+ // buffer, and will be released when the stream itself is released
+ BYTE* pMem = new BYTE[chunkSize];
+
+ memcpy((void*) pMem, (void*) bytes, chunkSize);
+
+ MakeAndInitialize(&spNativeBuffer, pMem, chunkSize, TRUE);
+ VideoMessageReceived(NativeBuffer::GetIBufferFromNativeBuffer(spNativeBuffer), hnsPresenationTime, hnsSampleDuration);
+ }
+
+ // Increment byte position
+ bytes += chunkSize;
+ bytesToSend -= chunkSize;
+ }
+ return;
+
+}
+
+BackEndTransport::~BackEndTransport()
+{
+}
diff --git a/BackEnd/BackEndTransport.h b/BackEnd/BackEndTransport.h
new file mode 100755
index 0000000..f8fb7bd
--- /dev/null
+++ b/BackEnd/BackEndTransport.h
@@ -0,0 +1,49 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+#pragma once
+#include "windows.h"
+
+namespace PhoneVoIPApp
+{
+ namespace BackEnd
+ {
+ namespace TransportMessageType
+ {
+ enum Value
+ {
+ Audio = 0,
+ Video = 1
+ };
+ }
+
+ public delegate void MessageReceivedEventHandler(Windows::Storage::Streams::IBuffer ^pBuffer, UINT64 hnsPresentationTime, UINT64 hnsSampleDuration);
+
+ ///
+ /// This is an abstraction of a network transport class
+ /// which does not actually send data over the network.
+ ///
+ public ref class BackEndTransport sealed
+ {
+ public:
+ // Constructor
+ BackEndTransport();
+
+ // Destructor
+ virtual ~BackEndTransport();
+
+ void WriteAudio(BYTE* bytes, int byteCount);
+ void WriteVideo(BYTE* bytes, int byteCount, UINT64 hnsPresentationTime, UINT64 hnsSampleDuration);
+
+ event MessageReceivedEventHandler^ AudioMessageReceived;
+ event MessageReceivedEventHandler^ VideoMessageReceived;
+
+ private:
+ void Write(BYTE* bytes, int byteCount, TransportMessageType::Value dataType, UINT64 hnsPresentationTime, UINT64 hnsSampleDurationTime);
+ };
+ }
+}
diff --git a/BackEnd/BackgroundTask.cpp b/BackEnd/BackgroundTask.cpp
new file mode 100755
index 0000000..1bf64e9
--- /dev/null
+++ b/BackEnd/BackgroundTask.cpp
@@ -0,0 +1,44 @@
+#include "BackgroundTask.h"
+#include "Globals.h"
+#include "CallController.h"
+
+using namespace PhoneVoIPApp::BackEnd;
+using namespace Windows::ApplicationModel::Background;
+using namespace Windows::Phone::Networking::Voip;
+using namespace Windows::Foundation;
+using namespace Platform;
+using namespace Windows::Phone::Media::Devices;
+
+BackgroundTask::BackgroundTask()
+{
+
+}
+
+void BackgroundTask::Run(IBackgroundTaskInstance^ taskInstance){
+
+ return;
+
+ VoipCallCoordinator^ callCoordinator = Windows::Phone::Networking::Voip::VoipCallCoordinator::GetDefault();
+
+ Windows::Phone::Networking::Voip::VoipPhoneCall^ incomingCall;
+
+ String^ installFolder = String::Concat(Windows::ApplicationModel::Package::Current->InstalledLocation->Path, "\\");
+ TimeSpan timeout;
+ timeout.Duration = 90 * 10 * 1000 * 1000; // in 100ns units
+ callCoordinator->RequestNewIncomingCall(
+ ref new String(L"/Views/ShellView.xaml"),
+ ref new String(L"test contact"),
+ ref new String(L"test number"),
+ ref new Uri(installFolder, "Assets\\DefaultContactImage.png"),
+ ref new String(L"PhoneVoIPApp"),
+ ref new Uri(installFolder, "Assets\\ApplicationIcon.png"),
+ ref new String(L"call details"), // Was this call forwarded/delegated to this user on behalf of someone else? At this time, we won't use this field
+ ref new Uri(installFolder, "Assets\\Ringtone.wma"),
+ VoipCallMedia::Audio,
+ timeout, // Maximum amount of time to ring for
+ &incomingCall);
+}
+
+void BackgroundTask::IncomingCallDissmissed(){
+
+}
diff --git a/BackEnd/BackgroundTask.h b/BackEnd/BackgroundTask.h
new file mode 100755
index 0000000..2188804
--- /dev/null
+++ b/BackEnd/BackgroundTask.h
@@ -0,0 +1,21 @@
+#pragma once
+
+using namespace Windows::ApplicationModel::Background;
+
+namespace PhoneVoIPApp
+{
+ namespace BackEnd
+ {
+ [Windows::Foundation::Metadata::WebHostHidden]
+ public ref class BackgroundTask sealed : public IBackgroundTask
+ {
+ public:
+ BackgroundTask();
+ virtual void Run(IBackgroundTaskInstance^ taskInstance);
+
+ private:
+ void IncomingCallDissmissed();
+ };
+ }
+}
+
diff --git a/BackEnd/CallController.cpp b/BackEnd/CallController.cpp
new file mode 100755
index 0000000..b93689f
--- /dev/null
+++ b/BackEnd/CallController.cpp
@@ -0,0 +1,1133 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+#include "CallController.h"
+#include "BackEndAudio.h"
+#include "BackEndCapture.h"
+#include "Server.h"
+
+using namespace PhoneVoIPApp::BackEnd;
+using namespace Platform;
+using namespace Windows::Foundation;
+using namespace Windows::Phone::Media::Devices;
+using namespace Windows::Phone::Networking::Voip;
+
+LibTgVoipStateListener::LibTgVoipStateListener(){
+
+}
+
+void LibTgVoipStateListener::OnCallStateChanged(libtgvoip::VoIPControllerWrapper^ sender, libtgvoip::CallState newState)
+{
+ if (this->statusListener != nullptr){
+ this->statusListener->OnCallStateChanged((CallState)newState);
+ }
+}
+
+void LibTgVoipStateListener::OnSignalBarsChanged(libtgvoip::VoIPControllerWrapper^ sender, int newSignal)
+{
+ if (this->statusListener != nullptr){
+ this->statusListener->OnSignalBarsChanged(newSignal);
+ }
+}
+
+void LibTgVoipStateListener::SetStatusCallback(ICallControllerStatusListener^ statusListener)
+{
+ this->statusListener = statusListener;
+}
+
+void CallController::StartMTProtoUpdater()
+{
+ if (Globals::Instance->MTProtoUpdater != nullptr)
+ {
+ Globals::Instance->MTProtoUpdater->Start(0, 0, 0);
+ }
+}
+
+void CallController::StopMTProtoUpdater()
+{
+ if (Globals::Instance->MTProtoUpdater != nullptr)
+ {
+ Globals::Instance->MTProtoUpdater->Stop();
+ }
+}
+
+void CallController::HandleUpdatePhoneCall()
+{
+
+ ::OutputDebugString(L"[CallController::HandleUpdatePhoneCall]\n");
+}
+
+void CallController::CreateVoIPControllerWrapper()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ wrapper = ref new libtgvoip::VoIPControllerWrapper();
+
+ //wrapper->SetStateCallback(stateListener);
+ wrapper->CallStateChanged += ref new libtgvoip::CallStateChangedEventHandler(
+ stateListener,
+ &LibTgVoipStateListener::OnCallStateChanged
+ );
+ wrapper->SignalBarsChanged += ref new libtgvoip::SignalBarsChangedEventHandler(
+ stateListener,
+ &LibTgVoipStateListener::OnSignalBarsChanged
+ );
+}
+
+void CallController::DeleteVoIPControllerWrapper()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (wrapper != nullptr){
+ delete wrapper;
+ wrapper = nullptr;
+ }
+}
+
+void CallController::SetConfig(Config config)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (wrapper != nullptr)
+ {
+ wrapper->SetConfig(config.InitTimeout, config.RecvTimeout, (libtgvoip::DataSavingMode)config.DataSavingMode, config.EnableAEC, config.EnableNS, config.EnableAGC, config.LogFilePath, config.StatsDumpFilePath);
+ }
+}
+
+void CallController::SetEncryptionKey(const Platform::Array^ key, bool isOutgoing)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (wrapper != nullptr)
+ {
+ wrapper->SetEncryptionKey(key, isOutgoing);
+ }
+}
+
+void CallController::SetPublicEndpoints(const Platform::Array^ endpoints, bool allowP2P, int connectionMaxLayer)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (wrapper != nullptr)
+ {
+ auto points = ref new Platform::Array(endpoints->Length);
+
+ for (int i = 0; i < endpoints->Length; i++)
+ {
+ auto point = ref new libtgvoip::Endpoint();
+ point->id = endpoints[i].id;
+ point->port = endpoints[i].port;
+ point->ipv4 = endpoints[i].ipv4;
+ point->ipv6 = endpoints[i].ipv6;
+
+ auto length = endpoints[i].peerTag->Length();
+ auto it = endpoints[i].peerTag->Begin();
+ auto peerTag = ref new Platform::Array(length);
+ for (size_t i = 0; i < length; i++)
+ {
+ peerTag[i] = (byte)it[i];
+ }
+ point->peerTag = peerTag;
+
+ points[i] = point;
+ }
+
+ wrapper->SetPublicEndpoints(points, allowP2P, connectionMaxLayer);
+ }
+}
+
+void CallController::SetProxy(ProxyStruct proxy)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (wrapper != nullptr)
+ {
+ wrapper->SetProxy((libtgvoip::ProxyProtocol)proxy.protocol, proxy.address, proxy.port, proxy.username, proxy.password);
+ }
+}
+
+void CallController::Start()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (wrapper != nullptr)
+ {
+ wrapper->Start();
+ }
+}
+
+void Handler(Windows::System::Threading::ThreadPoolTimer^ timer){
+ ::OutputDebugString(L"PeriodicTimer.Handler");
+}
+
+void CallController::Connect()
+{
+ ::OutputDebugString(L"[CallController::Connect]\n");
+
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (wrapper != nullptr)
+ {
+ wrapper->Connect();
+ }
+}
+
+void CallController::SetMicMute(bool mute)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (wrapper != nullptr){
+ wrapper->SetMicMute(mute);
+ }
+}
+void CallController::SwitchSpeaker(bool external)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ libtgvoip::VoIPControllerWrapper::SwitchSpeaker(external);
+}
+
+void CallController::SetStatusCallback(ICallControllerStatusListener^ statusListener)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ this->statusListener = statusListener;
+ this->stateListener->SetStatusCallback(statusListener);
+}
+
+void CallController::UpdateServerConfig(Platform::String^ json)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ libtgvoip::VoIPControllerWrapper::UpdateServerConfig(json);
+}
+
+int64 CallController::GetPreferredRelayID()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (wrapper != nullptr){
+ return wrapper->GetPreferredRelayID();
+ }
+
+ return 0;
+}
+
+Error CallController::GetLastError()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (wrapper != nullptr){
+ return (Error)wrapper->GetLastError();
+ }
+
+ return Error::Unknown;
+}
+
+Platform::String^ CallController::GetVersion()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ return libtgvoip::VoIPControllerWrapper::GetVersion();
+}
+
+int CallController::GetSignalBarsCount()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (wrapper != nullptr){
+ return wrapper->GetSignalBarsCount();
+ }
+
+ return 0;
+}
+
+Platform::String^ CallController::GetDebugLog()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (wrapper != nullptr){
+ return wrapper->GetDebugLog();
+ }
+
+ return nullptr;
+}
+
+Platform::String^ CallController::GetDebugString()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (wrapper != nullptr){
+ return wrapper->GetDebugString();
+ }
+
+ return nullptr;
+}
+
+bool CallController::InitiateOutgoingCall(Platform::String^ recepientName, int64 recepientId, int64 id, int64 accessHash,
+ Config config, const Platform::Array^ key, bool outgoing, const Platform::Array^ emojis,
+ const Platform::Array^ endpoints, bool allowP2P, int connectionMaxLayer,
+ ProxyStruct proxy)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ VoipPhoneCall^ outgoingCall = nullptr;
+
+ // In this sample, we allow only one call at a time.
+ if (this->activeCall != nullptr)
+ {
+ ::OutputDebugString(L"[CallController::InitiateOutgoingCall] => Only one active call allowed in this sample at a time\n");
+
+ this->activeCall->NotifyCallEnded();
+
+ // If we receive a request to initiate an outgoing call when another call is in progress,
+ // we just ignore it.
+ //return false;
+ }
+
+ ::OutputDebugString(L"[CallController::InitiateOutgoingCall] => Starting outgoing call\n");
+
+ // Start a new outgoing call.
+ this->callCoordinator->RequestNewOutgoingCall(this->callInProgressPageUri, recepientName, "Telegram", VoipCallMedia::Audio
+ //| VoipCallMedia::Video
+ , &outgoingCall);
+
+ // Tell the phone service that this call is active.
+ // Normally, we do this only when the remote party has accepted the call.
+ outgoingCall->NotifyCallActive();
+
+ // Store it as the active call - assume we support both audio and video
+ this->SetActiveCall(outgoingCall, recepientId, id, accessHash, key, outgoing, emojis, VoipCallMedia::Audio
+ //| VoipCallMedia::Video
+ );
+
+ this->DeleteVoIPControllerWrapper();
+ this->CreateVoIPControllerWrapper();
+ this->SetConfig(config);
+ this->SetEncryptionKey(key, outgoing);
+ this->SetPublicEndpoints(endpoints, allowP2P, connectionMaxLayer);
+ this->SetProxy(proxy);
+ this->Start();
+ //UpdateNetworkType(null);
+ this->Connect();
+
+
+ return true;
+}
+
+bool CallController::InitiateOutgoingCall(Platform::String^ recepientName, int64 recepientId, int64 callId, int64 callAccessHash)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ VoipPhoneCall^ outgoingCall = nullptr;
+
+ // In this sample, we allow only one call at a time.
+ if (this->activeCall != nullptr)
+ {
+ ::OutputDebugString(L"[CallController::InitiateOutgoingCall] => Only one active call allowed in this sample at a time\n");
+
+ // If we receive a request to initiate an outgoing call when another call is in progress,
+ // we just ignore it.
+ return false;
+ }
+
+ ::OutputDebugString(L"[CallController::InitiateOutgoingCall] => Starting outgoing call\n");
+
+ // Start a new outgoing call.
+ this->callCoordinator->RequestNewOutgoingCall(this->callInProgressPageUri, recepientName, "Telegram", VoipCallMedia::Audio
+ //| VoipCallMedia::Video
+ , &outgoingCall);
+
+ // Tell the phone service that this call is active.
+ // Normally, we do this only when the remote party has accepted the call.
+ outgoingCall->NotifyCallActive();
+
+ // Store it as the active call - assume we support both audio and video
+ this->SetActiveCall(outgoingCall, recepientId, callId, callAccessHash, nullptr, true, nullptr, VoipCallMedia::Audio
+ //| VoipCallMedia::Video
+ );
+
+ return true;
+}
+
+bool CallController::OnIncomingCallReceived(Platform::String^ contactName, int64 contactId, Platform::String^ contactImage, int64 callId, int64 callAccessHash, IncomingCallDialogDismissedCallback^ incomingCallDialogDismissedCallback)
+{
+ VoipPhoneCall^ incomingCall = nullptr;
+
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ // TODO: If required, contact your cloud service here for more information about the incoming call.
+
+ try
+ {
+ TimeSpan timeout;
+ timeout.Duration = 25 * 10 * 1000 * 1000; // in 100ns units
+
+ ::OutputDebugString(L"[CallController::OnIncomingCallReceived] => Will time out in 90 seconds\n");
+
+ // Store the caller number of this incoming call
+ this->incomingId = contactId;
+ this->incomingCallId = callId;
+ this->incomingCallAccessHash = callAccessHash;
+
+ // Store the callback that needs to be called when the incoming call dialog has been dismissed,
+ // either because the call was accepted or rejected by the user.
+ this->onIncomingCallDialogDismissed = incomingCallDialogDismissedCallback;
+ //Windows::ApplicationModel::Package::Current->InstalledLocation->Path
+ Uri^ contactImageUri = nullptr;
+ if (contactImage != nullptr)
+ {
+ String^ localFolder = String::Concat(Windows::Storage::ApplicationData::Current->LocalFolder->Path, "\\");
+ contactImageUri = ref new Uri(localFolder, contactImage);
+ }
+
+ // Ask the Phone Service to start a new incoming call
+ this->callCoordinator->RequestNewIncomingCall(
+ this->callInProgressPageUri,
+ contactName,
+ "Telegram Call",
+ contactImageUri,
+ this->voipServiceName,
+ this->brandingImageUri,
+ "", // Was this call forwarded/delegated to this user on behalf of someone else? At this time, we won't use this field
+ this->ringtoneUri,
+ VoipCallMedia::Audio, // | VoipCallMedia::Video,
+ timeout, // Maximum amount of time to ring for
+ &incomingCall);
+ }
+ catch(...)
+ {
+ // Requesting an incoming call can fail if there is already an incoming call in progress.
+ // This is rare, but possible. Treat this case like a missed call.
+ ::OutputDebugString(L"[CallController::OnIncomingCallReceived] => An exception has occurred\n");
+ return false;
+ }
+
+ // Register for events about this incoming call.
+ incomingCall->AnswerRequested += this->acceptCallRequestedHandler;
+ incomingCall->RejectRequested += this->rejectCallRequestedHandler;
+
+ return true;
+}
+
+bool CallController::HoldCall()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (this->activeCall == nullptr)
+ {
+ // Nothing to do - there is no call to put on hold
+ return false;
+ }
+
+ ::OutputDebugString(L"[CallController::HoldCall] => Trying to put call on hold\n");
+
+ // Change the call status before notifying that the call is held because
+ // access to the camera will be removed once NotifyCallHeld is called
+ this->SetCallStatus(PhoneVoIPApp::BackEnd::CallStatus::Held);
+
+ // Hold the active call
+ this->activeCall->NotifyCallHeld();
+
+ // TODO: Contact your cloud service and let it know that the active call has been put on hold.
+
+ return true;
+}
+
+bool CallController::ResumeCall()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (this->activeCall == nullptr)
+ {
+ // Nothing to do - there is no call to resume
+ return false;
+ }
+
+ ::OutputDebugString(L"[CallController::ResumeCall] => Trying to resume a call\n");
+
+ // Resume the active call
+ this->activeCall->NotifyCallActive();
+
+ // TODO: Contact your cloud service and let it know that the active call has been resumed.
+
+ // Change the call status after notifying that the call is active
+ // if it is done before access to the camera will not have been granted yet
+ this->SetCallStatus(PhoneVoIPApp::BackEnd::CallStatus::InProgress);
+
+ return true;
+}
+
+bool CallController::EndCall()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (this->activeCall == nullptr)
+ {
+ // Nothing to do - there is no call to end
+ return false;
+ }
+
+ ::OutputDebugString(L"[CallController::EndCall] => Trying to end a call\n");
+
+ // Unregister from audio endpoint changes
+ this->audioRoutingManager->AudioEndpointChanged -= this->audioEndpointChangedHandlercookie;
+
+ // TODO: Contact your cloud service and let it know that the active call has ended.
+
+ // End the active call.
+ this->activeCall->NotifyCallEnded();
+ this->activeCall = nullptr;
+
+ // Reset libtgvoip call params
+ this->key = nullptr;
+ this->callId = -1;
+ this->callAccessHash = 0;
+ this->otherPartyId = 0;
+ this->emojis = nullptr;
+
+ // Reset camera choice to front facing for next call
+ this->cameraLocation = PhoneVoIPApp::BackEnd::CameraLocation::Front;
+
+ // Change the call status
+ this->SetCallStatus(PhoneVoIPApp::BackEnd::CallStatus::None);
+
+ return true;
+}
+
+bool CallController::ToggleCamera()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (this->activeCall == nullptr)
+ {
+ // Nothing to do - there is no call to end
+ return false;
+ }
+ ::OutputDebugString(L"[CallController::ToggleCamera] => Trying to toggle the camera\n");
+
+ Globals::Instance->CaptureController->ToggleCamera();
+
+ return true;
+}
+
+PhoneVoIPApp::BackEnd::CallStatus CallController::CallStatus::get()
+{
+ // No need to lock - this get is idempotent
+ return this->callStatus;
+}
+
+PhoneVoIPApp::BackEnd::CameraLocation CallController::CameraLocation::get()
+{
+ // No need to lock - this get is idempotent
+ return this->cameraLocation;
+}
+
+PhoneVoIPApp::BackEnd::MediaOperations CallController::MediaOperations::get()
+{
+ // No need to lock - this get is idempotent
+ return this->mediaOperations;
+}
+
+bool CallController::IsShowingVideo::get()
+{
+ // No need to lock - this get is idempotent
+ return this->isShowingVideo;
+}
+
+void CallController::IsShowingVideo::set(bool value)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ // Has anything changed?
+ if (this->isShowingVideo == value)
+ return; // No
+
+ // Update the value
+ this->isShowingVideo = value;
+
+ // Start/stop video capture/render based on this change
+ this->UpdateMediaOperations();
+}
+
+bool CallController::IsRenderingVideo::get()
+{
+ // No need to lock - this get is idempotent
+ return this->isRenderingVideo;
+}
+
+void CallController::IsRenderingVideo::set(bool value)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ // Has anything changed?
+ if (this->isRenderingVideo == value)
+ return; // No
+
+ // Update the value
+ this->isRenderingVideo = value;
+
+ // Start/stop video capture/render based on this change
+ this->UpdateMediaOperations();
+}
+
+CallAudioRoute CallController::AvailableAudioRoutes::get()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (this->activeCall == nullptr)
+ {
+ // There is no call in progress
+ return CallAudioRoute::None;
+ }
+
+ return (CallAudioRoute)(this->audioRoutingManager->AvailableAudioEndpoints);
+}
+
+CallAudioRoute CallController::AudioRoute::get()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (this->activeCall == nullptr)
+ {
+ // There is no call in progress
+ return CallAudioRoute::None;
+ }
+
+ auto audioEndpoint = this->audioRoutingManager->GetAudioEndpoint();
+ switch(audioEndpoint)
+ {
+ case AudioRoutingEndpoint::Earpiece:
+ case AudioRoutingEndpoint::WiredHeadset:
+ case AudioRoutingEndpoint::WiredHeadsetSpeakerOnly:
+ return CallAudioRoute::Earpiece;
+
+ case AudioRoutingEndpoint::Default:
+ case AudioRoutingEndpoint::Speakerphone:
+ return CallAudioRoute::Speakerphone;
+
+ case AudioRoutingEndpoint::Bluetooth:
+ case AudioRoutingEndpoint::BluetoothWithNoiseAndEchoCancellation:
+ return CallAudioRoute::Bluetooth;
+
+ default:
+ throw ref new FailureException("Unexpected audio routing endpoint");
+ }
+
+}
+
+void CallController::AudioRoute::set(CallAudioRoute newRoute)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (this->callStatus != PhoneVoIPApp::BackEnd::CallStatus::InProgress)
+ {
+ // There is no call in progress - do nothing
+ return;
+ }
+
+ switch(newRoute)
+ {
+ case CallAudioRoute::Earpiece:
+ this->audioRoutingManager->SetAudioEndpoint(AudioRoutingEndpoint::Earpiece);
+ break;
+
+ case CallAudioRoute::Speakerphone:
+ this->audioRoutingManager->SetAudioEndpoint(AudioRoutingEndpoint::Speakerphone);
+ break;
+
+ case CallAudioRoute::Bluetooth:
+ this->audioRoutingManager->SetAudioEndpoint(AudioRoutingEndpoint::Bluetooth);
+ break;
+
+ case CallAudioRoute::None:
+ default:
+ throw ref new FailureException("Cannot set audio route to CallAudioRoute::None");
+ }
+}
+
+Platform::String^ CallController::OtherPartyName::get()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+ return this->otherPartyName;
+}
+
+int64 CallController::OtherPartyId::get()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+ return this->otherPartyId;
+}
+
+Windows::Foundation::DateTime CallController::CallStartTime::get()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (this->activeCall != nullptr)
+ {
+ // There is a call in progress
+ return this->activeCall->StartTime;
+ }
+ else
+ {
+ // There is no call in progress
+ Windows::Foundation::DateTime minValue;
+ minValue.UniversalTime = 0;
+ return minValue;
+ }
+}
+
+int64 CallController::CallId::get()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+ return this->callId;
+}
+
+int64 CallController::CallAccessHash::get()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+ return this->callAccessHash;
+}
+
+int64 CallController::AcceptedCallId::get()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ return this->acceptedCallId;
+}
+
+void CallController::AcceptedCallId::set(int64 value)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ this->acceptedCallId = value;
+}
+
+Platform::Array^ CallController::Key::get()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ return this->key;
+}
+
+bool CallController::Outgoing::get()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ return this->outgoing;
+}
+
+Platform::Array^ CallController::Emojis::get()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ return this->emojis;
+}
+
+CallController::CallController() :
+ wrapper(nullptr),
+ callInProgressPageUri(L"/Views/ShellView.xaml"),
+ voipServiceName(nullptr),
+ defaultContactImageUri(nullptr),
+ brandingImageUri(nullptr),
+ ringtoneUri(nullptr),
+ statusListener(nullptr),
+ callStatus(PhoneVoIPApp::BackEnd::CallStatus::None),
+ otherPartyName(nullptr),
+ otherPartyId(-1),
+ incomingId(-1),
+ acceptedCallId(-1),
+ key(nullptr),
+ emojis(nullptr),
+ mediaOperations(PhoneVoIPApp::BackEnd::MediaOperations::None),
+ onIncomingCallDialogDismissed(nullptr),
+ activeCall(nullptr),
+ cameraLocation(PhoneVoIPApp::BackEnd::CameraLocation::Front)
+{
+ this->stateListener = ref new LibTgVoipStateListener();
+ this->callCoordinator = VoipCallCoordinator::GetDefault();
+ this->audioRoutingManager = AudioRoutingManager::GetDefault();
+
+ // URIs required for interactions with the VoipCallCoordinator
+ String^ installFolder = String::Concat(Windows::ApplicationModel::Package::Current->InstalledLocation->Path, "\\");
+ //this->defaultContactImageUri = ref new Uri(installFolder, "Assets\\DefaultContactImage.png");
+ this->voipServiceName = ref new String(L"Telegram");
+ this->brandingImageUri = ref new Uri(installFolder, "SquareTile150x150.png");
+ //this->ringtoneUri = ref new Uri(installFolder, "Assets\\Ringtone.wma");
+
+ // Event handler delegates - creating them once and storing them as member variables
+ // avoids having to create new delegate objects for each phone call.
+ this->acceptCallRequestedHandler = ref new TypedEventHandler(this, &CallController::OnAcceptCallRequested);
+ this->rejectCallRequestedHandler = ref new TypedEventHandler(this, &CallController::OnRejectCallRequested);
+ this->holdCallRequestedHandler = ref new TypedEventHandler(this, &CallController::OnHoldCallRequested);
+ this->resumeCallRequestedHandler = ref new TypedEventHandler(this, &CallController::OnResumeCallRequested);
+ this->endCallRequestedHandler = ref new TypedEventHandler(this, &CallController::OnEndCallRequested);
+ this->audioEndpointChangedHandler = ref new TypedEventHandler(this, &CallController::OnAudioEndpointChanged);
+ this->cameraLocationChangedHandler = ref new CameraLocationChangedEventHandler(this, &CallController::OnCameraLocationChanged);
+}
+
+CallController::~CallController()
+{
+}
+
+void CallController::SetCallStatus(PhoneVoIPApp::BackEnd::CallStatus newStatus)
+{
+ // No need to lock - private method
+
+ if (newStatus == this->callStatus)
+ return; // Nothing more to do
+
+ // Change the call status
+ this->callStatus = newStatus;
+
+ // Update audio/video capture/render status, if required.
+ this->UpdateMediaOperations();
+
+ // If required, let the UI know.
+ if (this->statusListener != nullptr)
+ {
+ this->statusListener->OnCallStatusChanged(this->callStatus);
+ }
+}
+
+void CallController::SetActiveCall(VoipPhoneCall^ call, int64 contactId, int64 callId, int64 callAccessHash, const Platform::Array^ key, bool outgoing, const Platform::Array^ emojis, VoipCallMedia callMedia)
+{
+ // No need to lock - private method
+
+ // The specified call is now active.
+ // For an incoming call, this means that the local party has accepted the call.
+ // For an outoing call, this means that the remote party has accepted the call.
+ this->activeCall = call;
+
+ // Listen to state changes of the active call.
+ call->HoldRequested += this->holdCallRequestedHandler;
+ call->ResumeRequested += this->resumeCallRequestedHandler;
+ call->EndRequested += this->endCallRequestedHandler;
+
+ // Register for audio endpoint changes
+ this->audioEndpointChangedHandlercookie = this->audioRoutingManager->AudioEndpointChanged += this->audioEndpointChangedHandler;
+
+ // Store information about the other party in the call
+ this->otherPartyName = this->activeCall->ContactName;
+ this->otherPartyId = contactId;
+ this->callId = callId;
+ this->callAccessHash = callAccessHash;
+
+ if (key != nullptr)
+ {
+ this->key = ref new Platform::Array(key->Data, key->Length);
+ }
+ else
+ {
+ this->key = nullptr;
+ }
+ if (emojis != nullptr)
+ {
+ this->emojis = ref new Platform::Array(emojis->Data, emojis->Length);
+ }
+ else
+ {
+ this->emojis = nullptr;
+ }
+
+ this->outgoing = outgoing;
+
+ // Change the call status
+ this->SetCallStatus(PhoneVoIPApp::BackEnd::CallStatus::InProgress);
+
+ // Figure out if video/audio capture/render are all allowed
+ PhoneVoIPApp::BackEnd::MediaOperations newOperations = PhoneVoIPApp::BackEnd::MediaOperations::None;
+ if ((callMedia & VoipCallMedia::Audio) != VoipCallMedia::None)
+ {
+ // Enable both audio capture and render by default
+ newOperations = PhoneVoIPApp::BackEnd::MediaOperations::AudioCapture | PhoneVoIPApp::BackEnd::MediaOperations::AudioRender;
+ }
+ if ((callMedia & VoipCallMedia::Video) != VoipCallMedia::None)
+ {
+ // Enable both video capture and render by default
+ newOperations = newOperations | PhoneVoIPApp::BackEnd::MediaOperations::VideoCapture | PhoneVoIPApp::BackEnd::MediaOperations::VideoRender;
+
+ }
+ this->SetMediaOperations(newOperations);
+}
+
+void CallController::OnAcceptCallRequested(VoipPhoneCall^ sender, CallAnswerEventArgs^ args)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ ::OutputDebugString(L"[CallController::OnAcceptCallRequested] => Incoming call accepted\n");
+
+ // The local user has accepted an incoming call.
+ VoipPhoneCall^ incomingCall = (VoipPhoneCall^)sender;
+
+ // If there is was a call already in progress, end it
+ // As of now, we support only one call at a time in this application
+ this->EndCall();
+
+ // Reset camera choice to front facing for next call
+ this->cameraLocation = PhoneVoIPApp::BackEnd::CameraLocation::Front;
+
+ // The incoming call is the new active call.
+ incomingCall->NotifyCallActive();
+
+ this->acceptedCallId = this->incomingCallId;
+
+ // Let the incoming call agent know that incoming call processing is now complete
+ if (this->onIncomingCallDialogDismissed != nullptr)
+ this->onIncomingCallDialogDismissed(this->incomingCallId, this->incomingCallAccessHash, false);
+
+ // Store it as the active call.
+ this->SetActiveCall(incomingCall, this->incomingId, this->incomingCallId, this->incomingCallAccessHash, nullptr, false, nullptr, args->AcceptedMedia);
+}
+
+void CallController::OnRejectCallRequested(VoipPhoneCall^ sender, CallRejectEventArgs^ args)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ ::OutputDebugString(L"[CallController::OnRejectCallRequested] => Incoming call rejected\n");
+
+ // The local user has rejected an incoming call.
+ VoipPhoneCall^ incomingCall = (VoipPhoneCall^)sender;
+
+ // End it.
+ incomingCall->NotifyCallEnded();
+
+ // TODO: Contact your cloud service and let it know that the incoming call was rejected.
+
+ // Finally, let the incoming call agent know that incoming call processing is now complete
+ this->onIncomingCallDialogDismissed(this->incomingCallId, this->incomingCallAccessHash, true);
+}
+
+void CallController::OnHoldCallRequested(VoipPhoneCall^ sender, CallStateChangeEventArgs^ args)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ // A request to put the active call on hold has been received.
+ VoipPhoneCall^ callToPutOnHold = (VoipPhoneCall^)sender;
+
+ // Sanity test.
+ if (callToPutOnHold != this->activeCall)
+ {
+ throw ref new Platform::FailureException(L"Something is wrong. The call to put on hold is not the active call");
+ }
+
+ // Put the active call on hold.
+ this->HoldCall();
+}
+
+void CallController::OnResumeCallRequested(VoipPhoneCall^ sender, CallStateChangeEventArgs^ args)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ // A request to resumed the active call has been received.
+ VoipPhoneCall^ callToResume = (VoipPhoneCall^)sender;
+
+ // Sanity test.
+ if (callToResume != this->activeCall)
+ {
+ throw ref new Platform::FailureException(L"Something is wrong. The call to resume is not the active call");
+ }
+
+ // Resume the active call
+ this->ResumeCall();
+}
+
+void CallController::OnEndCallRequested(VoipPhoneCall^ sender, CallStateChangeEventArgs^ args)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ // A request to end the active call has been received.
+ VoipPhoneCall^ callToEnd = (VoipPhoneCall^)sender;
+
+ // Sanity test.
+ if (callToEnd != this->activeCall)
+ {
+ throw ref new Platform::FailureException(L"Something is wrong. The call to end is not the active call");
+ }
+
+ // End the active call
+ this->EndCall();
+}
+
+void CallController::OnAudioEndpointChanged(AudioRoutingManager^ sender, Object^ args)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ // If required, let the UI know.
+ if ((this->activeCall != nullptr) && (this->statusListener != nullptr))
+ {
+ this->statusListener->OnCallAudioRouteChanged(this->AudioRoute);
+ }
+}
+
+void CallController::OnCameraLocationChanged(PhoneVoIPApp::BackEnd::CameraLocation newCameraLocation)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if(this->cameraLocation == newCameraLocation || this->activeCall == nullptr)
+ {
+ // nothing to do
+ return;
+ }
+
+ this->cameraLocation = newCameraLocation;
+
+ // If required, let the UI know.
+ if ((this->statusListener != nullptr))
+ {
+ this->statusListener->OnCameraLocationChanged(this->cameraLocation);
+ }
+
+}
+
+void CallController::SetMediaOperations(PhoneVoIPApp::BackEnd::MediaOperations value)
+{
+ // No need to lock - private method
+
+ // Has anything changed?
+ if (this->mediaOperations == value)
+ return; // No
+
+ // Update the value
+ this->mediaOperations = value;
+
+ // Start/stop video/audio capture based on this change
+ this->UpdateMediaOperations();
+}
+
+void CallController::UpdateMediaOperations()
+{
+ // No need to lock - private method
+
+ bool captureAudio = false, captureVideo = false, renderAudio = false, renderVideo = false;
+
+ if (this->callStatus == PhoneVoIPApp::BackEnd::CallStatus::InProgress)
+ {
+ // A call is in progress
+
+ // Start audio capture/render, if enabled
+ captureAudio = ((this->mediaOperations & PhoneVoIPApp::BackEnd::MediaOperations::AudioCapture) != PhoneVoIPApp::BackEnd::MediaOperations::None);
+ renderAudio = ((this->mediaOperations & PhoneVoIPApp::BackEnd::MediaOperations::AudioRender) != PhoneVoIPApp::BackEnd::MediaOperations::None);
+
+ // Start video capture/render if enabled *and* the UI is showing video.
+ if (this->isShowingVideo)
+ {
+ if(isRenderingVideo)
+ {
+ renderVideo = ((this->mediaOperations & PhoneVoIPApp::BackEnd::MediaOperations::VideoRender) != PhoneVoIPApp::BackEnd::MediaOperations::None);
+ }
+
+ // Does this phone have a camera?
+ auto availableCameras = Windows::Phone::Media::Capture::AudioVideoCaptureDevice::AvailableSensorLocations;
+ bool isCameraPresent = ((availableCameras != nullptr) && (availableCameras->Size > 0));
+
+ // Start capture only if there is a camera present
+ if (isCameraPresent)
+ {
+ captureVideo = ((this->mediaOperations & PhoneVoIPApp::BackEnd::MediaOperations::VideoCapture) != PhoneVoIPApp::BackEnd::MediaOperations::None);
+ }
+ }
+ }
+ // else: call is not in progress - all capture/rendering should stop
+
+ // What are the new media operations?
+ PhoneVoIPApp::BackEnd::MediaOperations newOperations = PhoneVoIPApp::BackEnd::MediaOperations::None;
+
+ // Start/stop audio capture and render
+ if (captureAudio || renderAudio)
+ {
+ ::OutputDebugString(L"[CallController::UpdateMediaOperations] => Starting audio\n");
+ newOperations = newOperations | (PhoneVoIPApp::BackEnd::MediaOperations::AudioCapture | PhoneVoIPApp::BackEnd::MediaOperations::AudioRender);
+ //Globals::Instance->AudioController->Start();
+ }
+ else
+ {
+ ::OutputDebugString(L"[CallController::UpdateMediaOperations] => Stopping audio\n");
+ //Globals::Instance->AudioController->Stop();
+ }
+
+ // Start/stop video render
+ if (Globals::Instance->VideoRenderer != nullptr)
+ {
+ if (renderVideo)
+ {
+ ::OutputDebugString(L"[CallController::UpdateMediaOperations] => Starting video render\n");
+ newOperations = newOperations | PhoneVoIPApp::BackEnd::MediaOperations::VideoRender;
+ Globals::Instance->VideoRenderer->Start();
+ }
+ else
+ {
+ ::OutputDebugString(L"[CallController::UpdateMediaOperations] => Stopping video render\n");
+ Globals::Instance->VideoRenderer->Stop();
+ }
+
+ if (captureVideo)
+ {
+ ::OutputDebugString(L"[CallController::UpdateMediaOperations] => Starting video capture\n");
+ newOperations = newOperations | PhoneVoIPApp::BackEnd::MediaOperations::VideoCapture;
+ Globals::Instance->CaptureController->Start(cameraLocation);
+ Globals::Instance->CaptureController->CameraLocationChanged += cameraLocationChangedHandler;
+ }
+ else
+ {
+ ::OutputDebugString(L"[CallController::UpdateMediaOperations] => Stopping video capture\n");
+ Globals::Instance->CaptureController->Stop();
+ }
+ }
+
+ // Let the listener know that the allowed media operation state has changed
+ if (this->statusListener != nullptr)
+ {
+ this->statusListener->OnMediaOperationsChanged(newOperations);
+ }
+}
diff --git a/BackEnd/CallController.h b/BackEnd/CallController.h
new file mode 100755
index 0000000..ba21091
--- /dev/null
+++ b/BackEnd/CallController.h
@@ -0,0 +1,337 @@
+/*
+Copyright (c) 2012 Microsoft Corporation. All rights reserved.
+Use of this sample source code is subject to the terms of the Microsoft license
+agreement under which you licensed this sample source code and is provided AS-IS.
+If you did not accept the terms of the license agreement, you are not authorized
+to use this sample source code. For the terms of the license, please see the
+license agreement between you and Microsoft.
+
+To see all Code Samples for Windows Phone, visit http://go.microsoft.com/fwlink/?LinkID=219604
+
+*/
+#pragma once
+#include "BackEndCapture.h"
+#include
+#include "ICallControllerStatusListener.h"
+#include "IConfig.h"
+#include "ApiLock.h"
+
+namespace PhoneVoIPApp
+{
+ namespace BackEnd
+ {
+ // Forward declaration
+ ref class Globals;
+
+ // A method that is called back when the incoming call dialog has been dismissed.
+ // This callback is used to complete the incoming call agent.
+ public delegate void IncomingCallDialogDismissedCallback(int64 callId, int64 callAccessHash, bool rejected);
+
+ ref class LibTgVoipStateListener sealed {
+ private:
+ ICallControllerStatusListener^ statusListener;
+
+ public:
+ LibTgVoipStateListener();
+ void SetStatusCallback(ICallControllerStatusListener^ statusListener);
+ virtual void OnCallStateChanged(libtgvoip::VoIPControllerWrapper^ sender, libtgvoip::CallState newState);
+ virtual void OnSignalBarsChanged(libtgvoip::VoIPControllerWrapper^ sender, int signal);
+ };
+
+ public value struct Config{
+ double InitTimeout;
+ double RecvTimeout;
+ DataSavingMode DataSavingMode;
+ bool EnableAEC;
+ bool EnableNS;
+ bool EnableAGC;
+ Platform::String^ LogFilePath;
+ Platform::String^ StatsDumpFilePath;
+ };
+
+ // A class that provides methods and properties related to VoIP calls.
+ // It wraps Windows.Phone.Networking.Voip.VoipCallCoordinator, and provides app-specific call functionality.
+ public ref class CallController sealed
+ {
+ public:
+
+ // The public methods below are just for illustration purposes - add your own methods here
+ // mtproto
+ void HandleUpdatePhoneCall();
+ void StartMTProtoUpdater();
+ void StopMTProtoUpdater();
+
+ // libtgvoip
+ void CreateVoIPControllerWrapper();
+ void DeleteVoIPControllerWrapper();
+ void SetConfig(Config config);
+ void SetEncryptionKey(const Platform::Array^ key, bool isOutgoing);
+ void SetPublicEndpoints(const Platform::Array^ endpoints, bool allowP2P, int connectionMaxLayer);
+ void SetProxy(ProxyStruct proxy);
+ void Start();
+ void Connect();
+
+ void SetMicMute(bool mute);
+ void SwitchSpeaker(bool external);
+ void UpdateServerConfig(Platform::String^ json);
+ int64 GetPreferredRelayID();
+ Error GetLastError();
+ Platform::String^ GetDebugLog();
+ Platform::String^ GetDebugString();
+ Platform::String^ GetVersion();
+ int GetSignalBarsCount();
+
+ // Provide an inteface that can be used to get call controller status change notifications
+ void SetStatusCallback(ICallControllerStatusListener^ statusListener);
+
+ // Initiate an outgoing call. Called by the UI process.
+ // Returns true if the outgoing call processing was started, false otherwise.
+ bool InitiateOutgoingCall(Platform::String^ recepientName, int64 recepientId, int64 callId, int64 callAccessHash);
+ bool InitiateOutgoingCall(Platform::String^ recepientName, int64 recepientId, int64 callId, int64 callAccessHash,
+ Config config, const Platform::Array^ key, bool outgoing,
+ const Platform::Array^ emojis, const Platform::Array^ endpoints,
+ bool allowP2P, int connectionMaxLayer,
+ ProxyStruct proxy);
+
+ // Start processing an incoming call. Called by managed code in this process (the VoIP agent host process).
+ // Returns true if the incoming call processing was started, false otherwise.
+ bool OnIncomingCallReceived(Platform::String^ contactName, int64 contactId, Platform::String^ contactImage, int64 callId, int64 callAccessHash, IncomingCallDialogDismissedCallback^ incomingCallDialogDismissedCallback);
+
+ // Hold a call. Called by the UI process.
+ bool HoldCall();
+
+ // Resume a call. Called by the UI process.
+ bool ResumeCall();
+
+ // End a call. Called by the UI process.
+ bool EndCall();
+
+ // Toggle the camera location. Called by the UI process.
+ bool ToggleCamera();
+
+ // Get the call state
+ property PhoneVoIPApp::BackEnd::CallStatus CallStatus
+ {
+ PhoneVoIPApp::BackEnd::CallStatus get();
+ };
+
+ // Get or set the media operations that are allowed for a call.
+ property PhoneVoIPApp::BackEnd::MediaOperations MediaOperations
+ {
+ PhoneVoIPApp::BackEnd::MediaOperations get();
+ }
+
+ // Indicates if video is currently being displayed or not
+ property bool IsShowingVideo
+ {
+ bool get();
+ void set(bool value);
+ }
+
+ // Indicates whether the video is being rendered or not.
+ property bool IsRenderingVideo
+ {
+ bool get();
+ void set(bool value);
+ }
+
+ // Get the current camera location
+ property PhoneVoIPApp::BackEnd::CameraLocation CameraLocation
+ {
+ PhoneVoIPApp::BackEnd::CameraLocation get();
+ }
+
+ // Get the possible routes for audio
+ property CallAudioRoute AvailableAudioRoutes
+ {
+ CallAudioRoute get();
+ }
+
+ // Get or set the current route for audio
+ property CallAudioRoute AudioRoute
+ {
+ CallAudioRoute get();
+ void set(CallAudioRoute newRoute);
+ }
+
+ // Get the name of the other party in the most recent call.
+ // Can return nullptr if there hasn't been a call yet.
+ property Platform::String^ OtherPartyName
+ {
+ Platform::String^ get();
+ }
+
+ // Get the name of the other party in the most recent call.
+ // Can return nullptr if there hasn't been a call yet.
+ property int64 OtherPartyId
+ {
+ int64 get();
+ }
+
+ // Get call start time
+ property Windows::Foundation::DateTime CallStartTime
+ {
+ Windows::Foundation::DateTime get();
+ }
+
+ property int64 CallId
+ {
+ int64 get();
+ }
+
+ property int64 CallAccessHash
+ {
+ int64 get();
+ }
+
+ property int64 AcceptedCallId
+ {
+ int64 get();
+ void set(int64 value);
+ }
+
+ property Platform::Array^ Key
+ {
+ Platform::Array^ get();
+ }
+
+ property bool Outgoing
+ {
+ bool get();
+ }
+
+ property Platform::Array^ Emojis
+ {
+ Platform::Array^ get();
+ }
+
+ private:
+ libtgvoip::VoIPControllerWrapper^ wrapper;
+ LibTgVoipStateListener^ stateListener;
+
+ // Only the server can create an instance of this object
+ friend ref class PhoneVoIPApp::BackEnd::Globals;
+
+ // Constructor and destructor
+ CallController();
+ ~CallController();
+
+ // Set the call status
+ void SetCallStatus(PhoneVoIPApp::BackEnd::CallStatus newStatus);
+
+ // Indicates that a call is now active
+ void SetActiveCall(Windows::Phone::Networking::Voip::VoipPhoneCall^ call, int64 contactId, int64 callId, int64 callAccessHash, const Platform::Array^ key, bool outgoing, const Platform::Array^ emojis, Windows::Phone::Networking::Voip::VoipCallMedia callMedia);
+
+ // Called by the VoipCallCoordinator when the user accepts an incoming call.
+ void OnAcceptCallRequested(Windows::Phone::Networking::Voip::VoipPhoneCall^ sender, Windows::Phone::Networking::Voip::CallAnswerEventArgs^ args);
+
+ // Called by the VoipCallCoordinator when the user rejects an incoming call.
+ void OnRejectCallRequested(Windows::Phone::Networking::Voip::VoipPhoneCall^ sender, Windows::Phone::Networking::Voip::CallRejectEventArgs^ args);
+
+ // Called by the VoipCallCoordinator when a call is to be put on hold.
+ void OnHoldCallRequested(Windows::Phone::Networking::Voip::VoipPhoneCall^ sender, Windows::Phone::Networking::Voip::CallStateChangeEventArgs^ args);
+
+ // Called by the VoipCallCoordinator when a call that was previously put on hold is to be resumed.
+ void OnResumeCallRequested(Windows::Phone::Networking::Voip::VoipPhoneCall^ sender, Windows::Phone::Networking::Voip::CallStateChangeEventArgs^ args);
+
+ // Called by the VoipCallCoordinator when a call is to be ended.
+ void OnEndCallRequested(Windows::Phone::Networking::Voip::VoipPhoneCall^ sender, Windows::Phone::Networking::Voip::CallStateChangeEventArgs^ args);
+
+ // Called by the AudioRoutingManager when call audio routing changes.
+ void OnAudioEndpointChanged(Windows::Phone::Media::Devices::AudioRoutingManager^ sender, Platform::Object^ args);
+
+ // Called by the BackEndCapture when the camera is toggled
+ void OnCameraLocationChanged(PhoneVoIPApp::BackEnd::CameraLocation newCameraLocation);
+
+ // Set a value that indicates if video/audio capture/render is enabled for a call or not.
+ void SetMediaOperations(PhoneVoIPApp::BackEnd::MediaOperations value);
+
+ // Start/stop video/audio capture/playback based on the current state.
+ void UpdateMediaOperations();
+
+ // The relative URI to the call-in-progress page
+ Platform::String ^callInProgressPageUri;
+
+ // The name of this service provider
+ Platform::String^ voipServiceName;
+
+ // The URI to the default contact image
+ Windows::Foundation::Uri^ defaultContactImageUri;
+
+ // The URI to the branding image
+ Windows::Foundation::Uri^ brandingImageUri;
+
+ // The URI to the ringtone file
+ Windows::Foundation::Uri^ ringtoneUri;
+
+ // Interface used to deliver status callbacks
+ ICallControllerStatusListener^ statusListener;
+
+ // A VoIP call that is in progress
+ Windows::Phone::Networking::Voip::VoipPhoneCall^ activeCall;
+
+ // The status of a call, if any
+ PhoneVoIPApp::BackEnd::CallStatus callStatus;
+
+ // The name of the other party, if any
+ Platform::String^ otherPartyName;
+
+ // The id of the other party, if any
+ int64 otherPartyId;
+
+ int64 callId;
+
+ int64 callAccessHash;
+
+ // The id of the caller for the latest incoming call
+ int64 incomingId;
+
+ int64 incomingCallId;
+
+ int64 incomingCallAccessHash;
+
+ int64 acceptedCallId;
+
+ Platform::Array^ key;
+
+ bool outgoing;
+
+ Platform::Array^ emojis;
+
+ // Indicates if video/audio capture/render is enabled for a call or not.
+ PhoneVoIPApp::BackEnd::MediaOperations mediaOperations;
+
+ PhoneVoIPApp::BackEnd::CameraLocation cameraLocation;
+
+ // Indicates if video is currently being displayed or not.
+ bool isShowingVideo;
+
+ bool isRenderingVideo;
+
+ // The method to be called when the incoming call dialog box is dismissed
+ IncomingCallDialogDismissedCallback^ onIncomingCallDialogDismissed;
+
+ // The VoIP call coordinator
+ Windows::Phone::Networking::Voip::VoipCallCoordinator^ callCoordinator;
+
+ // The phone audio routing manager
+ Windows::Phone::Media::Devices::AudioRoutingManager^ audioRoutingManager;
+
+ // Phone call related event handlers
+ Windows::Foundation::TypedEventHandler^ acceptCallRequestedHandler;
+ Windows::Foundation::TypedEventHandler^ rejectCallRequestedHandler;
+ Windows::Foundation::TypedEventHandler^ holdCallRequestedHandler;
+ Windows::Foundation::TypedEventHandler^ resumeCallRequestedHandler;
+ Windows::Foundation::TypedEventHandler^ endCallRequestedHandler;
+
+ // Audio related event handlers
+ Windows::Foundation::TypedEventHandler^ audioEndpointChangedHandler;
+
+ // A cookie used to un-register the audio endpoint changed handler
+ Windows::Foundation::EventRegistrationToken audioEndpointChangedHandlercookie;
+
+ // Camera location related event handlers
+ CameraLocationChangedEventHandler^ cameraLocationChangedHandler;
+ };
+ }
+}
diff --git a/BackEnd/Globals.cpp b/BackEnd/Globals.cpp
new file mode 100755
index 0000000..34804f9
--- /dev/null
+++ b/BackEnd/Globals.cpp
@@ -0,0 +1,321 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+#include
+#include
+#include
+#include
+#include
+#include "Globals.h"
+#include "ApiLock.h"
+#include "CallController.h"
+#include "BackEndAudio.h"
+#include "BackEndCapture.h"
+
+using namespace PhoneVoIPApp::BackEnd;
+using namespace Windows::Foundation;
+using namespace Windows::Phone::Media::Capture;
+
+HRESULT __declspec(dllexport) MyGetActivationFactory(_In_ HSTRING activatableClassId, _COM_Outptr_ IInspectable **factory)
+{
+ *factory = nullptr;
+
+ Microsoft::WRL::ComPtr activationFactory;
+ auto &module = Microsoft::WRL::Module::GetModule();
+
+ HRESULT hr = module.GetActivationFactory(activatableClassId, &activationFactory);
+ if (SUCCEEDED(hr))
+ {
+ *factory = activationFactory.Detach();
+
+ if (*factory == nullptr)
+ {
+ return E_OUTOFMEMORY;
+ }
+ }
+
+ return hr;
+}
+
+// Maximum number of characters required to contain the string version of an unsigned integer
+#define MAX_CHARS_IN_UINT_AS_STRING ((sizeof(unsigned int) * 4) + 1)
+
+const LPCWSTR Globals::noOtherBackgroundProcessEventName = L"PhoneVoIPApp.noOtherBackgroundProcess";
+const LPCWSTR Globals::uiDisconnectedEventName = L"PhoneVoIPApp.uiDisconnected.";
+const LPCWSTR Globals::backgroundProcessReadyEventName = L"PhoneVoIPApp.backgroundProcessReady.";
+Globals^ Globals::singleton = nullptr;
+
+void Globals::StartServer(const Platform::Array^ outOfProcServerClassNames)
+{
+ HRESULT hr = S_OK;
+
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (outOfProcServerClassNames == nullptr)
+ {
+ throw ref new Platform::InvalidArgumentException(L"outOfProcServerClassNames cannot be null");
+ }
+
+ if (this->started)
+ {
+ return; // Nothing more to be done
+ }
+
+ // Set an event that indicates that the background process is ready.
+ this->backgroundReadyEvent = ::CreateEventEx(
+ NULL,
+ Globals::GetBackgroundProcessReadyEventName(Globals::GetCurrentProcessId())->Data(),
+ CREATE_EVENT_INITIAL_SET | CREATE_EVENT_MANUAL_RESET,
+ EVENT_ALL_ACCESS);
+ if (this->backgroundReadyEvent == NULL)
+ {
+ // Something went wrong
+ DWORD dwErr = ::GetLastError();
+ hr = HRESULT_FROM_WIN32(dwErr);
+ throw ref new Platform::COMException(hr, L"An error occurred trying to create an event that indicates that the background process is ready");
+ }
+
+ // Set the event
+ BOOL success = ::SetEvent(this->backgroundReadyEvent);
+ if (success == FALSE)
+ {
+ DWORD dwErr = ::GetLastError();
+ hr = HRESULT_FROM_WIN32(dwErr);
+ throw ref new Platform::COMException(hr, L"An error occurred trying to set an event that indicates that the background process is ready");
+ }
+
+ this->started = true;
+}
+
+void Globals::DoPeriodicKeepAlive()
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ // TODO: Do stuff here - refresh tokens, get new certs from server, etc.
+}
+
+unsigned int Globals::GetCurrentProcessId()
+{
+ return ::GetCurrentProcessId();
+}
+
+Platform::String^ Globals::GetUiDisconnectedEventName(unsigned int backgroundProcessId)
+{
+ WCHAR backgroundProcessIdString[MAX_CHARS_IN_UINT_AS_STRING];
+ if (swprintf_s<_countof(backgroundProcessIdString)>(backgroundProcessIdString, L"%u", backgroundProcessId) < 0)
+ throw ref new Platform::FailureException(L"Could not create string version of background process id");
+
+ auto eventName = ref new Platform::String(Globals::uiDisconnectedEventName) + ref new Platform::String(backgroundProcessIdString);
+ return eventName;
+}
+
+Platform::String^ Globals::GetBackgroundProcessReadyEventName(unsigned int backgroundProcessId)
+{
+ WCHAR backgroundProcessIdString[MAX_CHARS_IN_UINT_AS_STRING];
+ if (swprintf_s<_countof(backgroundProcessIdString)>(backgroundProcessIdString, L"%u", backgroundProcessId) < 0)
+ throw ref new Platform::FailureException(L"Could not create string version of background process id");
+
+ auto eventName = ref new Platform::String(Globals::backgroundProcessReadyEventName) + ref new Platform::String(backgroundProcessIdString);
+ return eventName;
+}
+
+Globals^ Globals::Instance::get()
+{
+ if (Globals::singleton == nullptr)
+ {
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (Globals::singleton == nullptr)
+ {
+ Globals::singleton = ref new Globals();
+ }
+ // else: some other thread has created an instance of the call controller
+ }
+
+ return Globals::singleton;
+}
+
+CallController^ Globals::CallController::get()
+{
+ if (this->callController == nullptr)
+ {
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ if (this->callController == nullptr)
+ {
+ this->callController = ref new PhoneVoIPApp::BackEnd::CallController();
+ }
+ // else: some other thread has created an instance of the call controller
+ }
+
+ return this->callController;
+}
+
+IVideoRenderer^ Globals::VideoRenderer::get()
+{
+ // No need to lock - this get is idempotent
+ return this->videoRenderer;
+}
+
+void Globals::VideoRenderer::set(IVideoRenderer^ value)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ this->videoRenderer = value;
+}
+
+IMTProtoUpdater^ Globals::MTProtoUpdater::get()
+{
+ // No need to lock - this get is idempotent
+ return this->mtProtoUpdater;
+}
+
+void Globals::MTProtoUpdater::set(IMTProtoUpdater^ value)
+{
+ // Make sure only one API call is in progress at a time
+ std::lock_guard lock(g_apiLock);
+
+ this->mtProtoUpdater = value;
+}
+
+//BackEndAudio^ Globals::AudioController::get()
+//{
+// // No need to lock - this get is idempotent
+// return this->audioController;
+//}
+
+BackEndCapture^ Globals::CaptureController::get()
+{
+ // No need to lock - this get is idempotent
+ return this->captureController;
+}
+
+BackEndTransport^ Globals::TransportController::get()
+{
+ // No need to lock - this get is idempotent
+ return this->transportController;
+}
+
+Globals::Globals() :
+ started(false),
+ serverRegistrationCookie(NULL),
+ callController(nullptr),
+ videoRenderer(nullptr),
+ noOtherBackgroundProcessEvent(NULL),
+ backgroundReadyEvent(NULL),
+ //audioController(nullptr),
+ transportController(nullptr),
+ captureController(nullptr)
+{
+ {
+ WCHAR szBuffer[256];
+ swprintf_s(szBuffer, L"[Globals::Globals] => VoIP background process with id %d starting up\n", this->GetCurrentProcessId());
+ ::OutputDebugString(szBuffer);
+ }
+
+ // Create an event that indicates if any other VoIP background exits or not
+ this->noOtherBackgroundProcessEvent = ::CreateEventEx(NULL, Globals::noOtherBackgroundProcessEventName, CREATE_EVENT_INITIAL_SET | CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS);
+ if (this->noOtherBackgroundProcessEvent == NULL)
+ {
+ // Something went wrong
+ DWORD dwErr = ::GetLastError();
+ HRESULT hr = HRESULT_FROM_WIN32(dwErr);
+ throw ref new Platform::COMException(hr, L"An error occurred trying to create an event that indicates if the background process exists or not");
+ }
+
+ // Wait for up to 30 seconds for the event to become set - if another instance of this process exists, this event would be in the reset state
+ DWORD reason = ::WaitForSingleObjectEx(this->noOtherBackgroundProcessEvent, 30 * 1000, FALSE);
+ _ASSERT(reason != WAIT_FAILED); // We don't care about any of the other reasons why WaitForSingleObjectEx returned
+ if (reason == WAIT_TIMEOUT)
+ {
+ throw ref new Platform::FailureException(L"Another instance of the VoIP background process exists and that process did not exit within 30 seconds. Cannot continue.");
+ }
+
+ // Reset the event to indicate that there is a VoIP background process
+ BOOL success = ::ResetEvent(this->noOtherBackgroundProcessEvent);
+ if (success == FALSE)
+ {
+ // Something went wrong
+ DWORD dwErr = ::GetLastError();
+ HRESULT hr = HRESULT_FROM_WIN32(dwErr);
+ throw ref new Platform::COMException(hr, L"An error occurred trying to reset the event that indicates if the background process exists or not");
+ }
+
+ // Initialize transport
+ this->transportController = ref new BackEndTransport(); // local
+
+ // Initialize audio controller
+ //this->audioController = ref new BackEndAudio();
+
+ // Set the transport for audio
+ //this->audioController->SetTransport(this->transportController);
+
+ // Initialize capture controller
+ this->captureController = ref new BackEndCapture();
+
+ // Set the transport on the controller
+ this->captureController->SetTransport(this->transportController);
+
+ // Initialize the call controller
+ this->callController = ref new PhoneVoIPApp::BackEnd::CallController();
+}
+
+Globals::~Globals()
+{
+ // The destructor of this singleton object is called when the process is shutting down.
+
+ // Before shutting down, make sure the UI process is not connected
+ HANDLE uiDisconnectedEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, Globals::GetUiDisconnectedEventName(Globals::GetCurrentProcessId())->Data());
+ if (uiDisconnectedEvent != NULL)
+ {
+ // The event exists - wait for it to get signaled (for a maximum of 30 seconds)
+ DWORD reason = ::WaitForSingleObjectEx(uiDisconnectedEvent, 30 * 1000, FALSE);
+ _ASSERT(reason != WAIT_FAILED); // We don't care about any of the other reasons why WaitForSingleObjectEx returned
+ }
+
+ // At this point, the UI is no longer connected to the background process.
+ // It is possible that the UI now reconnects to the background process - this would be a bug,
+ // and we should exit the background process anyway.
+
+ // Unset the event that indicates that the background process is ready
+ BOOL success;
+ if (this->backgroundReadyEvent != NULL)
+ {
+ success = ::ResetEvent(this->backgroundReadyEvent);
+ _ASSERT(success);
+
+ ::CloseHandle(this->backgroundReadyEvent);
+ this->backgroundReadyEvent = NULL;
+ }
+
+ // Unregister the activation factories for out-of-process objects hosted in this process
+ if (this->started)
+ {
+ RoRevokeActivationFactories(this->serverRegistrationCookie);
+ }
+
+ // Set the event that indicates that no instance of the VoIP background process exists
+ if (this->noOtherBackgroundProcessEvent != NULL)
+ {
+ success = ::SetEvent(this->noOtherBackgroundProcessEvent);
+ _ASSERT(success);
+
+ ::CloseHandle(this->noOtherBackgroundProcessEvent);
+ this->noOtherBackgroundProcessEvent = NULL;
+ }
+
+ {
+ WCHAR szBuffer[256];
+ swprintf_s(szBuffer, L"[Globals::~Globals] => VoIP background process with id %d shutting down\n", this->GetCurrentProcessId());
+ ::OutputDebugString(szBuffer);
+ }
+}
diff --git a/BackEnd/Globals.h b/BackEnd/Globals.h
new file mode 100755
index 0000000..c4b188b
--- /dev/null
+++ b/BackEnd/Globals.h
@@ -0,0 +1,137 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+#pragma once
+
+#include
+#include "IVideoRenderer.h"
+#include "IMTProtoUpdater.h"
+
+namespace PhoneVoIPApp
+{
+ namespace BackEnd
+ {
+ // Forward declarations
+ ref class CallController;
+ //ref class BackEndAudio;
+ ref class BackEndTransport;
+ ref class BackEndCapture;
+
+ // A singleton container that is used to hold other global singletons and background process-wide static state.
+ // Another purpose of this class is to start the out-of-process WinRT server, so that the UI process
+ // managed code can instantiate WinRT objects in this process.
+ public ref class Globals sealed
+ {
+ public:
+ // Start the out-of-process WinRT server, so that the UI process can instantiate WinRT objects in this process.
+ void StartServer(const Platform::Array^ outOfProcServerClassNames);
+
+ // Do some app-specific periodic tasks, to let the remote server know that this endpoint is still alive.
+ void DoPeriodicKeepAlive();
+
+ // Get the process id of the current process
+ static unsigned int GetCurrentProcessId();
+
+ // Get the name of the event that indicates if the UI is connected to the background process or not
+ static Platform::String^ GetUiDisconnectedEventName(unsigned int backgroundProcessId);
+
+ // Get the name of the event that indicates if the background process is ready or not
+ static Platform::String^ GetBackgroundProcessReadyEventName(unsigned int backgroundProcessId);
+
+ // Get the single instance of this class
+ static property Globals^ Instance
+ {
+ Globals^ get();
+ }
+
+ // Get the call controller singleton object
+ property PhoneVoIPApp::BackEnd::CallController^ CallController
+ {
+ PhoneVoIPApp::BackEnd::CallController^ get();
+ }
+
+ // The singleton video renderer object.
+ property IVideoRenderer^ VideoRenderer
+ {
+ IVideoRenderer^ get();
+ void set(IVideoRenderer^ value);
+ }
+
+ property IMTProtoUpdater^ MTProtoUpdater
+ {
+ IMTProtoUpdater^ get();
+ void set(IMTProtoUpdater^ value);
+ }
+
+ // The singleton audio controller object.
+ /*property BackEndAudio^ AudioController
+ {
+ BackEndAudio^ get();
+ }*/
+
+ // The singleton audio controller object.
+ property BackEndCapture^ CaptureController
+ {
+ BackEndCapture^ get();
+ }
+
+ // The singleton transport object.
+ property BackEndTransport^ TransportController
+ {
+ BackEndTransport^ get();
+ }
+
+ private:
+ // Default constructor
+ Globals();
+
+ // Destructor
+ ~Globals();
+
+ // Name of the event that indicates if another instance of the VoIP background process exists or not
+ static const LPCWSTR noOtherBackgroundProcessEventName;
+
+ // Name of the event that indicates if the UI is connected to the background process or not
+ static const LPCWSTR uiDisconnectedEventName;
+
+ // Name of the event that indicates if the background process is ready or not
+ static const LPCWSTR backgroundProcessReadyEventName;
+
+ // The single instance of this class
+ static Globals^ singleton;
+
+ // Indicates if the out-of-process server has started or not
+ bool started;
+
+ // A cookie that is used to unregister remotely activatable objects in this process
+ RO_REGISTRATION_COOKIE serverRegistrationCookie;
+
+ // An event that indicates if another instance of the background process exists or not
+ HANDLE noOtherBackgroundProcessEvent;
+
+ // An event that indicates that the background process is ready
+ HANDLE backgroundReadyEvent;
+
+ // The call controller object
+ PhoneVoIPApp::BackEnd::CallController^ callController;
+
+ // The video renderer object
+ PhoneVoIPApp::BackEnd::IVideoRenderer^ videoRenderer;
+
+ PhoneVoIPApp::BackEnd::IMTProtoUpdater^ mtProtoUpdater;
+
+ // The audio capture/render controller
+ //BackEndAudio^ audioController;
+
+ // The audio capture/render controller
+ BackEndCapture^ captureController;
+
+ // The data transport
+ BackEndTransport^ transportController;
+ };
+ }
+}
diff --git a/BackEnd/ICallControllerStatusListener.h b/BackEnd/ICallControllerStatusListener.h
new file mode 100755
index 0000000..f42b123
--- /dev/null
+++ b/BackEnd/ICallControllerStatusListener.h
@@ -0,0 +1,143 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+#pragma once
+
+#include
+
+namespace PhoneVoIPApp
+{
+ namespace BackEnd
+ {
+ // libtgvoip Endpoint
+ public ref class Endpoint sealed{
+ public:
+ property int64 id;
+ property uint16 port;
+ property Platform::String^ ipv4;
+ property Platform::String^ ipv6;
+ property Platform::Array^ peerTag;
+ };
+
+ public value struct EndpointStruct{
+ int64 id;
+ uint16 port;
+ Platform::String^ ipv4;
+ Platform::String^ ipv6;
+ Platform::String^ peerTag;
+ };
+
+ // libtgvoip ProxyProtocol
+ public enum class ProxyProtocol : int{
+ None = (int)libtgvoip::ProxyProtocol::None,
+ SOCKS5 = (int)libtgvoip::ProxyProtocol::SOCKS5
+ };
+
+ public value struct ProxyStruct{
+ ProxyProtocol protocol;
+ Platform::String^ address;
+ uint16 port;
+ Platform::String^ username;
+ Platform::String^ password;
+ };
+
+ // libtgvoip CallState
+ public enum class CallState : int{
+ WaitInit = (int)libtgvoip::CallState::WaitInit,
+ WaitInitAck = (int)libtgvoip::CallState::WaitInitAck,
+ Established = (int)libtgvoip::CallState::Established,
+ Failed = (int)libtgvoip::CallState::Failed
+ };
+
+ // libtgvoip Error
+ public enum class Error : int{
+ Unknown = (int)libtgvoip::Error::Unknown,
+ Incompatible = (int)libtgvoip::Error::Incompatible,
+ Timeout = (int)libtgvoip::Error::Timeout,
+ AudioIO = (int)libtgvoip::Error::AudioIO
+ };
+
+ // libtgvoip NetworkType
+ public enum class NetworkType : int{
+ Unknown = (int)libtgvoip::NetworkType::Unknown,
+ GPRS = (int)libtgvoip::NetworkType::GPRS,
+ EDGE = (int)libtgvoip::NetworkType::EDGE,
+ UMTS = (int)libtgvoip::NetworkType::UMTS,
+ HSPA = (int)libtgvoip::NetworkType::HSPA,
+ LTE = (int)libtgvoip::NetworkType::LTE,
+ WiFi = (int)libtgvoip::NetworkType::WiFi,
+ Ethernet = (int)libtgvoip::NetworkType::Ethernet,
+ OtherHighSpeed = (int)libtgvoip::NetworkType::OtherHighSpeed,
+ OtherLowSpeed = (int)libtgvoip::NetworkType::OtherLowSpeed,
+ Dialup = (int)libtgvoip::NetworkType::Dialup,
+ OtherMobile = (int)libtgvoip::NetworkType::OtherMobile,
+ };
+
+ // libtgvoip DataSavingMode
+ public enum class DataSavingMode{
+ Never = (int)libtgvoip::DataSavingMode::Never,
+ MobileOnly = (int)libtgvoip::DataSavingMode::MobileOnly,
+ Always = (int)libtgvoip::DataSavingMode::Always
+ };
+
+ // The status of a call
+ public enum class CallStatus
+ {
+ None = 0x00,
+ InProgress,
+ Held
+ };
+
+ // Where is the call audio going?
+ public enum class CallAudioRoute
+ {
+ None = (int)Windows::Phone::Media::Devices::AvailableAudioRoutingEndpoints::None,
+ Earpiece = (int)Windows::Phone::Media::Devices::AvailableAudioRoutingEndpoints::Earpiece,
+ Speakerphone = (int)Windows::Phone::Media::Devices::AvailableAudioRoutingEndpoints::Speakerphone,
+ Bluetooth = (int)Windows::Phone::Media::Devices::AvailableAudioRoutingEndpoints::Bluetooth
+ };
+
+ // Which camera are we using?
+ public enum class CameraLocation
+ {
+ Front = (int)Windows::Phone::Media::Capture::CameraSensorLocation::Front,
+ Back = (int)Windows::Phone::Media::Capture::CameraSensorLocation::Back
+ };
+
+ // Used to indicate the status of video/audio capture/render
+ public enum class MediaOperations
+ {
+ None = 0x00,
+ VideoCapture = 0x01,
+ VideoRender = 0x02,
+ AudioCapture = 0x04,
+ AudioRender = 0x08
+ };
+
+ // An interface that is used by the call controller to deliver status change notifications.
+ // This interface is meant to be implemented in the UI process, and will be called back by
+ // the agent host process using out-of-process WinRT.
+ public interface class ICallControllerStatusListener
+ {
+ void OnSignalBarsChanged(int newSignal);
+
+ void OnCallStateChanged(CallState newState);
+
+ // The status of a call has changed.
+ void OnCallStatusChanged(CallStatus newStatus);
+
+ // The call audio route has changed. Also called when the available audio routes have changed.
+ void OnCallAudioRouteChanged(CallAudioRoute newRoute);
+
+ // Video/audio capture/render has started/stopped
+ void OnMediaOperationsChanged(MediaOperations newOperations);
+
+ // Camera location has changed
+ void OnCameraLocationChanged(CameraLocation newCameraLocation);
+ };
+ }
+}
diff --git a/BackEnd/IConfig.h b/BackEnd/IConfig.h
new file mode 100755
index 0000000..4992c08
--- /dev/null
+++ b/BackEnd/IConfig.h
@@ -0,0 +1,13 @@
+#pragma once
+
+namespace PhoneVoIPApp
+{
+ namespace BackEnd
+ {
+ public interface class IConfig
+ {
+ property double InitTimeout;
+ property double RecvTimeout;
+ };
+ }
+}
\ No newline at end of file
diff --git a/BackEnd/IMTProtoUpdater.h b/BackEnd/IMTProtoUpdater.h
new file mode 100755
index 0000000..6458582
--- /dev/null
+++ b/BackEnd/IMTProtoUpdater.h
@@ -0,0 +1,30 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+#pragma once
+
+namespace PhoneVoIPApp
+{
+ namespace BackEnd
+ {
+ // An interface that is used by the call controller to start and stop mtproto communication.
+ public interface class IMTProtoUpdater
+ {
+ // Start handle background updates.
+ void Start(int pts, int date, int qts);
+
+ // Stop handle background updates.
+ void Stop();
+
+ // Discard incoming call
+ void DiscardCall(int64 id, int64 accessHash);
+
+ // Received incoming call
+ void ReceivedCall(int64 id, int64 accessHash);
+ };
+ }
+}
\ No newline at end of file
diff --git a/BackEnd/IVideoRenderer.h b/BackEnd/IVideoRenderer.h
new file mode 100755
index 0000000..d0bc771
--- /dev/null
+++ b/BackEnd/IVideoRenderer.h
@@ -0,0 +1,24 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+#pragma once
+
+namespace PhoneVoIPApp
+{
+ namespace BackEnd
+ {
+ // An interface that is used by the call controller to start and stop video rendering.
+ public interface class IVideoRenderer
+ {
+ // Start rendering video.
+ void Start();
+
+ // Stop rendering video.
+ void Stop();
+ };
+ }
+}
diff --git a/BackEnd/Server.h b/BackEnd/Server.h
new file mode 100755
index 0000000..6167299
--- /dev/null
+++ b/BackEnd/Server.h
@@ -0,0 +1,46 @@
+//
+// This is the source code of Telegram for Windows Phone v. 3.x.x.
+// It is licensed under GNU GPL v. 2 or later.
+// You should have received a copy of the license in this archive (see LICENSE).
+//
+// Copyright Evgeny Nadymov, 2013-present.
+//
+#pragma once
+#include
+#include "Globals.h"
+
+namespace PhoneVoIPApp
+{
+ namespace BackEnd
+ {
+ namespace OutOfProcess
+ {
+ // A remotely activatable class that is used by the UI process and managed code within
+ // the VoIP background process to get access to native objects that exist in the VoIP background process.
+ public ref class Server sealed
+ {
+ public:
+ // Constructor
+ Server()
+ {
+ }
+
+ // Destructor
+ virtual ~Server()
+ {
+ }
+
+ // Called by the UI process to get the call controller object
+ property CallController^ CallController
+ {
+ PhoneVoIPApp::BackEnd::CallController^ get()
+ {
+ return Globals::Instance->CallController;
+ };
+ }
+
+ // Add methods and properties to get other objects here, as required.
+ };
+ }
+ }
+}
diff --git a/BackEndProxyStub/BackEndProxyStub.def b/BackEndProxyStub/BackEndProxyStub.def
new file mode 100755
index 0000000..31a09ed
--- /dev/null
+++ b/BackEndProxyStub/BackEndProxyStub.def
@@ -0,0 +1,5 @@
+EXPORTS
+ DllGetClassObject PRIVATE
+ DllCanUnloadNow PRIVATE
+ DllRegisterServer PRIVATE
+ DllUnregisterServer PRIVATE
\ No newline at end of file
diff --git a/BackEndProxyStub/BackEndProxyStub.vcxproj b/BackEndProxyStub/BackEndProxyStub.vcxproj
new file mode 100755
index 0000000..58eddf9
--- /dev/null
+++ b/BackEndProxyStub/BackEndProxyStub.vcxproj
@@ -0,0 +1,155 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ ARM
+
+
+ Release
+ Win32
+
+
+ Release
+ ARM
+
+
+
+ {bbabeea1-494c-4618-96e3-399873a5558b}
+ BackEndProxyStub
+ en-US
+ $(VCTargetsPath11)
+ 11.0
+ Windows Phone
+ 8.0
+ Windows Phone Silverlight
+ 8.1
+
+
+
+ DynamicLibrary
+ true
+ v120
+ false
+
+
+ DynamicLibrary
+ true
+ v120
+ false
+
+
+ DynamicLibrary
+ false
+ true
+ v120
+ false
+
+
+ DynamicLibrary
+ false
+ true
+ v120
+ false
+
+
+
+
+
+
+
+ false
+
+
+ PhoneVoIPApp.$(ProjectName)
+ $(SolutionDir)$(PlatformTarget)\$(Configuration)\$(MSBuildProjectName)\
+ $(PlatformTarget)\$(Configuration)\
+
+
+ PhoneVoIPApp.$(ProjectName)
+ $(SolutionDir)$(PlatformTarget)\$(Configuration)\$(MSBuildProjectName)\
+ $(PlatformTarget)\$(Configuration)\
+
+
+ PhoneVoIPApp.$(ProjectName)
+ $(SolutionDir)$(PlatformTarget)\$(Configuration)\$(MSBuildProjectName)\
+ $(PlatformTarget)\$(Configuration)\
+
+
+ PhoneVoIPApp.$(ProjectName)
+ $(SolutionDir)$(PlatformTarget)\$(Configuration)\$(MSBuildProjectName)\
+ $(PlatformTarget)\$(Configuration)\
+
+
+
+ WIN32_LEAN_AND_MEAN;WIN32;REGISTER_PROXY_DLL;_USRDLL;%(PreprocessorDefinitions)
+
+
+
+
+ WIN32_LEAN_AND_MEAN;WIN32;REGISTER_PROXY_DLL;_USRDLL;NDEBUG;%(PreprocessorDefinitions)
+
+
+
+
+ WIN32_LEAN_AND_MEAN;_ARM_;WIN32;REGISTER_PROXY_DLL;_USRDLL;%(PreprocessorDefinitions)
+
+
+
+
+ WIN32_LEAN_AND_MEAN;_ARM_;WIN32;REGISTER_PROXY_DLL;_USRDLL;NDEBUG;%(PreprocessorDefinitions)
+
+
+
+
+ NotUsing
+ false
+ $(WindowsSDK_WindowsMetadata);$(AdditionalUsingDirectories)
+ $(ProjectDir);%(AdditionalIncludeDirectories)
+ $(ProjectDir);%(AdditionalIncludeDirectories)
+ $(ProjectDir);%(AdditionalIncludeDirectories)
+ $(ProjectDir);%(AdditionalIncludeDirectories)
+
+
+ Console
+ false
+ windowsphonecore.lib;runtimeobject.lib;rpcrt4.lib;%(AdditionalDependencies)
+ false
+ $(ProjectName).def
+ $(ProjectName).def
+ $(ProjectName).def
+ $(ProjectName).def
+
+
+
+
+ true
+
+
+ true
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BackEndProxyStub/PhoneVoIPApp.BackEnd.OutOfProcess.h b/BackEndProxyStub/PhoneVoIPApp.BackEnd.OutOfProcess.h
new file mode 100755
index 0000000..7a1cb37
--- /dev/null
+++ b/BackEndProxyStub/PhoneVoIPApp.BackEnd.OutOfProcess.h
@@ -0,0 +1,278 @@
+
+
+/* this ALWAYS GENERATED file contains the definitions for the interfaces */
+
+
+ /* File created by MIDL compiler version 8.00.0603 */
+/* at Tue Jan 29 08:48:52 2019
+ */
+/* Compiler settings for C:\Users\evgeny\AppData\Local\Temp\PhoneVoIPApp.BackEnd.OutOfProcess.idl-5b92719d:
+ Oicf, W1, Zp8, env=Win32 (32b run), target_arch=ARM 8.00.0603
+ protocol : dce , ms_ext, c_ext, robust
+ error checks: allocation ref bounds_check enum stub_data
+ VC __declspec() decoration level:
+ __declspec(uuid()), __declspec(selectany), __declspec(novtable)
+ DECLSPEC_UUID(), MIDL_INTERFACE()
+*/
+/* @@MIDL_FILE_HEADING( ) */
+
+#pragma warning( disable: 4049 ) /* more than 64k source lines */
+
+
+/* verify that the version is high enough to compile this file*/
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
+
+#include "rpc.h"
+#include "rpcndr.h"
+
+#ifndef __RPCNDR_H_VERSION__
+#error this stub requires an updated version of
+#endif // __RPCNDR_H_VERSION__
+
+#ifndef COM_NO_WINDOWS_H
+#include "windows.h"
+#include "ole2.h"
+#endif /*COM_NO_WINDOWS_H*/
+
+#ifndef __PhoneVoIPApp2EBackEnd2EOutOfProcess_h__
+#define __PhoneVoIPApp2EBackEnd2EOutOfProcess_h__
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+#pragma once
+#endif
+
+/* Forward Declarations */
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_FWD_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_FWD_DEFINED__
+typedef interface __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals;
+
+#ifdef __cplusplus
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+ namespace OutOfProcess {
+ interface __IServerPublicNonVirtuals;
+ } /* end namespace */
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+#endif /* __cplusplus */
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_FWD_DEFINED__ */
+
+
+/* header files for imported files */
+#include "inspectable.h"
+#include "AsyncInfo.h"
+#include "EventToken.h"
+#include "Windows.Foundation.h"
+#include "PhoneVoIPApp.BackEnd.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd2EOutOfProcess_0000_0000 */
+/* [local] */
+
+#if defined(__cplusplus)
+}
+#endif // defined(__cplusplus)
+#include
+#if !defined(__phonevoipapp2Ebackend_h__)
+#include
+#endif // !defined(__phonevoipapp2Ebackend_h__)
+#if defined(__cplusplus)
+extern "C" {
+#endif // defined(__cplusplus)
+#ifdef __cplusplus
+namespace ABI {
+namespace PhoneVoIPApp {
+namespace BackEnd {
+class CallController;
+} /*BackEnd*/
+} /*PhoneVoIPApp*/
+}
+#endif
+
+
+#ifdef __cplusplus
+namespace ABI {
+namespace PhoneVoIPApp {
+namespace BackEnd {
+namespace OutOfProcess {
+class Server;
+} /*OutOfProcess*/
+} /*BackEnd*/
+} /*PhoneVoIPApp*/
+}
+#endif
+#if !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_INTERFACE_DEFINED__)
+extern const __declspec(selectany) _Null_terminated_ WCHAR InterfaceName_PhoneVoIPApp_BackEnd_OutOfProcess___IServerPublicNonVirtuals[] = L"PhoneVoIPApp.BackEnd.OutOfProcess.__IServerPublicNonVirtuals";
+#endif /* !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_INTERFACE_DEFINED__) */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd2EOutOfProcess_0000_0000 */
+/* [local] */
+
+
+
+
+
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd2EOutOfProcess_0000_0000_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd2EOutOfProcess_0000_0000_v0_0_s_ifspec;
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_INTERFACE_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_INTERFACE_DEFINED__
+
+/* interface __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals */
+/* [uuid][object] */
+
+
+
+/* interface ABI::PhoneVoIPApp::BackEnd::OutOfProcess::__IServerPublicNonVirtuals */
+/* [uuid][object] */
+
+
+EXTERN_C const IID IID___x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals;
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+ } /* end extern "C" */
+ namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+ namespace OutOfProcess {
+
+ MIDL_INTERFACE("7BF79491-56BE-375A-BC22-0058B158F01F")
+ __IServerPublicNonVirtuals : public IInspectable
+ {
+ public:
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CallController(
+ /* [out][retval] */ ABI::PhoneVoIPApp::BackEnd::__ICallControllerPublicNonVirtuals **__returnValue) = 0;
+
+ };
+
+ extern const __declspec(selectany) IID & IID___IServerPublicNonVirtuals = __uuidof(__IServerPublicNonVirtuals);
+
+
+ } /* end namespace */
+ } /* end namespace */
+ } /* end namespace */
+ } /* end namespace */
+ extern "C" {
+
+#else /* C style interface */
+
+ typedef struct __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtualsVtbl
+ {
+ BEGIN_INTERFACE
+
+ HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals * This,
+ /* [in] */ REFIID riid,
+ /* [annotation][iid_is][out] */
+ _COM_Outptr_ void **ppvObject);
+
+ ULONG ( STDMETHODCALLTYPE *AddRef )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals * This);
+
+ ULONG ( STDMETHODCALLTYPE *Release )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals * This);
+
+ HRESULT ( STDMETHODCALLTYPE *GetIids )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals * This,
+ /* [out] */ ULONG *iidCount,
+ /* [size_is][size_is][out] */ IID **iids);
+
+ HRESULT ( STDMETHODCALLTYPE *GetRuntimeClassName )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals * This,
+ /* [out] */ HSTRING *className);
+
+ HRESULT ( STDMETHODCALLTYPE *GetTrustLevel )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals * This,
+ /* [out] */ TrustLevel *trustLevel);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CallController )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals * This,
+ /* [out][retval] */ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals **__returnValue);
+
+ END_INTERFACE
+ } __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtualsVtbl;
+
+ interface __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals
+ {
+ CONST_VTBL struct __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtualsVtbl *lpVtbl;
+ };
+
+
+
+#ifdef COBJMACROS
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_QueryInterface(This,riid,ppvObject) \
+ ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_AddRef(This) \
+ ( (This)->lpVtbl -> AddRef(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_Release(This) \
+ ( (This)->lpVtbl -> Release(This) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_GetIids(This,iidCount,iids) \
+ ( (This)->lpVtbl -> GetIids(This,iidCount,iids) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_GetRuntimeClassName(This,className) \
+ ( (This)->lpVtbl -> GetRuntimeClassName(This,className) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_GetTrustLevel(This,trustLevel) \
+ ( (This)->lpVtbl -> GetTrustLevel(This,trustLevel) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_get_CallController(This,__returnValue) \
+ ( (This)->lpVtbl -> get_CallController(This,__returnValue) )
+
+#endif /* COBJMACROS */
+
+
+#endif /* C style interface */
+
+
+
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_INTERFACE_DEFINED__ */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd2EOutOfProcess_0000_0001 */
+/* [local] */
+
+#ifndef RUNTIMECLASS_PhoneVoIPApp_BackEnd_OutOfProcess_Server_DEFINED
+#define RUNTIMECLASS_PhoneVoIPApp_BackEnd_OutOfProcess_Server_DEFINED
+extern const __declspec(selectany) _Null_terminated_ WCHAR RuntimeClass_PhoneVoIPApp_BackEnd_OutOfProcess_Server[] = L"PhoneVoIPApp.BackEnd.OutOfProcess.Server";
+#endif
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd2EOutOfProcess_0000_0001 */
+/* [local] */
+
+
+
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd2EOutOfProcess_0000_0001_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd2EOutOfProcess_0000_0001_v0_0_s_ifspec;
+
+/* Additional Prototypes for ALL interfaces */
+
+/* end of Additional Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/BackEndProxyStub/PhoneVoIPApp.BackEnd.OutOfProcess_i.c b/BackEndProxyStub/PhoneVoIPApp.BackEnd.OutOfProcess_i.c
new file mode 100755
index 0000000..1e01d0d
--- /dev/null
+++ b/BackEndProxyStub/PhoneVoIPApp.BackEnd.OutOfProcess_i.c
@@ -0,0 +1,79 @@
+
+
+/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */
+
+/* link this file in with the server and any clients */
+
+
+ /* File created by MIDL compiler version 8.00.0603 */
+/* at Tue Jan 29 08:48:52 2019
+ */
+/* Compiler settings for C:\Users\evgeny\AppData\Local\Temp\PhoneVoIPApp.BackEnd.OutOfProcess.idl-5b92719d:
+ Oicf, W1, Zp8, env=Win32 (32b run), target_arch=ARM 8.00.0603
+ protocol : dce , ms_ext, c_ext, robust
+ error checks: allocation ref bounds_check enum stub_data
+ VC __declspec() decoration level:
+ __declspec(uuid()), __declspec(selectany), __declspec(novtable)
+ DECLSPEC_UUID(), MIDL_INTERFACE()
+*/
+/* @@MIDL_FILE_HEADING( ) */
+
+#pragma warning( disable: 4049 ) /* more than 64k source lines */
+
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+
+#include
+#include
+
+#ifdef _MIDL_USE_GUIDDEF_
+
+#ifndef INITGUID
+#define INITGUID
+#include
+#undef INITGUID
+#else
+#include
+#endif
+
+#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
+ DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)
+
+#else // !_MIDL_USE_GUIDDEF_
+
+#ifndef __IID_DEFINED__
+#define __IID_DEFINED__
+
+typedef struct _IID
+{
+ unsigned long x;
+ unsigned short s1;
+ unsigned short s2;
+ unsigned char c[8];
+} IID;
+
+#endif // __IID_DEFINED__
+
+#ifndef CLSID_DEFINED
+#define CLSID_DEFINED
+typedef IID CLSID;
+#endif // CLSID_DEFINED
+
+#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
+ const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
+
+#endif !_MIDL_USE_GUIDDEF_
+
+MIDL_DEFINE_GUID(IID, IID___x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals,0x7BF79491,0x56BE,0x375A,0xBC,0x22,0x00,0x58,0xB1,0x58,0xF0,0x1F);
+
+#undef MIDL_DEFINE_GUID
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
diff --git a/BackEndProxyStub/PhoneVoIPApp.BackEnd.OutOfProcess_p.c b/BackEndProxyStub/PhoneVoIPApp.BackEnd.OutOfProcess_p.c
new file mode 100755
index 0000000..0a14e06
--- /dev/null
+++ b/BackEndProxyStub/PhoneVoIPApp.BackEnd.OutOfProcess_p.c
@@ -0,0 +1,338 @@
+
+
+/* this ALWAYS GENERATED file contains the proxy stub code */
+
+
+ /* File created by MIDL compiler version 8.00.0603 */
+/* at Tue Jan 29 08:48:52 2019
+ */
+/* Compiler settings for C:\Users\evgeny\AppData\Local\Temp\PhoneVoIPApp.BackEnd.OutOfProcess.idl-5b92719d:
+ Oicf, W1, Zp8, env=Win32 (32b run), target_arch=ARM 8.00.0603
+ protocol : dce , ms_ext, c_ext, robust
+ error checks: allocation ref bounds_check enum stub_data
+ VC __declspec() decoration level:
+ __declspec(uuid()), __declspec(selectany), __declspec(novtable)
+ DECLSPEC_UUID(), MIDL_INTERFACE()
+*/
+/* @@MIDL_FILE_HEADING( ) */
+
+#if defined(_ARM_)
+
+
+#pragma warning( disable: 4049 ) /* more than 64k source lines */
+#if _MSC_VER >= 1200
+#pragma warning(push)
+#endif
+
+#pragma warning( disable: 4211 ) /* redefine extern to static */
+#pragma warning( disable: 4232 ) /* dllimport identity*/
+#pragma warning( disable: 4024 ) /* array to pointer mapping*/
+#pragma warning( disable: 4152 ) /* function/data pointer conversion in expression */
+
+#define USE_STUBLESS_PROXY
+
+
+/* verify that the version is high enough to compile this file*/
+#ifndef __REDQ_RPCPROXY_H_VERSION__
+#define __REQUIRED_RPCPROXY_H_VERSION__ 475
+#endif
+
+
+#include "rpcproxy.h"
+#ifndef __RPCPROXY_H_VERSION__
+#error this stub requires an updated version of
+#endif /* __RPCPROXY_H_VERSION__ */
+
+
+#include "PhoneVoIPApp.BackEnd.OutOfProcess.h"
+
+#define TYPE_FORMAT_STRING_SIZE 25
+#define PROC_FORMAT_STRING_SIZE 43
+#define EXPR_FORMAT_STRING_SIZE 1
+#define TRANSMIT_AS_TABLE_SIZE 0
+#define WIRE_MARSHAL_TABLE_SIZE 0
+
+typedef struct _PhoneVoIPApp2EBackEnd2EOutOfProcess_MIDL_TYPE_FORMAT_STRING
+ {
+ short Pad;
+ unsigned char Format[ TYPE_FORMAT_STRING_SIZE ];
+ } PhoneVoIPApp2EBackEnd2EOutOfProcess_MIDL_TYPE_FORMAT_STRING;
+
+typedef struct _PhoneVoIPApp2EBackEnd2EOutOfProcess_MIDL_PROC_FORMAT_STRING
+ {
+ short Pad;
+ unsigned char Format[ PROC_FORMAT_STRING_SIZE ];
+ } PhoneVoIPApp2EBackEnd2EOutOfProcess_MIDL_PROC_FORMAT_STRING;
+
+typedef struct _PhoneVoIPApp2EBackEnd2EOutOfProcess_MIDL_EXPR_FORMAT_STRING
+ {
+ long Pad;
+ unsigned char Format[ EXPR_FORMAT_STRING_SIZE ];
+ } PhoneVoIPApp2EBackEnd2EOutOfProcess_MIDL_EXPR_FORMAT_STRING;
+
+
+static const RPC_SYNTAX_IDENTIFIER _RpcTransferSyntax =
+{{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}};
+
+
+extern const PhoneVoIPApp2EBackEnd2EOutOfProcess_MIDL_TYPE_FORMAT_STRING PhoneVoIPApp2EBackEnd2EOutOfProcess__MIDL_TypeFormatString;
+extern const PhoneVoIPApp2EBackEnd2EOutOfProcess_MIDL_PROC_FORMAT_STRING PhoneVoIPApp2EBackEnd2EOutOfProcess__MIDL_ProcFormatString;
+extern const PhoneVoIPApp2EBackEnd2EOutOfProcess_MIDL_EXPR_FORMAT_STRING PhoneVoIPApp2EBackEnd2EOutOfProcess__MIDL_ExprFormatString;
+
+
+extern const MIDL_STUB_DESC Object_StubDesc;
+
+
+extern const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_ServerInfo;
+extern const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_ProxyInfo;
+
+
+
+#if !defined(__RPC_ARM32__)
+#error Invalid build platform for this stub.
+#endif
+
+#if !(TARGET_IS_NT50_OR_LATER)
+#error You need Windows 2000 or later to run this stub because it uses these features:
+#error /robust command line switch.
+#error However, your C/C++ compilation flags indicate you intend to run this app on earlier systems.
+#error This app will fail with the RPC_X_WRONG_STUB_VERSION error.
+#endif
+
+
+static const PhoneVoIPApp2EBackEnd2EOutOfProcess_MIDL_PROC_FORMAT_STRING PhoneVoIPApp2EBackEnd2EOutOfProcess__MIDL_ProcFormatString =
+ {
+ 0,
+ {
+
+ /* Procedure get_CallController */
+
+ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2 */ NdrFcLong( 0x0 ), /* 0 */
+/* 6 */ NdrFcShort( 0x6 ), /* 6 */
+/* 8 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 10 */ NdrFcShort( 0x0 ), /* 0 */
+/* 12 */ NdrFcShort( 0x8 ), /* 8 */
+/* 14 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 16 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 18 */ NdrFcShort( 0x0 ), /* 0 */
+/* 20 */ NdrFcShort( 0x0 ), /* 0 */
+/* 22 */ NdrFcShort( 0x0 ), /* 0 */
+/* 24 */ NdrFcShort( 0x2 ), /* 2 */
+/* 26 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 28 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 30 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */
+/* 32 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 34 */ NdrFcShort( 0x2 ), /* Type Offset=2 */
+
+ /* Return value */
+
+/* 36 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 38 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 40 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ 0x0
+ }
+ };
+
+static const PhoneVoIPApp2EBackEnd2EOutOfProcess_MIDL_TYPE_FORMAT_STRING PhoneVoIPApp2EBackEnd2EOutOfProcess__MIDL_TypeFormatString =
+ {
+ 0,
+ {
+ NdrFcShort( 0x0 ), /* 0 */
+/* 2 */
+ 0x11, 0x10, /* FC_RP [pointer_deref] */
+/* 4 */ NdrFcShort( 0x2 ), /* Offset= 2 (6) */
+/* 6 */
+ 0x2f, /* FC_IP */
+ 0x5a, /* FC_CONSTANT_IID */
+/* 8 */ NdrFcLong( 0x6b50718 ), /* 112527128 */
+/* 12 */ NdrFcShort( 0x3528 ), /* 13608 */
+/* 14 */ NdrFcShort( 0x3b66 ), /* 15206 */
+/* 16 */ 0xbe, /* 190 */
+ 0x76, /* 118 */
+/* 18 */ 0xe1, /* 225 */
+ 0x83, /* 131 */
+/* 20 */ 0xaa, /* 170 */
+ 0x80, /* 128 */
+/* 22 */ 0xd4, /* 212 */
+ 0xa5, /* 165 */
+
+ 0x0
+ }
+ };
+
+
+/* Standard interface: __MIDL_itf_PhoneVoIPApp2EBackEnd2EOutOfProcess_0000_0000, ver. 0.0,
+ GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */
+
+
+/* Object interface: IUnknown, ver. 0.0,
+ GUID={0x00000000,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */
+
+
+/* Object interface: IInspectable, ver. 0.0,
+ GUID={0xAF86E2E0,0xB12D,0x4c6a,{0x9C,0x5A,0xD7,0xAA,0x65,0x10,0x1E,0x90}} */
+
+
+/* Object interface: __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals, ver. 0.0,
+ GUID={0x7BF79491,0x56BE,0x375A,{0xBC,0x22,0x00,0x58,0xB1,0x58,0xF0,0x1F}} */
+
+#pragma code_seg(".orpc")
+static const unsigned short __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_FormatStringOffsetTable[] =
+ {
+ (unsigned short) -1,
+ (unsigned short) -1,
+ (unsigned short) -1,
+ 0
+ };
+
+static const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_ProxyInfo =
+ {
+ &Object_StubDesc,
+ PhoneVoIPApp2EBackEnd2EOutOfProcess__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0
+ };
+
+
+static const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_ServerInfo =
+ {
+ &Object_StubDesc,
+ 0,
+ PhoneVoIPApp2EBackEnd2EOutOfProcess__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0,
+ 0};
+CINTERFACE_PROXY_VTABLE(7) ___x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtualsProxyVtbl =
+{
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_ProxyInfo,
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals,
+ IUnknown_QueryInterface_Proxy,
+ IUnknown_AddRef_Proxy,
+ IUnknown_Release_Proxy ,
+ 0 /* IInspectable::GetIids */ ,
+ 0 /* IInspectable::GetRuntimeClassName */ ,
+ 0 /* IInspectable::GetTrustLevel */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals::get_CallController */
+};
+
+
+static const PRPC_STUB_FUNCTION __x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_table[] =
+{
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ NdrStubCall2
+};
+
+CInterfaceStubVtbl ___x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtualsStubVtbl =
+{
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_ServerInfo,
+ 7,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals_table[-3],
+ CStdStubBuffer_DELEGATING_METHODS
+};
+
+
+/* Standard interface: __MIDL_itf_PhoneVoIPApp2EBackEnd2EOutOfProcess_0000_0001, ver. 0.0,
+ GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */
+
+static const MIDL_STUB_DESC Object_StubDesc =
+ {
+ 0,
+ NdrOleAllocate,
+ NdrOleFree,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ PhoneVoIPApp2EBackEnd2EOutOfProcess__MIDL_TypeFormatString.Format,
+ 1, /* -error bounds_check flag */
+ 0x50002, /* Ndr library version */
+ 0,
+ 0x800025b, /* MIDL Version 8.0.603 */
+ 0,
+ 0,
+ 0, /* notify & notify_flag routine table */
+ 0x1, /* MIDL flag */
+ 0, /* cs routines */
+ 0, /* proxy/server info */
+ 0
+ };
+
+const CInterfaceProxyVtbl * const _PhoneVoIPApp2EBackEnd2EOutOfProcess_ProxyVtblList[] =
+{
+ ( CInterfaceProxyVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtualsProxyVtbl,
+ 0
+};
+
+const CInterfaceStubVtbl * const _PhoneVoIPApp2EBackEnd2EOutOfProcess_StubVtblList[] =
+{
+ ( CInterfaceStubVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtualsStubVtbl,
+ 0
+};
+
+PCInterfaceName const _PhoneVoIPApp2EBackEnd2EOutOfProcess_InterfaceNamesList[] =
+{
+ "__x_ABI_CPhoneVoIPApp_CBackEnd_COutOfProcess_C____IServerPublicNonVirtuals",
+ 0
+};
+
+const IID * const _PhoneVoIPApp2EBackEnd2EOutOfProcess_BaseIIDList[] =
+{
+ &IID_IInspectable,
+ 0
+};
+
+
+#define _PhoneVoIPApp2EBackEnd2EOutOfProcess_CHECK_IID(n) IID_GENERIC_CHECK_IID( _PhoneVoIPApp2EBackEnd2EOutOfProcess, pIID, n)
+
+int __stdcall _PhoneVoIPApp2EBackEnd2EOutOfProcess_IID_Lookup( const IID * pIID, int * pIndex )
+{
+
+ if(!_PhoneVoIPApp2EBackEnd2EOutOfProcess_CHECK_IID(0))
+ {
+ *pIndex = 0;
+ return 1;
+ }
+
+ return 0;
+}
+
+const ExtendedProxyFileInfo PhoneVoIPApp2EBackEnd2EOutOfProcess_ProxyFileInfo =
+{
+ (PCInterfaceProxyVtblList *) & _PhoneVoIPApp2EBackEnd2EOutOfProcess_ProxyVtblList,
+ (PCInterfaceStubVtblList *) & _PhoneVoIPApp2EBackEnd2EOutOfProcess_StubVtblList,
+ (const PCInterfaceName * ) & _PhoneVoIPApp2EBackEnd2EOutOfProcess_InterfaceNamesList,
+ (const IID ** ) & _PhoneVoIPApp2EBackEnd2EOutOfProcess_BaseIIDList,
+ & _PhoneVoIPApp2EBackEnd2EOutOfProcess_IID_Lookup,
+ 1,
+ 2,
+ 0, /* table of [async_uuid] interfaces */
+ 0, /* Filler1 */
+ 0, /* Filler2 */
+ 0 /* Filler3 */
+};
+#if _MSC_VER >= 1200
+#pragma warning(pop)
+#endif
+
+
+#endif /* if defined(_ARM_) */
+
diff --git a/BackEndProxyStub/PhoneVoIPApp.BackEnd.h b/BackEndProxyStub/PhoneVoIPApp.BackEnd.h
new file mode 100755
index 0000000..941662b
--- /dev/null
+++ b/BackEndProxyStub/PhoneVoIPApp.BackEnd.h
@@ -0,0 +1,4046 @@
+
+
+/* this ALWAYS GENERATED file contains the definitions for the interfaces */
+
+
+ /* File created by MIDL compiler version 8.00.0603 */
+/* at Tue Jan 29 08:48:50 2019
+ */
+/* Compiler settings for C:\Users\evgeny\AppData\Local\Temp\PhoneVoIPApp.BackEnd.idl-35395493:
+ Oicf, W1, Zp8, env=Win32 (32b run), target_arch=ARM 8.00.0603
+ protocol : dce , ms_ext, c_ext, robust
+ error checks: allocation ref bounds_check enum stub_data
+ VC __declspec() decoration level:
+ __declspec(uuid()), __declspec(selectany), __declspec(novtable)
+ DECLSPEC_UUID(), MIDL_INTERFACE()
+*/
+/* @@MIDL_FILE_HEADING( ) */
+
+#pragma warning( disable: 4049 ) /* more than 64k source lines */
+
+
+/* verify that the version is high enough to compile this file*/
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
+
+#include "rpc.h"
+#include "rpcndr.h"
+
+#ifndef __RPCNDR_H_VERSION__
+#error this stub requires an updated version of
+#endif // __RPCNDR_H_VERSION__
+
+#ifndef COM_NO_WINDOWS_H
+#include "windows.h"
+#include "ole2.h"
+#endif /*COM_NO_WINDOWS_H*/
+
+#ifndef __PhoneVoIPApp2EBackEnd_h__
+#define __PhoneVoIPApp2EBackEnd_h__
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+#pragma once
+#endif
+
+/* Forward Declarations */
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler_FWD_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler_FWD_DEFINED__
+typedef interface __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler;
+
+#ifdef __cplusplus
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+ interface IMessageReceivedEventHandler;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+#endif /* __cplusplus */
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler_FWD_DEFINED__ */
+
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler_FWD_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler_FWD_DEFINED__
+typedef interface __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler;
+
+#ifdef __cplusplus
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+ interface ICameraLocationChangedEventHandler;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+#endif /* __cplusplus */
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler_FWD_DEFINED__ */
+
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback_FWD_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback_FWD_DEFINED__
+typedef interface __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback;
+
+#ifdef __cplusplus
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+ interface IIncomingCallDialogDismissedCallback;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+#endif /* __cplusplus */
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback_FWD_DEFINED__ */
+
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_FWD_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_FWD_DEFINED__
+typedef interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals;
+
+#ifdef __cplusplus
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+ interface __IBackEndTransportPublicNonVirtuals;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+#endif /* __cplusplus */
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_FWD_DEFINED__ */
+
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_FWD_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_FWD_DEFINED__
+typedef interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals;
+
+#ifdef __cplusplus
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+ interface __IBackEndTransportProtectedNonVirtuals;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+#endif /* __cplusplus */
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_FWD_DEFINED__ */
+
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_FWD_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_FWD_DEFINED__
+typedef interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals;
+
+#ifdef __cplusplus
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+ interface __IEndpointPublicNonVirtuals;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+#endif /* __cplusplus */
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_FWD_DEFINED__ */
+
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_FWD_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_FWD_DEFINED__
+typedef interface __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener;
+
+#ifdef __cplusplus
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+ interface ICallControllerStatusListener;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+#endif /* __cplusplus */
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_FWD_DEFINED__ */
+
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_FWD_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_FWD_DEFINED__
+typedef interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals;
+
+#ifdef __cplusplus
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+ interface __IBackEndCapturePublicNonVirtuals;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+#endif /* __cplusplus */
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_FWD_DEFINED__ */
+
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_FWD_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_FWD_DEFINED__
+typedef interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals;
+
+#ifdef __cplusplus
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+ interface __IBackEndCaptureProtectedNonVirtuals;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+#endif /* __cplusplus */
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_FWD_DEFINED__ */
+
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_FWD_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_FWD_DEFINED__
+typedef interface __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig;
+
+#ifdef __cplusplus
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+ interface IConfig;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+#endif /* __cplusplus */
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_FWD_DEFINED__ */
+
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_FWD_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_FWD_DEFINED__
+typedef interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals;
+
+#ifdef __cplusplus
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+ interface __ICallControllerPublicNonVirtuals;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+#endif /* __cplusplus */
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_FWD_DEFINED__ */
+
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_FWD_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_FWD_DEFINED__
+typedef interface __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer;
+
+#ifdef __cplusplus
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+ interface IVideoRenderer;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+#endif /* __cplusplus */
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_FWD_DEFINED__ */
+
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_FWD_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_FWD_DEFINED__
+typedef interface __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater;
+
+#ifdef __cplusplus
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+ interface IMTProtoUpdater;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+#endif /* __cplusplus */
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_FWD_DEFINED__ */
+
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_FWD_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_FWD_DEFINED__
+typedef interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals;
+
+#ifdef __cplusplus
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+ interface __IGlobalsPublicNonVirtuals;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+#endif /* __cplusplus */
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_FWD_DEFINED__ */
+
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_FWD_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_FWD_DEFINED__
+typedef interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics;
+
+#ifdef __cplusplus
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+ interface __IGlobalsStatics;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+#endif /* __cplusplus */
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_FWD_DEFINED__ */
+
+
+/* header files for imported files */
+#include "inspectable.h"
+#include "AsyncInfo.h"
+#include "EventToken.h"
+#include "Windows.Foundation.h"
+#include "Windows.Storage.Streams.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0000 */
+/* [local] */
+
+#if defined(__cplusplus)
+}
+#endif // defined(__cplusplus)
+#include
+#if !defined(__windows2Estorage2Estreams_h__)
+#include
+#endif // !defined(__windows2Estorage2Estreams_h__)
+#if defined(__cplusplus)
+extern "C" {
+#endif // defined(__cplusplus)
+#if !defined(__cplusplus)
+#if !defined(__cplusplus)
+
+typedef enum __x_ABI_CPhoneVoIPApp_CBackEnd_CProxyProtocol __x_ABI_CPhoneVoIPApp_CBackEnd_CProxyProtocol;
+
+
+#endif /* end if !defined(__cplusplus) */
+
+
+#endif
+#if !defined(__cplusplus)
+#if !defined(__cplusplus)
+
+typedef enum __x_ABI_CPhoneVoIPApp_CBackEnd_CCallState __x_ABI_CPhoneVoIPApp_CBackEnd_CCallState;
+
+
+#endif /* end if !defined(__cplusplus) */
+
+
+#endif
+#if !defined(__cplusplus)
+#if !defined(__cplusplus)
+
+typedef enum __x_ABI_CPhoneVoIPApp_CBackEnd_CError __x_ABI_CPhoneVoIPApp_CBackEnd_CError;
+
+
+#endif /* end if !defined(__cplusplus) */
+
+
+#endif
+#if !defined(__cplusplus)
+#if !defined(__cplusplus)
+
+typedef enum __x_ABI_CPhoneVoIPApp_CBackEnd_CNetworkType __x_ABI_CPhoneVoIPApp_CBackEnd_CNetworkType;
+
+
+#endif /* end if !defined(__cplusplus) */
+
+
+#endif
+#if !defined(__cplusplus)
+#if !defined(__cplusplus)
+
+typedef enum __x_ABI_CPhoneVoIPApp_CBackEnd_CDataSavingMode __x_ABI_CPhoneVoIPApp_CBackEnd_CDataSavingMode;
+
+
+#endif /* end if !defined(__cplusplus) */
+
+
+#endif
+#if !defined(__cplusplus)
+#if !defined(__cplusplus)
+
+typedef enum __x_ABI_CPhoneVoIPApp_CBackEnd_CCallStatus __x_ABI_CPhoneVoIPApp_CBackEnd_CCallStatus;
+
+
+#endif /* end if !defined(__cplusplus) */
+
+
+#endif
+#if !defined(__cplusplus)
+#if !defined(__cplusplus)
+
+typedef enum __x_ABI_CPhoneVoIPApp_CBackEnd_CCallAudioRoute __x_ABI_CPhoneVoIPApp_CBackEnd_CCallAudioRoute;
+
+
+#endif /* end if !defined(__cplusplus) */
+
+
+#endif
+#if !defined(__cplusplus)
+#if !defined(__cplusplus)
+
+typedef enum __x_ABI_CPhoneVoIPApp_CBackEnd_CCameraLocation __x_ABI_CPhoneVoIPApp_CBackEnd_CCameraLocation;
+
+
+#endif /* end if !defined(__cplusplus) */
+
+
+#endif
+#if !defined(__cplusplus)
+#if !defined(__cplusplus)
+
+typedef enum __x_ABI_CPhoneVoIPApp_CBackEnd_CMediaOperations __x_ABI_CPhoneVoIPApp_CBackEnd_CMediaOperations;
+
+
+#endif /* end if !defined(__cplusplus) */
+
+
+#endif
+#if !defined(__cplusplus)
+typedef struct __x_ABI_CPhoneVoIPApp_CBackEnd_CEndpointStruct __x_ABI_CPhoneVoIPApp_CBackEnd_CEndpointStruct;
+
+#endif
+#if !defined(__cplusplus)
+typedef struct __x_ABI_CPhoneVoIPApp_CBackEnd_CProxyStruct __x_ABI_CPhoneVoIPApp_CBackEnd_CProxyStruct;
+
+#endif
+#if !defined(__cplusplus)
+typedef struct __x_ABI_CPhoneVoIPApp_CBackEnd_CConfig __x_ABI_CPhoneVoIPApp_CBackEnd_CConfig;
+
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#ifdef __cplusplus
+namespace ABI {
+namespace PhoneVoIPApp {
+namespace BackEnd {
+class BackEndTransport;
+} /*BackEnd*/
+} /*PhoneVoIPApp*/
+}
+#endif
+#ifdef __cplusplus
+namespace ABI {
+namespace PhoneVoIPApp {
+namespace BackEnd {
+class Endpoint;
+} /*BackEnd*/
+} /*PhoneVoIPApp*/
+}
+#endif
+#ifdef __cplusplus
+namespace ABI {
+namespace PhoneVoIPApp {
+namespace BackEnd {
+class BackEndCapture;
+} /*BackEnd*/
+} /*PhoneVoIPApp*/
+}
+#endif
+#ifdef __cplusplus
+namespace ABI {
+namespace PhoneVoIPApp {
+namespace BackEnd {
+class CallController;
+} /*BackEnd*/
+} /*PhoneVoIPApp*/
+}
+#endif
+#ifdef __cplusplus
+namespace ABI {
+namespace PhoneVoIPApp {
+namespace BackEnd {
+class Globals;
+} /*BackEnd*/
+} /*PhoneVoIPApp*/
+}
+#endif
+#if !defined(__cplusplus)
+
+#if !defined(__cplusplus)
+/* [v1_enum] */
+enum __x_ABI_CPhoneVoIPApp_CBackEnd_CProxyProtocol
+ {
+ ProxyProtocol_None = 0,
+ ProxyProtocol_SOCKS5 = 1
+ } ;
+#endif /* end if !defined(__cplusplus) */
+
+#endif
+#if !defined(__cplusplus)
+
+#if !defined(__cplusplus)
+/* [v1_enum] */
+enum __x_ABI_CPhoneVoIPApp_CBackEnd_CCallState
+ {
+ CallState_WaitInit = 1,
+ CallState_WaitInitAck = 2,
+ CallState_Established = 3,
+ CallState_Failed = 4
+ } ;
+#endif /* end if !defined(__cplusplus) */
+
+#endif
+#if !defined(__cplusplus)
+
+#if !defined(__cplusplus)
+/* [v1_enum] */
+enum __x_ABI_CPhoneVoIPApp_CBackEnd_CError
+ {
+ Error_Unknown = 0,
+ Error_Incompatible = 1,
+ Error_Timeout = 2,
+ Error_AudioIO = 3
+ } ;
+#endif /* end if !defined(__cplusplus) */
+
+#endif
+#if !defined(__cplusplus)
+
+#if !defined(__cplusplus)
+/* [v1_enum] */
+enum __x_ABI_CPhoneVoIPApp_CBackEnd_CNetworkType
+ {
+ NetworkType_Unknown = 0,
+ NetworkType_GPRS = 1,
+ NetworkType_EDGE = 2,
+ NetworkType_UMTS = 3,
+ NetworkType_HSPA = 4,
+ NetworkType_LTE = 5,
+ NetworkType_WiFi = 6,
+ NetworkType_Ethernet = 7,
+ NetworkType_OtherHighSpeed = 8,
+ NetworkType_OtherLowSpeed = 9,
+ NetworkType_Dialup = 10,
+ NetworkType_OtherMobile = 11
+ } ;
+#endif /* end if !defined(__cplusplus) */
+
+#endif
+#if !defined(__cplusplus)
+
+#if !defined(__cplusplus)
+/* [v1_enum] */
+enum __x_ABI_CPhoneVoIPApp_CBackEnd_CDataSavingMode
+ {
+ DataSavingMode_Never = 0,
+ DataSavingMode_MobileOnly = 1,
+ DataSavingMode_Always = 2
+ } ;
+#endif /* end if !defined(__cplusplus) */
+
+#endif
+#if !defined(__cplusplus)
+
+#if !defined(__cplusplus)
+/* [v1_enum] */
+enum __x_ABI_CPhoneVoIPApp_CBackEnd_CCallStatus
+ {
+ CallStatus_None = 0,
+ CallStatus_InProgress = 1,
+ CallStatus_Held = 2
+ } ;
+#endif /* end if !defined(__cplusplus) */
+
+#endif
+#if !defined(__cplusplus)
+
+#if !defined(__cplusplus)
+/* [v1_enum] */
+enum __x_ABI_CPhoneVoIPApp_CBackEnd_CCallAudioRoute
+ {
+ CallAudioRoute_None = 0,
+ CallAudioRoute_Earpiece = 1,
+ CallAudioRoute_Speakerphone = 2,
+ CallAudioRoute_Bluetooth = 4
+ } ;
+#endif /* end if !defined(__cplusplus) */
+
+#endif
+#if !defined(__cplusplus)
+
+#if !defined(__cplusplus)
+/* [v1_enum] */
+enum __x_ABI_CPhoneVoIPApp_CBackEnd_CCameraLocation
+ {
+ CameraLocation_Front = 1,
+ CameraLocation_Back = 0
+ } ;
+#endif /* end if !defined(__cplusplus) */
+
+#endif
+#if !defined(__cplusplus)
+
+#if !defined(__cplusplus)
+/* [v1_enum] */
+enum __x_ABI_CPhoneVoIPApp_CBackEnd_CMediaOperations
+ {
+ MediaOperations_None = 0,
+ MediaOperations_VideoCapture = 1,
+ MediaOperations_VideoRender = 2,
+ MediaOperations_AudioCapture = 4,
+ MediaOperations_AudioRender = 8
+ } ;
+#endif /* end if !defined(__cplusplus) */
+
+#endif
+#if !defined(__cplusplus)
+struct __x_ABI_CPhoneVoIPApp_CBackEnd_CEndpointStruct
+ {
+ INT64 id;
+ UINT16 port;
+ HSTRING ipv4;
+ HSTRING ipv6;
+ HSTRING peerTag;
+ } ;
+#endif
+#if !defined(__cplusplus)
+struct __x_ABI_CPhoneVoIPApp_CBackEnd_CProxyStruct
+ {
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CProxyProtocol protocol;
+ HSTRING address;
+ UINT16 port;
+ HSTRING username;
+ HSTRING password;
+ } ;
+#endif
+#if !defined(__cplusplus)
+struct __x_ABI_CPhoneVoIPApp_CBackEnd_CConfig
+ {
+ DOUBLE InitTimeout;
+ DOUBLE RecvTimeout;
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CDataSavingMode DataSavingMode;
+ boolean EnableAEC;
+ boolean EnableNS;
+ boolean EnableAGC;
+ HSTRING LogFilePath;
+ HSTRING StatsDumpFilePath;
+ } ;
+#endif
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0000 */
+/* [local] */
+
+#ifdef __cplusplus
+
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ typedef enum ProxyProtocol ProxyProtocol;
+
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ typedef enum CallState CallState;
+
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ typedef enum Error Error;
+
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ typedef enum NetworkType NetworkType;
+
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ typedef enum DataSavingMode DataSavingMode;
+
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ typedef enum CallStatus CallStatus;
+
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ typedef enum CallAudioRoute CallAudioRoute;
+
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ typedef enum CameraLocation CameraLocation;
+
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ typedef enum MediaOperations MediaOperations;
+
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ typedef struct EndpointStruct EndpointStruct;
+
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ typedef struct ProxyStruct ProxyStruct;
+
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ typedef struct Config Config;
+
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#ifdef __cplusplus
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ /* [v1_enum] */
+ enum ProxyProtocol
+ {
+ ProxyProtocol_None = 0,
+ ProxyProtocol_SOCKS5 = 1
+ } ;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ /* [v1_enum] */
+ enum CallState
+ {
+ CallState_WaitInit = 1,
+ CallState_WaitInitAck = 2,
+ CallState_Established = 3,
+ CallState_Failed = 4
+ } ;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ /* [v1_enum] */
+ enum Error
+ {
+ Error_Unknown = 0,
+ Error_Incompatible = 1,
+ Error_Timeout = 2,
+ Error_AudioIO = 3
+ } ;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ /* [v1_enum] */
+ enum NetworkType
+ {
+ NetworkType_Unknown = 0,
+ NetworkType_GPRS = 1,
+ NetworkType_EDGE = 2,
+ NetworkType_UMTS = 3,
+ NetworkType_HSPA = 4,
+ NetworkType_LTE = 5,
+ NetworkType_WiFi = 6,
+ NetworkType_Ethernet = 7,
+ NetworkType_OtherHighSpeed = 8,
+ NetworkType_OtherLowSpeed = 9,
+ NetworkType_Dialup = 10,
+ NetworkType_OtherMobile = 11
+ } ;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ /* [v1_enum] */
+ enum DataSavingMode
+ {
+ DataSavingMode_Never = 0,
+ DataSavingMode_MobileOnly = 1,
+ DataSavingMode_Always = 2
+ } ;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ /* [v1_enum] */
+ enum CallStatus
+ {
+ CallStatus_None = 0,
+ CallStatus_InProgress = 1,
+ CallStatus_Held = 2
+ } ;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ /* [v1_enum] */
+ enum CallAudioRoute
+ {
+ CallAudioRoute_None = 0,
+ CallAudioRoute_Earpiece = 1,
+ CallAudioRoute_Speakerphone = 2,
+ CallAudioRoute_Bluetooth = 4
+ } ;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ /* [v1_enum] */
+ enum CameraLocation
+ {
+ CameraLocation_Front = 1,
+ CameraLocation_Back = 0
+ } ;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ /* [v1_enum] */
+ enum MediaOperations
+ {
+ MediaOperations_None = 0,
+ MediaOperations_VideoCapture = 1,
+ MediaOperations_VideoRender = 2,
+ MediaOperations_AudioCapture = 4,
+ MediaOperations_AudioRender = 8
+ } ;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ struct EndpointStruct
+ {
+ INT64 id;
+ UINT16 port;
+ HSTRING ipv4;
+ HSTRING ipv6;
+ HSTRING peerTag;
+ } ;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ struct ProxyStruct
+ {
+ ProxyProtocol protocol;
+ HSTRING address;
+ UINT16 port;
+ HSTRING username;
+ HSTRING password;
+ } ;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+} /* end extern "C" */
+namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ struct Config
+ {
+ DOUBLE InitTimeout;
+ DOUBLE RecvTimeout;
+ DataSavingMode DataSavingMode;
+ boolean EnableAEC;
+ boolean EnableNS;
+ boolean EnableAGC;
+ HSTRING LogFilePath;
+ HSTRING StatsDumpFilePath;
+ } ;
+ } /* end namespace */
+ } /* end namespace */
+} /* end namespace */
+
+extern "C" {
+#endif
+
+
+
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0000_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0000_v0_0_s_ifspec;
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler_INTERFACE_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler_INTERFACE_DEFINED__
+
+/* interface __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler */
+/* [uuid][object] */
+
+
+
+/* interface ABI::PhoneVoIPApp::BackEnd::IMessageReceivedEventHandler */
+/* [uuid][object] */
+
+
+EXTERN_C const IID IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler;
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+ } /* end extern "C" */
+ namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ MIDL_INTERFACE("F2035E6A-8067-3ABB-A795-7B334C67A2ED")
+ IMessageReceivedEventHandler : public IUnknown
+ {
+ public:
+ virtual HRESULT STDMETHODCALLTYPE Invoke(
+ /* [in] */ ABI::Windows::Storage::Streams::IBuffer *pBuffer,
+ /* [in] */ UINT64 hnsPresentationTime,
+ /* [in] */ UINT64 hnsSampleDuration) = 0;
+
+ };
+
+ extern const __declspec(selectany) IID & IID_IMessageReceivedEventHandler = __uuidof(IMessageReceivedEventHandler);
+
+
+ } /* end namespace */
+ } /* end namespace */
+ } /* end namespace */
+ extern "C" {
+
+#else /* C style interface */
+
+ typedef struct __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandlerVtbl
+ {
+ BEGIN_INTERFACE
+
+ HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler * This,
+ /* [in] */ REFIID riid,
+ /* [annotation][iid_is][out] */
+ _COM_Outptr_ void **ppvObject);
+
+ ULONG ( STDMETHODCALLTYPE *AddRef )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler * This);
+
+ ULONG ( STDMETHODCALLTYPE *Release )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler * This);
+
+ HRESULT ( STDMETHODCALLTYPE *Invoke )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler * This,
+ /* [in] */ __x_ABI_CWindows_CStorage_CStreams_CIBuffer *pBuffer,
+ /* [in] */ UINT64 hnsPresentationTime,
+ /* [in] */ UINT64 hnsSampleDuration);
+
+ END_INTERFACE
+ } __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandlerVtbl;
+
+ interface __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler
+ {
+ CONST_VTBL struct __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandlerVtbl *lpVtbl;
+ };
+
+
+
+#ifdef COBJMACROS
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler_QueryInterface(This,riid,ppvObject) \
+ ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler_AddRef(This) \
+ ( (This)->lpVtbl -> AddRef(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler_Release(This) \
+ ( (This)->lpVtbl -> Release(This) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler_Invoke(This,pBuffer,hnsPresentationTime,hnsSampleDuration) \
+ ( (This)->lpVtbl -> Invoke(This,pBuffer,hnsPresentationTime,hnsSampleDuration) )
+
+#endif /* COBJMACROS */
+
+
+#endif /* C style interface */
+
+
+
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler_INTERFACE_DEFINED__ */
+
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler_INTERFACE_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler_INTERFACE_DEFINED__
+
+/* interface __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler */
+/* [uuid][object] */
+
+
+
+/* interface ABI::PhoneVoIPApp::BackEnd::ICameraLocationChangedEventHandler */
+/* [uuid][object] */
+
+
+EXTERN_C const IID IID___x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler;
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+ } /* end extern "C" */
+ namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ MIDL_INTERFACE("1698B961-F90E-30D0-80FF-22E94CF66D7B")
+ ICameraLocationChangedEventHandler : public IUnknown
+ {
+ public:
+ virtual HRESULT STDMETHODCALLTYPE Invoke(
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::CameraLocation __param0) = 0;
+
+ };
+
+ extern const __declspec(selectany) IID & IID_ICameraLocationChangedEventHandler = __uuidof(ICameraLocationChangedEventHandler);
+
+
+ } /* end namespace */
+ } /* end namespace */
+ } /* end namespace */
+ extern "C" {
+
+#else /* C style interface */
+
+ typedef struct __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandlerVtbl
+ {
+ BEGIN_INTERFACE
+
+ HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler * This,
+ /* [in] */ REFIID riid,
+ /* [annotation][iid_is][out] */
+ _COM_Outptr_ void **ppvObject);
+
+ ULONG ( STDMETHODCALLTYPE *AddRef )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler * This);
+
+ ULONG ( STDMETHODCALLTYPE *Release )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler * This);
+
+ HRESULT ( STDMETHODCALLTYPE *Invoke )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler * This,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CCameraLocation __param0);
+
+ END_INTERFACE
+ } __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandlerVtbl;
+
+ interface __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler
+ {
+ CONST_VTBL struct __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandlerVtbl *lpVtbl;
+ };
+
+
+
+#ifdef COBJMACROS
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler_QueryInterface(This,riid,ppvObject) \
+ ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler_AddRef(This) \
+ ( (This)->lpVtbl -> AddRef(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler_Release(This) \
+ ( (This)->lpVtbl -> Release(This) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler_Invoke(This,__param0) \
+ ( (This)->lpVtbl -> Invoke(This,__param0) )
+
+#endif /* COBJMACROS */
+
+
+#endif /* C style interface */
+
+
+
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler_INTERFACE_DEFINED__ */
+
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback_INTERFACE_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback_INTERFACE_DEFINED__
+
+/* interface __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback */
+/* [uuid][object] */
+
+
+
+/* interface ABI::PhoneVoIPApp::BackEnd::IIncomingCallDialogDismissedCallback */
+/* [uuid][object] */
+
+
+EXTERN_C const IID IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback;
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+ } /* end extern "C" */
+ namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ MIDL_INTERFACE("91DDEE70-AA90-38E7-B4E5-F7959569CB5C")
+ IIncomingCallDialogDismissedCallback : public IUnknown
+ {
+ public:
+ virtual HRESULT STDMETHODCALLTYPE Invoke(
+ /* [in] */ INT64 callId,
+ /* [in] */ INT64 callAccessHash,
+ /* [in] */ boolean rejected) = 0;
+
+ };
+
+ extern const __declspec(selectany) IID & IID_IIncomingCallDialogDismissedCallback = __uuidof(IIncomingCallDialogDismissedCallback);
+
+
+ } /* end namespace */
+ } /* end namespace */
+ } /* end namespace */
+ extern "C" {
+
+#else /* C style interface */
+
+ typedef struct __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallbackVtbl
+ {
+ BEGIN_INTERFACE
+
+ HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback * This,
+ /* [in] */ REFIID riid,
+ /* [annotation][iid_is][out] */
+ _COM_Outptr_ void **ppvObject);
+
+ ULONG ( STDMETHODCALLTYPE *AddRef )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback * This);
+
+ ULONG ( STDMETHODCALLTYPE *Release )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback * This);
+
+ HRESULT ( STDMETHODCALLTYPE *Invoke )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback * This,
+ /* [in] */ INT64 callId,
+ /* [in] */ INT64 callAccessHash,
+ /* [in] */ boolean rejected);
+
+ END_INTERFACE
+ } __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallbackVtbl;
+
+ interface __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback
+ {
+ CONST_VTBL struct __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallbackVtbl *lpVtbl;
+ };
+
+
+
+#ifdef COBJMACROS
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback_QueryInterface(This,riid,ppvObject) \
+ ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback_AddRef(This) \
+ ( (This)->lpVtbl -> AddRef(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback_Release(This) \
+ ( (This)->lpVtbl -> Release(This) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback_Invoke(This,callId,callAccessHash,rejected) \
+ ( (This)->lpVtbl -> Invoke(This,callId,callAccessHash,rejected) )
+
+#endif /* COBJMACROS */
+
+
+#endif /* C style interface */
+
+
+
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback_INTERFACE_DEFINED__ */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0003 */
+/* [local] */
+
+#if !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_INTERFACE_DEFINED__)
+extern const __declspec(selectany) _Null_terminated_ WCHAR InterfaceName_PhoneVoIPApp_BackEnd___IBackEndTransportPublicNonVirtuals[] = L"PhoneVoIPApp.BackEnd.__IBackEndTransportPublicNonVirtuals";
+#endif /* !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_INTERFACE_DEFINED__) */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0003 */
+/* [local] */
+
+
+
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0003_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0003_v0_0_s_ifspec;
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_INTERFACE_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_INTERFACE_DEFINED__
+
+/* interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals */
+/* [uuid][object] */
+
+
+
+/* interface ABI::PhoneVoIPApp::BackEnd::__IBackEndTransportPublicNonVirtuals */
+/* [uuid][object] */
+
+
+EXTERN_C const IID IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals;
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+ } /* end extern "C" */
+ namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ MIDL_INTERFACE("F5A3C2AE-EF7B-3DE2-8B0E-8E8B3CD20D9D")
+ __IBackEndTransportPublicNonVirtuals : public IInspectable
+ {
+ public:
+ virtual HRESULT STDMETHODCALLTYPE WriteAudio(
+ /* [out] */ BYTE *bytes,
+ /* [in] */ INT32 byteCount) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE WriteVideo(
+ /* [out] */ BYTE *bytes,
+ /* [in] */ INT32 byteCount,
+ /* [in] */ UINT64 hnsPresentationTime,
+ /* [in] */ UINT64 hnsSampleDuration) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE add_AudioMessageReceived(
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::IMessageReceivedEventHandler *__param0,
+ /* [out][retval] */ EventRegistrationToken *__returnValue) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE remove_AudioMessageReceived(
+ /* [in] */ EventRegistrationToken __param0) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE add_VideoMessageReceived(
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::IMessageReceivedEventHandler *__param0,
+ /* [out][retval] */ EventRegistrationToken *__returnValue) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE remove_VideoMessageReceived(
+ /* [in] */ EventRegistrationToken __param0) = 0;
+
+ };
+
+ extern const __declspec(selectany) IID & IID___IBackEndTransportPublicNonVirtuals = __uuidof(__IBackEndTransportPublicNonVirtuals);
+
+
+ } /* end namespace */
+ } /* end namespace */
+ } /* end namespace */
+ extern "C" {
+
+#else /* C style interface */
+
+ typedef struct __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtualsVtbl
+ {
+ BEGIN_INTERFACE
+
+ HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals * This,
+ /* [in] */ REFIID riid,
+ /* [annotation][iid_is][out] */
+ _COM_Outptr_ void **ppvObject);
+
+ ULONG ( STDMETHODCALLTYPE *AddRef )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals * This);
+
+ ULONG ( STDMETHODCALLTYPE *Release )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals * This);
+
+ HRESULT ( STDMETHODCALLTYPE *GetIids )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals * This,
+ /* [out] */ ULONG *iidCount,
+ /* [size_is][size_is][out] */ IID **iids);
+
+ HRESULT ( STDMETHODCALLTYPE *GetRuntimeClassName )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals * This,
+ /* [out] */ HSTRING *className);
+
+ HRESULT ( STDMETHODCALLTYPE *GetTrustLevel )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals * This,
+ /* [out] */ TrustLevel *trustLevel);
+
+ HRESULT ( STDMETHODCALLTYPE *WriteAudio )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals * This,
+ /* [out] */ BYTE *bytes,
+ /* [in] */ INT32 byteCount);
+
+ HRESULT ( STDMETHODCALLTYPE *WriteVideo )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals * This,
+ /* [out] */ BYTE *bytes,
+ /* [in] */ INT32 byteCount,
+ /* [in] */ UINT64 hnsPresentationTime,
+ /* [in] */ UINT64 hnsSampleDuration);
+
+ HRESULT ( STDMETHODCALLTYPE *add_AudioMessageReceived )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals * This,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler *__param0,
+ /* [out][retval] */ EventRegistrationToken *__returnValue);
+
+ HRESULT ( STDMETHODCALLTYPE *remove_AudioMessageReceived )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals * This,
+ /* [in] */ EventRegistrationToken __param0);
+
+ HRESULT ( STDMETHODCALLTYPE *add_VideoMessageReceived )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals * This,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler *__param0,
+ /* [out][retval] */ EventRegistrationToken *__returnValue);
+
+ HRESULT ( STDMETHODCALLTYPE *remove_VideoMessageReceived )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals * This,
+ /* [in] */ EventRegistrationToken __param0);
+
+ END_INTERFACE
+ } __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtualsVtbl;
+
+ interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals
+ {
+ CONST_VTBL struct __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtualsVtbl *lpVtbl;
+ };
+
+
+
+#ifdef COBJMACROS
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_QueryInterface(This,riid,ppvObject) \
+ ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_AddRef(This) \
+ ( (This)->lpVtbl -> AddRef(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_Release(This) \
+ ( (This)->lpVtbl -> Release(This) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_GetIids(This,iidCount,iids) \
+ ( (This)->lpVtbl -> GetIids(This,iidCount,iids) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_GetRuntimeClassName(This,className) \
+ ( (This)->lpVtbl -> GetRuntimeClassName(This,className) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_GetTrustLevel(This,trustLevel) \
+ ( (This)->lpVtbl -> GetTrustLevel(This,trustLevel) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_WriteAudio(This,bytes,byteCount) \
+ ( (This)->lpVtbl -> WriteAudio(This,bytes,byteCount) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_WriteVideo(This,bytes,byteCount,hnsPresentationTime,hnsSampleDuration) \
+ ( (This)->lpVtbl -> WriteVideo(This,bytes,byteCount,hnsPresentationTime,hnsSampleDuration) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_add_AudioMessageReceived(This,__param0,__returnValue) \
+ ( (This)->lpVtbl -> add_AudioMessageReceived(This,__param0,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_remove_AudioMessageReceived(This,__param0) \
+ ( (This)->lpVtbl -> remove_AudioMessageReceived(This,__param0) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_add_VideoMessageReceived(This,__param0,__returnValue) \
+ ( (This)->lpVtbl -> add_VideoMessageReceived(This,__param0,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_remove_VideoMessageReceived(This,__param0) \
+ ( (This)->lpVtbl -> remove_VideoMessageReceived(This,__param0) )
+
+#endif /* COBJMACROS */
+
+
+#endif /* C style interface */
+
+
+
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_INTERFACE_DEFINED__ */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0004 */
+/* [local] */
+
+#if !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_INTERFACE_DEFINED__)
+extern const __declspec(selectany) _Null_terminated_ WCHAR InterfaceName_PhoneVoIPApp_BackEnd___IBackEndTransportProtectedNonVirtuals[] = L"PhoneVoIPApp.BackEnd.__IBackEndTransportProtectedNonVirtuals";
+#endif /* !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_INTERFACE_DEFINED__) */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0004 */
+/* [local] */
+
+
+
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0004_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0004_v0_0_s_ifspec;
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_INTERFACE_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_INTERFACE_DEFINED__
+
+/* interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals */
+/* [uuid][object] */
+
+
+
+/* interface ABI::PhoneVoIPApp::BackEnd::__IBackEndTransportProtectedNonVirtuals */
+/* [uuid][object] */
+
+
+EXTERN_C const IID IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals;
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+ } /* end extern "C" */
+ namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ MIDL_INTERFACE("044DEA28-0E8D-3A16-A2C1-BE95C0BED5E5")
+ __IBackEndTransportProtectedNonVirtuals : public IInspectable
+ {
+ public:
+ };
+
+ extern const __declspec(selectany) IID & IID___IBackEndTransportProtectedNonVirtuals = __uuidof(__IBackEndTransportProtectedNonVirtuals);
+
+
+ } /* end namespace */
+ } /* end namespace */
+ } /* end namespace */
+ extern "C" {
+
+#else /* C style interface */
+
+ typedef struct __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtualsVtbl
+ {
+ BEGIN_INTERFACE
+
+ HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals * This,
+ /* [in] */ REFIID riid,
+ /* [annotation][iid_is][out] */
+ _COM_Outptr_ void **ppvObject);
+
+ ULONG ( STDMETHODCALLTYPE *AddRef )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals * This);
+
+ ULONG ( STDMETHODCALLTYPE *Release )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals * This);
+
+ HRESULT ( STDMETHODCALLTYPE *GetIids )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals * This,
+ /* [out] */ ULONG *iidCount,
+ /* [size_is][size_is][out] */ IID **iids);
+
+ HRESULT ( STDMETHODCALLTYPE *GetRuntimeClassName )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals * This,
+ /* [out] */ HSTRING *className);
+
+ HRESULT ( STDMETHODCALLTYPE *GetTrustLevel )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals * This,
+ /* [out] */ TrustLevel *trustLevel);
+
+ END_INTERFACE
+ } __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtualsVtbl;
+
+ interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals
+ {
+ CONST_VTBL struct __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtualsVtbl *lpVtbl;
+ };
+
+
+
+#ifdef COBJMACROS
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_QueryInterface(This,riid,ppvObject) \
+ ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_AddRef(This) \
+ ( (This)->lpVtbl -> AddRef(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_Release(This) \
+ ( (This)->lpVtbl -> Release(This) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_GetIids(This,iidCount,iids) \
+ ( (This)->lpVtbl -> GetIids(This,iidCount,iids) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_GetRuntimeClassName(This,className) \
+ ( (This)->lpVtbl -> GetRuntimeClassName(This,className) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_GetTrustLevel(This,trustLevel) \
+ ( (This)->lpVtbl -> GetTrustLevel(This,trustLevel) )
+
+
+#endif /* COBJMACROS */
+
+
+#endif /* C style interface */
+
+
+
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_INTERFACE_DEFINED__ */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0005 */
+/* [local] */
+
+#if !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_INTERFACE_DEFINED__)
+extern const __declspec(selectany) _Null_terminated_ WCHAR InterfaceName_PhoneVoIPApp_BackEnd___IEndpointPublicNonVirtuals[] = L"PhoneVoIPApp.BackEnd.__IEndpointPublicNonVirtuals";
+#endif /* !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_INTERFACE_DEFINED__) */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0005 */
+/* [local] */
+
+
+
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0005_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0005_v0_0_s_ifspec;
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_INTERFACE_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_INTERFACE_DEFINED__
+
+/* interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals */
+/* [uuid][object] */
+
+
+
+/* interface ABI::PhoneVoIPApp::BackEnd::__IEndpointPublicNonVirtuals */
+/* [uuid][object] */
+
+
+EXTERN_C const IID IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals;
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+ } /* end extern "C" */
+ namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ MIDL_INTERFACE("0CC88A54-89AF-3CC6-9B95-F8F22428ABED")
+ __IEndpointPublicNonVirtuals : public IInspectable
+ {
+ public:
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_id(
+ /* [out][retval] */ INT64 *__returnValue) = 0;
+
+ virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_id(
+ /* [in] */ INT64 __set_formal) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_port(
+ /* [out][retval] */ UINT16 *__returnValue) = 0;
+
+ virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_port(
+ /* [in] */ UINT16 __set_formal) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ipv4(
+ /* [out][retval] */ HSTRING *__returnValue) = 0;
+
+ virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ipv4(
+ /* [in] */ HSTRING __set_formal) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_ipv6(
+ /* [out][retval] */ HSTRING *__returnValue) = 0;
+
+ virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_ipv6(
+ /* [in] */ HSTRING __set_formal) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_peerTag(
+ /* [out] */ UINT32 *____returnValueSize,
+ /* [out][retval][size_is][size_is] */ BYTE **__returnValue) = 0;
+
+ virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_peerTag(
+ /* [in] */ UINT32 ____set_formalSize,
+ /* [in][size_is] */ BYTE *__set_formal) = 0;
+
+ };
+
+ extern const __declspec(selectany) IID & IID___IEndpointPublicNonVirtuals = __uuidof(__IEndpointPublicNonVirtuals);
+
+
+ } /* end namespace */
+ } /* end namespace */
+ } /* end namespace */
+ extern "C" {
+
+#else /* C style interface */
+
+ typedef struct __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtualsVtbl
+ {
+ BEGIN_INTERFACE
+
+ HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals * This,
+ /* [in] */ REFIID riid,
+ /* [annotation][iid_is][out] */
+ _COM_Outptr_ void **ppvObject);
+
+ ULONG ( STDMETHODCALLTYPE *AddRef )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals * This);
+
+ ULONG ( STDMETHODCALLTYPE *Release )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals * This);
+
+ HRESULT ( STDMETHODCALLTYPE *GetIids )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals * This,
+ /* [out] */ ULONG *iidCount,
+ /* [size_is][size_is][out] */ IID **iids);
+
+ HRESULT ( STDMETHODCALLTYPE *GetRuntimeClassName )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals * This,
+ /* [out] */ HSTRING *className);
+
+ HRESULT ( STDMETHODCALLTYPE *GetTrustLevel )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals * This,
+ /* [out] */ TrustLevel *trustLevel);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_id )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals * This,
+ /* [out][retval] */ INT64 *__returnValue);
+
+ /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_id )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals * This,
+ /* [in] */ INT64 __set_formal);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_port )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals * This,
+ /* [out][retval] */ UINT16 *__returnValue);
+
+ /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_port )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals * This,
+ /* [in] */ UINT16 __set_formal);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ipv4 )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals * This,
+ /* [out][retval] */ HSTRING *__returnValue);
+
+ /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ipv4 )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals * This,
+ /* [in] */ HSTRING __set_formal);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_ipv6 )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals * This,
+ /* [out][retval] */ HSTRING *__returnValue);
+
+ /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_ipv6 )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals * This,
+ /* [in] */ HSTRING __set_formal);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_peerTag )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals * This,
+ /* [out] */ UINT32 *____returnValueSize,
+ /* [out][retval][size_is][size_is] */ BYTE **__returnValue);
+
+ /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_peerTag )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals * This,
+ /* [in] */ UINT32 ____set_formalSize,
+ /* [in][size_is] */ BYTE *__set_formal);
+
+ END_INTERFACE
+ } __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtualsVtbl;
+
+ interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals
+ {
+ CONST_VTBL struct __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtualsVtbl *lpVtbl;
+ };
+
+
+
+#ifdef COBJMACROS
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_QueryInterface(This,riid,ppvObject) \
+ ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_AddRef(This) \
+ ( (This)->lpVtbl -> AddRef(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_Release(This) \
+ ( (This)->lpVtbl -> Release(This) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_GetIids(This,iidCount,iids) \
+ ( (This)->lpVtbl -> GetIids(This,iidCount,iids) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_GetRuntimeClassName(This,className) \
+ ( (This)->lpVtbl -> GetRuntimeClassName(This,className) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_GetTrustLevel(This,trustLevel) \
+ ( (This)->lpVtbl -> GetTrustLevel(This,trustLevel) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_get_id(This,__returnValue) \
+ ( (This)->lpVtbl -> get_id(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_put_id(This,__set_formal) \
+ ( (This)->lpVtbl -> put_id(This,__set_formal) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_get_port(This,__returnValue) \
+ ( (This)->lpVtbl -> get_port(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_put_port(This,__set_formal) \
+ ( (This)->lpVtbl -> put_port(This,__set_formal) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_get_ipv4(This,__returnValue) \
+ ( (This)->lpVtbl -> get_ipv4(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_put_ipv4(This,__set_formal) \
+ ( (This)->lpVtbl -> put_ipv4(This,__set_formal) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_get_ipv6(This,__returnValue) \
+ ( (This)->lpVtbl -> get_ipv6(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_put_ipv6(This,__set_formal) \
+ ( (This)->lpVtbl -> put_ipv6(This,__set_formal) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_get_peerTag(This,____returnValueSize,__returnValue) \
+ ( (This)->lpVtbl -> get_peerTag(This,____returnValueSize,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_put_peerTag(This,____set_formalSize,__set_formal) \
+ ( (This)->lpVtbl -> put_peerTag(This,____set_formalSize,__set_formal) )
+
+#endif /* COBJMACROS */
+
+
+#endif /* C style interface */
+
+
+
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_INTERFACE_DEFINED__ */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0006 */
+/* [local] */
+
+#if !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_INTERFACE_DEFINED__)
+extern const __declspec(selectany) _Null_terminated_ WCHAR InterfaceName_PhoneVoIPApp_BackEnd_ICallControllerStatusListener[] = L"PhoneVoIPApp.BackEnd.ICallControllerStatusListener";
+#endif /* !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_INTERFACE_DEFINED__) */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0006 */
+/* [local] */
+
+
+
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0006_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0006_v0_0_s_ifspec;
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_INTERFACE_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_INTERFACE_DEFINED__
+
+/* interface __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener */
+/* [uuid][object] */
+
+
+
+/* interface ABI::PhoneVoIPApp::BackEnd::ICallControllerStatusListener */
+/* [uuid][object] */
+
+
+EXTERN_C const IID IID___x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener;
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+ } /* end extern "C" */
+ namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ MIDL_INTERFACE("39126060-0292-36D6-B3F8-9AC4156C651D")
+ ICallControllerStatusListener : public IInspectable
+ {
+ public:
+ virtual HRESULT STDMETHODCALLTYPE OnSignalBarsChanged(
+ /* [in] */ INT32 newSignal) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE OnCallStateChanged(
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::CallState newState) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE OnCallStatusChanged(
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::CallStatus newStatus) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE OnCallAudioRouteChanged(
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::CallAudioRoute newRoute) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE OnMediaOperationsChanged(
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::MediaOperations newOperations) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE OnCameraLocationChanged(
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::CameraLocation newCameraLocation) = 0;
+
+ };
+
+ extern const __declspec(selectany) IID & IID_ICallControllerStatusListener = __uuidof(ICallControllerStatusListener);
+
+
+ } /* end namespace */
+ } /* end namespace */
+ } /* end namespace */
+ extern "C" {
+
+#else /* C style interface */
+
+ typedef struct __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListenerVtbl
+ {
+ BEGIN_INTERFACE
+
+ HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener * This,
+ /* [in] */ REFIID riid,
+ /* [annotation][iid_is][out] */
+ _COM_Outptr_ void **ppvObject);
+
+ ULONG ( STDMETHODCALLTYPE *AddRef )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener * This);
+
+ ULONG ( STDMETHODCALLTYPE *Release )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener * This);
+
+ HRESULT ( STDMETHODCALLTYPE *GetIids )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener * This,
+ /* [out] */ ULONG *iidCount,
+ /* [size_is][size_is][out] */ IID **iids);
+
+ HRESULT ( STDMETHODCALLTYPE *GetRuntimeClassName )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener * This,
+ /* [out] */ HSTRING *className);
+
+ HRESULT ( STDMETHODCALLTYPE *GetTrustLevel )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener * This,
+ /* [out] */ TrustLevel *trustLevel);
+
+ HRESULT ( STDMETHODCALLTYPE *OnSignalBarsChanged )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener * This,
+ /* [in] */ INT32 newSignal);
+
+ HRESULT ( STDMETHODCALLTYPE *OnCallStateChanged )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener * This,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CCallState newState);
+
+ HRESULT ( STDMETHODCALLTYPE *OnCallStatusChanged )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener * This,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CCallStatus newStatus);
+
+ HRESULT ( STDMETHODCALLTYPE *OnCallAudioRouteChanged )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener * This,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CCallAudioRoute newRoute);
+
+ HRESULT ( STDMETHODCALLTYPE *OnMediaOperationsChanged )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener * This,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CMediaOperations newOperations);
+
+ HRESULT ( STDMETHODCALLTYPE *OnCameraLocationChanged )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener * This,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CCameraLocation newCameraLocation);
+
+ END_INTERFACE
+ } __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListenerVtbl;
+
+ interface __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener
+ {
+ CONST_VTBL struct __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListenerVtbl *lpVtbl;
+ };
+
+
+
+#ifdef COBJMACROS
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_QueryInterface(This,riid,ppvObject) \
+ ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_AddRef(This) \
+ ( (This)->lpVtbl -> AddRef(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_Release(This) \
+ ( (This)->lpVtbl -> Release(This) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_GetIids(This,iidCount,iids) \
+ ( (This)->lpVtbl -> GetIids(This,iidCount,iids) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_GetRuntimeClassName(This,className) \
+ ( (This)->lpVtbl -> GetRuntimeClassName(This,className) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_GetTrustLevel(This,trustLevel) \
+ ( (This)->lpVtbl -> GetTrustLevel(This,trustLevel) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_OnSignalBarsChanged(This,newSignal) \
+ ( (This)->lpVtbl -> OnSignalBarsChanged(This,newSignal) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_OnCallStateChanged(This,newState) \
+ ( (This)->lpVtbl -> OnCallStateChanged(This,newState) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_OnCallStatusChanged(This,newStatus) \
+ ( (This)->lpVtbl -> OnCallStatusChanged(This,newStatus) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_OnCallAudioRouteChanged(This,newRoute) \
+ ( (This)->lpVtbl -> OnCallAudioRouteChanged(This,newRoute) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_OnMediaOperationsChanged(This,newOperations) \
+ ( (This)->lpVtbl -> OnMediaOperationsChanged(This,newOperations) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_OnCameraLocationChanged(This,newCameraLocation) \
+ ( (This)->lpVtbl -> OnCameraLocationChanged(This,newCameraLocation) )
+
+#endif /* COBJMACROS */
+
+
+#endif /* C style interface */
+
+
+
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_INTERFACE_DEFINED__ */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0007 */
+/* [local] */
+
+#if !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_INTERFACE_DEFINED__)
+extern const __declspec(selectany) _Null_terminated_ WCHAR InterfaceName_PhoneVoIPApp_BackEnd___IBackEndCapturePublicNonVirtuals[] = L"PhoneVoIPApp.BackEnd.__IBackEndCapturePublicNonVirtuals";
+#endif /* !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_INTERFACE_DEFINED__) */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0007 */
+/* [local] */
+
+
+
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0007_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0007_v0_0_s_ifspec;
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_INTERFACE_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_INTERFACE_DEFINED__
+
+/* interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals */
+/* [uuid][object] */
+
+
+
+/* interface ABI::PhoneVoIPApp::BackEnd::__IBackEndCapturePublicNonVirtuals */
+/* [uuid][object] */
+
+
+EXTERN_C const IID IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals;
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+ } /* end extern "C" */
+ namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ MIDL_INTERFACE("8313DBEA-FD3B-3071-8035-7B611658DAD8")
+ __IBackEndCapturePublicNonVirtuals : public IInspectable
+ {
+ public:
+ virtual HRESULT STDMETHODCALLTYPE SetTransport(
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::__IBackEndTransportPublicNonVirtuals *transport) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE Start(
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::CameraLocation cameraLocation) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE Stop( void) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE ToggleCamera( void) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE add_CameraLocationChanged(
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::ICameraLocationChangedEventHandler *__param0,
+ /* [out][retval] */ EventRegistrationToken *__returnValue) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE remove_CameraLocationChanged(
+ /* [in] */ EventRegistrationToken __param0) = 0;
+
+ };
+
+ extern const __declspec(selectany) IID & IID___IBackEndCapturePublicNonVirtuals = __uuidof(__IBackEndCapturePublicNonVirtuals);
+
+
+ } /* end namespace */
+ } /* end namespace */
+ } /* end namespace */
+ extern "C" {
+
+#else /* C style interface */
+
+ typedef struct __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtualsVtbl
+ {
+ BEGIN_INTERFACE
+
+ HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals * This,
+ /* [in] */ REFIID riid,
+ /* [annotation][iid_is][out] */
+ _COM_Outptr_ void **ppvObject);
+
+ ULONG ( STDMETHODCALLTYPE *AddRef )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals * This);
+
+ ULONG ( STDMETHODCALLTYPE *Release )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals * This);
+
+ HRESULT ( STDMETHODCALLTYPE *GetIids )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals * This,
+ /* [out] */ ULONG *iidCount,
+ /* [size_is][size_is][out] */ IID **iids);
+
+ HRESULT ( STDMETHODCALLTYPE *GetRuntimeClassName )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals * This,
+ /* [out] */ HSTRING *className);
+
+ HRESULT ( STDMETHODCALLTYPE *GetTrustLevel )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals * This,
+ /* [out] */ TrustLevel *trustLevel);
+
+ HRESULT ( STDMETHODCALLTYPE *SetTransport )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals * This,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals *transport);
+
+ HRESULT ( STDMETHODCALLTYPE *Start )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals * This,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CCameraLocation cameraLocation);
+
+ HRESULT ( STDMETHODCALLTYPE *Stop )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals * This);
+
+ HRESULT ( STDMETHODCALLTYPE *ToggleCamera )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals * This);
+
+ HRESULT ( STDMETHODCALLTYPE *add_CameraLocationChanged )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals * This,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler *__param0,
+ /* [out][retval] */ EventRegistrationToken *__returnValue);
+
+ HRESULT ( STDMETHODCALLTYPE *remove_CameraLocationChanged )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals * This,
+ /* [in] */ EventRegistrationToken __param0);
+
+ END_INTERFACE
+ } __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtualsVtbl;
+
+ interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals
+ {
+ CONST_VTBL struct __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtualsVtbl *lpVtbl;
+ };
+
+
+
+#ifdef COBJMACROS
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_QueryInterface(This,riid,ppvObject) \
+ ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_AddRef(This) \
+ ( (This)->lpVtbl -> AddRef(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_Release(This) \
+ ( (This)->lpVtbl -> Release(This) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_GetIids(This,iidCount,iids) \
+ ( (This)->lpVtbl -> GetIids(This,iidCount,iids) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_GetRuntimeClassName(This,className) \
+ ( (This)->lpVtbl -> GetRuntimeClassName(This,className) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_GetTrustLevel(This,trustLevel) \
+ ( (This)->lpVtbl -> GetTrustLevel(This,trustLevel) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_SetTransport(This,transport) \
+ ( (This)->lpVtbl -> SetTransport(This,transport) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_Start(This,cameraLocation) \
+ ( (This)->lpVtbl -> Start(This,cameraLocation) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_Stop(This) \
+ ( (This)->lpVtbl -> Stop(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_ToggleCamera(This) \
+ ( (This)->lpVtbl -> ToggleCamera(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_add_CameraLocationChanged(This,__param0,__returnValue) \
+ ( (This)->lpVtbl -> add_CameraLocationChanged(This,__param0,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_remove_CameraLocationChanged(This,__param0) \
+ ( (This)->lpVtbl -> remove_CameraLocationChanged(This,__param0) )
+
+#endif /* COBJMACROS */
+
+
+#endif /* C style interface */
+
+
+
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_INTERFACE_DEFINED__ */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0008 */
+/* [local] */
+
+#if !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_INTERFACE_DEFINED__)
+extern const __declspec(selectany) _Null_terminated_ WCHAR InterfaceName_PhoneVoIPApp_BackEnd___IBackEndCaptureProtectedNonVirtuals[] = L"PhoneVoIPApp.BackEnd.__IBackEndCaptureProtectedNonVirtuals";
+#endif /* !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_INTERFACE_DEFINED__) */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0008 */
+/* [local] */
+
+
+
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0008_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0008_v0_0_s_ifspec;
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_INTERFACE_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_INTERFACE_DEFINED__
+
+/* interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals */
+/* [uuid][object] */
+
+
+
+/* interface ABI::PhoneVoIPApp::BackEnd::__IBackEndCaptureProtectedNonVirtuals */
+/* [uuid][object] */
+
+
+EXTERN_C const IID IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals;
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+ } /* end extern "C" */
+ namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ MIDL_INTERFACE("64B31D5B-1A27-37A8-BCBC-C0BBD5314C79")
+ __IBackEndCaptureProtectedNonVirtuals : public IInspectable
+ {
+ public:
+ };
+
+ extern const __declspec(selectany) IID & IID___IBackEndCaptureProtectedNonVirtuals = __uuidof(__IBackEndCaptureProtectedNonVirtuals);
+
+
+ } /* end namespace */
+ } /* end namespace */
+ } /* end namespace */
+ extern "C" {
+
+#else /* C style interface */
+
+ typedef struct __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtualsVtbl
+ {
+ BEGIN_INTERFACE
+
+ HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals * This,
+ /* [in] */ REFIID riid,
+ /* [annotation][iid_is][out] */
+ _COM_Outptr_ void **ppvObject);
+
+ ULONG ( STDMETHODCALLTYPE *AddRef )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals * This);
+
+ ULONG ( STDMETHODCALLTYPE *Release )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals * This);
+
+ HRESULT ( STDMETHODCALLTYPE *GetIids )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals * This,
+ /* [out] */ ULONG *iidCount,
+ /* [size_is][size_is][out] */ IID **iids);
+
+ HRESULT ( STDMETHODCALLTYPE *GetRuntimeClassName )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals * This,
+ /* [out] */ HSTRING *className);
+
+ HRESULT ( STDMETHODCALLTYPE *GetTrustLevel )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals * This,
+ /* [out] */ TrustLevel *trustLevel);
+
+ END_INTERFACE
+ } __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtualsVtbl;
+
+ interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals
+ {
+ CONST_VTBL struct __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtualsVtbl *lpVtbl;
+ };
+
+
+
+#ifdef COBJMACROS
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_QueryInterface(This,riid,ppvObject) \
+ ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_AddRef(This) \
+ ( (This)->lpVtbl -> AddRef(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_Release(This) \
+ ( (This)->lpVtbl -> Release(This) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_GetIids(This,iidCount,iids) \
+ ( (This)->lpVtbl -> GetIids(This,iidCount,iids) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_GetRuntimeClassName(This,className) \
+ ( (This)->lpVtbl -> GetRuntimeClassName(This,className) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_GetTrustLevel(This,trustLevel) \
+ ( (This)->lpVtbl -> GetTrustLevel(This,trustLevel) )
+
+
+#endif /* COBJMACROS */
+
+
+#endif /* C style interface */
+
+
+
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_INTERFACE_DEFINED__ */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0009 */
+/* [local] */
+
+#if !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_INTERFACE_DEFINED__)
+extern const __declspec(selectany) _Null_terminated_ WCHAR InterfaceName_PhoneVoIPApp_BackEnd_IConfig[] = L"PhoneVoIPApp.BackEnd.IConfig";
+#endif /* !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_INTERFACE_DEFINED__) */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0009 */
+/* [local] */
+
+
+
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0009_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0009_v0_0_s_ifspec;
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_INTERFACE_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_INTERFACE_DEFINED__
+
+/* interface __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig */
+/* [uuid][object] */
+
+
+
+/* interface ABI::PhoneVoIPApp::BackEnd::IConfig */
+/* [uuid][object] */
+
+
+EXTERN_C const IID IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig;
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+ } /* end extern "C" */
+ namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ MIDL_INTERFACE("A9F22E31-D4E1-3940-BA20-DCB20973B09F")
+ IConfig : public IInspectable
+ {
+ public:
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_InitTimeout(
+ /* [out][retval] */ DOUBLE *__returnValue) = 0;
+
+ virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_InitTimeout(
+ /* [in] */ DOUBLE __set_formal) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_RecvTimeout(
+ /* [out][retval] */ DOUBLE *__returnValue) = 0;
+
+ virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_RecvTimeout(
+ /* [in] */ DOUBLE __set_formal) = 0;
+
+ };
+
+ extern const __declspec(selectany) IID & IID_IConfig = __uuidof(IConfig);
+
+
+ } /* end namespace */
+ } /* end namespace */
+ } /* end namespace */
+ extern "C" {
+
+#else /* C style interface */
+
+ typedef struct __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfigVtbl
+ {
+ BEGIN_INTERFACE
+
+ HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig * This,
+ /* [in] */ REFIID riid,
+ /* [annotation][iid_is][out] */
+ _COM_Outptr_ void **ppvObject);
+
+ ULONG ( STDMETHODCALLTYPE *AddRef )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig * This);
+
+ ULONG ( STDMETHODCALLTYPE *Release )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig * This);
+
+ HRESULT ( STDMETHODCALLTYPE *GetIids )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig * This,
+ /* [out] */ ULONG *iidCount,
+ /* [size_is][size_is][out] */ IID **iids);
+
+ HRESULT ( STDMETHODCALLTYPE *GetRuntimeClassName )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig * This,
+ /* [out] */ HSTRING *className);
+
+ HRESULT ( STDMETHODCALLTYPE *GetTrustLevel )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig * This,
+ /* [out] */ TrustLevel *trustLevel);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_InitTimeout )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig * This,
+ /* [out][retval] */ DOUBLE *__returnValue);
+
+ /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_InitTimeout )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig * This,
+ /* [in] */ DOUBLE __set_formal);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_RecvTimeout )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig * This,
+ /* [out][retval] */ DOUBLE *__returnValue);
+
+ /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_RecvTimeout )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig * This,
+ /* [in] */ DOUBLE __set_formal);
+
+ END_INTERFACE
+ } __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfigVtbl;
+
+ interface __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig
+ {
+ CONST_VTBL struct __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfigVtbl *lpVtbl;
+ };
+
+
+
+#ifdef COBJMACROS
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_QueryInterface(This,riid,ppvObject) \
+ ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_AddRef(This) \
+ ( (This)->lpVtbl -> AddRef(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_Release(This) \
+ ( (This)->lpVtbl -> Release(This) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_GetIids(This,iidCount,iids) \
+ ( (This)->lpVtbl -> GetIids(This,iidCount,iids) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_GetRuntimeClassName(This,className) \
+ ( (This)->lpVtbl -> GetRuntimeClassName(This,className) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_GetTrustLevel(This,trustLevel) \
+ ( (This)->lpVtbl -> GetTrustLevel(This,trustLevel) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_get_InitTimeout(This,__returnValue) \
+ ( (This)->lpVtbl -> get_InitTimeout(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_put_InitTimeout(This,__set_formal) \
+ ( (This)->lpVtbl -> put_InitTimeout(This,__set_formal) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_get_RecvTimeout(This,__returnValue) \
+ ( (This)->lpVtbl -> get_RecvTimeout(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_put_RecvTimeout(This,__set_formal) \
+ ( (This)->lpVtbl -> put_RecvTimeout(This,__set_formal) )
+
+#endif /* COBJMACROS */
+
+
+#endif /* C style interface */
+
+
+
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_INTERFACE_DEFINED__ */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0010 */
+/* [local] */
+
+#if !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_INTERFACE_DEFINED__)
+extern const __declspec(selectany) _Null_terminated_ WCHAR InterfaceName_PhoneVoIPApp_BackEnd___ICallControllerPublicNonVirtuals[] = L"PhoneVoIPApp.BackEnd.__ICallControllerPublicNonVirtuals";
+#endif /* !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_INTERFACE_DEFINED__) */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0010 */
+/* [local] */
+
+
+
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0010_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0010_v0_0_s_ifspec;
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_INTERFACE_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_INTERFACE_DEFINED__
+
+/* interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals */
+/* [uuid][object] */
+
+
+
+/* interface ABI::PhoneVoIPApp::BackEnd::__ICallControllerPublicNonVirtuals */
+/* [uuid][object] */
+
+
+EXTERN_C const IID IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals;
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+ } /* end extern "C" */
+ namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ MIDL_INTERFACE("06B50718-3528-3B66-BE76-E183AA80D4A5")
+ __ICallControllerPublicNonVirtuals : public IInspectable
+ {
+ public:
+ virtual HRESULT STDMETHODCALLTYPE HandleUpdatePhoneCall( void) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE StartMTProtoUpdater( void) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE StopMTProtoUpdater( void) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE CreateVoIPControllerWrapper( void) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE DeleteVoIPControllerWrapper( void) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE SetConfig(
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::Config config) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE SetEncryptionKey(
+ /* [in] */ UINT32 __keySize,
+ /* [in][size_is] */ BYTE *key,
+ /* [in] */ boolean isOutgoing) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE SetPublicEndpoints(
+ /* [in] */ UINT32 __endpointsSize,
+ /* [in][size_is] */ ABI::PhoneVoIPApp::BackEnd::EndpointStruct *endpoints,
+ /* [in] */ boolean allowP2P,
+ /* [in] */ INT32 connectionMaxLayer) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE SetProxy(
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::ProxyStruct proxy) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE Start( void) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE Connect( void) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE SetMicMute(
+ /* [in] */ boolean mute) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE SwitchSpeaker(
+ /* [in] */ boolean external) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE UpdateServerConfig(
+ /* [in] */ HSTRING json) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE GetPreferredRelayID(
+ /* [out][retval] */ INT64 *__returnValue) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE GetLastError(
+ /* [out][retval] */ ABI::PhoneVoIPApp::BackEnd::Error *__returnValue) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE GetDebugLog(
+ /* [out][retval] */ HSTRING *__returnValue) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE GetDebugString(
+ /* [out][retval] */ HSTRING *__returnValue) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE GetVersion(
+ /* [out][retval] */ HSTRING *__returnValue) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE GetSignalBarsCount(
+ /* [out][retval] */ INT32 *__returnValue) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE SetStatusCallback(
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::ICallControllerStatusListener *statusListener) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE InitiateOutgoingCall2(
+ /* [in] */ HSTRING recepientName,
+ /* [in] */ INT64 recepientId,
+ /* [in] */ INT64 callId,
+ /* [in] */ INT64 callAccessHash,
+ /* [out][retval] */ boolean *__returnValue) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE InitiateOutgoingCall1(
+ /* [in] */ HSTRING recepientName,
+ /* [in] */ INT64 recepientId,
+ /* [in] */ INT64 callId,
+ /* [in] */ INT64 callAccessHash,
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::Config config,
+ /* [in] */ UINT32 __keySize,
+ /* [in][size_is] */ BYTE *key,
+ /* [in] */ boolean outgoing,
+ /* [in] */ UINT32 __emojisSize,
+ /* [in][size_is] */ HSTRING *emojis,
+ /* [in] */ UINT32 __endpointsSize,
+ /* [in][size_is] */ ABI::PhoneVoIPApp::BackEnd::EndpointStruct *endpoints,
+ /* [in] */ boolean allowP2P,
+ /* [in] */ INT32 connectionMaxLayer,
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::ProxyStruct proxy,
+ /* [out][retval] */ boolean *__returnValue) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE OnIncomingCallReceived(
+ /* [in] */ HSTRING contactName,
+ /* [in] */ INT64 contactId,
+ /* [in] */ HSTRING contactImage,
+ /* [in] */ INT64 callId,
+ /* [in] */ INT64 callAccessHash,
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::IIncomingCallDialogDismissedCallback *incomingCallDialogDismissedCallback,
+ /* [out][retval] */ boolean *__returnValue) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE HoldCall(
+ /* [out][retval] */ boolean *__returnValue) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE ResumeCall(
+ /* [out][retval] */ boolean *__returnValue) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE EndCall(
+ /* [out][retval] */ boolean *__returnValue) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE ToggleCamera(
+ /* [out][retval] */ boolean *__returnValue) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CallStatus(
+ /* [out][retval] */ ABI::PhoneVoIPApp::BackEnd::CallStatus *__returnValue) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_MediaOperations(
+ /* [out][retval] */ ABI::PhoneVoIPApp::BackEnd::MediaOperations *__returnValue) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsShowingVideo(
+ /* [out][retval] */ boolean *__returnValue) = 0;
+
+ virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_IsShowingVideo(
+ /* [in] */ boolean value) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsRenderingVideo(
+ /* [out][retval] */ boolean *__returnValue) = 0;
+
+ virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_IsRenderingVideo(
+ /* [in] */ boolean value) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CameraLocation(
+ /* [out][retval] */ ABI::PhoneVoIPApp::BackEnd::CameraLocation *__returnValue) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AvailableAudioRoutes(
+ /* [out][retval] */ ABI::PhoneVoIPApp::BackEnd::CallAudioRoute *__returnValue) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AudioRoute(
+ /* [out][retval] */ ABI::PhoneVoIPApp::BackEnd::CallAudioRoute *__returnValue) = 0;
+
+ virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_AudioRoute(
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::CallAudioRoute newRoute) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_OtherPartyName(
+ /* [out][retval] */ HSTRING *__returnValue) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_OtherPartyId(
+ /* [out][retval] */ INT64 *__returnValue) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CallStartTime(
+ /* [out][retval] */ ABI::Windows::Foundation::DateTime *__returnValue) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CallId(
+ /* [out][retval] */ INT64 *__returnValue) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CallAccessHash(
+ /* [out][retval] */ INT64 *__returnValue) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AcceptedCallId(
+ /* [out][retval] */ INT64 *__returnValue) = 0;
+
+ virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_AcceptedCallId(
+ /* [in] */ INT64 value) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Key(
+ /* [out] */ UINT32 *____returnValueSize,
+ /* [out][retval][size_is][size_is] */ BYTE **__returnValue) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Outgoing(
+ /* [out][retval] */ boolean *__returnValue) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Emojis(
+ /* [out] */ UINT32 *____returnValueSize,
+ /* [out][retval][size_is][size_is] */ HSTRING **__returnValue) = 0;
+
+ };
+
+ extern const __declspec(selectany) IID & IID___ICallControllerPublicNonVirtuals = __uuidof(__ICallControllerPublicNonVirtuals);
+
+
+ } /* end namespace */
+ } /* end namespace */
+ } /* end namespace */
+ extern "C" {
+
+#else /* C style interface */
+
+ typedef struct __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtualsVtbl
+ {
+ BEGIN_INTERFACE
+
+ HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [in] */ REFIID riid,
+ /* [annotation][iid_is][out] */
+ _COM_Outptr_ void **ppvObject);
+
+ ULONG ( STDMETHODCALLTYPE *AddRef )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This);
+
+ ULONG ( STDMETHODCALLTYPE *Release )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This);
+
+ HRESULT ( STDMETHODCALLTYPE *GetIids )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out] */ ULONG *iidCount,
+ /* [size_is][size_is][out] */ IID **iids);
+
+ HRESULT ( STDMETHODCALLTYPE *GetRuntimeClassName )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out] */ HSTRING *className);
+
+ HRESULT ( STDMETHODCALLTYPE *GetTrustLevel )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out] */ TrustLevel *trustLevel);
+
+ HRESULT ( STDMETHODCALLTYPE *HandleUpdatePhoneCall )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This);
+
+ HRESULT ( STDMETHODCALLTYPE *StartMTProtoUpdater )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This);
+
+ HRESULT ( STDMETHODCALLTYPE *StopMTProtoUpdater )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This);
+
+ HRESULT ( STDMETHODCALLTYPE *CreateVoIPControllerWrapper )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This);
+
+ HRESULT ( STDMETHODCALLTYPE *DeleteVoIPControllerWrapper )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This);
+
+ HRESULT ( STDMETHODCALLTYPE *SetConfig )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CConfig config);
+
+ HRESULT ( STDMETHODCALLTYPE *SetEncryptionKey )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [in] */ UINT32 __keySize,
+ /* [in][size_is] */ BYTE *key,
+ /* [in] */ boolean isOutgoing);
+
+ HRESULT ( STDMETHODCALLTYPE *SetPublicEndpoints )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [in] */ UINT32 __endpointsSize,
+ /* [in][size_is] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CEndpointStruct *endpoints,
+ /* [in] */ boolean allowP2P,
+ /* [in] */ INT32 connectionMaxLayer);
+
+ HRESULT ( STDMETHODCALLTYPE *SetProxy )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CProxyStruct proxy);
+
+ HRESULT ( STDMETHODCALLTYPE *Start )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This);
+
+ HRESULT ( STDMETHODCALLTYPE *Connect )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This);
+
+ HRESULT ( STDMETHODCALLTYPE *SetMicMute )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [in] */ boolean mute);
+
+ HRESULT ( STDMETHODCALLTYPE *SwitchSpeaker )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [in] */ boolean external);
+
+ HRESULT ( STDMETHODCALLTYPE *UpdateServerConfig )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [in] */ HSTRING json);
+
+ HRESULT ( STDMETHODCALLTYPE *GetPreferredRelayID )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ INT64 *__returnValue);
+
+ HRESULT ( STDMETHODCALLTYPE *GetLastError )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CError *__returnValue);
+
+ HRESULT ( STDMETHODCALLTYPE *GetDebugLog )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ HSTRING *__returnValue);
+
+ HRESULT ( STDMETHODCALLTYPE *GetDebugString )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ HSTRING *__returnValue);
+
+ HRESULT ( STDMETHODCALLTYPE *GetVersion )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ HSTRING *__returnValue);
+
+ HRESULT ( STDMETHODCALLTYPE *GetSignalBarsCount )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ INT32 *__returnValue);
+
+ HRESULT ( STDMETHODCALLTYPE *SetStatusCallback )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener *statusListener);
+
+ HRESULT ( STDMETHODCALLTYPE *InitiateOutgoingCall2 )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [in] */ HSTRING recepientName,
+ /* [in] */ INT64 recepientId,
+ /* [in] */ INT64 callId,
+ /* [in] */ INT64 callAccessHash,
+ /* [out][retval] */ boolean *__returnValue);
+
+ HRESULT ( STDMETHODCALLTYPE *InitiateOutgoingCall1 )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [in] */ HSTRING recepientName,
+ /* [in] */ INT64 recepientId,
+ /* [in] */ INT64 callId,
+ /* [in] */ INT64 callAccessHash,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CConfig config,
+ /* [in] */ UINT32 __keySize,
+ /* [in][size_is] */ BYTE *key,
+ /* [in] */ boolean outgoing,
+ /* [in] */ UINT32 __emojisSize,
+ /* [in][size_is] */ HSTRING *emojis,
+ /* [in] */ UINT32 __endpointsSize,
+ /* [in][size_is] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CEndpointStruct *endpoints,
+ /* [in] */ boolean allowP2P,
+ /* [in] */ INT32 connectionMaxLayer,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CProxyStruct proxy,
+ /* [out][retval] */ boolean *__returnValue);
+
+ HRESULT ( STDMETHODCALLTYPE *OnIncomingCallReceived )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [in] */ HSTRING contactName,
+ /* [in] */ INT64 contactId,
+ /* [in] */ HSTRING contactImage,
+ /* [in] */ INT64 callId,
+ /* [in] */ INT64 callAccessHash,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback *incomingCallDialogDismissedCallback,
+ /* [out][retval] */ boolean *__returnValue);
+
+ HRESULT ( STDMETHODCALLTYPE *HoldCall )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ boolean *__returnValue);
+
+ HRESULT ( STDMETHODCALLTYPE *ResumeCall )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ boolean *__returnValue);
+
+ HRESULT ( STDMETHODCALLTYPE *EndCall )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ boolean *__returnValue);
+
+ HRESULT ( STDMETHODCALLTYPE *ToggleCamera )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ boolean *__returnValue);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CallStatus )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CCallStatus *__returnValue);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_MediaOperations )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CMediaOperations *__returnValue);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsShowingVideo )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ boolean *__returnValue);
+
+ /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_IsShowingVideo )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [in] */ boolean value);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_IsRenderingVideo )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ boolean *__returnValue);
+
+ /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_IsRenderingVideo )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [in] */ boolean value);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CameraLocation )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CCameraLocation *__returnValue);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AvailableAudioRoutes )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CCallAudioRoute *__returnValue);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AudioRoute )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CCallAudioRoute *__returnValue);
+
+ /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AudioRoute )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CCallAudioRoute newRoute);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OtherPartyName )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ HSTRING *__returnValue);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_OtherPartyId )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ INT64 *__returnValue);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CallStartTime )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ __x_ABI_CWindows_CFoundation_CDateTime *__returnValue);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CallId )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ INT64 *__returnValue);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CallAccessHash )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ INT64 *__returnValue);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_AcceptedCallId )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ INT64 *__returnValue);
+
+ /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_AcceptedCallId )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [in] */ INT64 value);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Key )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out] */ UINT32 *____returnValueSize,
+ /* [out][retval][size_is][size_is] */ BYTE **__returnValue);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Outgoing )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out][retval] */ boolean *__returnValue);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Emojis )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals * This,
+ /* [out] */ UINT32 *____returnValueSize,
+ /* [out][retval][size_is][size_is] */ HSTRING **__returnValue);
+
+ END_INTERFACE
+ } __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtualsVtbl;
+
+ interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals
+ {
+ CONST_VTBL struct __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtualsVtbl *lpVtbl;
+ };
+
+
+
+#ifdef COBJMACROS
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_QueryInterface(This,riid,ppvObject) \
+ ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_AddRef(This) \
+ ( (This)->lpVtbl -> AddRef(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_Release(This) \
+ ( (This)->lpVtbl -> Release(This) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_GetIids(This,iidCount,iids) \
+ ( (This)->lpVtbl -> GetIids(This,iidCount,iids) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_GetRuntimeClassName(This,className) \
+ ( (This)->lpVtbl -> GetRuntimeClassName(This,className) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_GetTrustLevel(This,trustLevel) \
+ ( (This)->lpVtbl -> GetTrustLevel(This,trustLevel) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_HandleUpdatePhoneCall(This) \
+ ( (This)->lpVtbl -> HandleUpdatePhoneCall(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_StartMTProtoUpdater(This) \
+ ( (This)->lpVtbl -> StartMTProtoUpdater(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_StopMTProtoUpdater(This) \
+ ( (This)->lpVtbl -> StopMTProtoUpdater(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_CreateVoIPControllerWrapper(This) \
+ ( (This)->lpVtbl -> CreateVoIPControllerWrapper(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_DeleteVoIPControllerWrapper(This) \
+ ( (This)->lpVtbl -> DeleteVoIPControllerWrapper(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_SetConfig(This,config) \
+ ( (This)->lpVtbl -> SetConfig(This,config) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_SetEncryptionKey(This,__keySize,key,isOutgoing) \
+ ( (This)->lpVtbl -> SetEncryptionKey(This,__keySize,key,isOutgoing) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_SetPublicEndpoints(This,__endpointsSize,endpoints,allowP2P,connectionMaxLayer) \
+ ( (This)->lpVtbl -> SetPublicEndpoints(This,__endpointsSize,endpoints,allowP2P,connectionMaxLayer) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_SetProxy(This,proxy) \
+ ( (This)->lpVtbl -> SetProxy(This,proxy) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_Start(This) \
+ ( (This)->lpVtbl -> Start(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_Connect(This) \
+ ( (This)->lpVtbl -> Connect(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_SetMicMute(This,mute) \
+ ( (This)->lpVtbl -> SetMicMute(This,mute) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_SwitchSpeaker(This,external) \
+ ( (This)->lpVtbl -> SwitchSpeaker(This,external) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_UpdateServerConfig(This,json) \
+ ( (This)->lpVtbl -> UpdateServerConfig(This,json) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_GetPreferredRelayID(This,__returnValue) \
+ ( (This)->lpVtbl -> GetPreferredRelayID(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_GetLastError(This,__returnValue) \
+ ( (This)->lpVtbl -> GetLastError(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_GetDebugLog(This,__returnValue) \
+ ( (This)->lpVtbl -> GetDebugLog(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_GetDebugString(This,__returnValue) \
+ ( (This)->lpVtbl -> GetDebugString(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_GetVersion(This,__returnValue) \
+ ( (This)->lpVtbl -> GetVersion(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_GetSignalBarsCount(This,__returnValue) \
+ ( (This)->lpVtbl -> GetSignalBarsCount(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_SetStatusCallback(This,statusListener) \
+ ( (This)->lpVtbl -> SetStatusCallback(This,statusListener) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_InitiateOutgoingCall2(This,recepientName,recepientId,callId,callAccessHash,__returnValue) \
+ ( (This)->lpVtbl -> InitiateOutgoingCall2(This,recepientName,recepientId,callId,callAccessHash,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_InitiateOutgoingCall1(This,recepientName,recepientId,callId,callAccessHash,config,__keySize,key,outgoing,__emojisSize,emojis,__endpointsSize,endpoints,allowP2P,connectionMaxLayer,proxy,__returnValue) \
+ ( (This)->lpVtbl -> InitiateOutgoingCall1(This,recepientName,recepientId,callId,callAccessHash,config,__keySize,key,outgoing,__emojisSize,emojis,__endpointsSize,endpoints,allowP2P,connectionMaxLayer,proxy,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_OnIncomingCallReceived(This,contactName,contactId,contactImage,callId,callAccessHash,incomingCallDialogDismissedCallback,__returnValue) \
+ ( (This)->lpVtbl -> OnIncomingCallReceived(This,contactName,contactId,contactImage,callId,callAccessHash,incomingCallDialogDismissedCallback,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_HoldCall(This,__returnValue) \
+ ( (This)->lpVtbl -> HoldCall(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_ResumeCall(This,__returnValue) \
+ ( (This)->lpVtbl -> ResumeCall(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_EndCall(This,__returnValue) \
+ ( (This)->lpVtbl -> EndCall(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_ToggleCamera(This,__returnValue) \
+ ( (This)->lpVtbl -> ToggleCamera(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_get_CallStatus(This,__returnValue) \
+ ( (This)->lpVtbl -> get_CallStatus(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_get_MediaOperations(This,__returnValue) \
+ ( (This)->lpVtbl -> get_MediaOperations(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_get_IsShowingVideo(This,__returnValue) \
+ ( (This)->lpVtbl -> get_IsShowingVideo(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_put_IsShowingVideo(This,value) \
+ ( (This)->lpVtbl -> put_IsShowingVideo(This,value) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_get_IsRenderingVideo(This,__returnValue) \
+ ( (This)->lpVtbl -> get_IsRenderingVideo(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_put_IsRenderingVideo(This,value) \
+ ( (This)->lpVtbl -> put_IsRenderingVideo(This,value) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_get_CameraLocation(This,__returnValue) \
+ ( (This)->lpVtbl -> get_CameraLocation(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_get_AvailableAudioRoutes(This,__returnValue) \
+ ( (This)->lpVtbl -> get_AvailableAudioRoutes(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_get_AudioRoute(This,__returnValue) \
+ ( (This)->lpVtbl -> get_AudioRoute(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_put_AudioRoute(This,newRoute) \
+ ( (This)->lpVtbl -> put_AudioRoute(This,newRoute) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_get_OtherPartyName(This,__returnValue) \
+ ( (This)->lpVtbl -> get_OtherPartyName(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_get_OtherPartyId(This,__returnValue) \
+ ( (This)->lpVtbl -> get_OtherPartyId(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_get_CallStartTime(This,__returnValue) \
+ ( (This)->lpVtbl -> get_CallStartTime(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_get_CallId(This,__returnValue) \
+ ( (This)->lpVtbl -> get_CallId(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_get_CallAccessHash(This,__returnValue) \
+ ( (This)->lpVtbl -> get_CallAccessHash(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_get_AcceptedCallId(This,__returnValue) \
+ ( (This)->lpVtbl -> get_AcceptedCallId(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_put_AcceptedCallId(This,value) \
+ ( (This)->lpVtbl -> put_AcceptedCallId(This,value) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_get_Key(This,____returnValueSize,__returnValue) \
+ ( (This)->lpVtbl -> get_Key(This,____returnValueSize,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_get_Outgoing(This,__returnValue) \
+ ( (This)->lpVtbl -> get_Outgoing(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_get_Emojis(This,____returnValueSize,__returnValue) \
+ ( (This)->lpVtbl -> get_Emojis(This,____returnValueSize,__returnValue) )
+
+#endif /* COBJMACROS */
+
+
+#endif /* C style interface */
+
+
+
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_INTERFACE_DEFINED__ */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0011 */
+/* [local] */
+
+#if !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_INTERFACE_DEFINED__)
+extern const __declspec(selectany) _Null_terminated_ WCHAR InterfaceName_PhoneVoIPApp_BackEnd_IVideoRenderer[] = L"PhoneVoIPApp.BackEnd.IVideoRenderer";
+#endif /* !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_INTERFACE_DEFINED__) */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0011 */
+/* [local] */
+
+
+
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0011_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0011_v0_0_s_ifspec;
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_INTERFACE_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_INTERFACE_DEFINED__
+
+/* interface __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer */
+/* [uuid][object] */
+
+
+
+/* interface ABI::PhoneVoIPApp::BackEnd::IVideoRenderer */
+/* [uuid][object] */
+
+
+EXTERN_C const IID IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer;
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+ } /* end extern "C" */
+ namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ MIDL_INTERFACE("6928CA7B-166D-3B37-9010-FBAB2C7E92B0")
+ IVideoRenderer : public IInspectable
+ {
+ public:
+ virtual HRESULT STDMETHODCALLTYPE Start( void) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE Stop( void) = 0;
+
+ };
+
+ extern const __declspec(selectany) IID & IID_IVideoRenderer = __uuidof(IVideoRenderer);
+
+
+ } /* end namespace */
+ } /* end namespace */
+ } /* end namespace */
+ extern "C" {
+
+#else /* C style interface */
+
+ typedef struct __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRendererVtbl
+ {
+ BEGIN_INTERFACE
+
+ HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer * This,
+ /* [in] */ REFIID riid,
+ /* [annotation][iid_is][out] */
+ _COM_Outptr_ void **ppvObject);
+
+ ULONG ( STDMETHODCALLTYPE *AddRef )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer * This);
+
+ ULONG ( STDMETHODCALLTYPE *Release )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer * This);
+
+ HRESULT ( STDMETHODCALLTYPE *GetIids )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer * This,
+ /* [out] */ ULONG *iidCount,
+ /* [size_is][size_is][out] */ IID **iids);
+
+ HRESULT ( STDMETHODCALLTYPE *GetRuntimeClassName )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer * This,
+ /* [out] */ HSTRING *className);
+
+ HRESULT ( STDMETHODCALLTYPE *GetTrustLevel )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer * This,
+ /* [out] */ TrustLevel *trustLevel);
+
+ HRESULT ( STDMETHODCALLTYPE *Start )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer * This);
+
+ HRESULT ( STDMETHODCALLTYPE *Stop )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer * This);
+
+ END_INTERFACE
+ } __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRendererVtbl;
+
+ interface __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer
+ {
+ CONST_VTBL struct __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRendererVtbl *lpVtbl;
+ };
+
+
+
+#ifdef COBJMACROS
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_QueryInterface(This,riid,ppvObject) \
+ ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_AddRef(This) \
+ ( (This)->lpVtbl -> AddRef(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_Release(This) \
+ ( (This)->lpVtbl -> Release(This) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_GetIids(This,iidCount,iids) \
+ ( (This)->lpVtbl -> GetIids(This,iidCount,iids) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_GetRuntimeClassName(This,className) \
+ ( (This)->lpVtbl -> GetRuntimeClassName(This,className) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_GetTrustLevel(This,trustLevel) \
+ ( (This)->lpVtbl -> GetTrustLevel(This,trustLevel) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_Start(This) \
+ ( (This)->lpVtbl -> Start(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_Stop(This) \
+ ( (This)->lpVtbl -> Stop(This) )
+
+#endif /* COBJMACROS */
+
+
+#endif /* C style interface */
+
+
+
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_INTERFACE_DEFINED__ */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0012 */
+/* [local] */
+
+#if !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_INTERFACE_DEFINED__)
+extern const __declspec(selectany) _Null_terminated_ WCHAR InterfaceName_PhoneVoIPApp_BackEnd_IMTProtoUpdater[] = L"PhoneVoIPApp.BackEnd.IMTProtoUpdater";
+#endif /* !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_INTERFACE_DEFINED__) */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0012 */
+/* [local] */
+
+
+
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0012_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0012_v0_0_s_ifspec;
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_INTERFACE_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_INTERFACE_DEFINED__
+
+/* interface __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater */
+/* [uuid][object] */
+
+
+
+/* interface ABI::PhoneVoIPApp::BackEnd::IMTProtoUpdater */
+/* [uuid][object] */
+
+
+EXTERN_C const IID IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater;
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+ } /* end extern "C" */
+ namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ MIDL_INTERFACE("4FA5F2C4-8612-35C9-BFAA-967C2C819FA7")
+ IMTProtoUpdater : public IInspectable
+ {
+ public:
+ virtual HRESULT STDMETHODCALLTYPE Start(
+ /* [in] */ INT32 pts,
+ /* [in] */ INT32 date,
+ /* [in] */ INT32 qts) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE Stop( void) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE DiscardCall(
+ /* [in] */ INT64 id,
+ /* [in] */ INT64 accessHash) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE ReceivedCall(
+ /* [in] */ INT64 id,
+ /* [in] */ INT64 accessHash) = 0;
+
+ };
+
+ extern const __declspec(selectany) IID & IID_IMTProtoUpdater = __uuidof(IMTProtoUpdater);
+
+
+ } /* end namespace */
+ } /* end namespace */
+ } /* end namespace */
+ extern "C" {
+
+#else /* C style interface */
+
+ typedef struct __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdaterVtbl
+ {
+ BEGIN_INTERFACE
+
+ HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater * This,
+ /* [in] */ REFIID riid,
+ /* [annotation][iid_is][out] */
+ _COM_Outptr_ void **ppvObject);
+
+ ULONG ( STDMETHODCALLTYPE *AddRef )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater * This);
+
+ ULONG ( STDMETHODCALLTYPE *Release )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater * This);
+
+ HRESULT ( STDMETHODCALLTYPE *GetIids )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater * This,
+ /* [out] */ ULONG *iidCount,
+ /* [size_is][size_is][out] */ IID **iids);
+
+ HRESULT ( STDMETHODCALLTYPE *GetRuntimeClassName )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater * This,
+ /* [out] */ HSTRING *className);
+
+ HRESULT ( STDMETHODCALLTYPE *GetTrustLevel )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater * This,
+ /* [out] */ TrustLevel *trustLevel);
+
+ HRESULT ( STDMETHODCALLTYPE *Start )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater * This,
+ /* [in] */ INT32 pts,
+ /* [in] */ INT32 date,
+ /* [in] */ INT32 qts);
+
+ HRESULT ( STDMETHODCALLTYPE *Stop )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater * This);
+
+ HRESULT ( STDMETHODCALLTYPE *DiscardCall )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater * This,
+ /* [in] */ INT64 id,
+ /* [in] */ INT64 accessHash);
+
+ HRESULT ( STDMETHODCALLTYPE *ReceivedCall )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater * This,
+ /* [in] */ INT64 id,
+ /* [in] */ INT64 accessHash);
+
+ END_INTERFACE
+ } __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdaterVtbl;
+
+ interface __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater
+ {
+ CONST_VTBL struct __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdaterVtbl *lpVtbl;
+ };
+
+
+
+#ifdef COBJMACROS
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_QueryInterface(This,riid,ppvObject) \
+ ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_AddRef(This) \
+ ( (This)->lpVtbl -> AddRef(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_Release(This) \
+ ( (This)->lpVtbl -> Release(This) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_GetIids(This,iidCount,iids) \
+ ( (This)->lpVtbl -> GetIids(This,iidCount,iids) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_GetRuntimeClassName(This,className) \
+ ( (This)->lpVtbl -> GetRuntimeClassName(This,className) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_GetTrustLevel(This,trustLevel) \
+ ( (This)->lpVtbl -> GetTrustLevel(This,trustLevel) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_Start(This,pts,date,qts) \
+ ( (This)->lpVtbl -> Start(This,pts,date,qts) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_Stop(This) \
+ ( (This)->lpVtbl -> Stop(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_DiscardCall(This,id,accessHash) \
+ ( (This)->lpVtbl -> DiscardCall(This,id,accessHash) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_ReceivedCall(This,id,accessHash) \
+ ( (This)->lpVtbl -> ReceivedCall(This,id,accessHash) )
+
+#endif /* COBJMACROS */
+
+
+#endif /* C style interface */
+
+
+
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_INTERFACE_DEFINED__ */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0013 */
+/* [local] */
+
+#if !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_INTERFACE_DEFINED__)
+extern const __declspec(selectany) _Null_terminated_ WCHAR InterfaceName_PhoneVoIPApp_BackEnd___IGlobalsPublicNonVirtuals[] = L"PhoneVoIPApp.BackEnd.__IGlobalsPublicNonVirtuals";
+#endif /* !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_INTERFACE_DEFINED__) */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0013 */
+/* [local] */
+
+
+
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0013_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0013_v0_0_s_ifspec;
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_INTERFACE_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_INTERFACE_DEFINED__
+
+/* interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals */
+/* [uuid][object] */
+
+
+
+/* interface ABI::PhoneVoIPApp::BackEnd::__IGlobalsPublicNonVirtuals */
+/* [uuid][object] */
+
+
+EXTERN_C const IID IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals;
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+ } /* end extern "C" */
+ namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ MIDL_INTERFACE("C8AFE1A8-92FC-3783-9520-D6BBC507B24A")
+ __IGlobalsPublicNonVirtuals : public IInspectable
+ {
+ public:
+ virtual HRESULT STDMETHODCALLTYPE StartServer(
+ /* [in] */ UINT32 __outOfProcServerClassNamesSize,
+ /* [in][size_is] */ HSTRING *outOfProcServerClassNames) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE DoPeriodicKeepAlive( void) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CallController(
+ /* [out][retval] */ ABI::PhoneVoIPApp::BackEnd::__ICallControllerPublicNonVirtuals **__returnValue) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_VideoRenderer(
+ /* [out][retval] */ ABI::PhoneVoIPApp::BackEnd::IVideoRenderer **__returnValue) = 0;
+
+ virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_VideoRenderer(
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::IVideoRenderer *value) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_MTProtoUpdater(
+ /* [out][retval] */ ABI::PhoneVoIPApp::BackEnd::IMTProtoUpdater **__returnValue) = 0;
+
+ virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_MTProtoUpdater(
+ /* [in] */ ABI::PhoneVoIPApp::BackEnd::IMTProtoUpdater *value) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_CaptureController(
+ /* [out][retval] */ ABI::PhoneVoIPApp::BackEnd::__IBackEndCapturePublicNonVirtuals **__returnValue) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_TransportController(
+ /* [out][retval] */ ABI::PhoneVoIPApp::BackEnd::__IBackEndTransportPublicNonVirtuals **__returnValue) = 0;
+
+ };
+
+ extern const __declspec(selectany) IID & IID___IGlobalsPublicNonVirtuals = __uuidof(__IGlobalsPublicNonVirtuals);
+
+
+ } /* end namespace */
+ } /* end namespace */
+ } /* end namespace */
+ extern "C" {
+
+#else /* C style interface */
+
+ typedef struct __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtualsVtbl
+ {
+ BEGIN_INTERFACE
+
+ HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals * This,
+ /* [in] */ REFIID riid,
+ /* [annotation][iid_is][out] */
+ _COM_Outptr_ void **ppvObject);
+
+ ULONG ( STDMETHODCALLTYPE *AddRef )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals * This);
+
+ ULONG ( STDMETHODCALLTYPE *Release )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals * This);
+
+ HRESULT ( STDMETHODCALLTYPE *GetIids )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals * This,
+ /* [out] */ ULONG *iidCount,
+ /* [size_is][size_is][out] */ IID **iids);
+
+ HRESULT ( STDMETHODCALLTYPE *GetRuntimeClassName )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals * This,
+ /* [out] */ HSTRING *className);
+
+ HRESULT ( STDMETHODCALLTYPE *GetTrustLevel )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals * This,
+ /* [out] */ TrustLevel *trustLevel);
+
+ HRESULT ( STDMETHODCALLTYPE *StartServer )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals * This,
+ /* [in] */ UINT32 __outOfProcServerClassNamesSize,
+ /* [in][size_is] */ HSTRING *outOfProcServerClassNames);
+
+ HRESULT ( STDMETHODCALLTYPE *DoPeriodicKeepAlive )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals * This);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CallController )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals * This,
+ /* [out][retval] */ __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals **__returnValue);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_VideoRenderer )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals * This,
+ /* [out][retval] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer **__returnValue);
+
+ /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_VideoRenderer )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals * This,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer *value);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_MTProtoUpdater )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals * This,
+ /* [out][retval] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater **__returnValue);
+
+ /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_MTProtoUpdater )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals * This,
+ /* [in] */ __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater *value);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_CaptureController )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals * This,
+ /* [out][retval] */ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals **__returnValue);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_TransportController )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals * This,
+ /* [out][retval] */ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals **__returnValue);
+
+ END_INTERFACE
+ } __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtualsVtbl;
+
+ interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals
+ {
+ CONST_VTBL struct __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtualsVtbl *lpVtbl;
+ };
+
+
+
+#ifdef COBJMACROS
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_QueryInterface(This,riid,ppvObject) \
+ ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_AddRef(This) \
+ ( (This)->lpVtbl -> AddRef(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_Release(This) \
+ ( (This)->lpVtbl -> Release(This) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_GetIids(This,iidCount,iids) \
+ ( (This)->lpVtbl -> GetIids(This,iidCount,iids) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_GetRuntimeClassName(This,className) \
+ ( (This)->lpVtbl -> GetRuntimeClassName(This,className) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_GetTrustLevel(This,trustLevel) \
+ ( (This)->lpVtbl -> GetTrustLevel(This,trustLevel) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_StartServer(This,__outOfProcServerClassNamesSize,outOfProcServerClassNames) \
+ ( (This)->lpVtbl -> StartServer(This,__outOfProcServerClassNamesSize,outOfProcServerClassNames) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_DoPeriodicKeepAlive(This) \
+ ( (This)->lpVtbl -> DoPeriodicKeepAlive(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_get_CallController(This,__returnValue) \
+ ( (This)->lpVtbl -> get_CallController(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_get_VideoRenderer(This,__returnValue) \
+ ( (This)->lpVtbl -> get_VideoRenderer(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_put_VideoRenderer(This,value) \
+ ( (This)->lpVtbl -> put_VideoRenderer(This,value) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_get_MTProtoUpdater(This,__returnValue) \
+ ( (This)->lpVtbl -> get_MTProtoUpdater(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_put_MTProtoUpdater(This,value) \
+ ( (This)->lpVtbl -> put_MTProtoUpdater(This,value) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_get_CaptureController(This,__returnValue) \
+ ( (This)->lpVtbl -> get_CaptureController(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_get_TransportController(This,__returnValue) \
+ ( (This)->lpVtbl -> get_TransportController(This,__returnValue) )
+
+#endif /* COBJMACROS */
+
+
+#endif /* C style interface */
+
+
+
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_INTERFACE_DEFINED__ */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0014 */
+/* [local] */
+
+#if !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_INTERFACE_DEFINED__)
+extern const __declspec(selectany) _Null_terminated_ WCHAR InterfaceName_PhoneVoIPApp_BackEnd___IGlobalsStatics[] = L"PhoneVoIPApp.BackEnd.__IGlobalsStatics";
+#endif /* !defined(____x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_INTERFACE_DEFINED__) */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0014 */
+/* [local] */
+
+
+
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0014_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0014_v0_0_s_ifspec;
+
+#ifndef ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_INTERFACE_DEFINED__
+#define ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_INTERFACE_DEFINED__
+
+/* interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics */
+/* [uuid][object] */
+
+
+
+/* interface ABI::PhoneVoIPApp::BackEnd::__IGlobalsStatics */
+/* [uuid][object] */
+
+
+EXTERN_C const IID IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics;
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+ } /* end extern "C" */
+ namespace ABI {
+ namespace PhoneVoIPApp {
+ namespace BackEnd {
+
+ MIDL_INTERFACE("2C1E9C37-6827-38F7-857C-021642CA428B")
+ __IGlobalsStatics : public IInspectable
+ {
+ public:
+ virtual HRESULT STDMETHODCALLTYPE GetCurrentProcessId(
+ /* [out][retval] */ UINT32 *__returnValue) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE GetUiDisconnectedEventName(
+ /* [in] */ UINT32 backgroundProcessId,
+ /* [out][retval] */ HSTRING *__returnValue) = 0;
+
+ virtual HRESULT STDMETHODCALLTYPE GetBackgroundProcessReadyEventName(
+ /* [in] */ UINT32 backgroundProcessId,
+ /* [out][retval] */ HSTRING *__returnValue) = 0;
+
+ virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Instance(
+ /* [out][retval] */ ABI::PhoneVoIPApp::BackEnd::__IGlobalsPublicNonVirtuals **__returnValue) = 0;
+
+ };
+
+ extern const __declspec(selectany) IID & IID___IGlobalsStatics = __uuidof(__IGlobalsStatics);
+
+
+ } /* end namespace */
+ } /* end namespace */
+ } /* end namespace */
+ extern "C" {
+
+#else /* C style interface */
+
+ typedef struct __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStaticsVtbl
+ {
+ BEGIN_INTERFACE
+
+ HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics * This,
+ /* [in] */ REFIID riid,
+ /* [annotation][iid_is][out] */
+ _COM_Outptr_ void **ppvObject);
+
+ ULONG ( STDMETHODCALLTYPE *AddRef )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics * This);
+
+ ULONG ( STDMETHODCALLTYPE *Release )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics * This);
+
+ HRESULT ( STDMETHODCALLTYPE *GetIids )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics * This,
+ /* [out] */ ULONG *iidCount,
+ /* [size_is][size_is][out] */ IID **iids);
+
+ HRESULT ( STDMETHODCALLTYPE *GetRuntimeClassName )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics * This,
+ /* [out] */ HSTRING *className);
+
+ HRESULT ( STDMETHODCALLTYPE *GetTrustLevel )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics * This,
+ /* [out] */ TrustLevel *trustLevel);
+
+ HRESULT ( STDMETHODCALLTYPE *GetCurrentProcessId )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics * This,
+ /* [out][retval] */ UINT32 *__returnValue);
+
+ HRESULT ( STDMETHODCALLTYPE *GetUiDisconnectedEventName )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics * This,
+ /* [in] */ UINT32 backgroundProcessId,
+ /* [out][retval] */ HSTRING *__returnValue);
+
+ HRESULT ( STDMETHODCALLTYPE *GetBackgroundProcessReadyEventName )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics * This,
+ /* [in] */ UINT32 backgroundProcessId,
+ /* [out][retval] */ HSTRING *__returnValue);
+
+ /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Instance )(
+ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics * This,
+ /* [out][retval] */ __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals **__returnValue);
+
+ END_INTERFACE
+ } __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStaticsVtbl;
+
+ interface __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics
+ {
+ CONST_VTBL struct __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStaticsVtbl *lpVtbl;
+ };
+
+
+
+#ifdef COBJMACROS
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_QueryInterface(This,riid,ppvObject) \
+ ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_AddRef(This) \
+ ( (This)->lpVtbl -> AddRef(This) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_Release(This) \
+ ( (This)->lpVtbl -> Release(This) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_GetIids(This,iidCount,iids) \
+ ( (This)->lpVtbl -> GetIids(This,iidCount,iids) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_GetRuntimeClassName(This,className) \
+ ( (This)->lpVtbl -> GetRuntimeClassName(This,className) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_GetTrustLevel(This,trustLevel) \
+ ( (This)->lpVtbl -> GetTrustLevel(This,trustLevel) )
+
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_GetCurrentProcessId(This,__returnValue) \
+ ( (This)->lpVtbl -> GetCurrentProcessId(This,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_GetUiDisconnectedEventName(This,backgroundProcessId,__returnValue) \
+ ( (This)->lpVtbl -> GetUiDisconnectedEventName(This,backgroundProcessId,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_GetBackgroundProcessReadyEventName(This,backgroundProcessId,__returnValue) \
+ ( (This)->lpVtbl -> GetBackgroundProcessReadyEventName(This,backgroundProcessId,__returnValue) )
+
+#define __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_get_Instance(This,__returnValue) \
+ ( (This)->lpVtbl -> get_Instance(This,__returnValue) )
+
+#endif /* COBJMACROS */
+
+
+#endif /* C style interface */
+
+
+
+
+#endif /* ____x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_INTERFACE_DEFINED__ */
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0015 */
+/* [local] */
+
+#ifndef RUNTIMECLASS_PhoneVoIPApp_BackEnd_BackEndTransport_DEFINED
+#define RUNTIMECLASS_PhoneVoIPApp_BackEnd_BackEndTransport_DEFINED
+extern const __declspec(selectany) _Null_terminated_ WCHAR RuntimeClass_PhoneVoIPApp_BackEnd_BackEndTransport[] = L"PhoneVoIPApp.BackEnd.BackEndTransport";
+#endif
+#ifndef RUNTIMECLASS_PhoneVoIPApp_BackEnd_Endpoint_DEFINED
+#define RUNTIMECLASS_PhoneVoIPApp_BackEnd_Endpoint_DEFINED
+extern const __declspec(selectany) _Null_terminated_ WCHAR RuntimeClass_PhoneVoIPApp_BackEnd_Endpoint[] = L"PhoneVoIPApp.BackEnd.Endpoint";
+#endif
+#ifndef RUNTIMECLASS_PhoneVoIPApp_BackEnd_BackEndCapture_DEFINED
+#define RUNTIMECLASS_PhoneVoIPApp_BackEnd_BackEndCapture_DEFINED
+extern const __declspec(selectany) _Null_terminated_ WCHAR RuntimeClass_PhoneVoIPApp_BackEnd_BackEndCapture[] = L"PhoneVoIPApp.BackEnd.BackEndCapture";
+#endif
+#ifndef RUNTIMECLASS_PhoneVoIPApp_BackEnd_CallController_DEFINED
+#define RUNTIMECLASS_PhoneVoIPApp_BackEnd_CallController_DEFINED
+extern const __declspec(selectany) _Null_terminated_ WCHAR RuntimeClass_PhoneVoIPApp_BackEnd_CallController[] = L"PhoneVoIPApp.BackEnd.CallController";
+#endif
+#ifndef RUNTIMECLASS_PhoneVoIPApp_BackEnd_Globals_DEFINED
+#define RUNTIMECLASS_PhoneVoIPApp_BackEnd_Globals_DEFINED
+extern const __declspec(selectany) _Null_terminated_ WCHAR RuntimeClass_PhoneVoIPApp_BackEnd_Globals[] = L"PhoneVoIPApp.BackEnd.Globals";
+#endif
+
+
+/* interface __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0015 */
+/* [local] */
+
+
+
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0015_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0015_v0_0_s_ifspec;
+
+/* Additional Prototypes for ALL interfaces */
+
+unsigned long __RPC_USER HSTRING_UserSize( unsigned long *, unsigned long , HSTRING * );
+unsigned char * __RPC_USER HSTRING_UserMarshal( unsigned long *, unsigned char *, HSTRING * );
+unsigned char * __RPC_USER HSTRING_UserUnmarshal(unsigned long *, unsigned char *, HSTRING * );
+void __RPC_USER HSTRING_UserFree( unsigned long *, HSTRING * );
+
+/* end of Additional Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/BackEndProxyStub/PhoneVoIPApp.BackEnd_i.c b/BackEndProxyStub/PhoneVoIPApp.BackEnd_i.c
new file mode 100755
index 0000000..315cace
--- /dev/null
+++ b/BackEndProxyStub/PhoneVoIPApp.BackEnd_i.c
@@ -0,0 +1,121 @@
+
+
+/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */
+
+/* link this file in with the server and any clients */
+
+
+ /* File created by MIDL compiler version 8.00.0603 */
+/* at Tue Jan 29 08:48:50 2019
+ */
+/* Compiler settings for C:\Users\evgeny\AppData\Local\Temp\PhoneVoIPApp.BackEnd.idl-35395493:
+ Oicf, W1, Zp8, env=Win32 (32b run), target_arch=ARM 8.00.0603
+ protocol : dce , ms_ext, c_ext, robust
+ error checks: allocation ref bounds_check enum stub_data
+ VC __declspec() decoration level:
+ __declspec(uuid()), __declspec(selectany), __declspec(novtable)
+ DECLSPEC_UUID(), MIDL_INTERFACE()
+*/
+/* @@MIDL_FILE_HEADING( ) */
+
+#pragma warning( disable: 4049 ) /* more than 64k source lines */
+
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+
+#include
+#include
+
+#ifdef _MIDL_USE_GUIDDEF_
+
+#ifndef INITGUID
+#define INITGUID
+#include
+#undef INITGUID
+#else
+#include
+#endif
+
+#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
+ DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)
+
+#else // !_MIDL_USE_GUIDDEF_
+
+#ifndef __IID_DEFINED__
+#define __IID_DEFINED__
+
+typedef struct _IID
+{
+ unsigned long x;
+ unsigned short s1;
+ unsigned short s2;
+ unsigned char c[8];
+} IID;
+
+#endif // __IID_DEFINED__
+
+#ifndef CLSID_DEFINED
+#define CLSID_DEFINED
+typedef IID CLSID;
+#endif // CLSID_DEFINED
+
+#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
+ const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
+
+#endif !_MIDL_USE_GUIDDEF_
+
+MIDL_DEFINE_GUID(IID, IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler,0xF2035E6A,0x8067,0x3ABB,0xA7,0x95,0x7B,0x33,0x4C,0x67,0xA2,0xED);
+
+
+MIDL_DEFINE_GUID(IID, IID___x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler,0x1698B961,0xF90E,0x30D0,0x80,0xFF,0x22,0xE9,0x4C,0xF6,0x6D,0x7B);
+
+
+MIDL_DEFINE_GUID(IID, IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback,0x91DDEE70,0xAA90,0x38E7,0xB4,0xE5,0xF7,0x95,0x95,0x69,0xCB,0x5C);
+
+
+MIDL_DEFINE_GUID(IID, IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals,0xF5A3C2AE,0xEF7B,0x3DE2,0x8B,0x0E,0x8E,0x8B,0x3C,0xD2,0x0D,0x9D);
+
+
+MIDL_DEFINE_GUID(IID, IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals,0x044DEA28,0x0E8D,0x3A16,0xA2,0xC1,0xBE,0x95,0xC0,0xBE,0xD5,0xE5);
+
+
+MIDL_DEFINE_GUID(IID, IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals,0x0CC88A54,0x89AF,0x3CC6,0x9B,0x95,0xF8,0xF2,0x24,0x28,0xAB,0xED);
+
+
+MIDL_DEFINE_GUID(IID, IID___x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener,0x39126060,0x0292,0x36D6,0xB3,0xF8,0x9A,0xC4,0x15,0x6C,0x65,0x1D);
+
+
+MIDL_DEFINE_GUID(IID, IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals,0x8313DBEA,0xFD3B,0x3071,0x80,0x35,0x7B,0x61,0x16,0x58,0xDA,0xD8);
+
+
+MIDL_DEFINE_GUID(IID, IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals,0x64B31D5B,0x1A27,0x37A8,0xBC,0xBC,0xC0,0xBB,0xD5,0x31,0x4C,0x79);
+
+
+MIDL_DEFINE_GUID(IID, IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig,0xA9F22E31,0xD4E1,0x3940,0xBA,0x20,0xDC,0xB2,0x09,0x73,0xB0,0x9F);
+
+
+MIDL_DEFINE_GUID(IID, IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals,0x06B50718,0x3528,0x3B66,0xBE,0x76,0xE1,0x83,0xAA,0x80,0xD4,0xA5);
+
+
+MIDL_DEFINE_GUID(IID, IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer,0x6928CA7B,0x166D,0x3B37,0x90,0x10,0xFB,0xAB,0x2C,0x7E,0x92,0xB0);
+
+
+MIDL_DEFINE_GUID(IID, IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater,0x4FA5F2C4,0x8612,0x35C9,0xBF,0xAA,0x96,0x7C,0x2C,0x81,0x9F,0xA7);
+
+
+MIDL_DEFINE_GUID(IID, IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals,0xC8AFE1A8,0x92FC,0x3783,0x95,0x20,0xD6,0xBB,0xC5,0x07,0xB2,0x4A);
+
+
+MIDL_DEFINE_GUID(IID, IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics,0x2C1E9C37,0x6827,0x38F7,0x85,0x7C,0x02,0x16,0x42,0xCA,0x42,0x8B);
+
+#undef MIDL_DEFINE_GUID
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
diff --git a/BackEndProxyStub/PhoneVoIPApp.BackEnd_p.c b/BackEndProxyStub/PhoneVoIPApp.BackEnd_p.c
new file mode 100755
index 0000000..3b76f42
--- /dev/null
+++ b/BackEndProxyStub/PhoneVoIPApp.BackEnd_p.c
@@ -0,0 +1,5831 @@
+
+
+/* this ALWAYS GENERATED file contains the proxy stub code */
+
+
+ /* File created by MIDL compiler version 8.00.0603 */
+/* at Tue Jan 29 08:48:50 2019
+ */
+/* Compiler settings for C:\Users\evgeny\AppData\Local\Temp\PhoneVoIPApp.BackEnd.idl-35395493:
+ Oicf, W1, Zp8, env=Win32 (32b run), target_arch=ARM 8.00.0603
+ protocol : dce , ms_ext, c_ext, robust
+ error checks: allocation ref bounds_check enum stub_data
+ VC __declspec() decoration level:
+ __declspec(uuid()), __declspec(selectany), __declspec(novtable)
+ DECLSPEC_UUID(), MIDL_INTERFACE()
+*/
+/* @@MIDL_FILE_HEADING( ) */
+
+#if defined(_ARM_)
+
+
+#pragma warning( disable: 4049 ) /* more than 64k source lines */
+#if _MSC_VER >= 1200
+#pragma warning(push)
+#endif
+
+#pragma warning( disable: 4211 ) /* redefine extern to static */
+#pragma warning( disable: 4232 ) /* dllimport identity*/
+#pragma warning( disable: 4024 ) /* array to pointer mapping*/
+#pragma warning( disable: 4152 ) /* function/data pointer conversion in expression */
+
+#define USE_STUBLESS_PROXY
+
+
+/* verify that the version is high enough to compile this file*/
+#ifndef __REDQ_RPCPROXY_H_VERSION__
+#define __REQUIRED_RPCPROXY_H_VERSION__ 475
+#endif
+
+
+#include "rpcproxy.h"
+#ifndef __RPCPROXY_H_VERSION__
+#error this stub requires an updated version of
+#endif /* __RPCPROXY_H_VERSION__ */
+
+
+#include "PhoneVoIPApp.BackEnd.h"
+
+#define TYPE_FORMAT_STRING_SIZE 575
+#define PROC_FORMAT_STRING_SIZE 4275
+#define EXPR_FORMAT_STRING_SIZE 1
+#define TRANSMIT_AS_TABLE_SIZE 0
+#define WIRE_MARSHAL_TABLE_SIZE 1
+
+typedef struct _PhoneVoIPApp2EBackEnd_MIDL_TYPE_FORMAT_STRING
+ {
+ short Pad;
+ unsigned char Format[ TYPE_FORMAT_STRING_SIZE ];
+ } PhoneVoIPApp2EBackEnd_MIDL_TYPE_FORMAT_STRING;
+
+typedef struct _PhoneVoIPApp2EBackEnd_MIDL_PROC_FORMAT_STRING
+ {
+ short Pad;
+ unsigned char Format[ PROC_FORMAT_STRING_SIZE ];
+ } PhoneVoIPApp2EBackEnd_MIDL_PROC_FORMAT_STRING;
+
+typedef struct _PhoneVoIPApp2EBackEnd_MIDL_EXPR_FORMAT_STRING
+ {
+ long Pad;
+ unsigned char Format[ EXPR_FORMAT_STRING_SIZE ];
+ } PhoneVoIPApp2EBackEnd_MIDL_EXPR_FORMAT_STRING;
+
+
+static const RPC_SYNTAX_IDENTIFIER _RpcTransferSyntax =
+{{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}};
+
+
+extern const PhoneVoIPApp2EBackEnd_MIDL_TYPE_FORMAT_STRING PhoneVoIPApp2EBackEnd__MIDL_TypeFormatString;
+extern const PhoneVoIPApp2EBackEnd_MIDL_PROC_FORMAT_STRING PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString;
+extern const PhoneVoIPApp2EBackEnd_MIDL_EXPR_FORMAT_STRING PhoneVoIPApp2EBackEnd__MIDL_ExprFormatString;
+
+
+extern const MIDL_STUB_DESC Object_StubDesc;
+
+
+extern const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler_ServerInfo;
+extern const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler_ProxyInfo;
+
+
+extern const MIDL_STUB_DESC Object_StubDesc;
+
+
+extern const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler_ServerInfo;
+extern const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler_ProxyInfo;
+
+
+extern const MIDL_STUB_DESC Object_StubDesc;
+
+
+extern const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback_ServerInfo;
+extern const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback_ProxyInfo;
+
+
+extern const MIDL_STUB_DESC Object_StubDesc;
+
+
+extern const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_ServerInfo;
+extern const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_ProxyInfo;
+
+
+extern const MIDL_STUB_DESC Object_StubDesc;
+
+
+extern const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_ServerInfo;
+extern const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_ProxyInfo;
+
+
+extern const MIDL_STUB_DESC Object_StubDesc;
+
+
+extern const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_ServerInfo;
+extern const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_ProxyInfo;
+
+
+extern const MIDL_STUB_DESC Object_StubDesc;
+
+
+extern const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_ServerInfo;
+extern const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_ProxyInfo;
+
+
+extern const MIDL_STUB_DESC Object_StubDesc;
+
+
+extern const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_ServerInfo;
+extern const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_ProxyInfo;
+
+
+extern const MIDL_STUB_DESC Object_StubDesc;
+
+
+extern const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_ServerInfo;
+extern const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_ProxyInfo;
+
+
+extern const MIDL_STUB_DESC Object_StubDesc;
+
+
+extern const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_ServerInfo;
+extern const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_ProxyInfo;
+
+
+extern const MIDL_STUB_DESC Object_StubDesc;
+
+
+extern const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_ServerInfo;
+extern const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_ProxyInfo;
+
+
+extern const MIDL_STUB_DESC Object_StubDesc;
+
+
+extern const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_ServerInfo;
+extern const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_ProxyInfo;
+
+
+extern const MIDL_STUB_DESC Object_StubDesc;
+
+
+extern const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_ServerInfo;
+extern const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_ProxyInfo;
+
+
+extern const MIDL_STUB_DESC Object_StubDesc;
+
+
+extern const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_ServerInfo;
+extern const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_ProxyInfo;
+
+
+extern const MIDL_STUB_DESC Object_StubDesc;
+
+
+extern const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_ServerInfo;
+extern const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_ProxyInfo;
+
+
+extern const USER_MARSHAL_ROUTINE_QUADRUPLE UserMarshalRoutines[ WIRE_MARSHAL_TABLE_SIZE ];
+
+#if !defined(__RPC_ARM32__)
+#error Invalid build platform for this stub.
+#endif
+
+#if !(TARGET_IS_NT50_OR_LATER)
+#error You need Windows 2000 or later to run this stub because it uses these features:
+#error /robust command line switch.
+#error However, your C/C++ compilation flags indicate you intend to run this app on earlier systems.
+#error This app will fail with the RPC_X_WRONG_STUB_VERSION error.
+#endif
+
+
+static const PhoneVoIPApp2EBackEnd_MIDL_PROC_FORMAT_STRING PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString =
+ {
+ 0,
+ {
+
+ /* Procedure Invoke */
+
+ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2 */ NdrFcLong( 0x0 ), /* 0 */
+/* 6 */ NdrFcShort( 0x3 ), /* 3 */
+/* 8 */ NdrFcShort( 0x1c ), /* ARM Stack size/offset = 28 */
+/* 10 */ NdrFcShort( 0x20 ), /* 32 */
+/* 12 */ NdrFcShort( 0x8 ), /* 8 */
+/* 14 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x4, /* 4 */
+/* 16 */ 0x12, /* 18 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 18 */ NdrFcShort( 0x0 ), /* 0 */
+/* 20 */ NdrFcShort( 0x0 ), /* 0 */
+/* 22 */ NdrFcShort( 0x0 ), /* 0 */
+/* 24 */ NdrFcShort( 0x6 ), /* 6 */
+/* 26 */ 0x6, /* 6 */
+ 0x80, /* 128 */
+/* 28 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+/* 30 */ 0x83, /* 131 */
+ 0xfc, /* 252 */
+/* 32 */ 0xfc, /* 252 */
+ 0x0, /* 0 */
+
+ /* Parameter pBuffer */
+
+/* 34 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */
+/* 36 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 38 */ NdrFcShort( 0x2 ), /* Type Offset=2 */
+
+ /* Parameter hnsPresentationTime */
+
+/* 40 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 42 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 44 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter hnsSampleDuration */
+
+/* 46 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 48 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 50 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 52 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 54 */ NdrFcShort( 0x18 ), /* ARM Stack size/offset = 24 */
+/* 56 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure Invoke */
+
+/* 58 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 60 */ NdrFcLong( 0x0 ), /* 0 */
+/* 64 */ NdrFcShort( 0x3 ), /* 3 */
+/* 66 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 68 */ NdrFcShort( 0x8 ), /* 8 */
+/* 70 */ NdrFcShort( 0x8 ), /* 8 */
+/* 72 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 74 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 76 */ NdrFcShort( 0x0 ), /* 0 */
+/* 78 */ NdrFcShort( 0x0 ), /* 0 */
+/* 80 */ NdrFcShort( 0x0 ), /* 0 */
+/* 82 */ NdrFcShort( 0x2 ), /* 2 */
+/* 84 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 86 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __param0 */
+
+/* 88 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 90 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 92 */ 0xe, /* FC_ENUM32 */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 94 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 96 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 98 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure Invoke */
+
+/* 100 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 102 */ NdrFcLong( 0x0 ), /* 0 */
+/* 106 */ NdrFcShort( 0x3 ), /* 3 */
+/* 108 */ NdrFcShort( 0x20 ), /* ARM Stack size/offset = 32 */
+/* 110 */ NdrFcShort( 0x25 ), /* 37 */
+/* 112 */ NdrFcShort( 0x8 ), /* 8 */
+/* 114 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x4, /* 4 */
+/* 116 */ 0x12, /* 18 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 118 */ NdrFcShort( 0x0 ), /* 0 */
+/* 120 */ NdrFcShort( 0x0 ), /* 0 */
+/* 122 */ NdrFcShort( 0x0 ), /* 0 */
+/* 124 */ NdrFcShort( 0x7 ), /* 7 */
+/* 126 */ 0x7, /* 7 */
+ 0x80, /* 128 */
+/* 128 */ 0x9f, /* 159 */
+ 0x82, /* 130 */
+/* 130 */ 0x83, /* 131 */
+ 0xfc, /* 252 */
+/* 132 */ 0xfc, /* 252 */
+ 0xfc, /* 252 */
+
+ /* Parameter callId */
+
+/* 134 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 136 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 138 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter callAccessHash */
+
+/* 140 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 142 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 144 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter rejected */
+
+/* 146 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 148 */ NdrFcShort( 0x18 ), /* ARM Stack size/offset = 24 */
+/* 150 */ 0x3, /* FC_SMALL */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 152 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 154 */ NdrFcShort( 0x1c ), /* ARM Stack size/offset = 28 */
+/* 156 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure WriteAudio */
+
+/* 158 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 160 */ NdrFcLong( 0x0 ), /* 0 */
+/* 164 */ NdrFcShort( 0x6 ), /* 6 */
+/* 166 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 168 */ NdrFcShort( 0x8 ), /* 8 */
+/* 170 */ NdrFcShort( 0x21 ), /* 33 */
+/* 172 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x3, /* 3 */
+/* 174 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 176 */ NdrFcShort( 0x0 ), /* 0 */
+/* 178 */ NdrFcShort( 0x0 ), /* 0 */
+/* 180 */ NdrFcShort( 0x0 ), /* 0 */
+/* 182 */ NdrFcShort( 0x3 ), /* 3 */
+/* 184 */ 0x3, /* 3 */
+ 0x80, /* 128 */
+/* 186 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+
+ /* Parameter bytes */
+
+/* 188 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 190 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 192 */ 0x1, /* FC_BYTE */
+ 0x0, /* 0 */
+
+ /* Parameter byteCount */
+
+/* 194 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 196 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 198 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 200 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 202 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 204 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure WriteVideo */
+
+/* 206 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 208 */ NdrFcLong( 0x0 ), /* 0 */
+/* 212 */ NdrFcShort( 0x7 ), /* 7 */
+/* 214 */ NdrFcShort( 0x24 ), /* ARM Stack size/offset = 36 */
+/* 216 */ NdrFcShort( 0x28 ), /* 40 */
+/* 218 */ NdrFcShort( 0x21 ), /* 33 */
+/* 220 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x5, /* 5 */
+/* 222 */ 0x14, /* 20 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 224 */ NdrFcShort( 0x0 ), /* 0 */
+/* 226 */ NdrFcShort( 0x0 ), /* 0 */
+/* 228 */ NdrFcShort( 0x0 ), /* 0 */
+/* 230 */ NdrFcShort( 0x8 ), /* 8 */
+/* 232 */ 0x8, /* 8 */
+ 0x80, /* 128 */
+/* 234 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+/* 236 */ 0x9f, /* 159 */
+ 0x9d, /* 157 */
+/* 238 */ 0xfc, /* 252 */
+ 0x4, /* 4 */
+/* 240 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+
+ /* Parameter bytes */
+
+/* 242 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 244 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 246 */ 0x1, /* FC_BYTE */
+ 0x0, /* 0 */
+
+ /* Parameter byteCount */
+
+/* 248 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 250 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 252 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Parameter hnsPresentationTime */
+
+/* 254 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 256 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 258 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter hnsSampleDuration */
+
+/* 260 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 262 */ NdrFcShort( 0x18 ), /* ARM Stack size/offset = 24 */
+/* 264 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 266 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 268 */ NdrFcShort( 0x20 ), /* ARM Stack size/offset = 32 */
+/* 270 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure add_AudioMessageReceived */
+
+/* 272 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 274 */ NdrFcLong( 0x0 ), /* 0 */
+/* 278 */ NdrFcShort( 0x8 ), /* 8 */
+/* 280 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 282 */ NdrFcShort( 0x0 ), /* 0 */
+/* 284 */ NdrFcShort( 0x34 ), /* 52 */
+/* 286 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x3, /* 3 */
+/* 288 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 290 */ NdrFcShort( 0x0 ), /* 0 */
+/* 292 */ NdrFcShort( 0x0 ), /* 0 */
+/* 294 */ NdrFcShort( 0x0 ), /* 0 */
+/* 296 */ NdrFcShort( 0x3 ), /* 3 */
+/* 298 */ 0x3, /* 3 */
+ 0x80, /* 128 */
+/* 300 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+
+ /* Parameter __param0 */
+
+/* 302 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */
+/* 304 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 306 */ NdrFcShort( 0x18 ), /* Type Offset=24 */
+
+ /* Parameter __returnValue */
+
+/* 308 */ NdrFcShort( 0x2112 ), /* Flags: must free, out, simple ref, srv alloc size=8 */
+/* 310 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 312 */ NdrFcShort( 0x2e ), /* Type Offset=46 */
+
+ /* Return value */
+
+/* 314 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 316 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 318 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure remove_AudioMessageReceived */
+
+/* 320 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 322 */ NdrFcLong( 0x0 ), /* 0 */
+/* 326 */ NdrFcShort( 0x9 ), /* 9 */
+/* 328 */ NdrFcShort( 0x14 ), /* ARM Stack size/offset = 20 */
+/* 330 */ NdrFcShort( 0x18 ), /* 24 */
+/* 332 */ NdrFcShort( 0x8 ), /* 8 */
+/* 334 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 336 */ 0x10, /* 16 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 338 */ NdrFcShort( 0x0 ), /* 0 */
+/* 340 */ NdrFcShort( 0x0 ), /* 0 */
+/* 342 */ NdrFcShort( 0x0 ), /* 0 */
+/* 344 */ NdrFcShort( 0x4 ), /* 4 */
+/* 346 */ 0x4, /* 4 */
+ 0x80, /* 128 */
+/* 348 */ 0x9f, /* 159 */
+ 0x82, /* 130 */
+/* 350 */ 0x83, /* 131 */
+ 0x0, /* 0 */
+
+ /* Parameter __param0 */
+
+/* 352 */ NdrFcShort( 0x8a ), /* Flags: must free, in, by val, */
+/* 354 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 356 */ NdrFcShort( 0x2e ), /* Type Offset=46 */
+
+ /* Return value */
+
+/* 358 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 360 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 362 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure add_VideoMessageReceived */
+
+/* 364 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 366 */ NdrFcLong( 0x0 ), /* 0 */
+/* 370 */ NdrFcShort( 0xa ), /* 10 */
+/* 372 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 374 */ NdrFcShort( 0x0 ), /* 0 */
+/* 376 */ NdrFcShort( 0x34 ), /* 52 */
+/* 378 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x3, /* 3 */
+/* 380 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 382 */ NdrFcShort( 0x0 ), /* 0 */
+/* 384 */ NdrFcShort( 0x0 ), /* 0 */
+/* 386 */ NdrFcShort( 0x0 ), /* 0 */
+/* 388 */ NdrFcShort( 0x3 ), /* 3 */
+/* 390 */ 0x3, /* 3 */
+ 0x80, /* 128 */
+/* 392 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+
+ /* Parameter __param0 */
+
+/* 394 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */
+/* 396 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 398 */ NdrFcShort( 0x18 ), /* Type Offset=24 */
+
+ /* Parameter __returnValue */
+
+/* 400 */ NdrFcShort( 0x2112 ), /* Flags: must free, out, simple ref, srv alloc size=8 */
+/* 402 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 404 */ NdrFcShort( 0x2e ), /* Type Offset=46 */
+
+ /* Return value */
+
+/* 406 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 408 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 410 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure remove_CameraLocationChanged */
+
+
+ /* Procedure remove_VideoMessageReceived */
+
+/* 412 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 414 */ NdrFcLong( 0x0 ), /* 0 */
+/* 418 */ NdrFcShort( 0xb ), /* 11 */
+/* 420 */ NdrFcShort( 0x14 ), /* ARM Stack size/offset = 20 */
+/* 422 */ NdrFcShort( 0x18 ), /* 24 */
+/* 424 */ NdrFcShort( 0x8 ), /* 8 */
+/* 426 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 428 */ 0x10, /* 16 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 430 */ NdrFcShort( 0x0 ), /* 0 */
+/* 432 */ NdrFcShort( 0x0 ), /* 0 */
+/* 434 */ NdrFcShort( 0x0 ), /* 0 */
+/* 436 */ NdrFcShort( 0x4 ), /* 4 */
+/* 438 */ 0x4, /* 4 */
+ 0x80, /* 128 */
+/* 440 */ 0x9f, /* 159 */
+ 0x82, /* 130 */
+/* 442 */ 0x83, /* 131 */
+ 0x0, /* 0 */
+
+ /* Parameter __param0 */
+
+
+ /* Parameter __param0 */
+
+/* 444 */ NdrFcShort( 0x8a ), /* Flags: must free, in, by val, */
+/* 446 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 448 */ NdrFcShort( 0x2e ), /* Type Offset=46 */
+
+ /* Return value */
+
+
+ /* Return value */
+
+/* 450 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 452 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 454 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_id */
+
+/* 456 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 458 */ NdrFcLong( 0x0 ), /* 0 */
+/* 462 */ NdrFcShort( 0x6 ), /* 6 */
+/* 464 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 466 */ NdrFcShort( 0x0 ), /* 0 */
+/* 468 */ NdrFcShort( 0x2c ), /* 44 */
+/* 470 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 472 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 474 */ NdrFcShort( 0x0 ), /* 0 */
+/* 476 */ NdrFcShort( 0x0 ), /* 0 */
+/* 478 */ NdrFcShort( 0x0 ), /* 0 */
+/* 480 */ NdrFcShort( 0x2 ), /* 2 */
+/* 482 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 484 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 486 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 488 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 490 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 492 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 494 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 496 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure put_id */
+
+/* 498 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 500 */ NdrFcLong( 0x0 ), /* 0 */
+/* 504 */ NdrFcShort( 0x7 ), /* 7 */
+/* 506 */ NdrFcShort( 0x14 ), /* ARM Stack size/offset = 20 */
+/* 508 */ NdrFcShort( 0x10 ), /* 16 */
+/* 510 */ NdrFcShort( 0x8 ), /* 8 */
+/* 512 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 514 */ 0x10, /* 16 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 516 */ NdrFcShort( 0x0 ), /* 0 */
+/* 518 */ NdrFcShort( 0x0 ), /* 0 */
+/* 520 */ NdrFcShort( 0x0 ), /* 0 */
+/* 522 */ NdrFcShort( 0x4 ), /* 4 */
+/* 524 */ 0x4, /* 4 */
+ 0x80, /* 128 */
+/* 526 */ 0x9f, /* 159 */
+ 0x82, /* 130 */
+/* 528 */ 0x83, /* 131 */
+ 0x0, /* 0 */
+
+ /* Parameter __set_formal */
+
+/* 530 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 532 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 534 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 536 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 538 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 540 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_port */
+
+/* 542 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 544 */ NdrFcLong( 0x0 ), /* 0 */
+/* 548 */ NdrFcShort( 0x8 ), /* 8 */
+/* 550 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 552 */ NdrFcShort( 0x0 ), /* 0 */
+/* 554 */ NdrFcShort( 0x22 ), /* 34 */
+/* 556 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 558 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 560 */ NdrFcShort( 0x0 ), /* 0 */
+/* 562 */ NdrFcShort( 0x0 ), /* 0 */
+/* 564 */ NdrFcShort( 0x0 ), /* 0 */
+/* 566 */ NdrFcShort( 0x2 ), /* 2 */
+/* 568 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 570 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 572 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 574 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 576 */ 0x6, /* FC_SHORT */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 578 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 580 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 582 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure put_port */
+
+/* 584 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 586 */ NdrFcLong( 0x0 ), /* 0 */
+/* 590 */ NdrFcShort( 0x9 ), /* 9 */
+/* 592 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 594 */ NdrFcShort( 0x6 ), /* 6 */
+/* 596 */ NdrFcShort( 0x8 ), /* 8 */
+/* 598 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 600 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 602 */ NdrFcShort( 0x0 ), /* 0 */
+/* 604 */ NdrFcShort( 0x0 ), /* 0 */
+/* 606 */ NdrFcShort( 0x0 ), /* 0 */
+/* 608 */ NdrFcShort( 0x2 ), /* 2 */
+/* 610 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 612 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __set_formal */
+
+/* 614 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 616 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 618 */ 0x6, /* FC_SHORT */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 620 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 622 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 624 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_ipv4 */
+
+/* 626 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 628 */ NdrFcLong( 0x0 ), /* 0 */
+/* 632 */ NdrFcShort( 0xa ), /* 10 */
+/* 634 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 636 */ NdrFcShort( 0x0 ), /* 0 */
+/* 638 */ NdrFcShort( 0x8 ), /* 8 */
+/* 640 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 642 */ 0xe, /* 14 */
+ 0x3, /* Ext Flags: new corr desc, clt corr check, */
+/* 644 */ NdrFcShort( 0x1 ), /* 1 */
+/* 646 */ NdrFcShort( 0x0 ), /* 0 */
+/* 648 */ NdrFcShort( 0x0 ), /* 0 */
+/* 650 */ NdrFcShort( 0x2 ), /* 2 */
+/* 652 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 654 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 656 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */
+/* 658 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 660 */ NdrFcShort( 0x5a ), /* Type Offset=90 */
+
+ /* Return value */
+
+/* 662 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 664 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 666 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure put_ipv4 */
+
+/* 668 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 670 */ NdrFcLong( 0x0 ), /* 0 */
+/* 674 */ NdrFcShort( 0xb ), /* 11 */
+/* 676 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 678 */ NdrFcShort( 0x0 ), /* 0 */
+/* 680 */ NdrFcShort( 0x8 ), /* 8 */
+/* 682 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 684 */ 0xe, /* 14 */
+ 0x5, /* Ext Flags: new corr desc, srv corr check, */
+/* 686 */ NdrFcShort( 0x0 ), /* 0 */
+/* 688 */ NdrFcShort( 0x1 ), /* 1 */
+/* 690 */ NdrFcShort( 0x0 ), /* 0 */
+/* 692 */ NdrFcShort( 0x2 ), /* 2 */
+/* 694 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 696 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __set_formal */
+
+/* 698 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
+/* 700 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 702 */ NdrFcShort( 0x68 ), /* Type Offset=104 */
+
+ /* Return value */
+
+/* 704 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 706 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 708 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_ipv6 */
+
+/* 710 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 712 */ NdrFcLong( 0x0 ), /* 0 */
+/* 716 */ NdrFcShort( 0xc ), /* 12 */
+/* 718 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 720 */ NdrFcShort( 0x0 ), /* 0 */
+/* 722 */ NdrFcShort( 0x8 ), /* 8 */
+/* 724 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 726 */ 0xe, /* 14 */
+ 0x3, /* Ext Flags: new corr desc, clt corr check, */
+/* 728 */ NdrFcShort( 0x1 ), /* 1 */
+/* 730 */ NdrFcShort( 0x0 ), /* 0 */
+/* 732 */ NdrFcShort( 0x0 ), /* 0 */
+/* 734 */ NdrFcShort( 0x2 ), /* 2 */
+/* 736 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 738 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 740 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */
+/* 742 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 744 */ NdrFcShort( 0x5a ), /* Type Offset=90 */
+
+ /* Return value */
+
+/* 746 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 748 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 750 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure put_ipv6 */
+
+/* 752 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 754 */ NdrFcLong( 0x0 ), /* 0 */
+/* 758 */ NdrFcShort( 0xd ), /* 13 */
+/* 760 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 762 */ NdrFcShort( 0x0 ), /* 0 */
+/* 764 */ NdrFcShort( 0x8 ), /* 8 */
+/* 766 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 768 */ 0xe, /* 14 */
+ 0x5, /* Ext Flags: new corr desc, srv corr check, */
+/* 770 */ NdrFcShort( 0x0 ), /* 0 */
+/* 772 */ NdrFcShort( 0x1 ), /* 1 */
+/* 774 */ NdrFcShort( 0x0 ), /* 0 */
+/* 776 */ NdrFcShort( 0x2 ), /* 2 */
+/* 778 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 780 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __set_formal */
+
+/* 782 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
+/* 784 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 786 */ NdrFcShort( 0x68 ), /* Type Offset=104 */
+
+ /* Return value */
+
+/* 788 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 790 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 792 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_peerTag */
+
+/* 794 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 796 */ NdrFcLong( 0x0 ), /* 0 */
+/* 800 */ NdrFcShort( 0xe ), /* 14 */
+/* 802 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 804 */ NdrFcShort( 0x0 ), /* 0 */
+/* 806 */ NdrFcShort( 0x24 ), /* 36 */
+/* 808 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
+ 0x3, /* 3 */
+/* 810 */ 0xe, /* 14 */
+ 0x3, /* Ext Flags: new corr desc, clt corr check, */
+/* 812 */ NdrFcShort( 0x1 ), /* 1 */
+/* 814 */ NdrFcShort( 0x0 ), /* 0 */
+/* 816 */ NdrFcShort( 0x0 ), /* 0 */
+/* 818 */ NdrFcShort( 0x3 ), /* 3 */
+/* 820 */ 0x3, /* 3 */
+ 0x80, /* 128 */
+/* 822 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+
+ /* Parameter ____returnValueSize */
+
+/* 824 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 826 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 828 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 830 */ NdrFcShort( 0x2013 ), /* Flags: must size, must free, out, srv alloc size=8 */
+/* 832 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 834 */ NdrFcShort( 0x76 ), /* Type Offset=118 */
+
+ /* Return value */
+
+/* 836 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 838 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 840 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure put_peerTag */
+
+/* 842 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 844 */ NdrFcLong( 0x0 ), /* 0 */
+/* 848 */ NdrFcShort( 0xf ), /* 15 */
+/* 850 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 852 */ NdrFcShort( 0x8 ), /* 8 */
+/* 854 */ NdrFcShort( 0x8 ), /* 8 */
+/* 856 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x3, /* 3 */
+/* 858 */ 0xe, /* 14 */
+ 0x5, /* Ext Flags: new corr desc, srv corr check, */
+/* 860 */ NdrFcShort( 0x0 ), /* 0 */
+/* 862 */ NdrFcShort( 0x1 ), /* 1 */
+/* 864 */ NdrFcShort( 0x0 ), /* 0 */
+/* 866 */ NdrFcShort( 0x3 ), /* 3 */
+/* 868 */ 0x3, /* 3 */
+ 0x80, /* 128 */
+/* 870 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+
+ /* Parameter ____set_formalSize */
+
+/* 872 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 874 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 876 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Parameter __set_formal */
+
+/* 878 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */
+/* 880 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 882 */ NdrFcShort( 0x8e ), /* Type Offset=142 */
+
+ /* Return value */
+
+/* 884 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 886 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 888 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure OnSignalBarsChanged */
+
+/* 890 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 892 */ NdrFcLong( 0x0 ), /* 0 */
+/* 896 */ NdrFcShort( 0x6 ), /* 6 */
+/* 898 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 900 */ NdrFcShort( 0x8 ), /* 8 */
+/* 902 */ NdrFcShort( 0x8 ), /* 8 */
+/* 904 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 906 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 908 */ NdrFcShort( 0x0 ), /* 0 */
+/* 910 */ NdrFcShort( 0x0 ), /* 0 */
+/* 912 */ NdrFcShort( 0x0 ), /* 0 */
+/* 914 */ NdrFcShort( 0x2 ), /* 2 */
+/* 916 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 918 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter newSignal */
+
+/* 920 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 922 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 924 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 926 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 928 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 930 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure Start */
+
+
+ /* Procedure OnCallStateChanged */
+
+/* 932 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 934 */ NdrFcLong( 0x0 ), /* 0 */
+/* 938 */ NdrFcShort( 0x7 ), /* 7 */
+/* 940 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 942 */ NdrFcShort( 0x8 ), /* 8 */
+/* 944 */ NdrFcShort( 0x8 ), /* 8 */
+/* 946 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 948 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 950 */ NdrFcShort( 0x0 ), /* 0 */
+/* 952 */ NdrFcShort( 0x0 ), /* 0 */
+/* 954 */ NdrFcShort( 0x0 ), /* 0 */
+/* 956 */ NdrFcShort( 0x2 ), /* 2 */
+/* 958 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 960 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter cameraLocation */
+
+
+ /* Parameter newState */
+
+/* 962 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 964 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 966 */ 0xe, /* FC_ENUM32 */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+
+ /* Return value */
+
+/* 968 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 970 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 972 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure OnCallStatusChanged */
+
+/* 974 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 976 */ NdrFcLong( 0x0 ), /* 0 */
+/* 980 */ NdrFcShort( 0x8 ), /* 8 */
+/* 982 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 984 */ NdrFcShort( 0x8 ), /* 8 */
+/* 986 */ NdrFcShort( 0x8 ), /* 8 */
+/* 988 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 990 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 992 */ NdrFcShort( 0x0 ), /* 0 */
+/* 994 */ NdrFcShort( 0x0 ), /* 0 */
+/* 996 */ NdrFcShort( 0x0 ), /* 0 */
+/* 998 */ NdrFcShort( 0x2 ), /* 2 */
+/* 1000 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 1002 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter newStatus */
+
+/* 1004 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 1006 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1008 */ 0xe, /* FC_ENUM32 */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 1010 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1012 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1014 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure OnCallAudioRouteChanged */
+
+/* 1016 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1018 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1022 */ NdrFcShort( 0x9 ), /* 9 */
+/* 1024 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 1026 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1028 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1030 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 1032 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 1034 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1036 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1038 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1040 */ NdrFcShort( 0x2 ), /* 2 */
+/* 1042 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 1044 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter newRoute */
+
+/* 1046 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 1048 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1050 */ 0xe, /* FC_ENUM32 */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 1052 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1054 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1056 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure OnMediaOperationsChanged */
+
+/* 1058 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1060 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1064 */ NdrFcShort( 0xa ), /* 10 */
+/* 1066 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 1068 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1070 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1072 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 1074 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 1076 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1078 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1080 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1082 */ NdrFcShort( 0x2 ), /* 2 */
+/* 1084 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 1086 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter newOperations */
+
+/* 1088 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 1090 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1092 */ 0xe, /* FC_ENUM32 */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 1094 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1096 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1098 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure OnCameraLocationChanged */
+
+/* 1100 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1102 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1106 */ NdrFcShort( 0xb ), /* 11 */
+/* 1108 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 1110 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1112 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1114 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 1116 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 1118 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1120 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1122 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1124 */ NdrFcShort( 0x2 ), /* 2 */
+/* 1126 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 1128 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter newCameraLocation */
+
+/* 1130 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 1132 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1134 */ 0xe, /* FC_ENUM32 */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 1136 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1138 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1140 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure SetTransport */
+
+/* 1142 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1144 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1148 */ NdrFcShort( 0x6 ), /* 6 */
+/* 1150 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 1152 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1154 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1156 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 1158 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 1160 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1162 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1164 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1166 */ NdrFcShort( 0x2 ), /* 2 */
+/* 1168 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 1170 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter transport */
+
+/* 1172 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */
+/* 1174 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1176 */ NdrFcShort( 0x9a ), /* Type Offset=154 */
+
+ /* Return value */
+
+/* 1178 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1180 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1182 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure StopMTProtoUpdater */
+
+
+ /* Procedure Stop */
+
+/* 1184 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1186 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1190 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1192 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1194 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1196 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1198 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x1, /* 1 */
+/* 1200 */ 0xc, /* 12 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 1202 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1204 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1206 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1208 */ NdrFcShort( 0x1 ), /* 1 */
+/* 1210 */ 0x1, /* 1 */
+ 0x80, /* 128 */
+
+ /* Return value */
+
+
+ /* Return value */
+
+/* 1212 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1214 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1216 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure CreateVoIPControllerWrapper */
+
+
+ /* Procedure ToggleCamera */
+
+/* 1218 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1220 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1224 */ NdrFcShort( 0x9 ), /* 9 */
+/* 1226 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1228 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1230 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1232 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x1, /* 1 */
+/* 1234 */ 0xc, /* 12 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 1236 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1238 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1240 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1242 */ NdrFcShort( 0x1 ), /* 1 */
+/* 1244 */ 0x1, /* 1 */
+ 0x80, /* 128 */
+
+ /* Return value */
+
+
+ /* Return value */
+
+/* 1246 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1248 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1250 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure add_CameraLocationChanged */
+
+/* 1252 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1254 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1258 */ NdrFcShort( 0xa ), /* 10 */
+/* 1260 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 1262 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1264 */ NdrFcShort( 0x34 ), /* 52 */
+/* 1266 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x3, /* 3 */
+/* 1268 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 1270 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1272 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1274 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1276 */ NdrFcShort( 0x3 ), /* 3 */
+/* 1278 */ 0x3, /* 3 */
+ 0x80, /* 128 */
+/* 1280 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+
+ /* Parameter __param0 */
+
+/* 1282 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */
+/* 1284 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1286 */ NdrFcShort( 0xac ), /* Type Offset=172 */
+
+ /* Parameter __returnValue */
+
+/* 1288 */ NdrFcShort( 0x2112 ), /* Flags: must free, out, simple ref, srv alloc size=8 */
+/* 1290 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1292 */ NdrFcShort( 0x2e ), /* Type Offset=46 */
+
+ /* Return value */
+
+/* 1294 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1296 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 1298 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_InitTimeout */
+
+/* 1300 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1302 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1306 */ NdrFcShort( 0x6 ), /* 6 */
+/* 1308 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 1310 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1312 */ NdrFcShort( 0x2c ), /* 44 */
+/* 1314 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 1316 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 1318 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1320 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1322 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1324 */ NdrFcShort( 0x2 ), /* 2 */
+/* 1326 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 1328 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 1330 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 1332 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1334 */ 0xc, /* FC_DOUBLE */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 1336 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1338 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1340 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure put_InitTimeout */
+
+/* 1342 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1344 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1348 */ NdrFcShort( 0x7 ), /* 7 */
+/* 1350 */ NdrFcShort( 0x14 ), /* ARM Stack size/offset = 20 */
+/* 1352 */ NdrFcShort( 0x10 ), /* 16 */
+/* 1354 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1356 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 1358 */ 0x10, /* 16 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 1360 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1362 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1364 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1366 */ NdrFcShort( 0x4 ), /* 4 */
+/* 1368 */ 0x4, /* 4 */
+ 0x80, /* 128 */
+/* 1370 */ 0x9f, /* 159 */
+ 0x84, /* 132 */
+/* 1372 */ 0x85, /* 133 */
+ 0x0, /* 0 */
+
+ /* Parameter __set_formal */
+
+/* 1374 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 1376 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1378 */ 0xc, /* FC_DOUBLE */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 1380 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1382 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 1384 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_RecvTimeout */
+
+/* 1386 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1388 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1392 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1394 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 1396 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1398 */ NdrFcShort( 0x2c ), /* 44 */
+/* 1400 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 1402 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 1404 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1406 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1408 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1410 */ NdrFcShort( 0x2 ), /* 2 */
+/* 1412 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 1414 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 1416 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 1418 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1420 */ 0xc, /* FC_DOUBLE */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 1422 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1424 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1426 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure put_RecvTimeout */
+
+/* 1428 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1430 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1434 */ NdrFcShort( 0x9 ), /* 9 */
+/* 1436 */ NdrFcShort( 0x14 ), /* ARM Stack size/offset = 20 */
+/* 1438 */ NdrFcShort( 0x10 ), /* 16 */
+/* 1440 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1442 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 1444 */ 0x10, /* 16 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 1446 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1448 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1450 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1452 */ NdrFcShort( 0x4 ), /* 4 */
+/* 1454 */ 0x4, /* 4 */
+ 0x80, /* 128 */
+/* 1456 */ 0x9f, /* 159 */
+ 0x84, /* 132 */
+/* 1458 */ 0x85, /* 133 */
+ 0x0, /* 0 */
+
+ /* Parameter __set_formal */
+
+/* 1460 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 1462 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1464 */ 0xc, /* FC_DOUBLE */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 1466 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1468 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 1470 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure Start */
+
+
+ /* Procedure HandleUpdatePhoneCall */
+
+/* 1472 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1474 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1478 */ NdrFcShort( 0x6 ), /* 6 */
+/* 1480 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1482 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1484 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1486 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x1, /* 1 */
+/* 1488 */ 0xc, /* 12 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 1490 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1492 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1494 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1496 */ NdrFcShort( 0x1 ), /* 1 */
+/* 1498 */ 0x1, /* 1 */
+ 0x80, /* 128 */
+
+ /* Return value */
+
+
+ /* Return value */
+
+/* 1500 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1502 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1504 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure DoPeriodicKeepAlive */
+
+
+ /* Procedure Stop */
+
+
+ /* Procedure Stop */
+
+
+ /* Procedure StartMTProtoUpdater */
+
+/* 1506 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1508 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1512 */ NdrFcShort( 0x7 ), /* 7 */
+/* 1514 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1516 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1518 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1520 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x1, /* 1 */
+/* 1522 */ 0xc, /* 12 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 1524 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1526 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1528 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1530 */ NdrFcShort( 0x1 ), /* 1 */
+/* 1532 */ 0x1, /* 1 */
+ 0x80, /* 128 */
+
+ /* Return value */
+
+
+ /* Return value */
+
+
+ /* Return value */
+
+
+ /* Return value */
+
+/* 1534 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1536 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1538 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure DeleteVoIPControllerWrapper */
+
+/* 1540 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1542 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1546 */ NdrFcShort( 0xa ), /* 10 */
+/* 1548 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1550 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1552 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1554 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x1, /* 1 */
+/* 1556 */ 0xc, /* 12 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 1558 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1560 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1562 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1564 */ NdrFcShort( 0x1 ), /* 1 */
+/* 1566 */ 0x1, /* 1 */
+ 0x80, /* 128 */
+
+ /* Return value */
+
+/* 1568 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1570 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1572 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure SetConfig */
+
+/* 1574 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1576 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1580 */ NdrFcShort( 0xb ), /* 11 */
+/* 1582 */ NdrFcShort( 0x2c ), /* ARM Stack size/offset = 44 */
+/* 1584 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1586 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1588 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 1590 */ 0x14, /* 20 */
+ 0x5, /* Ext Flags: new corr desc, srv corr check, */
+/* 1592 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1594 */ NdrFcShort( 0x1 ), /* 1 */
+/* 1596 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1598 */ NdrFcShort( 0xa ), /* 10 */
+/* 1600 */ 0x8, /* 8 */
+ 0x80, /* 128 */
+/* 1602 */ 0x9f, /* 159 */
+ 0x82, /* 130 */
+/* 1604 */ 0x83, /* 131 */
+ 0x9d, /* 157 */
+/* 1606 */ 0xfc, /* 252 */
+ 0x6, /* 6 */
+/* 1608 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+
+ /* Parameter config */
+
+/* 1610 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
+/* 1612 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1614 */ NdrFcShort( 0xc2 ), /* Type Offset=194 */
+
+ /* Return value */
+
+/* 1616 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1618 */ NdrFcShort( 0x28 ), /* ARM Stack size/offset = 40 */
+/* 1620 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure SetEncryptionKey */
+
+/* 1622 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1624 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1628 */ NdrFcShort( 0xc ), /* 12 */
+/* 1630 */ NdrFcShort( 0x14 ), /* ARM Stack size/offset = 20 */
+/* 1632 */ NdrFcShort( 0xd ), /* 13 */
+/* 1634 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1636 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x4, /* 4 */
+/* 1638 */ 0x10, /* 16 */
+ 0x5, /* Ext Flags: new corr desc, srv corr check, */
+/* 1640 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1642 */ NdrFcShort( 0x1 ), /* 1 */
+/* 1644 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1646 */ NdrFcShort( 0x4 ), /* 4 */
+/* 1648 */ 0x4, /* 4 */
+ 0x80, /* 128 */
+/* 1650 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+/* 1652 */ 0x83, /* 131 */
+ 0x0, /* 0 */
+
+ /* Parameter __keySize */
+
+/* 1654 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 1656 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1658 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Parameter key */
+
+/* 1660 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */
+/* 1662 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1664 */ NdrFcShort( 0x8e ), /* Type Offset=142 */
+
+ /* Parameter isOutgoing */
+
+/* 1666 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 1668 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 1670 */ 0x3, /* FC_SMALL */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 1672 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1674 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 1676 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure SetPublicEndpoints */
+
+/* 1678 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1680 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1684 */ NdrFcShort( 0xd ), /* 13 */
+/* 1686 */ NdrFcShort( 0x18 ), /* ARM Stack size/offset = 24 */
+/* 1688 */ NdrFcShort( 0x15 ), /* 21 */
+/* 1690 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1692 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x5, /* 5 */
+/* 1694 */ 0x10, /* 16 */
+ 0x5, /* Ext Flags: new corr desc, srv corr check, */
+/* 1696 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1698 */ NdrFcShort( 0x1 ), /* 1 */
+/* 1700 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1702 */ NdrFcShort( 0x5 ), /* 5 */
+/* 1704 */ 0x5, /* 5 */
+ 0x80, /* 128 */
+/* 1706 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+/* 1708 */ 0x83, /* 131 */
+ 0xfc, /* 252 */
+
+ /* Parameter __endpointsSize */
+
+/* 1710 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 1712 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1714 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Parameter endpoints */
+
+/* 1716 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */
+/* 1718 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1720 */ NdrFcShort( 0xf6 ), /* Type Offset=246 */
+
+ /* Parameter allowP2P */
+
+/* 1722 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 1724 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 1726 */ 0x3, /* FC_SMALL */
+ 0x0, /* 0 */
+
+ /* Parameter connectionMaxLayer */
+
+/* 1728 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 1730 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 1732 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 1734 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1736 */ NdrFcShort( 0x14 ), /* ARM Stack size/offset = 20 */
+/* 1738 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure SetProxy */
+
+/* 1740 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1742 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1746 */ NdrFcShort( 0xe ), /* 14 */
+/* 1748 */ NdrFcShort( 0x1c ), /* ARM Stack size/offset = 28 */
+/* 1750 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1752 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1754 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 1756 */ 0x12, /* 18 */
+ 0x5, /* Ext Flags: new corr desc, srv corr check, */
+/* 1758 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1760 */ NdrFcShort( 0x1 ), /* 1 */
+/* 1762 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1764 */ NdrFcShort( 0x6 ), /* 6 */
+/* 1766 */ 0x6, /* 6 */
+ 0x80, /* 128 */
+/* 1768 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+/* 1770 */ 0x83, /* 131 */
+ 0xfc, /* 252 */
+/* 1772 */ 0xfc, /* 252 */
+ 0x0, /* 0 */
+
+ /* Parameter proxy */
+
+/* 1774 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
+/* 1776 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1778 */ NdrFcShort( 0x10c ), /* Type Offset=268 */
+
+ /* Return value */
+
+/* 1780 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1782 */ NdrFcShort( 0x18 ), /* ARM Stack size/offset = 24 */
+/* 1784 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure Start */
+
+/* 1786 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1788 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1792 */ NdrFcShort( 0xf ), /* 15 */
+/* 1794 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1796 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1798 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1800 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x1, /* 1 */
+/* 1802 */ 0xc, /* 12 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 1804 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1806 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1808 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1810 */ NdrFcShort( 0x1 ), /* 1 */
+/* 1812 */ 0x1, /* 1 */
+ 0x80, /* 128 */
+
+ /* Return value */
+
+/* 1814 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1816 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1818 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure Connect */
+
+/* 1820 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1822 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1826 */ NdrFcShort( 0x10 ), /* 16 */
+/* 1828 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1830 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1832 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1834 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x1, /* 1 */
+/* 1836 */ 0xc, /* 12 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 1838 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1840 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1842 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1844 */ NdrFcShort( 0x1 ), /* 1 */
+/* 1846 */ 0x1, /* 1 */
+ 0x80, /* 128 */
+
+ /* Return value */
+
+/* 1848 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1850 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1852 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure SetMicMute */
+
+/* 1854 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1856 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1860 */ NdrFcShort( 0x11 ), /* 17 */
+/* 1862 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 1864 */ NdrFcShort( 0x5 ), /* 5 */
+/* 1866 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1868 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 1870 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 1872 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1874 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1876 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1878 */ NdrFcShort( 0x2 ), /* 2 */
+/* 1880 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 1882 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter mute */
+
+/* 1884 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 1886 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1888 */ 0x3, /* FC_SMALL */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 1890 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1892 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1894 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure SwitchSpeaker */
+
+/* 1896 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1898 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1902 */ NdrFcShort( 0x12 ), /* 18 */
+/* 1904 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 1906 */ NdrFcShort( 0x5 ), /* 5 */
+/* 1908 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1910 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 1912 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 1914 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1916 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1918 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1920 */ NdrFcShort( 0x2 ), /* 2 */
+/* 1922 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 1924 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter external */
+
+/* 1926 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 1928 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1930 */ 0x3, /* FC_SMALL */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 1932 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1934 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1936 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure UpdateServerConfig */
+
+/* 1938 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1940 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1944 */ NdrFcShort( 0x13 ), /* 19 */
+/* 1946 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 1948 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1950 */ NdrFcShort( 0x8 ), /* 8 */
+/* 1952 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 1954 */ 0xe, /* 14 */
+ 0x5, /* Ext Flags: new corr desc, srv corr check, */
+/* 1956 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1958 */ NdrFcShort( 0x1 ), /* 1 */
+/* 1960 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1962 */ NdrFcShort( 0x2 ), /* 2 */
+/* 1964 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 1966 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter json */
+
+/* 1968 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
+/* 1970 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 1972 */ NdrFcShort( 0x68 ), /* Type Offset=104 */
+
+ /* Return value */
+
+/* 1974 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 1976 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 1978 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure GetPreferredRelayID */
+
+/* 1980 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 1982 */ NdrFcLong( 0x0 ), /* 0 */
+/* 1986 */ NdrFcShort( 0x14 ), /* 20 */
+/* 1988 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 1990 */ NdrFcShort( 0x0 ), /* 0 */
+/* 1992 */ NdrFcShort( 0x2c ), /* 44 */
+/* 1994 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 1996 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 1998 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2000 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2002 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2004 */ NdrFcShort( 0x2 ), /* 2 */
+/* 2006 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 2008 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 2010 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 2012 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2014 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 2016 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2018 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2020 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure GetLastError */
+
+/* 2022 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2024 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2028 */ NdrFcShort( 0x15 ), /* 21 */
+/* 2030 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 2032 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2034 */ NdrFcShort( 0x24 ), /* 36 */
+/* 2036 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 2038 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 2040 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2042 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2044 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2046 */ NdrFcShort( 0x2 ), /* 2 */
+/* 2048 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 2050 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 2052 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 2054 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2056 */ 0xe, /* FC_ENUM32 */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 2058 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2060 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2062 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure GetDebugLog */
+
+/* 2064 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2066 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2070 */ NdrFcShort( 0x16 ), /* 22 */
+/* 2072 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 2074 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2076 */ NdrFcShort( 0x8 ), /* 8 */
+/* 2078 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 2080 */ 0xe, /* 14 */
+ 0x3, /* Ext Flags: new corr desc, clt corr check, */
+/* 2082 */ NdrFcShort( 0x1 ), /* 1 */
+/* 2084 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2086 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2088 */ NdrFcShort( 0x2 ), /* 2 */
+/* 2090 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 2092 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 2094 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */
+/* 2096 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2098 */ NdrFcShort( 0x5a ), /* Type Offset=90 */
+
+ /* Return value */
+
+/* 2100 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2102 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2104 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure GetDebugString */
+
+/* 2106 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2108 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2112 */ NdrFcShort( 0x17 ), /* 23 */
+/* 2114 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 2116 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2118 */ NdrFcShort( 0x8 ), /* 8 */
+/* 2120 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 2122 */ 0xe, /* 14 */
+ 0x3, /* Ext Flags: new corr desc, clt corr check, */
+/* 2124 */ NdrFcShort( 0x1 ), /* 1 */
+/* 2126 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2128 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2130 */ NdrFcShort( 0x2 ), /* 2 */
+/* 2132 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 2134 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 2136 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */
+/* 2138 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2140 */ NdrFcShort( 0x5a ), /* Type Offset=90 */
+
+ /* Return value */
+
+/* 2142 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2144 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2146 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure GetVersion */
+
+/* 2148 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2150 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2154 */ NdrFcShort( 0x18 ), /* 24 */
+/* 2156 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 2158 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2160 */ NdrFcShort( 0x8 ), /* 8 */
+/* 2162 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 2164 */ 0xe, /* 14 */
+ 0x3, /* Ext Flags: new corr desc, clt corr check, */
+/* 2166 */ NdrFcShort( 0x1 ), /* 1 */
+/* 2168 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2170 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2172 */ NdrFcShort( 0x2 ), /* 2 */
+/* 2174 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 2176 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 2178 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */
+/* 2180 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2182 */ NdrFcShort( 0x5a ), /* Type Offset=90 */
+
+ /* Return value */
+
+/* 2184 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2186 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2188 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure GetSignalBarsCount */
+
+/* 2190 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2192 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2196 */ NdrFcShort( 0x19 ), /* 25 */
+/* 2198 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 2200 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2202 */ NdrFcShort( 0x24 ), /* 36 */
+/* 2204 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 2206 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 2208 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2210 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2212 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2214 */ NdrFcShort( 0x2 ), /* 2 */
+/* 2216 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 2218 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 2220 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 2222 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2224 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 2226 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2228 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2230 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure SetStatusCallback */
+
+/* 2232 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2234 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2238 */ NdrFcShort( 0x1a ), /* 26 */
+/* 2240 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 2242 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2244 */ NdrFcShort( 0x8 ), /* 8 */
+/* 2246 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 2248 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 2250 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2252 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2254 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2256 */ NdrFcShort( 0x2 ), /* 2 */
+/* 2258 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 2260 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter statusListener */
+
+/* 2262 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */
+/* 2264 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2266 */ NdrFcShort( 0x128 ), /* Type Offset=296 */
+
+ /* Return value */
+
+/* 2268 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2270 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2272 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure InitiateOutgoingCall2 */
+
+/* 2274 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2276 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2280 */ NdrFcShort( 0x1b ), /* 27 */
+/* 2282 */ NdrFcShort( 0x28 ), /* ARM Stack size/offset = 40 */
+/* 2284 */ NdrFcShort( 0x30 ), /* 48 */
+/* 2286 */ NdrFcShort( 0x21 ), /* 33 */
+/* 2288 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x6, /* 6 */
+/* 2290 */ 0x14, /* 20 */
+ 0x5, /* Ext Flags: new corr desc, srv corr check, */
+/* 2292 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2294 */ NdrFcShort( 0x1 ), /* 1 */
+/* 2296 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2298 */ NdrFcShort( 0x9 ), /* 9 */
+/* 2300 */ 0x8, /* 8 */
+ 0x80, /* 128 */
+/* 2302 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+/* 2304 */ 0x83, /* 131 */
+ 0x9d, /* 157 */
+/* 2306 */ 0xfc, /* 252 */
+ 0x5, /* 5 */
+/* 2308 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+
+ /* Parameter recepientName */
+
+/* 2310 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
+/* 2312 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2314 */ NdrFcShort( 0x68 ), /* Type Offset=104 */
+
+ /* Parameter recepientId */
+
+/* 2316 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 2318 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2320 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter callId */
+
+/* 2322 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 2324 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 2326 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter callAccessHash */
+
+/* 2328 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 2330 */ NdrFcShort( 0x18 ), /* ARM Stack size/offset = 24 */
+/* 2332 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 2334 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 2336 */ NdrFcShort( 0x20 ), /* ARM Stack size/offset = 32 */
+/* 2338 */ 0x3, /* FC_SMALL */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 2340 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2342 */ NdrFcShort( 0x24 ), /* ARM Stack size/offset = 36 */
+/* 2344 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure InitiateOutgoingCall1 */
+
+/* 2346 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2348 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2352 */ NdrFcShort( 0x1c ), /* 28 */
+/* 2354 */ NdrFcShort( 0x80 ), /* ARM Stack size/offset = 128 */
+/* 2356 */ NdrFcShort( 0x5a ), /* 90 */
+/* 2358 */ NdrFcShort( 0x21 ), /* 33 */
+/* 2360 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x11, /* 17 */
+/* 2362 */ 0x14, /* 20 */
+ 0x5, /* Ext Flags: new corr desc, srv corr check, */
+/* 2364 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2366 */ NdrFcShort( 0x1 ), /* 1 */
+/* 2368 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2370 */ NdrFcShort( 0x1f ), /* 31 */
+/* 2372 */ 0x8, /* 8 */
+ 0x80, /* 128 */
+/* 2374 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+/* 2376 */ 0x83, /* 131 */
+ 0x9d, /* 157 */
+/* 2378 */ 0xfc, /* 252 */
+ 0x1b, /* 27 */
+/* 2380 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+
+ /* Parameter recepientName */
+
+/* 2382 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
+/* 2384 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2386 */ NdrFcShort( 0x68 ), /* Type Offset=104 */
+
+ /* Parameter recepientId */
+
+/* 2388 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 2390 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2392 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter callId */
+
+/* 2394 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 2396 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 2398 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter callAccessHash */
+
+/* 2400 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 2402 */ NdrFcShort( 0x18 ), /* ARM Stack size/offset = 24 */
+/* 2404 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter config */
+
+/* 2406 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
+/* 2408 */ NdrFcShort( 0x20 ), /* ARM Stack size/offset = 32 */
+/* 2410 */ NdrFcShort( 0xc2 ), /* Type Offset=194 */
+
+ /* Parameter __keySize */
+
+/* 2412 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 2414 */ NdrFcShort( 0x40 ), /* ARM Stack size/offset = 64 */
+/* 2416 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Parameter key */
+
+/* 2418 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */
+/* 2420 */ NdrFcShort( 0x44 ), /* ARM Stack size/offset = 68 */
+/* 2422 */ NdrFcShort( 0x142 ), /* Type Offset=322 */
+
+ /* Parameter outgoing */
+
+/* 2424 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 2426 */ NdrFcShort( 0x48 ), /* ARM Stack size/offset = 72 */
+/* 2428 */ 0x3, /* FC_SMALL */
+ 0x0, /* 0 */
+
+ /* Parameter __emojisSize */
+
+/* 2430 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 2432 */ NdrFcShort( 0x4c ), /* ARM Stack size/offset = 76 */
+/* 2434 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Parameter emojis */
+
+/* 2436 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */
+/* 2438 */ NdrFcShort( 0x50 ), /* ARM Stack size/offset = 80 */
+/* 2440 */ NdrFcShort( 0x152 ), /* Type Offset=338 */
+
+ /* Parameter __endpointsSize */
+
+/* 2442 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 2444 */ NdrFcShort( 0x54 ), /* ARM Stack size/offset = 84 */
+/* 2446 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Parameter endpoints */
+
+/* 2448 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */
+/* 2450 */ NdrFcShort( 0x58 ), /* ARM Stack size/offset = 88 */
+/* 2452 */ NdrFcShort( 0x16c ), /* Type Offset=364 */
+
+ /* Parameter allowP2P */
+
+/* 2454 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 2456 */ NdrFcShort( 0x5c ), /* ARM Stack size/offset = 92 */
+/* 2458 */ 0x3, /* FC_SMALL */
+ 0x0, /* 0 */
+
+ /* Parameter connectionMaxLayer */
+
+/* 2460 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 2462 */ NdrFcShort( 0x60 ), /* ARM Stack size/offset = 96 */
+/* 2464 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Parameter proxy */
+
+/* 2466 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
+/* 2468 */ NdrFcShort( 0x64 ), /* ARM Stack size/offset = 100 */
+/* 2470 */ NdrFcShort( 0x10c ), /* Type Offset=268 */
+
+ /* Parameter __returnValue */
+
+/* 2472 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 2474 */ NdrFcShort( 0x78 ), /* ARM Stack size/offset = 120 */
+/* 2476 */ 0x3, /* FC_SMALL */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 2478 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2480 */ NdrFcShort( 0x7c ), /* ARM Stack size/offset = 124 */
+/* 2482 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure OnIncomingCallReceived */
+
+/* 2484 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2486 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2490 */ NdrFcShort( 0x1d ), /* 29 */
+/* 2492 */ NdrFcShort( 0x34 ), /* ARM Stack size/offset = 52 */
+/* 2494 */ NdrFcShort( 0x30 ), /* 48 */
+/* 2496 */ NdrFcShort( 0x21 ), /* 33 */
+/* 2498 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x8, /* 8 */
+/* 2500 */ 0x16, /* 22 */
+ 0x5, /* Ext Flags: new corr desc, srv corr check, */
+/* 2502 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2504 */ NdrFcShort( 0x1 ), /* 1 */
+/* 2506 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2508 */ NdrFcShort( 0xc ), /* 12 */
+/* 2510 */ 0xa, /* 10 */
+ 0x80, /* 128 */
+/* 2512 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+/* 2514 */ 0x83, /* 131 */
+ 0xfc, /* 252 */
+/* 2516 */ 0x9f, /* 159 */
+ 0x9d, /* 157 */
+/* 2518 */ 0xfc, /* 252 */
+ 0x6, /* 6 */
+/* 2520 */ 0x0, /* 0 */
+ 0x0, /* 0 */
+
+ /* Parameter contactName */
+
+/* 2522 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
+/* 2524 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2526 */ NdrFcShort( 0x68 ), /* Type Offset=104 */
+
+ /* Parameter contactId */
+
+/* 2528 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 2530 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2532 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter contactImage */
+
+/* 2534 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
+/* 2536 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 2538 */ NdrFcShort( 0x68 ), /* Type Offset=104 */
+
+ /* Parameter callId */
+
+/* 2540 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 2542 */ NdrFcShort( 0x18 ), /* ARM Stack size/offset = 24 */
+/* 2544 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter callAccessHash */
+
+/* 2546 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 2548 */ NdrFcShort( 0x20 ), /* ARM Stack size/offset = 32 */
+/* 2550 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter incomingCallDialogDismissedCallback */
+
+/* 2552 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */
+/* 2554 */ NdrFcShort( 0x28 ), /* ARM Stack size/offset = 40 */
+/* 2556 */ NdrFcShort( 0x182 ), /* Type Offset=386 */
+
+ /* Parameter __returnValue */
+
+/* 2558 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 2560 */ NdrFcShort( 0x2c ), /* ARM Stack size/offset = 44 */
+/* 2562 */ 0x3, /* FC_SMALL */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 2564 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2566 */ NdrFcShort( 0x30 ), /* ARM Stack size/offset = 48 */
+/* 2568 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure HoldCall */
+
+/* 2570 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2572 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2576 */ NdrFcShort( 0x1e ), /* 30 */
+/* 2578 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 2580 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2582 */ NdrFcShort( 0x21 ), /* 33 */
+/* 2584 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 2586 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 2588 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2590 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2592 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2594 */ NdrFcShort( 0x2 ), /* 2 */
+/* 2596 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 2598 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 2600 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 2602 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2604 */ 0x3, /* FC_SMALL */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 2606 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2608 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2610 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure ResumeCall */
+
+/* 2612 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2614 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2618 */ NdrFcShort( 0x1f ), /* 31 */
+/* 2620 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 2622 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2624 */ NdrFcShort( 0x21 ), /* 33 */
+/* 2626 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 2628 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 2630 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2632 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2634 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2636 */ NdrFcShort( 0x2 ), /* 2 */
+/* 2638 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 2640 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 2642 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 2644 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2646 */ 0x3, /* FC_SMALL */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 2648 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2650 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2652 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure EndCall */
+
+/* 2654 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2656 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2660 */ NdrFcShort( 0x20 ), /* 32 */
+/* 2662 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 2664 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2666 */ NdrFcShort( 0x21 ), /* 33 */
+/* 2668 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 2670 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 2672 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2674 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2676 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2678 */ NdrFcShort( 0x2 ), /* 2 */
+/* 2680 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 2682 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 2684 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 2686 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2688 */ 0x3, /* FC_SMALL */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 2690 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2692 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2694 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure ToggleCamera */
+
+/* 2696 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2698 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2702 */ NdrFcShort( 0x21 ), /* 33 */
+/* 2704 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 2706 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2708 */ NdrFcShort( 0x21 ), /* 33 */
+/* 2710 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 2712 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 2714 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2716 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2718 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2720 */ NdrFcShort( 0x2 ), /* 2 */
+/* 2722 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 2724 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 2726 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 2728 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2730 */ 0x3, /* FC_SMALL */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 2732 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2734 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2736 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_CallStatus */
+
+/* 2738 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2740 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2744 */ NdrFcShort( 0x22 ), /* 34 */
+/* 2746 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 2748 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2750 */ NdrFcShort( 0x24 ), /* 36 */
+/* 2752 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 2754 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 2756 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2758 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2760 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2762 */ NdrFcShort( 0x2 ), /* 2 */
+/* 2764 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 2766 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 2768 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 2770 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2772 */ 0xe, /* FC_ENUM32 */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 2774 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2776 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2778 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_MediaOperations */
+
+/* 2780 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2782 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2786 */ NdrFcShort( 0x23 ), /* 35 */
+/* 2788 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 2790 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2792 */ NdrFcShort( 0x24 ), /* 36 */
+/* 2794 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 2796 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 2798 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2800 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2802 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2804 */ NdrFcShort( 0x2 ), /* 2 */
+/* 2806 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 2808 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 2810 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 2812 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2814 */ 0xe, /* FC_ENUM32 */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 2816 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2818 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2820 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_IsShowingVideo */
+
+/* 2822 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2824 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2828 */ NdrFcShort( 0x24 ), /* 36 */
+/* 2830 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 2832 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2834 */ NdrFcShort( 0x21 ), /* 33 */
+/* 2836 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 2838 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 2840 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2842 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2844 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2846 */ NdrFcShort( 0x2 ), /* 2 */
+/* 2848 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 2850 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 2852 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 2854 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2856 */ 0x3, /* FC_SMALL */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 2858 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2860 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2862 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure put_IsShowingVideo */
+
+/* 2864 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2866 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2870 */ NdrFcShort( 0x25 ), /* 37 */
+/* 2872 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 2874 */ NdrFcShort( 0x5 ), /* 5 */
+/* 2876 */ NdrFcShort( 0x8 ), /* 8 */
+/* 2878 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 2880 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 2882 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2884 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2886 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2888 */ NdrFcShort( 0x2 ), /* 2 */
+/* 2890 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 2892 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter value */
+
+/* 2894 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 2896 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2898 */ 0x3, /* FC_SMALL */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 2900 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2902 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2904 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_IsRenderingVideo */
+
+/* 2906 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2908 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2912 */ NdrFcShort( 0x26 ), /* 38 */
+/* 2914 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 2916 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2918 */ NdrFcShort( 0x21 ), /* 33 */
+/* 2920 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 2922 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 2924 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2926 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2928 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2930 */ NdrFcShort( 0x2 ), /* 2 */
+/* 2932 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 2934 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 2936 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 2938 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2940 */ 0x3, /* FC_SMALL */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 2942 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2944 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2946 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure put_IsRenderingVideo */
+
+/* 2948 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2950 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2954 */ NdrFcShort( 0x27 ), /* 39 */
+/* 2956 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 2958 */ NdrFcShort( 0x5 ), /* 5 */
+/* 2960 */ NdrFcShort( 0x8 ), /* 8 */
+/* 2962 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 2964 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 2966 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2968 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2970 */ NdrFcShort( 0x0 ), /* 0 */
+/* 2972 */ NdrFcShort( 0x2 ), /* 2 */
+/* 2974 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 2976 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter value */
+
+/* 2978 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 2980 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 2982 */ 0x3, /* FC_SMALL */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 2984 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 2986 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 2988 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_CameraLocation */
+
+/* 2990 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 2992 */ NdrFcLong( 0x0 ), /* 0 */
+/* 2996 */ NdrFcShort( 0x28 ), /* 40 */
+/* 2998 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3000 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3002 */ NdrFcShort( 0x24 ), /* 36 */
+/* 3004 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 3006 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 3008 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3010 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3012 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3014 */ NdrFcShort( 0x2 ), /* 2 */
+/* 3016 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 3018 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 3020 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 3022 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 3024 */ 0xe, /* FC_ENUM32 */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 3026 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3028 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3030 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_AvailableAudioRoutes */
+
+/* 3032 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3034 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3038 */ NdrFcShort( 0x29 ), /* 41 */
+/* 3040 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3042 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3044 */ NdrFcShort( 0x24 ), /* 36 */
+/* 3046 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 3048 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 3050 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3052 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3054 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3056 */ NdrFcShort( 0x2 ), /* 2 */
+/* 3058 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 3060 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 3062 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 3064 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 3066 */ 0xe, /* FC_ENUM32 */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 3068 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3070 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3072 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_AudioRoute */
+
+/* 3074 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3076 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3080 */ NdrFcShort( 0x2a ), /* 42 */
+/* 3082 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3084 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3086 */ NdrFcShort( 0x24 ), /* 36 */
+/* 3088 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 3090 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 3092 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3094 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3096 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3098 */ NdrFcShort( 0x2 ), /* 2 */
+/* 3100 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 3102 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 3104 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 3106 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 3108 */ 0xe, /* FC_ENUM32 */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 3110 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3112 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3114 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure put_AudioRoute */
+
+/* 3116 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3118 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3122 */ NdrFcShort( 0x2b ), /* 43 */
+/* 3124 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3126 */ NdrFcShort( 0x8 ), /* 8 */
+/* 3128 */ NdrFcShort( 0x8 ), /* 8 */
+/* 3130 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 3132 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 3134 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3136 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3138 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3140 */ NdrFcShort( 0x2 ), /* 2 */
+/* 3142 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 3144 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter newRoute */
+
+/* 3146 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 3148 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 3150 */ 0xe, /* FC_ENUM32 */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 3152 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3154 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3156 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_OtherPartyName */
+
+/* 3158 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3160 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3164 */ NdrFcShort( 0x2c ), /* 44 */
+/* 3166 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3168 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3170 */ NdrFcShort( 0x8 ), /* 8 */
+/* 3172 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 3174 */ 0xe, /* 14 */
+ 0x3, /* Ext Flags: new corr desc, clt corr check, */
+/* 3176 */ NdrFcShort( 0x1 ), /* 1 */
+/* 3178 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3180 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3182 */ NdrFcShort( 0x2 ), /* 2 */
+/* 3184 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 3186 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 3188 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */
+/* 3190 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 3192 */ NdrFcShort( 0x5a ), /* Type Offset=90 */
+
+ /* Return value */
+
+/* 3194 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3196 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3198 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_OtherPartyId */
+
+/* 3200 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3202 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3206 */ NdrFcShort( 0x2d ), /* 45 */
+/* 3208 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3210 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3212 */ NdrFcShort( 0x2c ), /* 44 */
+/* 3214 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 3216 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 3218 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3220 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3222 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3224 */ NdrFcShort( 0x2 ), /* 2 */
+/* 3226 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 3228 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 3230 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 3232 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 3234 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 3236 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3238 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3240 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_CallStartTime */
+
+/* 3242 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3244 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3248 */ NdrFcShort( 0x2e ), /* 46 */
+/* 3250 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3252 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3254 */ NdrFcShort( 0x34 ), /* 52 */
+/* 3256 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 3258 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 3260 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3262 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3264 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3266 */ NdrFcShort( 0x2 ), /* 2 */
+/* 3268 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 3270 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 3272 */ NdrFcShort( 0x2112 ), /* Flags: must free, out, simple ref, srv alloc size=8 */
+/* 3274 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 3276 */ NdrFcShort( 0x2e ), /* Type Offset=46 */
+
+ /* Return value */
+
+/* 3278 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3280 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3282 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_CallId */
+
+/* 3284 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3286 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3290 */ NdrFcShort( 0x2f ), /* 47 */
+/* 3292 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3294 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3296 */ NdrFcShort( 0x2c ), /* 44 */
+/* 3298 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 3300 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 3302 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3304 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3306 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3308 */ NdrFcShort( 0x2 ), /* 2 */
+/* 3310 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 3312 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 3314 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 3316 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 3318 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 3320 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3322 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3324 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_CallAccessHash */
+
+/* 3326 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3328 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3332 */ NdrFcShort( 0x30 ), /* 48 */
+/* 3334 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3336 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3338 */ NdrFcShort( 0x2c ), /* 44 */
+/* 3340 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 3342 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 3344 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3346 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3348 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3350 */ NdrFcShort( 0x2 ), /* 2 */
+/* 3352 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 3354 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 3356 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 3358 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 3360 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 3362 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3364 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3366 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_AcceptedCallId */
+
+/* 3368 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3370 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3374 */ NdrFcShort( 0x31 ), /* 49 */
+/* 3376 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3378 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3380 */ NdrFcShort( 0x2c ), /* 44 */
+/* 3382 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 3384 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 3386 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3388 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3390 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3392 */ NdrFcShort( 0x2 ), /* 2 */
+/* 3394 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 3396 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 3398 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 3400 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 3402 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 3404 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3406 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3408 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure put_AcceptedCallId */
+
+/* 3410 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3412 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3416 */ NdrFcShort( 0x32 ), /* 50 */
+/* 3418 */ NdrFcShort( 0x14 ), /* ARM Stack size/offset = 20 */
+/* 3420 */ NdrFcShort( 0x10 ), /* 16 */
+/* 3422 */ NdrFcShort( 0x8 ), /* 8 */
+/* 3424 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 3426 */ 0x10, /* 16 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 3428 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3430 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3432 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3434 */ NdrFcShort( 0x4 ), /* 4 */
+/* 3436 */ 0x4, /* 4 */
+ 0x80, /* 128 */
+/* 3438 */ 0x9f, /* 159 */
+ 0x82, /* 130 */
+/* 3440 */ 0x83, /* 131 */
+ 0x0, /* 0 */
+
+ /* Parameter value */
+
+/* 3442 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 3444 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3446 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 3448 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3450 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 3452 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_Key */
+
+/* 3454 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3456 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3460 */ NdrFcShort( 0x33 ), /* 51 */
+/* 3462 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 3464 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3466 */ NdrFcShort( 0x24 ), /* 36 */
+/* 3468 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
+ 0x3, /* 3 */
+/* 3470 */ 0xe, /* 14 */
+ 0x3, /* Ext Flags: new corr desc, clt corr check, */
+/* 3472 */ NdrFcShort( 0x1 ), /* 1 */
+/* 3474 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3476 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3478 */ NdrFcShort( 0x3 ), /* 3 */
+/* 3480 */ 0x3, /* 3 */
+ 0x80, /* 128 */
+/* 3482 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+
+ /* Parameter ____returnValueSize */
+
+/* 3484 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 3486 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 3488 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 3490 */ NdrFcShort( 0x2013 ), /* Flags: must size, must free, out, srv alloc size=8 */
+/* 3492 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3494 */ NdrFcShort( 0x76 ), /* Type Offset=118 */
+
+ /* Return value */
+
+/* 3496 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3498 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3500 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_Outgoing */
+
+/* 3502 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3504 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3508 */ NdrFcShort( 0x34 ), /* 52 */
+/* 3510 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3512 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3514 */ NdrFcShort( 0x21 ), /* 33 */
+/* 3516 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 3518 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 3520 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3522 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3524 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3526 */ NdrFcShort( 0x2 ), /* 2 */
+/* 3528 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 3530 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 3532 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 3534 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 3536 */ 0x3, /* FC_SMALL */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 3538 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3540 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3542 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_Emojis */
+
+/* 3544 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3546 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3550 */ NdrFcShort( 0x35 ), /* 53 */
+/* 3552 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 3554 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3556 */ NdrFcShort( 0x24 ), /* 36 */
+/* 3558 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
+ 0x3, /* 3 */
+/* 3560 */ 0xe, /* 14 */
+ 0x3, /* Ext Flags: new corr desc, clt corr check, */
+/* 3562 */ NdrFcShort( 0x1 ), /* 1 */
+/* 3564 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3566 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3568 */ NdrFcShort( 0x3 ), /* 3 */
+/* 3570 */ 0x3, /* 3 */
+ 0x80, /* 128 */
+/* 3572 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+
+ /* Parameter ____returnValueSize */
+
+/* 3574 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 3576 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 3578 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 3580 */ NdrFcShort( 0x2013 ), /* Flags: must size, must free, out, srv alloc size=8 */
+/* 3582 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3584 */ NdrFcShort( 0x194 ), /* Type Offset=404 */
+
+ /* Return value */
+
+/* 3586 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3588 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3590 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure Start */
+
+/* 3592 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3594 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3598 */ NdrFcShort( 0x6 ), /* 6 */
+/* 3600 */ NdrFcShort( 0x14 ), /* ARM Stack size/offset = 20 */
+/* 3602 */ NdrFcShort( 0x18 ), /* 24 */
+/* 3604 */ NdrFcShort( 0x8 ), /* 8 */
+/* 3606 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x4, /* 4 */
+/* 3608 */ 0x10, /* 16 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 3610 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3612 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3614 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3616 */ NdrFcShort( 0x4 ), /* 4 */
+/* 3618 */ 0x4, /* 4 */
+ 0x80, /* 128 */
+/* 3620 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+/* 3622 */ 0x83, /* 131 */
+ 0x0, /* 0 */
+
+ /* Parameter pts */
+
+/* 3624 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 3626 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 3628 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Parameter date */
+
+/* 3630 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 3632 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3634 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Parameter qts */
+
+/* 3636 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 3638 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3640 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 3642 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3644 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 3646 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure DiscardCall */
+
+/* 3648 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3650 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3654 */ NdrFcShort( 0x8 ), /* 8 */
+/* 3656 */ NdrFcShort( 0x1c ), /* ARM Stack size/offset = 28 */
+/* 3658 */ NdrFcShort( 0x20 ), /* 32 */
+/* 3660 */ NdrFcShort( 0x8 ), /* 8 */
+/* 3662 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x3, /* 3 */
+/* 3664 */ 0x12, /* 18 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 3666 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3668 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3670 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3672 */ NdrFcShort( 0x6 ), /* 6 */
+/* 3674 */ 0x6, /* 6 */
+ 0x80, /* 128 */
+/* 3676 */ 0x9f, /* 159 */
+ 0x82, /* 130 */
+/* 3678 */ 0x83, /* 131 */
+ 0xfc, /* 252 */
+/* 3680 */ 0xfc, /* 252 */
+ 0x0, /* 0 */
+
+ /* Parameter id */
+
+/* 3682 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 3684 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3686 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter accessHash */
+
+/* 3688 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 3690 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 3692 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 3694 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3696 */ NdrFcShort( 0x18 ), /* ARM Stack size/offset = 24 */
+/* 3698 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure ReceivedCall */
+
+/* 3700 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3702 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3706 */ NdrFcShort( 0x9 ), /* 9 */
+/* 3708 */ NdrFcShort( 0x1c ), /* ARM Stack size/offset = 28 */
+/* 3710 */ NdrFcShort( 0x20 ), /* 32 */
+/* 3712 */ NdrFcShort( 0x8 ), /* 8 */
+/* 3714 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x3, /* 3 */
+/* 3716 */ 0x12, /* 18 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 3718 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3720 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3722 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3724 */ NdrFcShort( 0x6 ), /* 6 */
+/* 3726 */ 0x6, /* 6 */
+ 0x80, /* 128 */
+/* 3728 */ 0x9f, /* 159 */
+ 0x82, /* 130 */
+/* 3730 */ 0x83, /* 131 */
+ 0xfc, /* 252 */
+/* 3732 */ 0xfc, /* 252 */
+ 0x0, /* 0 */
+
+ /* Parameter id */
+
+/* 3734 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 3736 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3738 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Parameter accessHash */
+
+/* 3740 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 3742 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 3744 */ 0xb, /* FC_HYPER */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 3746 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3748 */ NdrFcShort( 0x18 ), /* ARM Stack size/offset = 24 */
+/* 3750 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure StartServer */
+
+/* 3752 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3754 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3758 */ NdrFcShort( 0x6 ), /* 6 */
+/* 3760 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 3762 */ NdrFcShort( 0x8 ), /* 8 */
+/* 3764 */ NdrFcShort( 0x8 ), /* 8 */
+/* 3766 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x3, /* 3 */
+/* 3768 */ 0xe, /* 14 */
+ 0x5, /* Ext Flags: new corr desc, srv corr check, */
+/* 3770 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3772 */ NdrFcShort( 0x1 ), /* 1 */
+/* 3774 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3776 */ NdrFcShort( 0x3 ), /* 3 */
+/* 3778 */ 0x3, /* 3 */
+ 0x80, /* 128 */
+/* 3780 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+
+ /* Parameter __outOfProcServerClassNamesSize */
+
+/* 3782 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 3784 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 3786 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Parameter outOfProcServerClassNames */
+
+/* 3788 */ NdrFcShort( 0x10b ), /* Flags: must size, must free, in, simple ref, */
+/* 3790 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3792 */ NdrFcShort( 0x1b6 ), /* Type Offset=438 */
+
+ /* Return value */
+
+/* 3794 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3796 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3798 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_CallController */
+
+/* 3800 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3802 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3806 */ NdrFcShort( 0x8 ), /* 8 */
+/* 3808 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3810 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3812 */ NdrFcShort( 0x8 ), /* 8 */
+/* 3814 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 3816 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 3818 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3820 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3822 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3824 */ NdrFcShort( 0x2 ), /* 2 */
+/* 3826 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 3828 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 3830 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */
+/* 3832 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 3834 */ NdrFcShort( 0x1cc ), /* Type Offset=460 */
+
+ /* Return value */
+
+/* 3836 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3838 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3840 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_VideoRenderer */
+
+/* 3842 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3844 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3848 */ NdrFcShort( 0x9 ), /* 9 */
+/* 3850 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3852 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3854 */ NdrFcShort( 0x8 ), /* 8 */
+/* 3856 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 3858 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 3860 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3862 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3864 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3866 */ NdrFcShort( 0x2 ), /* 2 */
+/* 3868 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 3870 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 3872 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */
+/* 3874 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 3876 */ NdrFcShort( 0x1e2 ), /* Type Offset=482 */
+
+ /* Return value */
+
+/* 3878 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3880 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3882 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure put_VideoRenderer */
+
+/* 3884 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3886 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3890 */ NdrFcShort( 0xa ), /* 10 */
+/* 3892 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3894 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3896 */ NdrFcShort( 0x8 ), /* 8 */
+/* 3898 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 3900 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 3902 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3904 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3906 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3908 */ NdrFcShort( 0x2 ), /* 2 */
+/* 3910 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 3912 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter value */
+
+/* 3914 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */
+/* 3916 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 3918 */ NdrFcShort( 0x1e6 ), /* Type Offset=486 */
+
+ /* Return value */
+
+/* 3920 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3922 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3924 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_MTProtoUpdater */
+
+/* 3926 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3928 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3932 */ NdrFcShort( 0xb ), /* 11 */
+/* 3934 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3936 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3938 */ NdrFcShort( 0x8 ), /* 8 */
+/* 3940 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 3942 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 3944 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3946 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3948 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3950 */ NdrFcShort( 0x2 ), /* 2 */
+/* 3952 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 3954 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 3956 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */
+/* 3958 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 3960 */ NdrFcShort( 0x1f8 ), /* Type Offset=504 */
+
+ /* Return value */
+
+/* 3962 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 3964 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 3966 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure put_MTProtoUpdater */
+
+/* 3968 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 3970 */ NdrFcLong( 0x0 ), /* 0 */
+/* 3974 */ NdrFcShort( 0xc ), /* 12 */
+/* 3976 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 3978 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3980 */ NdrFcShort( 0x8 ), /* 8 */
+/* 3982 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 3984 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 3986 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3988 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3990 */ NdrFcShort( 0x0 ), /* 0 */
+/* 3992 */ NdrFcShort( 0x2 ), /* 2 */
+/* 3994 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 3996 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter value */
+
+/* 3998 */ NdrFcShort( 0xb ), /* Flags: must size, must free, in, */
+/* 4000 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 4002 */ NdrFcShort( 0x1fc ), /* Type Offset=508 */
+
+ /* Return value */
+
+/* 4004 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 4006 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 4008 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_CaptureController */
+
+/* 4010 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 4012 */ NdrFcLong( 0x0 ), /* 0 */
+/* 4016 */ NdrFcShort( 0xd ), /* 13 */
+/* 4018 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 4020 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4022 */ NdrFcShort( 0x8 ), /* 8 */
+/* 4024 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 4026 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 4028 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4030 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4032 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4034 */ NdrFcShort( 0x2 ), /* 2 */
+/* 4036 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 4038 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 4040 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */
+/* 4042 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 4044 */ NdrFcShort( 0x20e ), /* Type Offset=526 */
+
+ /* Return value */
+
+/* 4046 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 4048 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 4050 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_TransportController */
+
+/* 4052 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 4054 */ NdrFcLong( 0x0 ), /* 0 */
+/* 4058 */ NdrFcShort( 0xe ), /* 14 */
+/* 4060 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 4062 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4064 */ NdrFcShort( 0x8 ), /* 8 */
+/* 4066 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 4068 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 4070 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4072 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4074 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4076 */ NdrFcShort( 0x2 ), /* 2 */
+/* 4078 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 4080 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 4082 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */
+/* 4084 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 4086 */ NdrFcShort( 0x224 ), /* Type Offset=548 */
+
+ /* Return value */
+
+/* 4088 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 4090 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 4092 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure GetCurrentProcessId */
+
+/* 4094 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 4096 */ NdrFcLong( 0x0 ), /* 0 */
+/* 4100 */ NdrFcShort( 0x6 ), /* 6 */
+/* 4102 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 4104 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4106 */ NdrFcShort( 0x24 ), /* 36 */
+/* 4108 */ 0x44, /* Oi2 Flags: has return, has ext, */
+ 0x2, /* 2 */
+/* 4110 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 4112 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4114 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4116 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4118 */ NdrFcShort( 0x2 ), /* 2 */
+/* 4120 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 4122 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 4124 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */
+/* 4126 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 4128 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Return value */
+
+/* 4130 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 4132 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 4134 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure GetUiDisconnectedEventName */
+
+/* 4136 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 4138 */ NdrFcLong( 0x0 ), /* 0 */
+/* 4142 */ NdrFcShort( 0x7 ), /* 7 */
+/* 4144 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 4146 */ NdrFcShort( 0x8 ), /* 8 */
+/* 4148 */ NdrFcShort( 0x8 ), /* 8 */
+/* 4150 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
+ 0x3, /* 3 */
+/* 4152 */ 0xe, /* 14 */
+ 0x3, /* Ext Flags: new corr desc, clt corr check, */
+/* 4154 */ NdrFcShort( 0x1 ), /* 1 */
+/* 4156 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4158 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4160 */ NdrFcShort( 0x3 ), /* 3 */
+/* 4162 */ 0x3, /* 3 */
+ 0x80, /* 128 */
+/* 4164 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+
+ /* Parameter backgroundProcessId */
+
+/* 4166 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 4168 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 4170 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 4172 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */
+/* 4174 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 4176 */ NdrFcShort( 0x5a ), /* Type Offset=90 */
+
+ /* Return value */
+
+/* 4178 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 4180 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 4182 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure GetBackgroundProcessReadyEventName */
+
+/* 4184 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 4186 */ NdrFcLong( 0x0 ), /* 0 */
+/* 4190 */ NdrFcShort( 0x8 ), /* 8 */
+/* 4192 */ NdrFcShort( 0x10 ), /* ARM Stack size/offset = 16 */
+/* 4194 */ NdrFcShort( 0x8 ), /* 8 */
+/* 4196 */ NdrFcShort( 0x8 ), /* 8 */
+/* 4198 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
+ 0x3, /* 3 */
+/* 4200 */ 0xe, /* 14 */
+ 0x3, /* Ext Flags: new corr desc, clt corr check, */
+/* 4202 */ NdrFcShort( 0x1 ), /* 1 */
+/* 4204 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4206 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4208 */ NdrFcShort( 0x3 ), /* 3 */
+/* 4210 */ 0x3, /* 3 */
+ 0x80, /* 128 */
+/* 4212 */ 0x81, /* 129 */
+ 0x82, /* 130 */
+
+ /* Parameter backgroundProcessId */
+
+/* 4214 */ NdrFcShort( 0x48 ), /* Flags: in, base type, */
+/* 4216 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 4218 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 4220 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */
+/* 4222 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 4224 */ NdrFcShort( 0x5a ), /* Type Offset=90 */
+
+ /* Return value */
+
+/* 4226 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 4228 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 4230 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ /* Procedure get_Instance */
+
+/* 4232 */ 0x33, /* FC_AUTO_HANDLE */
+ 0x6c, /* Old Flags: object, Oi2 */
+/* 4234 */ NdrFcLong( 0x0 ), /* 0 */
+/* 4238 */ NdrFcShort( 0x9 ), /* 9 */
+/* 4240 */ NdrFcShort( 0xc ), /* ARM Stack size/offset = 12 */
+/* 4242 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4244 */ NdrFcShort( 0x8 ), /* 8 */
+/* 4246 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
+ 0x2, /* 2 */
+/* 4248 */ 0xe, /* 14 */
+ 0x1, /* Ext Flags: new corr desc, */
+/* 4250 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4252 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4254 */ NdrFcShort( 0x0 ), /* 0 */
+/* 4256 */ NdrFcShort( 0x2 ), /* 2 */
+/* 4258 */ 0x2, /* 2 */
+ 0x80, /* 128 */
+/* 4260 */ 0x81, /* 129 */
+ 0x0, /* 0 */
+
+ /* Parameter __returnValue */
+
+/* 4262 */ NdrFcShort( 0x13 ), /* Flags: must size, must free, out, */
+/* 4264 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 4266 */ NdrFcShort( 0x228 ), /* Type Offset=552 */
+
+ /* Return value */
+
+/* 4268 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
+/* 4270 */ NdrFcShort( 0x8 ), /* ARM Stack size/offset = 8 */
+/* 4272 */ 0x8, /* FC_LONG */
+ 0x0, /* 0 */
+
+ 0x0
+ }
+ };
+
+static const PhoneVoIPApp2EBackEnd_MIDL_TYPE_FORMAT_STRING PhoneVoIPApp2EBackEnd__MIDL_TypeFormatString =
+ {
+ 0,
+ {
+ NdrFcShort( 0x0 ), /* 0 */
+/* 2 */
+ 0x2f, /* FC_IP */
+ 0x5a, /* FC_CONSTANT_IID */
+/* 4 */ NdrFcLong( 0x905a0fe0 ), /* -1873145888 */
+/* 8 */ NdrFcShort( 0xbc53 ), /* -17325 */
+/* 10 */ NdrFcShort( 0x11df ), /* 4575 */
+/* 12 */ 0x8c, /* 140 */
+ 0x49, /* 73 */
+/* 14 */ 0x0, /* 0 */
+ 0x1e, /* 30 */
+/* 16 */ 0x4f, /* 79 */
+ 0xc6, /* 198 */
+/* 18 */ 0x86, /* 134 */
+ 0xda, /* 218 */
+/* 20 */
+ 0x11, 0xc, /* FC_RP [alloced_on_stack] [simple_pointer] */
+/* 22 */ 0x1, /* FC_BYTE */
+ 0x5c, /* FC_PAD */
+/* 24 */
+ 0x2f, /* FC_IP */
+ 0x5a, /* FC_CONSTANT_IID */
+/* 26 */ NdrFcLong( 0xf2035e6a ), /* -234660246 */
+/* 30 */ NdrFcShort( 0x8067 ), /* -32665 */
+/* 32 */ NdrFcShort( 0x3abb ), /* 15035 */
+/* 34 */ 0xa7, /* 167 */
+ 0x95, /* 149 */
+/* 36 */ 0x7b, /* 123 */
+ 0x33, /* 51 */
+/* 38 */ 0x4c, /* 76 */
+ 0x67, /* 103 */
+/* 40 */ 0xa2, /* 162 */
+ 0xed, /* 237 */
+/* 42 */
+ 0x11, 0x4, /* FC_RP [alloced_on_stack] */
+/* 44 */ NdrFcShort( 0x2 ), /* Offset= 2 (46) */
+/* 46 */
+ 0x15, /* FC_STRUCT */
+ 0x7, /* 7 */
+/* 48 */ NdrFcShort( 0x8 ), /* 8 */
+/* 50 */ 0xb, /* FC_HYPER */
+ 0x5b, /* FC_END */
+/* 52 */
+ 0x11, 0xc, /* FC_RP [alloced_on_stack] [simple_pointer] */
+/* 54 */ 0xb, /* FC_HYPER */
+ 0x5c, /* FC_PAD */
+/* 56 */
+ 0x11, 0xc, /* FC_RP [alloced_on_stack] [simple_pointer] */
+/* 58 */ 0x6, /* FC_SHORT */
+ 0x5c, /* FC_PAD */
+/* 60 */
+ 0x11, 0x4, /* FC_RP [alloced_on_stack] */
+/* 62 */ NdrFcShort( 0x1c ), /* Offset= 28 (90) */
+/* 64 */
+ 0x13, 0x0, /* FC_OP */
+/* 66 */ NdrFcShort( 0xe ), /* Offset= 14 (80) */
+/* 68 */
+ 0x1b, /* FC_CARRAY */
+ 0x1, /* 1 */
+/* 70 */ NdrFcShort( 0x2 ), /* 2 */
+/* 72 */ 0x9, /* Corr desc: FC_ULONG */
+ 0x0, /* */
+/* 74 */ NdrFcShort( 0xfffc ), /* -4 */
+/* 76 */ NdrFcShort( 0x1 ), /* Corr flags: early, */
+/* 78 */ 0x6, /* FC_SHORT */
+ 0x5b, /* FC_END */
+/* 80 */
+ 0x17, /* FC_CSTRUCT */
+ 0x3, /* 3 */
+/* 82 */ NdrFcShort( 0x8 ), /* 8 */
+/* 84 */ NdrFcShort( 0xfff0 ), /* Offset= -16 (68) */
+/* 86 */ 0x8, /* FC_LONG */
+ 0x8, /* FC_LONG */
+/* 88 */ 0x5c, /* FC_PAD */
+ 0x5b, /* FC_END */
+/* 90 */ 0xb4, /* FC_USER_MARSHAL */
+ 0x83, /* 131 */
+/* 92 */ NdrFcShort( 0x0 ), /* 0 */
+/* 94 */ NdrFcShort( 0x4 ), /* 4 */
+/* 96 */ NdrFcShort( 0x0 ), /* 0 */
+/* 98 */ NdrFcShort( 0xffde ), /* Offset= -34 (64) */
+/* 100 */
+ 0x12, 0x0, /* FC_UP */
+/* 102 */ NdrFcShort( 0xffea ), /* Offset= -22 (80) */
+/* 104 */ 0xb4, /* FC_USER_MARSHAL */
+ 0x83, /* 131 */
+/* 106 */ NdrFcShort( 0x0 ), /* 0 */
+/* 108 */ NdrFcShort( 0x4 ), /* 4 */
+/* 110 */ NdrFcShort( 0x0 ), /* 0 */
+/* 112 */ NdrFcShort( 0xfff4 ), /* Offset= -12 (100) */
+/* 114 */
+ 0x11, 0xc, /* FC_RP [alloced_on_stack] [simple_pointer] */
+/* 116 */ 0x8, /* FC_LONG */
+ 0x5c, /* FC_PAD */
+/* 118 */
+ 0x11, 0x14, /* FC_RP [alloced_on_stack] [pointer_deref] */
+/* 120 */ NdrFcShort( 0x2 ), /* Offset= 2 (122) */
+/* 122 */
+ 0x13, 0x0, /* FC_OP */
+/* 124 */ NdrFcShort( 0x2 ), /* Offset= 2 (126) */
+/* 126 */
+ 0x1b, /* FC_CARRAY */
+ 0x0, /* 0 */
+/* 128 */ NdrFcShort( 0x1 ), /* 1 */
+/* 130 */ 0x29, /* Corr desc: parameter, FC_ULONG */
+ 0x54, /* FC_DEREFERENCE */
+/* 132 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 134 */ NdrFcShort( 0x1 ), /* Corr flags: early, */
+/* 136 */ 0x1, /* FC_BYTE */
+ 0x5b, /* FC_END */
+/* 138 */
+ 0x11, 0x0, /* FC_RP */
+/* 140 */ NdrFcShort( 0x2 ), /* Offset= 2 (142) */
+/* 142 */
+ 0x1b, /* FC_CARRAY */
+ 0x0, /* 0 */
+/* 144 */ NdrFcShort( 0x1 ), /* 1 */
+/* 146 */ 0x29, /* Corr desc: parameter, FC_ULONG */
+ 0x0, /* */
+/* 148 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 150 */ NdrFcShort( 0x1 ), /* Corr flags: early, */
+/* 152 */ 0x1, /* FC_BYTE */
+ 0x5b, /* FC_END */
+/* 154 */
+ 0x2f, /* FC_IP */
+ 0x5a, /* FC_CONSTANT_IID */
+/* 156 */ NdrFcLong( 0xf5a3c2ae ), /* -173817170 */
+/* 160 */ NdrFcShort( 0xef7b ), /* -4229 */
+/* 162 */ NdrFcShort( 0x3de2 ), /* 15842 */
+/* 164 */ 0x8b, /* 139 */
+ 0xe, /* 14 */
+/* 166 */ 0x8e, /* 142 */
+ 0x8b, /* 139 */
+/* 168 */ 0x3c, /* 60 */
+ 0xd2, /* 210 */
+/* 170 */ 0xd, /* 13 */
+ 0x9d, /* 157 */
+/* 172 */
+ 0x2f, /* FC_IP */
+ 0x5a, /* FC_CONSTANT_IID */
+/* 174 */ NdrFcLong( 0x1698b961 ), /* 379107681 */
+/* 178 */ NdrFcShort( 0xf90e ), /* -1778 */
+/* 180 */ NdrFcShort( 0x30d0 ), /* 12496 */
+/* 182 */ 0x80, /* 128 */
+ 0xff, /* 255 */
+/* 184 */ 0x22, /* 34 */
+ 0xe9, /* 233 */
+/* 186 */ 0x4c, /* 76 */
+ 0xf6, /* 246 */
+/* 188 */ 0x6d, /* 109 */
+ 0x7b, /* 123 */
+/* 190 */
+ 0x11, 0xc, /* FC_RP [alloced_on_stack] [simple_pointer] */
+/* 192 */ 0xc, /* FC_DOUBLE */
+ 0x5c, /* FC_PAD */
+/* 194 */
+ 0x1a, /* FC_BOGUS_STRUCT */
+ 0x7, /* 7 */
+/* 196 */ NdrFcShort( 0x20 ), /* 32 */
+/* 198 */ NdrFcShort( 0x0 ), /* 0 */
+/* 200 */ NdrFcShort( 0x0 ), /* Offset= 0 (200) */
+/* 202 */ 0xc, /* FC_DOUBLE */
+ 0xc, /* FC_DOUBLE */
+/* 204 */ 0xe, /* FC_ENUM32 */
+ 0x3, /* FC_SMALL */
+/* 206 */ 0x3, /* FC_SMALL */
+ 0x3, /* FC_SMALL */
+/* 208 */ 0x3d, /* FC_STRUCTPAD1 */
+ 0x4c, /* FC_EMBEDDED_COMPLEX */
+/* 210 */ 0x0, /* 0 */
+ NdrFcShort( 0xff95 ), /* Offset= -107 (104) */
+ 0x4c, /* FC_EMBEDDED_COMPLEX */
+/* 214 */ 0x0, /* 0 */
+ NdrFcShort( 0xff91 ), /* Offset= -111 (104) */
+ 0x5b, /* FC_END */
+/* 218 */
+ 0x11, 0x0, /* FC_RP */
+/* 220 */ NdrFcShort( 0x1a ), /* Offset= 26 (246) */
+/* 222 */
+ 0x1a, /* FC_BOGUS_STRUCT */
+ 0x7, /* 7 */
+/* 224 */ NdrFcShort( 0x18 ), /* 24 */
+/* 226 */ NdrFcShort( 0x0 ), /* 0 */
+/* 228 */ NdrFcShort( 0x0 ), /* Offset= 0 (228) */
+/* 230 */ 0xb, /* FC_HYPER */
+ 0x6, /* FC_SHORT */
+/* 232 */ 0x3e, /* FC_STRUCTPAD2 */
+ 0x4c, /* FC_EMBEDDED_COMPLEX */
+/* 234 */ 0x0, /* 0 */
+ NdrFcShort( 0xff7d ), /* Offset= -131 (104) */
+ 0x4c, /* FC_EMBEDDED_COMPLEX */
+/* 238 */ 0x0, /* 0 */
+ NdrFcShort( 0xff79 ), /* Offset= -135 (104) */
+ 0x4c, /* FC_EMBEDDED_COMPLEX */
+/* 242 */ 0x0, /* 0 */
+ NdrFcShort( 0xff75 ), /* Offset= -139 (104) */
+ 0x5b, /* FC_END */
+/* 246 */
+ 0x21, /* FC_BOGUS_ARRAY */
+ 0x7, /* 7 */
+/* 248 */ NdrFcShort( 0x0 ), /* 0 */
+/* 250 */ 0x29, /* Corr desc: parameter, FC_ULONG */
+ 0x0, /* */
+/* 252 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 254 */ NdrFcShort( 0x1 ), /* Corr flags: early, */
+/* 256 */ NdrFcLong( 0xffffffff ), /* -1 */
+/* 260 */ NdrFcShort( 0x0 ), /* Corr flags: */
+/* 262 */ 0x4c, /* FC_EMBEDDED_COMPLEX */
+ 0x0, /* 0 */
+/* 264 */ NdrFcShort( 0xffd6 ), /* Offset= -42 (222) */
+/* 266 */ 0x5c, /* FC_PAD */
+ 0x5b, /* FC_END */
+/* 268 */
+ 0x1a, /* FC_BOGUS_STRUCT */
+ 0x3, /* 3 */
+/* 270 */ NdrFcShort( 0x14 ), /* 20 */
+/* 272 */ NdrFcShort( 0x0 ), /* 0 */
+/* 274 */ NdrFcShort( 0x0 ), /* Offset= 0 (274) */
+/* 276 */ 0xe, /* FC_ENUM32 */
+ 0x4c, /* FC_EMBEDDED_COMPLEX */
+/* 278 */ 0x0, /* 0 */
+ NdrFcShort( 0xff51 ), /* Offset= -175 (104) */
+ 0x6, /* FC_SHORT */
+/* 282 */ 0x3e, /* FC_STRUCTPAD2 */
+ 0x4c, /* FC_EMBEDDED_COMPLEX */
+/* 284 */ 0x0, /* 0 */
+ NdrFcShort( 0xff4b ), /* Offset= -181 (104) */
+ 0x4c, /* FC_EMBEDDED_COMPLEX */
+/* 288 */ 0x0, /* 0 */
+ NdrFcShort( 0xff47 ), /* Offset= -185 (104) */
+ 0x5b, /* FC_END */
+/* 292 */
+ 0x11, 0xc, /* FC_RP [alloced_on_stack] [simple_pointer] */
+/* 294 */ 0xe, /* FC_ENUM32 */
+ 0x5c, /* FC_PAD */
+/* 296 */
+ 0x2f, /* FC_IP */
+ 0x5a, /* FC_CONSTANT_IID */
+/* 298 */ NdrFcLong( 0x39126060 ), /* 957505632 */
+/* 302 */ NdrFcShort( 0x292 ), /* 658 */
+/* 304 */ NdrFcShort( 0x36d6 ), /* 14038 */
+/* 306 */ 0xb3, /* 179 */
+ 0xf8, /* 248 */
+/* 308 */ 0x9a, /* 154 */
+ 0xc4, /* 196 */
+/* 310 */ 0x15, /* 21 */
+ 0x6c, /* 108 */
+/* 312 */ 0x65, /* 101 */
+ 0x1d, /* 29 */
+/* 314 */
+ 0x11, 0xc, /* FC_RP [alloced_on_stack] [simple_pointer] */
+/* 316 */ 0x3, /* FC_SMALL */
+ 0x5c, /* FC_PAD */
+/* 318 */
+ 0x11, 0x0, /* FC_RP */
+/* 320 */ NdrFcShort( 0x2 ), /* Offset= 2 (322) */
+/* 322 */
+ 0x1b, /* FC_CARRAY */
+ 0x0, /* 0 */
+/* 324 */ NdrFcShort( 0x1 ), /* 1 */
+/* 326 */ 0x29, /* Corr desc: parameter, FC_ULONG */
+ 0x0, /* */
+/* 328 */ NdrFcShort( 0x40 ), /* ARM Stack size/offset = 64 */
+/* 330 */ NdrFcShort( 0x1 ), /* Corr flags: early, */
+/* 332 */ 0x1, /* FC_BYTE */
+ 0x5b, /* FC_END */
+/* 334 */
+ 0x11, 0x0, /* FC_RP */
+/* 336 */ NdrFcShort( 0x2 ), /* Offset= 2 (338) */
+/* 338 */
+ 0x21, /* FC_BOGUS_ARRAY */
+ 0x3, /* 3 */
+/* 340 */ NdrFcShort( 0x0 ), /* 0 */
+/* 342 */ 0x29, /* Corr desc: parameter, FC_ULONG */
+ 0x0, /* */
+/* 344 */ NdrFcShort( 0x4c ), /* ARM Stack size/offset = 76 */
+/* 346 */ NdrFcShort( 0x1 ), /* Corr flags: early, */
+/* 348 */ NdrFcLong( 0xffffffff ), /* -1 */
+/* 352 */ NdrFcShort( 0x0 ), /* Corr flags: */
+/* 354 */ 0x4c, /* FC_EMBEDDED_COMPLEX */
+ 0x0, /* 0 */
+/* 356 */ NdrFcShort( 0xff04 ), /* Offset= -252 (104) */
+/* 358 */ 0x5c, /* FC_PAD */
+ 0x5b, /* FC_END */
+/* 360 */
+ 0x11, 0x0, /* FC_RP */
+/* 362 */ NdrFcShort( 0x2 ), /* Offset= 2 (364) */
+/* 364 */
+ 0x21, /* FC_BOGUS_ARRAY */
+ 0x7, /* 7 */
+/* 366 */ NdrFcShort( 0x0 ), /* 0 */
+/* 368 */ 0x29, /* Corr desc: parameter, FC_ULONG */
+ 0x0, /* */
+/* 370 */ NdrFcShort( 0x54 ), /* ARM Stack size/offset = 84 */
+/* 372 */ NdrFcShort( 0x1 ), /* Corr flags: early, */
+/* 374 */ NdrFcLong( 0xffffffff ), /* -1 */
+/* 378 */ NdrFcShort( 0x0 ), /* Corr flags: */
+/* 380 */ 0x4c, /* FC_EMBEDDED_COMPLEX */
+ 0x0, /* 0 */
+/* 382 */ NdrFcShort( 0xff60 ), /* Offset= -160 (222) */
+/* 384 */ 0x5c, /* FC_PAD */
+ 0x5b, /* FC_END */
+/* 386 */
+ 0x2f, /* FC_IP */
+ 0x5a, /* FC_CONSTANT_IID */
+/* 388 */ NdrFcLong( 0x91ddee70 ), /* -1847726480 */
+/* 392 */ NdrFcShort( 0xaa90 ), /* -21872 */
+/* 394 */ NdrFcShort( 0x38e7 ), /* 14567 */
+/* 396 */ 0xb4, /* 180 */
+ 0xe5, /* 229 */
+/* 398 */ 0xf7, /* 247 */
+ 0x95, /* 149 */
+/* 400 */ 0x95, /* 149 */
+ 0x69, /* 105 */
+/* 402 */ 0xcb, /* 203 */
+ 0x5c, /* 92 */
+/* 404 */
+ 0x11, 0x14, /* FC_RP [alloced_on_stack] [pointer_deref] */
+/* 406 */ NdrFcShort( 0x2 ), /* Offset= 2 (408) */
+/* 408 */
+ 0x13, 0x0, /* FC_OP */
+/* 410 */ NdrFcShort( 0x2 ), /* Offset= 2 (412) */
+/* 412 */
+ 0x21, /* FC_BOGUS_ARRAY */
+ 0x3, /* 3 */
+/* 414 */ NdrFcShort( 0x0 ), /* 0 */
+/* 416 */ 0x29, /* Corr desc: parameter, FC_ULONG */
+ 0x54, /* FC_DEREFERENCE */
+/* 418 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 420 */ NdrFcShort( 0x1 ), /* Corr flags: early, */
+/* 422 */ NdrFcLong( 0xffffffff ), /* -1 */
+/* 426 */ NdrFcShort( 0x0 ), /* Corr flags: */
+/* 428 */ 0x4c, /* FC_EMBEDDED_COMPLEX */
+ 0x0, /* 0 */
+/* 430 */ NdrFcShort( 0xfeac ), /* Offset= -340 (90) */
+/* 432 */ 0x5c, /* FC_PAD */
+ 0x5b, /* FC_END */
+/* 434 */
+ 0x11, 0x0, /* FC_RP */
+/* 436 */ NdrFcShort( 0x2 ), /* Offset= 2 (438) */
+/* 438 */
+ 0x21, /* FC_BOGUS_ARRAY */
+ 0x3, /* 3 */
+/* 440 */ NdrFcShort( 0x0 ), /* 0 */
+/* 442 */ 0x29, /* Corr desc: parameter, FC_ULONG */
+ 0x0, /* */
+/* 444 */ NdrFcShort( 0x4 ), /* ARM Stack size/offset = 4 */
+/* 446 */ NdrFcShort( 0x1 ), /* Corr flags: early, */
+/* 448 */ NdrFcLong( 0xffffffff ), /* -1 */
+/* 452 */ NdrFcShort( 0x0 ), /* Corr flags: */
+/* 454 */ 0x4c, /* FC_EMBEDDED_COMPLEX */
+ 0x0, /* 0 */
+/* 456 */ NdrFcShort( 0xfea0 ), /* Offset= -352 (104) */
+/* 458 */ 0x5c, /* FC_PAD */
+ 0x5b, /* FC_END */
+/* 460 */
+ 0x11, 0x10, /* FC_RP [pointer_deref] */
+/* 462 */ NdrFcShort( 0x2 ), /* Offset= 2 (464) */
+/* 464 */
+ 0x2f, /* FC_IP */
+ 0x5a, /* FC_CONSTANT_IID */
+/* 466 */ NdrFcLong( 0x6b50718 ), /* 112527128 */
+/* 470 */ NdrFcShort( 0x3528 ), /* 13608 */
+/* 472 */ NdrFcShort( 0x3b66 ), /* 15206 */
+/* 474 */ 0xbe, /* 190 */
+ 0x76, /* 118 */
+/* 476 */ 0xe1, /* 225 */
+ 0x83, /* 131 */
+/* 478 */ 0xaa, /* 170 */
+ 0x80, /* 128 */
+/* 480 */ 0xd4, /* 212 */
+ 0xa5, /* 165 */
+/* 482 */
+ 0x11, 0x10, /* FC_RP [pointer_deref] */
+/* 484 */ NdrFcShort( 0x2 ), /* Offset= 2 (486) */
+/* 486 */
+ 0x2f, /* FC_IP */
+ 0x5a, /* FC_CONSTANT_IID */
+/* 488 */ NdrFcLong( 0x6928ca7b ), /* 1764280955 */
+/* 492 */ NdrFcShort( 0x166d ), /* 5741 */
+/* 494 */ NdrFcShort( 0x3b37 ), /* 15159 */
+/* 496 */ 0x90, /* 144 */
+ 0x10, /* 16 */
+/* 498 */ 0xfb, /* 251 */
+ 0xab, /* 171 */
+/* 500 */ 0x2c, /* 44 */
+ 0x7e, /* 126 */
+/* 502 */ 0x92, /* 146 */
+ 0xb0, /* 176 */
+/* 504 */
+ 0x11, 0x10, /* FC_RP [pointer_deref] */
+/* 506 */ NdrFcShort( 0x2 ), /* Offset= 2 (508) */
+/* 508 */
+ 0x2f, /* FC_IP */
+ 0x5a, /* FC_CONSTANT_IID */
+/* 510 */ NdrFcLong( 0x4fa5f2c4 ), /* 1336275652 */
+/* 514 */ NdrFcShort( 0x8612 ), /* -31214 */
+/* 516 */ NdrFcShort( 0x35c9 ), /* 13769 */
+/* 518 */ 0xbf, /* 191 */
+ 0xaa, /* 170 */
+/* 520 */ 0x96, /* 150 */
+ 0x7c, /* 124 */
+/* 522 */ 0x2c, /* 44 */
+ 0x81, /* 129 */
+/* 524 */ 0x9f, /* 159 */
+ 0xa7, /* 167 */
+/* 526 */
+ 0x11, 0x10, /* FC_RP [pointer_deref] */
+/* 528 */ NdrFcShort( 0x2 ), /* Offset= 2 (530) */
+/* 530 */
+ 0x2f, /* FC_IP */
+ 0x5a, /* FC_CONSTANT_IID */
+/* 532 */ NdrFcLong( 0x8313dbea ), /* -2095850518 */
+/* 536 */ NdrFcShort( 0xfd3b ), /* -709 */
+/* 538 */ NdrFcShort( 0x3071 ), /* 12401 */
+/* 540 */ 0x80, /* 128 */
+ 0x35, /* 53 */
+/* 542 */ 0x7b, /* 123 */
+ 0x61, /* 97 */
+/* 544 */ 0x16, /* 22 */
+ 0x58, /* 88 */
+/* 546 */ 0xda, /* 218 */
+ 0xd8, /* 216 */
+/* 548 */
+ 0x11, 0x10, /* FC_RP [pointer_deref] */
+/* 550 */ NdrFcShort( 0xfe74 ), /* Offset= -396 (154) */
+/* 552 */
+ 0x11, 0x10, /* FC_RP [pointer_deref] */
+/* 554 */ NdrFcShort( 0x2 ), /* Offset= 2 (556) */
+/* 556 */
+ 0x2f, /* FC_IP */
+ 0x5a, /* FC_CONSTANT_IID */
+/* 558 */ NdrFcLong( 0xc8afe1a8 ), /* -927997528 */
+/* 562 */ NdrFcShort( 0x92fc ), /* -27908 */
+/* 564 */ NdrFcShort( 0x3783 ), /* 14211 */
+/* 566 */ 0x95, /* 149 */
+ 0x20, /* 32 */
+/* 568 */ 0xd6, /* 214 */
+ 0xbb, /* 187 */
+/* 570 */ 0xc5, /* 197 */
+ 0x7, /* 7 */
+/* 572 */ 0xb2, /* 178 */
+ 0x4a, /* 74 */
+
+ 0x0
+ }
+ };
+
+static const USER_MARSHAL_ROUTINE_QUADRUPLE UserMarshalRoutines[ WIRE_MARSHAL_TABLE_SIZE ] =
+ {
+
+ {
+ HSTRING_UserSize
+ ,HSTRING_UserMarshal
+ ,HSTRING_UserUnmarshal
+ ,HSTRING_UserFree
+ }
+
+ };
+
+
+
+/* Standard interface: __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0000, ver. 0.0,
+ GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */
+
+
+/* Object interface: IUnknown, ver. 0.0,
+ GUID={0x00000000,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */
+
+
+/* Object interface: __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler, ver. 0.0,
+ GUID={0xF2035E6A,0x8067,0x3ABB,{0xA7,0x95,0x7B,0x33,0x4C,0x67,0xA2,0xED}} */
+
+#pragma code_seg(".orpc")
+static const unsigned short __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler_FormatStringOffsetTable[] =
+ {
+ 0
+ };
+
+static const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler_ProxyInfo =
+ {
+ &Object_StubDesc,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0
+ };
+
+
+static const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler_ServerInfo =
+ {
+ &Object_StubDesc,
+ 0,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0,
+ 0};
+CINTERFACE_PROXY_VTABLE(4) ___x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandlerProxyVtbl =
+{
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler_ProxyInfo,
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler,
+ IUnknown_QueryInterface_Proxy,
+ IUnknown_AddRef_Proxy,
+ IUnknown_Release_Proxy ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler::Invoke */
+};
+
+const CInterfaceStubVtbl ___x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandlerStubVtbl =
+{
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler_ServerInfo,
+ 4,
+ 0, /* pure interpreted */
+ CStdStubBuffer_METHODS
+};
+
+
+/* Object interface: __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler, ver. 0.0,
+ GUID={0x1698B961,0xF90E,0x30D0,{0x80,0xFF,0x22,0xE9,0x4C,0xF6,0x6D,0x7B}} */
+
+#pragma code_seg(".orpc")
+static const unsigned short __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler_FormatStringOffsetTable[] =
+ {
+ 58
+ };
+
+static const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler_ProxyInfo =
+ {
+ &Object_StubDesc,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0
+ };
+
+
+static const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler_ServerInfo =
+ {
+ &Object_StubDesc,
+ 0,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0,
+ 0};
+CINTERFACE_PROXY_VTABLE(4) ___x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandlerProxyVtbl =
+{
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler_ProxyInfo,
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler,
+ IUnknown_QueryInterface_Proxy,
+ IUnknown_AddRef_Proxy,
+ IUnknown_Release_Proxy ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler::Invoke */
+};
+
+const CInterfaceStubVtbl ___x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandlerStubVtbl =
+{
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler_ServerInfo,
+ 4,
+ 0, /* pure interpreted */
+ CStdStubBuffer_METHODS
+};
+
+
+/* Object interface: __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback, ver. 0.0,
+ GUID={0x91DDEE70,0xAA90,0x38E7,{0xB4,0xE5,0xF7,0x95,0x95,0x69,0xCB,0x5C}} */
+
+#pragma code_seg(".orpc")
+static const unsigned short __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback_FormatStringOffsetTable[] =
+ {
+ 100
+ };
+
+static const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback_ProxyInfo =
+ {
+ &Object_StubDesc,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0
+ };
+
+
+static const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback_ServerInfo =
+ {
+ &Object_StubDesc,
+ 0,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0,
+ 0};
+CINTERFACE_PROXY_VTABLE(4) ___x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallbackProxyVtbl =
+{
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback_ProxyInfo,
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback,
+ IUnknown_QueryInterface_Proxy,
+ IUnknown_AddRef_Proxy,
+ IUnknown_Release_Proxy ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback::Invoke */
+};
+
+const CInterfaceStubVtbl ___x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallbackStubVtbl =
+{
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback_ServerInfo,
+ 4,
+ 0, /* pure interpreted */
+ CStdStubBuffer_METHODS
+};
+
+
+/* Standard interface: __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0003, ver. 0.0,
+ GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */
+
+
+/* Object interface: IInspectable, ver. 0.0,
+ GUID={0xAF86E2E0,0xB12D,0x4c6a,{0x9C,0x5A,0xD7,0xAA,0x65,0x10,0x1E,0x90}} */
+
+
+/* Object interface: __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals, ver. 0.0,
+ GUID={0xF5A3C2AE,0xEF7B,0x3DE2,{0x8B,0x0E,0x8E,0x8B,0x3C,0xD2,0x0D,0x9D}} */
+
+#pragma code_seg(".orpc")
+static const unsigned short __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_FormatStringOffsetTable[] =
+ {
+ (unsigned short) -1,
+ (unsigned short) -1,
+ (unsigned short) -1,
+ 158,
+ 206,
+ 272,
+ 320,
+ 364,
+ 412
+ };
+
+static const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_ProxyInfo =
+ {
+ &Object_StubDesc,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0
+ };
+
+
+static const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_ServerInfo =
+ {
+ &Object_StubDesc,
+ 0,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0,
+ 0};
+CINTERFACE_PROXY_VTABLE(12) ___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtualsProxyVtbl =
+{
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_ProxyInfo,
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals,
+ IUnknown_QueryInterface_Proxy,
+ IUnknown_AddRef_Proxy,
+ IUnknown_Release_Proxy ,
+ 0 /* IInspectable::GetIids */ ,
+ 0 /* IInspectable::GetRuntimeClassName */ ,
+ 0 /* IInspectable::GetTrustLevel */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals::WriteAudio */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals::WriteVideo */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals::add_AudioMessageReceived */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals::remove_AudioMessageReceived */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals::add_VideoMessageReceived */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals::remove_VideoMessageReceived */
+};
+
+
+static const PRPC_STUB_FUNCTION __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_table[] =
+{
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2
+};
+
+CInterfaceStubVtbl ___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtualsStubVtbl =
+{
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_ServerInfo,
+ 12,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals_table[-3],
+ CStdStubBuffer_DELEGATING_METHODS
+};
+
+
+/* Standard interface: __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0004, ver. 0.0,
+ GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */
+
+
+/* Object interface: __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals, ver. 0.0,
+ GUID={0x044DEA28,0x0E8D,0x3A16,{0xA2,0xC1,0xBE,0x95,0xC0,0xBE,0xD5,0xE5}} */
+
+#pragma code_seg(".orpc")
+static const unsigned short __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_FormatStringOffsetTable[] =
+ {
+ (unsigned short) -1,
+ (unsigned short) -1,
+ (unsigned short) -1,
+ 0
+ };
+
+static const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_ProxyInfo =
+ {
+ &Object_StubDesc,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0
+ };
+
+
+static const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_ServerInfo =
+ {
+ &Object_StubDesc,
+ 0,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0,
+ 0};
+CINTERFACE_PROXY_VTABLE(6) ___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtualsProxyVtbl =
+{
+ 0,
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals,
+ IUnknown_QueryInterface_Proxy,
+ IUnknown_AddRef_Proxy,
+ IUnknown_Release_Proxy ,
+ 0 /* IInspectable::GetIids */ ,
+ 0 /* IInspectable::GetRuntimeClassName */ ,
+ 0 /* IInspectable::GetTrustLevel */
+};
+
+
+static const PRPC_STUB_FUNCTION __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_table[] =
+{
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION
+};
+
+CInterfaceStubVtbl ___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtualsStubVtbl =
+{
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_ServerInfo,
+ 6,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals_table[-3],
+ CStdStubBuffer_DELEGATING_METHODS
+};
+
+
+/* Standard interface: __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0005, ver. 0.0,
+ GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */
+
+
+/* Object interface: __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals, ver. 0.0,
+ GUID={0x0CC88A54,0x89AF,0x3CC6,{0x9B,0x95,0xF8,0xF2,0x24,0x28,0xAB,0xED}} */
+
+#pragma code_seg(".orpc")
+static const unsigned short __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_FormatStringOffsetTable[] =
+ {
+ (unsigned short) -1,
+ (unsigned short) -1,
+ (unsigned short) -1,
+ 456,
+ 498,
+ 542,
+ 584,
+ 626,
+ 668,
+ 710,
+ 752,
+ 794,
+ 842
+ };
+
+static const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_ProxyInfo =
+ {
+ &Object_StubDesc,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0
+ };
+
+
+static const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_ServerInfo =
+ {
+ &Object_StubDesc,
+ 0,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0,
+ 0};
+CINTERFACE_PROXY_VTABLE(16) ___x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtualsProxyVtbl =
+{
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_ProxyInfo,
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals,
+ IUnknown_QueryInterface_Proxy,
+ IUnknown_AddRef_Proxy,
+ IUnknown_Release_Proxy ,
+ 0 /* IInspectable::GetIids */ ,
+ 0 /* IInspectable::GetRuntimeClassName */ ,
+ 0 /* IInspectable::GetTrustLevel */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals::get_id */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals::put_id */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals::get_port */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals::put_port */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals::get_ipv4 */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals::put_ipv4 */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals::get_ipv6 */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals::put_ipv6 */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals::get_peerTag */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals::put_peerTag */
+};
+
+
+static const PRPC_STUB_FUNCTION __x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_table[] =
+{
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2
+};
+
+CInterfaceStubVtbl ___x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtualsStubVtbl =
+{
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_ServerInfo,
+ 16,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals_table[-3],
+ CStdStubBuffer_DELEGATING_METHODS
+};
+
+
+/* Standard interface: __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0006, ver. 0.0,
+ GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */
+
+
+/* Object interface: __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener, ver. 0.0,
+ GUID={0x39126060,0x0292,0x36D6,{0xB3,0xF8,0x9A,0xC4,0x15,0x6C,0x65,0x1D}} */
+
+#pragma code_seg(".orpc")
+static const unsigned short __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_FormatStringOffsetTable[] =
+ {
+ (unsigned short) -1,
+ (unsigned short) -1,
+ (unsigned short) -1,
+ 890,
+ 932,
+ 974,
+ 1016,
+ 1058,
+ 1100
+ };
+
+static const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_ProxyInfo =
+ {
+ &Object_StubDesc,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0
+ };
+
+
+static const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_ServerInfo =
+ {
+ &Object_StubDesc,
+ 0,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0,
+ 0};
+CINTERFACE_PROXY_VTABLE(12) ___x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListenerProxyVtbl =
+{
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_ProxyInfo,
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener,
+ IUnknown_QueryInterface_Proxy,
+ IUnknown_AddRef_Proxy,
+ IUnknown_Release_Proxy ,
+ 0 /* IInspectable::GetIids */ ,
+ 0 /* IInspectable::GetRuntimeClassName */ ,
+ 0 /* IInspectable::GetTrustLevel */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener::OnSignalBarsChanged */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener::OnCallStateChanged */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener::OnCallStatusChanged */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener::OnCallAudioRouteChanged */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener::OnMediaOperationsChanged */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener::OnCameraLocationChanged */
+};
+
+
+static const PRPC_STUB_FUNCTION __x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_table[] =
+{
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2
+};
+
+CInterfaceStubVtbl ___x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListenerStubVtbl =
+{
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_ServerInfo,
+ 12,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener_table[-3],
+ CStdStubBuffer_DELEGATING_METHODS
+};
+
+
+/* Standard interface: __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0007, ver. 0.0,
+ GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */
+
+
+/* Object interface: __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals, ver. 0.0,
+ GUID={0x8313DBEA,0xFD3B,0x3071,{0x80,0x35,0x7B,0x61,0x16,0x58,0xDA,0xD8}} */
+
+#pragma code_seg(".orpc")
+static const unsigned short __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_FormatStringOffsetTable[] =
+ {
+ (unsigned short) -1,
+ (unsigned short) -1,
+ (unsigned short) -1,
+ 1142,
+ 932,
+ 1184,
+ 1218,
+ 1252,
+ 412
+ };
+
+static const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_ProxyInfo =
+ {
+ &Object_StubDesc,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0
+ };
+
+
+static const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_ServerInfo =
+ {
+ &Object_StubDesc,
+ 0,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0,
+ 0};
+CINTERFACE_PROXY_VTABLE(12) ___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtualsProxyVtbl =
+{
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_ProxyInfo,
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals,
+ IUnknown_QueryInterface_Proxy,
+ IUnknown_AddRef_Proxy,
+ IUnknown_Release_Proxy ,
+ 0 /* IInspectable::GetIids */ ,
+ 0 /* IInspectable::GetRuntimeClassName */ ,
+ 0 /* IInspectable::GetTrustLevel */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals::SetTransport */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals::Start */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals::Stop */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals::ToggleCamera */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals::add_CameraLocationChanged */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals::remove_CameraLocationChanged */
+};
+
+
+static const PRPC_STUB_FUNCTION __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_table[] =
+{
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2
+};
+
+CInterfaceStubVtbl ___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtualsStubVtbl =
+{
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_ServerInfo,
+ 12,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals_table[-3],
+ CStdStubBuffer_DELEGATING_METHODS
+};
+
+
+/* Standard interface: __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0008, ver. 0.0,
+ GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */
+
+
+/* Object interface: __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals, ver. 0.0,
+ GUID={0x64B31D5B,0x1A27,0x37A8,{0xBC,0xBC,0xC0,0xBB,0xD5,0x31,0x4C,0x79}} */
+
+#pragma code_seg(".orpc")
+static const unsigned short __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_FormatStringOffsetTable[] =
+ {
+ (unsigned short) -1,
+ (unsigned short) -1,
+ (unsigned short) -1,
+ 0
+ };
+
+static const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_ProxyInfo =
+ {
+ &Object_StubDesc,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0
+ };
+
+
+static const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_ServerInfo =
+ {
+ &Object_StubDesc,
+ 0,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0,
+ 0};
+CINTERFACE_PROXY_VTABLE(6) ___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtualsProxyVtbl =
+{
+ 0,
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals,
+ IUnknown_QueryInterface_Proxy,
+ IUnknown_AddRef_Proxy,
+ IUnknown_Release_Proxy ,
+ 0 /* IInspectable::GetIids */ ,
+ 0 /* IInspectable::GetRuntimeClassName */ ,
+ 0 /* IInspectable::GetTrustLevel */
+};
+
+
+static const PRPC_STUB_FUNCTION __x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_table[] =
+{
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION
+};
+
+CInterfaceStubVtbl ___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtualsStubVtbl =
+{
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_ServerInfo,
+ 6,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals_table[-3],
+ CStdStubBuffer_DELEGATING_METHODS
+};
+
+
+/* Standard interface: __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0009, ver. 0.0,
+ GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */
+
+
+/* Object interface: __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig, ver. 0.0,
+ GUID={0xA9F22E31,0xD4E1,0x3940,{0xBA,0x20,0xDC,0xB2,0x09,0x73,0xB0,0x9F}} */
+
+#pragma code_seg(".orpc")
+static const unsigned short __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_FormatStringOffsetTable[] =
+ {
+ (unsigned short) -1,
+ (unsigned short) -1,
+ (unsigned short) -1,
+ 1300,
+ 1342,
+ 1386,
+ 1428
+ };
+
+static const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_ProxyInfo =
+ {
+ &Object_StubDesc,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0
+ };
+
+
+static const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_ServerInfo =
+ {
+ &Object_StubDesc,
+ 0,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0,
+ 0};
+CINTERFACE_PROXY_VTABLE(10) ___x_ABI_CPhoneVoIPApp_CBackEnd_CIConfigProxyVtbl =
+{
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_ProxyInfo,
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig,
+ IUnknown_QueryInterface_Proxy,
+ IUnknown_AddRef_Proxy,
+ IUnknown_Release_Proxy ,
+ 0 /* IInspectable::GetIids */ ,
+ 0 /* IInspectable::GetRuntimeClassName */ ,
+ 0 /* IInspectable::GetTrustLevel */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig::get_InitTimeout */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig::put_InitTimeout */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig::get_RecvTimeout */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig::put_RecvTimeout */
+};
+
+
+static const PRPC_STUB_FUNCTION __x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_table[] =
+{
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2
+};
+
+CInterfaceStubVtbl ___x_ABI_CPhoneVoIPApp_CBackEnd_CIConfigStubVtbl =
+{
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_ServerInfo,
+ 10,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig_table[-3],
+ CStdStubBuffer_DELEGATING_METHODS
+};
+
+
+/* Standard interface: __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0010, ver. 0.0,
+ GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */
+
+
+/* Object interface: __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals, ver. 0.0,
+ GUID={0x06B50718,0x3528,0x3B66,{0xBE,0x76,0xE1,0x83,0xAA,0x80,0xD4,0xA5}} */
+
+#pragma code_seg(".orpc")
+static const unsigned short __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_FormatStringOffsetTable[] =
+ {
+ (unsigned short) -1,
+ (unsigned short) -1,
+ (unsigned short) -1,
+ 1472,
+ 1506,
+ 1184,
+ 1218,
+ 1540,
+ 1574,
+ 1622,
+ 1678,
+ 1740,
+ 1786,
+ 1820,
+ 1854,
+ 1896,
+ 1938,
+ 1980,
+ 2022,
+ 2064,
+ 2106,
+ 2148,
+ 2190,
+ 2232,
+ 2274,
+ 2346,
+ 2484,
+ 2570,
+ 2612,
+ 2654,
+ 2696,
+ 2738,
+ 2780,
+ 2822,
+ 2864,
+ 2906,
+ 2948,
+ 2990,
+ 3032,
+ 3074,
+ 3116,
+ 3158,
+ 3200,
+ 3242,
+ 3284,
+ 3326,
+ 3368,
+ 3410,
+ 3454,
+ 3502,
+ 3544
+ };
+
+static const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_ProxyInfo =
+ {
+ &Object_StubDesc,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0
+ };
+
+
+static const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_ServerInfo =
+ {
+ &Object_StubDesc,
+ 0,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0,
+ 0};
+CINTERFACE_PROXY_VTABLE(54) ___x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtualsProxyVtbl =
+{
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_ProxyInfo,
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals,
+ IUnknown_QueryInterface_Proxy,
+ IUnknown_AddRef_Proxy,
+ IUnknown_Release_Proxy ,
+ 0 /* IInspectable::GetIids */ ,
+ 0 /* IInspectable::GetRuntimeClassName */ ,
+ 0 /* IInspectable::GetTrustLevel */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::HandleUpdatePhoneCall */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::StartMTProtoUpdater */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::StopMTProtoUpdater */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::CreateVoIPControllerWrapper */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::DeleteVoIPControllerWrapper */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::SetConfig */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::SetEncryptionKey */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::SetPublicEndpoints */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::SetProxy */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::Start */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::Connect */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::SetMicMute */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::SwitchSpeaker */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::UpdateServerConfig */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::GetPreferredRelayID */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::GetLastError */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::GetDebugLog */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::GetDebugString */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::GetVersion */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::GetSignalBarsCount */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::SetStatusCallback */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::InitiateOutgoingCall2 */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::InitiateOutgoingCall1 */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::OnIncomingCallReceived */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::HoldCall */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::ResumeCall */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::EndCall */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::ToggleCamera */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::get_CallStatus */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::get_MediaOperations */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::get_IsShowingVideo */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::put_IsShowingVideo */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::get_IsRenderingVideo */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::put_IsRenderingVideo */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::get_CameraLocation */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::get_AvailableAudioRoutes */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::get_AudioRoute */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::put_AudioRoute */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::get_OtherPartyName */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::get_OtherPartyId */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::get_CallStartTime */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::get_CallId */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::get_CallAccessHash */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::get_AcceptedCallId */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::put_AcceptedCallId */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::get_Key */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::get_Outgoing */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals::get_Emojis */
+};
+
+
+static const PRPC_STUB_FUNCTION __x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_table[] =
+{
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2
+};
+
+CInterfaceStubVtbl ___x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtualsStubVtbl =
+{
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_ServerInfo,
+ 54,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals_table[-3],
+ CStdStubBuffer_DELEGATING_METHODS
+};
+
+
+/* Standard interface: __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0011, ver. 0.0,
+ GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */
+
+
+/* Object interface: __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer, ver. 0.0,
+ GUID={0x6928CA7B,0x166D,0x3B37,{0x90,0x10,0xFB,0xAB,0x2C,0x7E,0x92,0xB0}} */
+
+#pragma code_seg(".orpc")
+static const unsigned short __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_FormatStringOffsetTable[] =
+ {
+ (unsigned short) -1,
+ (unsigned short) -1,
+ (unsigned short) -1,
+ 1472,
+ 1506
+ };
+
+static const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_ProxyInfo =
+ {
+ &Object_StubDesc,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0
+ };
+
+
+static const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_ServerInfo =
+ {
+ &Object_StubDesc,
+ 0,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0,
+ 0};
+CINTERFACE_PROXY_VTABLE(8) ___x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRendererProxyVtbl =
+{
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_ProxyInfo,
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer,
+ IUnknown_QueryInterface_Proxy,
+ IUnknown_AddRef_Proxy,
+ IUnknown_Release_Proxy ,
+ 0 /* IInspectable::GetIids */ ,
+ 0 /* IInspectable::GetRuntimeClassName */ ,
+ 0 /* IInspectable::GetTrustLevel */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer::Start */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer::Stop */
+};
+
+
+static const PRPC_STUB_FUNCTION __x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_table[] =
+{
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ NdrStubCall2,
+ NdrStubCall2
+};
+
+CInterfaceStubVtbl ___x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRendererStubVtbl =
+{
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_ServerInfo,
+ 8,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer_table[-3],
+ CStdStubBuffer_DELEGATING_METHODS
+};
+
+
+/* Standard interface: __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0012, ver. 0.0,
+ GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */
+
+
+/* Object interface: __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater, ver. 0.0,
+ GUID={0x4FA5F2C4,0x8612,0x35C9,{0xBF,0xAA,0x96,0x7C,0x2C,0x81,0x9F,0xA7}} */
+
+#pragma code_seg(".orpc")
+static const unsigned short __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_FormatStringOffsetTable[] =
+ {
+ (unsigned short) -1,
+ (unsigned short) -1,
+ (unsigned short) -1,
+ 3592,
+ 1506,
+ 3648,
+ 3700
+ };
+
+static const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_ProxyInfo =
+ {
+ &Object_StubDesc,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0
+ };
+
+
+static const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_ServerInfo =
+ {
+ &Object_StubDesc,
+ 0,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0,
+ 0};
+CINTERFACE_PROXY_VTABLE(10) ___x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdaterProxyVtbl =
+{
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_ProxyInfo,
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater,
+ IUnknown_QueryInterface_Proxy,
+ IUnknown_AddRef_Proxy,
+ IUnknown_Release_Proxy ,
+ 0 /* IInspectable::GetIids */ ,
+ 0 /* IInspectable::GetRuntimeClassName */ ,
+ 0 /* IInspectable::GetTrustLevel */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater::Start */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater::Stop */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater::DiscardCall */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater::ReceivedCall */
+};
+
+
+static const PRPC_STUB_FUNCTION __x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_table[] =
+{
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2
+};
+
+CInterfaceStubVtbl ___x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdaterStubVtbl =
+{
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_ServerInfo,
+ 10,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater_table[-3],
+ CStdStubBuffer_DELEGATING_METHODS
+};
+
+
+/* Standard interface: __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0013, ver. 0.0,
+ GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */
+
+
+/* Object interface: __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals, ver. 0.0,
+ GUID={0xC8AFE1A8,0x92FC,0x3783,{0x95,0x20,0xD6,0xBB,0xC5,0x07,0xB2,0x4A}} */
+
+#pragma code_seg(".orpc")
+static const unsigned short __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_FormatStringOffsetTable[] =
+ {
+ (unsigned short) -1,
+ (unsigned short) -1,
+ (unsigned short) -1,
+ 3752,
+ 1506,
+ 3800,
+ 3842,
+ 3884,
+ 3926,
+ 3968,
+ 4010,
+ 4052
+ };
+
+static const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_ProxyInfo =
+ {
+ &Object_StubDesc,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0
+ };
+
+
+static const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_ServerInfo =
+ {
+ &Object_StubDesc,
+ 0,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0,
+ 0};
+CINTERFACE_PROXY_VTABLE(15) ___x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtualsProxyVtbl =
+{
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_ProxyInfo,
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals,
+ IUnknown_QueryInterface_Proxy,
+ IUnknown_AddRef_Proxy,
+ IUnknown_Release_Proxy ,
+ 0 /* IInspectable::GetIids */ ,
+ 0 /* IInspectable::GetRuntimeClassName */ ,
+ 0 /* IInspectable::GetTrustLevel */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals::StartServer */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals::DoPeriodicKeepAlive */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals::get_CallController */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals::get_VideoRenderer */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals::put_VideoRenderer */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals::get_MTProtoUpdater */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals::put_MTProtoUpdater */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals::get_CaptureController */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals::get_TransportController */
+};
+
+
+static const PRPC_STUB_FUNCTION __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_table[] =
+{
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2
+};
+
+CInterfaceStubVtbl ___x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtualsStubVtbl =
+{
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_ServerInfo,
+ 15,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals_table[-3],
+ CStdStubBuffer_DELEGATING_METHODS
+};
+
+
+/* Standard interface: __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0014, ver. 0.0,
+ GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */
+
+
+/* Object interface: __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics, ver. 0.0,
+ GUID={0x2C1E9C37,0x6827,0x38F7,{0x85,0x7C,0x02,0x16,0x42,0xCA,0x42,0x8B}} */
+
+#pragma code_seg(".orpc")
+static const unsigned short __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_FormatStringOffsetTable[] =
+ {
+ (unsigned short) -1,
+ (unsigned short) -1,
+ (unsigned short) -1,
+ 4094,
+ 4136,
+ 4184,
+ 4232
+ };
+
+static const MIDL_STUBLESS_PROXY_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_ProxyInfo =
+ {
+ &Object_StubDesc,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0
+ };
+
+
+static const MIDL_SERVER_INFO __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_ServerInfo =
+ {
+ &Object_StubDesc,
+ 0,
+ PhoneVoIPApp2EBackEnd__MIDL_ProcFormatString.Format,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_FormatStringOffsetTable[-3],
+ 0,
+ 0,
+ 0,
+ 0};
+CINTERFACE_PROXY_VTABLE(10) ___x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStaticsProxyVtbl =
+{
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_ProxyInfo,
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics,
+ IUnknown_QueryInterface_Proxy,
+ IUnknown_AddRef_Proxy,
+ IUnknown_Release_Proxy ,
+ 0 /* IInspectable::GetIids */ ,
+ 0 /* IInspectable::GetRuntimeClassName */ ,
+ 0 /* IInspectable::GetTrustLevel */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics::GetCurrentProcessId */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics::GetUiDisconnectedEventName */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics::GetBackgroundProcessReadyEventName */ ,
+ (void *) (INT_PTR) -1 /* __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics::get_Instance */
+};
+
+
+static const PRPC_STUB_FUNCTION __x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_table[] =
+{
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ STUB_FORWARDING_FUNCTION,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2,
+ NdrStubCall2
+};
+
+CInterfaceStubVtbl ___x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStaticsStubVtbl =
+{
+ &IID___x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_ServerInfo,
+ 10,
+ &__x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics_table[-3],
+ CStdStubBuffer_DELEGATING_METHODS
+};
+
+
+/* Standard interface: __MIDL_itf_PhoneVoIPApp2EBackEnd_0000_0015, ver. 0.0,
+ GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */
+
+static const MIDL_STUB_DESC Object_StubDesc =
+ {
+ 0,
+ NdrOleAllocate,
+ NdrOleFree,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ PhoneVoIPApp2EBackEnd__MIDL_TypeFormatString.Format,
+ 1, /* -error bounds_check flag */
+ 0x50002, /* Ndr library version */
+ 0,
+ 0x800025b, /* MIDL Version 8.0.603 */
+ 0,
+ UserMarshalRoutines,
+ 0, /* notify & notify_flag routine table */
+ 0x1, /* MIDL flag */
+ 0, /* cs routines */
+ 0, /* proxy/server info */
+ 0
+ };
+
+const CInterfaceProxyVtbl * const _PhoneVoIPApp2EBackEnd_ProxyVtblList[] =
+{
+ ( CInterfaceProxyVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtualsProxyVtbl,
+ ( CInterfaceProxyVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtualsProxyVtbl,
+ ( CInterfaceProxyVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_CIConfigProxyVtbl,
+ ( CInterfaceProxyVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStaticsProxyVtbl,
+ ( CInterfaceProxyVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtualsProxyVtbl,
+ ( CInterfaceProxyVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtualsProxyVtbl,
+ ( CInterfaceProxyVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListenerProxyVtbl,
+ ( CInterfaceProxyVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandlerProxyVtbl,
+ ( CInterfaceProxyVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandlerProxyVtbl,
+ ( CInterfaceProxyVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallbackProxyVtbl,
+ ( CInterfaceProxyVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRendererProxyVtbl,
+ ( CInterfaceProxyVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtualsProxyVtbl,
+ ( CInterfaceProxyVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtualsProxyVtbl,
+ ( CInterfaceProxyVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdaterProxyVtbl,
+ ( CInterfaceProxyVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtualsProxyVtbl,
+ 0
+};
+
+const CInterfaceStubVtbl * const _PhoneVoIPApp2EBackEnd_StubVtblList[] =
+{
+ ( CInterfaceStubVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtualsStubVtbl,
+ ( CInterfaceStubVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtualsStubVtbl,
+ ( CInterfaceStubVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_CIConfigStubVtbl,
+ ( CInterfaceStubVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStaticsStubVtbl,
+ ( CInterfaceStubVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtualsStubVtbl,
+ ( CInterfaceStubVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtualsStubVtbl,
+ ( CInterfaceStubVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListenerStubVtbl,
+ ( CInterfaceStubVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandlerStubVtbl,
+ ( CInterfaceStubVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandlerStubVtbl,
+ ( CInterfaceStubVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallbackStubVtbl,
+ ( CInterfaceStubVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRendererStubVtbl,
+ ( CInterfaceStubVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtualsStubVtbl,
+ ( CInterfaceStubVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtualsStubVtbl,
+ ( CInterfaceStubVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdaterStubVtbl,
+ ( CInterfaceStubVtbl *) &___x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtualsStubVtbl,
+ 0
+};
+
+PCInterfaceName const _PhoneVoIPApp2EBackEnd_InterfaceNamesList[] =
+{
+ "__x_ABI_CPhoneVoIPApp_CBackEnd_C____ICallControllerPublicNonVirtuals",
+ "__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportProtectedNonVirtuals",
+ "__x_ABI_CPhoneVoIPApp_CBackEnd_CIConfig",
+ "__x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsStatics",
+ "__x_ABI_CPhoneVoIPApp_CBackEnd_C____IEndpointPublicNonVirtuals",
+ "__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCaptureProtectedNonVirtuals",
+ "__x_ABI_CPhoneVoIPApp_CBackEnd_CICallControllerStatusListener",
+ "__x_ABI_CPhoneVoIPApp_CBackEnd_CICameraLocationChangedEventHandler",
+ "__x_ABI_CPhoneVoIPApp_CBackEnd_CIMessageReceivedEventHandler",
+ "__x_ABI_CPhoneVoIPApp_CBackEnd_CIIncomingCallDialogDismissedCallback",
+ "__x_ABI_CPhoneVoIPApp_CBackEnd_CIVideoRenderer",
+ "__x_ABI_CPhoneVoIPApp_CBackEnd_C____IGlobalsPublicNonVirtuals",
+ "__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndTransportPublicNonVirtuals",
+ "__x_ABI_CPhoneVoIPApp_CBackEnd_CIMTProtoUpdater",
+ "__x_ABI_CPhoneVoIPApp_CBackEnd_C____IBackEndCapturePublicNonVirtuals",
+ 0
+};
+
+const IID * const _PhoneVoIPApp2EBackEnd_BaseIIDList[] =
+{
+ &IID_IInspectable,
+ &IID_IInspectable,
+ &IID_IInspectable,
+ &IID_IInspectable,
+ &IID_IInspectable,
+ &IID_IInspectable,
+ &IID_IInspectable,
+ 0,
+ 0,
+ 0,
+ &IID_IInspectable,
+ &IID_IInspectable,
+ &IID_IInspectable,
+ &IID_IInspectable,
+ &IID_IInspectable,
+ 0
+};
+
+
+#define _PhoneVoIPApp2EBackEnd_CHECK_IID(n) IID_GENERIC_CHECK_IID( _PhoneVoIPApp2EBackEnd, pIID, n)
+
+int __stdcall _PhoneVoIPApp2EBackEnd_IID_Lookup( const IID * pIID, int * pIndex )
+{
+ IID_BS_LOOKUP_SETUP
+
+ IID_BS_LOOKUP_INITIAL_TEST( _PhoneVoIPApp2EBackEnd, 15, 8 )
+ IID_BS_LOOKUP_NEXT_TEST( _PhoneVoIPApp2EBackEnd, 4 )
+ IID_BS_LOOKUP_NEXT_TEST( _PhoneVoIPApp2EBackEnd, 2 )
+ IID_BS_LOOKUP_NEXT_TEST( _PhoneVoIPApp2EBackEnd, 1 )
+ IID_BS_LOOKUP_RETURN_RESULT( _PhoneVoIPApp2EBackEnd, 15, *pIndex )
+
+}
+
+const ExtendedProxyFileInfo PhoneVoIPApp2EBackEnd_ProxyFileInfo =
+{
+ (PCInterfaceProxyVtblList *) & _PhoneVoIPApp2EBackEnd_ProxyVtblList,
+ (PCInterfaceStubVtblList *) & _PhoneVoIPApp2EBackEnd_StubVtblList,
+ (const PCInterfaceName * ) & _PhoneVoIPApp2EBackEnd_InterfaceNamesList,
+ (const IID ** ) & _PhoneVoIPApp2EBackEnd_BaseIIDList,
+ & _PhoneVoIPApp2EBackEnd_IID_Lookup,
+ 15,
+ 2,
+ 0, /* table of [async_uuid] interfaces */
+ 0, /* Filler1 */
+ 0, /* Filler2 */
+ 0 /* Filler3 */
+};
+#if _MSC_VER >= 1200
+#pragma warning(pop)
+#endif
+
+
+#endif /* if defined(_ARM_) */
+
diff --git a/BackEndProxyStub/dlldata.c b/BackEndProxyStub/dlldata.c
new file mode 100755
index 0000000..8e8c732
--- /dev/null
+++ b/BackEndProxyStub/dlldata.c
@@ -0,0 +1,40 @@
+/*********************************************************
+ DllData file -- generated by MIDL compiler
+
+ DO NOT ALTER THIS FILE
+
+ This file is regenerated by MIDL on every IDL file compile.
+
+ To completely reconstruct this file, delete it and rerun MIDL
+ on all the IDL files in this DLL, specifying this file for the
+ /dlldata command line option
+
+*********************************************************/
+
+#define PROXY_DELEGATION
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EXTERN_PROXY_FILE( PhoneVoIPApp2EBackEnd )
+EXTERN_PROXY_FILE( PhoneVoIPApp2EBackEnd2EOutOfProcess )
+
+
+PROXYFILE_LIST_START
+/* Start of list */
+ REFERENCE_PROXY_FILE( PhoneVoIPApp2EBackEnd ),
+ REFERENCE_PROXY_FILE( PhoneVoIPApp2EBackEnd2EOutOfProcess ),
+/* End of list */
+PROXYFILE_LIST_END
+
+
+DLLDATA_ROUTINES( aProxyFileList, GET_DLL_CLSID )
+
+#ifdef __cplusplus
+} /*extern "C" */
+#endif
+
+/* end of generated dlldata file */
diff --git a/EmojiPanel/EmojiPanel/App.xaml b/EmojiPanel/EmojiPanel/App.xaml
new file mode 100755
index 0000000..826d731
--- /dev/null
+++ b/EmojiPanel/EmojiPanel/App.xaml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/EmojiPanel/EmojiPanel/App.xaml.cs b/EmojiPanel/EmojiPanel/App.xaml.cs
new file mode 100755
index 0000000..bcc2b02
--- /dev/null
+++ b/EmojiPanel/EmojiPanel/App.xaml.cs
@@ -0,0 +1,143 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Net;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Animation;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Microsoft.Phone.Controls;
+using Microsoft.Phone.Shell;
+
+namespace EmojiPanel
+{
+ public partial class App : Application
+ {
+ ///
+ /// Provides easy access to the root frame of the Phone Application.
+ ///
+ /// The root frame of the Phone Application.
+ public PhoneApplicationFrame RootFrame { get; private set; }
+
+ ///
+ /// Constructor for the Application object.
+ ///
+ public App()
+ {
+ // Global handler for uncaught exceptions.
+ UnhandledException += Application_UnhandledException;
+
+ // Standard Silverlight initialization
+ InitializeComponent();
+
+ // Phone-specific initialization
+ InitializePhoneApplication();
+
+ // Show graphics profiling information while debugging.
+ if (Debugger.IsAttached)
+ {
+ // Display the current frame rate counters.
+ Current.Host.Settings.EnableFrameRateCounter = true;
+
+ // Show the areas of the app that are being redrawn in each frame.
+ //Application.Current.Host.Settings.EnableRedrawRegions = true;
+
+ // Enable non-production analysis visualization mode,
+ // which shows areas of a page that are handed off to GPU with a colored overlay.
+ //Application.Current.Host.Settings.EnableCacheVisualization = true;
+
+ // Disable the application idle detection by setting the UserIdleDetectionMode property of the
+ // application's PhoneApplicationService object to Disabled.
+ // Caution:- Use this under debug mode only. Application that disables user idle detection will continue to run
+ // and consume battery power when the user is not using the phone.
+ PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
+ }
+
+ }
+
+ // Code to execute when the application is launching (eg, from Start)
+ // This code will not execute when the application is reactivated
+ private void Application_Launching(object sender, LaunchingEventArgs e)
+ {
+ }
+
+ // Code to execute when the application is activated (brought to foreground)
+ // This code will not execute when the application is first launched
+ private void Application_Activated(object sender, ActivatedEventArgs e)
+ {
+ }
+
+ // Code to execute when the application is deactivated (sent to background)
+ // This code will not execute when the application is closing
+ private void Application_Deactivated(object sender, DeactivatedEventArgs e)
+ {
+ }
+
+ // Code to execute when the application is closing (eg, user hit Back)
+ // This code will not execute when the application is deactivated
+ private void Application_Closing(object sender, ClosingEventArgs e)
+ {
+ }
+
+ // Code to execute if a navigation fails
+ private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
+ {
+ if (Debugger.IsAttached)
+ {
+ // A navigation has failed; break into the debugger
+ Debugger.Break();
+ }
+ }
+
+ // Code to execute on Unhandled Exceptions
+ private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
+ {
+ if (Debugger.IsAttached)
+ {
+ // An unhandled exception has occurred; break into the debugger
+ Debugger.Break();
+ }
+ }
+
+ #region Phone application initialization
+
+ // Avoid double-initialization
+ private bool phoneApplicationInitialized = false;
+
+ // Do not add any additional code to this method
+ private void InitializePhoneApplication()
+ {
+ if (phoneApplicationInitialized)
+ return;
+
+ // Create the frame but don't set it as RootVisual yet; this allows the splash
+ // screen to remain active until the application is ready to render.
+ RootFrame = new PhoneApplicationFrame();
+ RootFrame.Navigated += CompleteInitializePhoneApplication;
+
+ // Handle navigation failures
+ RootFrame.NavigationFailed += RootFrame_NavigationFailed;
+
+ // Ensure we don't initialize again
+ phoneApplicationInitialized = true;
+ }
+
+ // Do not add any additional code to this method
+ private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
+ {
+ // Set the root visual to allow the application to render
+ if (RootVisual != RootFrame)
+ RootVisual = RootFrame;
+
+ // Remove this handler since it is no longer needed
+ RootFrame.Navigated -= CompleteInitializePhoneApplication;
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/EmojiPanel/EmojiPanel/ApplicationIcon.png b/EmojiPanel/EmojiPanel/ApplicationIcon.png
new file mode 100755
index 0000000..5859393
Binary files /dev/null and b/EmojiPanel/EmojiPanel/ApplicationIcon.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/AppBarIcons/appbar.smile.png b/EmojiPanel/EmojiPanel/Assets/AppBarIcons/appbar.smile.png
new file mode 100755
index 0000000..a19ddb9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/AppBarIcons/appbar.smile.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0023-fe0f-20e3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0023-fe0f-20e3.png
new file mode 100755
index 0000000..6765d7d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0023-fe0f-20e3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0030-fe0f-20e3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0030-fe0f-20e3.png
new file mode 100755
index 0000000..15e7446
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0030-fe0f-20e3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0031-fe0f-20e3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0031-fe0f-20e3.png
new file mode 100755
index 0000000..2d1f9f8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0031-fe0f-20e3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0032-fe0f-20e3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0032-fe0f-20e3.png
new file mode 100755
index 0000000..c191f8a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0032-fe0f-20e3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0033-fe0f-20e3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0033-fe0f-20e3.png
new file mode 100755
index 0000000..55644c9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0033-fe0f-20e3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0034-fe0f-20e3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0034-fe0f-20e3.png
new file mode 100755
index 0000000..14782ba
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0034-fe0f-20e3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0035-fe0f-20e3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0035-fe0f-20e3.png
new file mode 100755
index 0000000..794321a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0035-fe0f-20e3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0036-fe0f-20e3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0036-fe0f-20e3.png
new file mode 100755
index 0000000..5688055
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0036-fe0f-20e3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0037-fe0f-20e3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0037-fe0f-20e3.png
new file mode 100755
index 0000000..354e89a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0037-fe0f-20e3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0038-fe0f-20e3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0038-fe0f-20e3.png
new file mode 100755
index 0000000..7bdb422
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0038-fe0f-20e3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0039-fe0f-20e3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0039-fe0f-20e3.png
new file mode 100755
index 0000000..8006cc9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/0039-fe0f-20e3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/00a9.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/00a9.png
new file mode 100755
index 0000000..d59f580
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/00a9.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/00ae.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/00ae.png
new file mode 100755
index 0000000..e539410
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/00ae.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f004-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f004-fe0f.png
new file mode 100755
index 0000000..f51ce65
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f004-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f0cf.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f0cf.png
new file mode 100755
index 0000000..4c78f36
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f0cf.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f170.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f170.png
new file mode 100755
index 0000000..4908a44
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f170.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f171.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f171.png
new file mode 100755
index 0000000..8742b3d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f171.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f17e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f17e.png
new file mode 100755
index 0000000..d85f9fb
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f17e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f17f-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f17f-fe0f.png
new file mode 100755
index 0000000..c24af81
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f17f-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f18e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f18e.png
new file mode 100755
index 0000000..2a52220
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f18e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f191.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f191.png
new file mode 100755
index 0000000..15ac675
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f191.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f192.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f192.png
new file mode 100755
index 0000000..937dcd7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f192.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f193.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f193.png
new file mode 100755
index 0000000..c886cf2
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f193.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f194.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f194.png
new file mode 100755
index 0000000..47437a7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f194.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f195.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f195.png
new file mode 100755
index 0000000..28d1570
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f195.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f196.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f196.png
new file mode 100755
index 0000000..2ca180a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f196.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f197.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f197.png
new file mode 100755
index 0000000..6433d1a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f197.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f198.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f198.png
new file mode 100755
index 0000000..e3e16ef
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f198.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f199.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f199.png
new file mode 100755
index 0000000..829219a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f199.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f19a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f19a.png
new file mode 100755
index 0000000..8636388
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f19a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1e8-1f1f3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1e8-1f1f3.png
new file mode 100755
index 0000000..b30dcc5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1e8-1f1f3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1e9-1f1ea.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1e9-1f1ea.png
new file mode 100755
index 0000000..16a2854
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1e9-1f1ea.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1ea-1f1f8.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1ea-1f1f8.png
new file mode 100755
index 0000000..71b30bf
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1ea-1f1f8.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1eb-1f1f7.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1eb-1f1f7.png
new file mode 100755
index 0000000..6311c91
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1eb-1f1f7.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1ec-1f1e7.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1ec-1f1e7.png
new file mode 100755
index 0000000..2a62c7a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1ec-1f1e7.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1ee-1f1f9.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1ee-1f1f9.png
new file mode 100755
index 0000000..70bc9f3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1ee-1f1f9.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1ef-1f1f5.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1ef-1f1f5.png
new file mode 100755
index 0000000..b786efb
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1ef-1f1f5.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1f0-1f1f7.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1f0-1f1f7.png
new file mode 100755
index 0000000..b4c0c1b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1f0-1f1f7.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1f7-1f1fa.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1f7-1f1fa.png
new file mode 100755
index 0000000..55fcf35
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1f7-1f1fa.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1fa-1f1f8.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1fa-1f1f8.png
new file mode 100755
index 0000000..3813766
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f1fa-1f1f8.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f201.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f201.png
new file mode 100755
index 0000000..3bef28c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f201.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f202.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f202.png
new file mode 100755
index 0000000..387f098
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f202.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f21a-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f21a-fe0f.png
new file mode 100755
index 0000000..25f694e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f21a-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f22f-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f22f-fe0f.png
new file mode 100755
index 0000000..6557f56
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f22f-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f232.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f232.png
new file mode 100755
index 0000000..f550a57
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f232.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f233.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f233.png
new file mode 100755
index 0000000..c05f5cf
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f233.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f234.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f234.png
new file mode 100755
index 0000000..03ab0d8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f234.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f235.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f235.png
new file mode 100755
index 0000000..5df1cb8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f235.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f236.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f236.png
new file mode 100755
index 0000000..cd8fb3f
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f236.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f237.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f237.png
new file mode 100755
index 0000000..e4dfe5a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f237.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f238.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f238.png
new file mode 100755
index 0000000..fc4a990
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f238.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f239.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f239.png
new file mode 100755
index 0000000..2148253
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f239.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f23a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f23a.png
new file mode 100755
index 0000000..ba946d3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f23a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f250.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f250.png
new file mode 100755
index 0000000..e79af78
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f250.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f251.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f251.png
new file mode 100755
index 0000000..2d20090
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f251.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f300.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f300.png
new file mode 100755
index 0000000..6c49f64
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f300.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f301.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f301.png
new file mode 100755
index 0000000..3c7b8b0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f301.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f302.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f302.png
new file mode 100755
index 0000000..072c5c2
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f302.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f303.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f303.png
new file mode 100755
index 0000000..d4de585
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f303.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f304.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f304.png
new file mode 100755
index 0000000..ebc3db1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f304.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f305.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f305.png
new file mode 100755
index 0000000..ec58dcc
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f305.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f306.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f306.png
new file mode 100755
index 0000000..7cb178a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f306.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f307.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f307.png
new file mode 100755
index 0000000..91ca2a4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f307.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f308.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f308.png
new file mode 100755
index 0000000..6b1faa0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f308.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f309.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f309.png
new file mode 100755
index 0000000..495b06c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f309.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f30a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f30a.png
new file mode 100755
index 0000000..f8d520c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f30a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f30b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f30b.png
new file mode 100755
index 0000000..9b43453
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f30b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f30c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f30c.png
new file mode 100755
index 0000000..901090a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f30c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f30d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f30d.png
new file mode 100755
index 0000000..44ce5ec
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f30d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f30e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f30e.png
new file mode 100755
index 0000000..97d7176
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f30e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f30f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f30f.png
new file mode 100755
index 0000000..95ec357
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f30f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f310.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f310.png
new file mode 100755
index 0000000..b198646
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f310.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f311.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f311.png
new file mode 100755
index 0000000..540239b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f311.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f312.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f312.png
new file mode 100755
index 0000000..c8f13dd
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f312.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f313.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f313.png
new file mode 100755
index 0000000..f38c236
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f313.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f314.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f314.png
new file mode 100755
index 0000000..dd8c484
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f314.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f315.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f315.png
new file mode 100755
index 0000000..8ff657a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f315.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f316.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f316.png
new file mode 100755
index 0000000..8e324ec
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f316.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f317.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f317.png
new file mode 100755
index 0000000..355e3c3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f317.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f318.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f318.png
new file mode 100755
index 0000000..3038778
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f318.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f319.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f319.png
new file mode 100755
index 0000000..afdb450
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f319.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f31a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f31a.png
new file mode 100755
index 0000000..b9aff7a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f31a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f31b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f31b.png
new file mode 100755
index 0000000..85ae2ce
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f31b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f31c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f31c.png
new file mode 100755
index 0000000..9ece82d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f31c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f31d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f31d.png
new file mode 100755
index 0000000..94395a4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f31d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f31e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f31e.png
new file mode 100755
index 0000000..ee27663
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f31e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f31f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f31f.png
new file mode 100755
index 0000000..8b40ff4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f31f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f320.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f320.png
new file mode 100755
index 0000000..097a842
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f320.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f330.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f330.png
new file mode 100755
index 0000000..066fb6b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f330.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f331.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f331.png
new file mode 100755
index 0000000..f0eb5a6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f331.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f332.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f332.png
new file mode 100755
index 0000000..ae8ad10
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f332.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f333.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f333.png
new file mode 100755
index 0000000..9bb16bd
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f333.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f334.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f334.png
new file mode 100755
index 0000000..d534785
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f334.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f335.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f335.png
new file mode 100755
index 0000000..5a2c3cc
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f335.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f337.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f337.png
new file mode 100755
index 0000000..b3ee110
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f337.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f338.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f338.png
new file mode 100755
index 0000000..e031554
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f338.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f339.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f339.png
new file mode 100755
index 0000000..3479fbc
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f339.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f33a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f33a.png
new file mode 100755
index 0000000..32a3774
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f33a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f33b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f33b.png
new file mode 100755
index 0000000..d9bad19
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f33b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f33c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f33c.png
new file mode 100755
index 0000000..55a9735
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f33c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f33d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f33d.png
new file mode 100755
index 0000000..fe5d8b1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f33d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f33e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f33e.png
new file mode 100755
index 0000000..a9bba5c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f33e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f33f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f33f.png
new file mode 100755
index 0000000..de1ff1b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f33f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f340.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f340.png
new file mode 100755
index 0000000..f2014be
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f340.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f341.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f341.png
new file mode 100755
index 0000000..4e9b472
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f341.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f342.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f342.png
new file mode 100755
index 0000000..d49f9c1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f342.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f343.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f343.png
new file mode 100755
index 0000000..801e578
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f343.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f344.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f344.png
new file mode 100755
index 0000000..5eeed8e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f344.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f345.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f345.png
new file mode 100755
index 0000000..a129700
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f345.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f346.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f346.png
new file mode 100755
index 0000000..566d6a8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f346.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f347.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f347.png
new file mode 100755
index 0000000..0f9f007
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f347.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f348.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f348.png
new file mode 100755
index 0000000..11c13cb
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f348.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f349.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f349.png
new file mode 100755
index 0000000..fc212be
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f349.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f34a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f34a.png
new file mode 100755
index 0000000..fc9d4f8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f34a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f34b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f34b.png
new file mode 100755
index 0000000..9814dc9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f34b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f34c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f34c.png
new file mode 100755
index 0000000..a0563af
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f34c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f34d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f34d.png
new file mode 100755
index 0000000..d6f8e28
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f34d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f34e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f34e.png
new file mode 100755
index 0000000..08aa17b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f34e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f34f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f34f.png
new file mode 100755
index 0000000..337205c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f34f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f350.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f350.png
new file mode 100755
index 0000000..f24aca8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f350.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f351.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f351.png
new file mode 100755
index 0000000..ee2139e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f351.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f352.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f352.png
new file mode 100755
index 0000000..8d3e044
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f352.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f353.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f353.png
new file mode 100755
index 0000000..13eb827
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f353.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f354.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f354.png
new file mode 100755
index 0000000..9f1a3fd
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f354.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f355.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f355.png
new file mode 100755
index 0000000..460367d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f355.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f356.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f356.png
new file mode 100755
index 0000000..d6b311b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f356.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f357.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f357.png
new file mode 100755
index 0000000..43ad859
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f357.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f358.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f358.png
new file mode 100755
index 0000000..954c901
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f358.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f359.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f359.png
new file mode 100755
index 0000000..04f8a88
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f359.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f35a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f35a.png
new file mode 100755
index 0000000..f4773ed
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f35a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f35b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f35b.png
new file mode 100755
index 0000000..7983c70
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f35b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f35c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f35c.png
new file mode 100755
index 0000000..78dc7d5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f35c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f35d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f35d.png
new file mode 100755
index 0000000..08de243
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f35d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f35e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f35e.png
new file mode 100755
index 0000000..7e7c637
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f35e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f35f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f35f.png
new file mode 100755
index 0000000..cfef669
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f35f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f360.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f360.png
new file mode 100755
index 0000000..32117fa
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f360.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f361.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f361.png
new file mode 100755
index 0000000..2d042ae
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f361.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f362.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f362.png
new file mode 100755
index 0000000..73add1c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f362.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f363.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f363.png
new file mode 100755
index 0000000..0d179bd
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f363.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f364.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f364.png
new file mode 100755
index 0000000..c8c284b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f364.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f365.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f365.png
new file mode 100755
index 0000000..a8f2261
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f365.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f366.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f366.png
new file mode 100755
index 0000000..871ce09
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f366.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f367.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f367.png
new file mode 100755
index 0000000..0d0b382
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f367.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f368.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f368.png
new file mode 100755
index 0000000..190be01
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f368.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f369.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f369.png
new file mode 100755
index 0000000..ccf8691
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f369.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f36a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f36a.png
new file mode 100755
index 0000000..653edb2
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f36a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f36b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f36b.png
new file mode 100755
index 0000000..c7ec19d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f36b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f36c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f36c.png
new file mode 100755
index 0000000..33722f2
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f36c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f36d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f36d.png
new file mode 100755
index 0000000..ba55e70
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f36d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f36e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f36e.png
new file mode 100755
index 0000000..9f843b4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f36e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f36f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f36f.png
new file mode 100755
index 0000000..7327889
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f36f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f370.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f370.png
new file mode 100755
index 0000000..efeb9b4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f370.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f371.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f371.png
new file mode 100755
index 0000000..c6d99e8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f371.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f372.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f372.png
new file mode 100755
index 0000000..6e80b4a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f372.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f373.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f373.png
new file mode 100755
index 0000000..c3de6ae
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f373.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f374.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f374.png
new file mode 100755
index 0000000..8ba4bc6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f374.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f375.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f375.png
new file mode 100755
index 0000000..3ece0b7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f375.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f376.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f376.png
new file mode 100755
index 0000000..1f69907
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f376.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f377.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f377.png
new file mode 100755
index 0000000..82b0f00
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f377.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f378.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f378.png
new file mode 100755
index 0000000..28b45ea
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f378.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f379.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f379.png
new file mode 100755
index 0000000..55ca9ee
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f379.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f37a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f37a.png
new file mode 100755
index 0000000..cd78bed
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f37a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f37b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f37b.png
new file mode 100755
index 0000000..cc5e4ab
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f37b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f37c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f37c.png
new file mode 100755
index 0000000..1b2cfe5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f37c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f380.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f380.png
new file mode 100755
index 0000000..63ee5ba
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f380.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f381.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f381.png
new file mode 100755
index 0000000..552cfdc
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f381.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f382.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f382.png
new file mode 100755
index 0000000..36e8edc
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f382.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f383.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f383.png
new file mode 100755
index 0000000..1f7667e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f383.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f384.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f384.png
new file mode 100755
index 0000000..d813b95
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f384.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f385.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f385.png
new file mode 100755
index 0000000..a2240c0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f385.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f386.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f386.png
new file mode 100755
index 0000000..b4eccd5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f386.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f387.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f387.png
new file mode 100755
index 0000000..4aabd7e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f387.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f388.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f388.png
new file mode 100755
index 0000000..a4d3207
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f388.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f389.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f389.png
new file mode 100755
index 0000000..7411b52
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f389.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f38a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f38a.png
new file mode 100755
index 0000000..bd293e3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f38a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f38b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f38b.png
new file mode 100755
index 0000000..4733464
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f38b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f38c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f38c.png
new file mode 100755
index 0000000..2ffbb26
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f38c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f38d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f38d.png
new file mode 100755
index 0000000..fc858d0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f38d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f38e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f38e.png
new file mode 100755
index 0000000..47ce339
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f38e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f38f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f38f.png
new file mode 100755
index 0000000..540164e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f38f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f390.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f390.png
new file mode 100755
index 0000000..efacf5d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f390.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f391.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f391.png
new file mode 100755
index 0000000..1436198
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f391.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f392.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f392.png
new file mode 100755
index 0000000..edfb19a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f392.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f393.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f393.png
new file mode 100755
index 0000000..2e811b0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f393.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a0.png
new file mode 100755
index 0000000..765d2c0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a1.png
new file mode 100755
index 0000000..54a1dcf
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a2.png
new file mode 100755
index 0000000..9180b98
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a3.png
new file mode 100755
index 0000000..d84609c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a4.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a4.png
new file mode 100755
index 0000000..ce19a2b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a4.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a5.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a5.png
new file mode 100755
index 0000000..9c14384
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a5.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a6.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a6.png
new file mode 100755
index 0000000..a990ccf
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a6.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a7.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a7.png
new file mode 100755
index 0000000..ad83000
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a7.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a8.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a8.png
new file mode 100755
index 0000000..d45212b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a8.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a9.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a9.png
new file mode 100755
index 0000000..7d27134
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3a9.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3aa.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3aa.png
new file mode 100755
index 0000000..4af8719
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3aa.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ab.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ab.png
new file mode 100755
index 0000000..cdacf1a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ab.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ac.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ac.png
new file mode 100755
index 0000000..4e1dc11
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ac.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ad.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ad.png
new file mode 100755
index 0000000..899fbe5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ad.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ae.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ae.png
new file mode 100755
index 0000000..59d45ba
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ae.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3af.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3af.png
new file mode 100755
index 0000000..0438fe5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3af.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b0.png
new file mode 100755
index 0000000..26f1148
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b1.png
new file mode 100755
index 0000000..c2c710d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b2.png
new file mode 100755
index 0000000..4136e78
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b3.png
new file mode 100755
index 0000000..13d8ece
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b4.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b4.png
new file mode 100755
index 0000000..cc46a6a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b4.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b5.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b5.png
new file mode 100755
index 0000000..68b261b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b5.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b6.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b6.png
new file mode 100755
index 0000000..a13147f
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b6.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b7.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b7.png
new file mode 100755
index 0000000..011559a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b7.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b8.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b8.png
new file mode 100755
index 0000000..2b7fa43
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b8.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b9.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b9.png
new file mode 100755
index 0000000..93647a4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3b9.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ba.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ba.png
new file mode 100755
index 0000000..8d4703f
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ba.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3bb.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3bb.png
new file mode 100755
index 0000000..0dba5ba
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3bb.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3bc.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3bc.png
new file mode 100755
index 0000000..0c927d3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3bc.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3bd.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3bd.png
new file mode 100755
index 0000000..0d68bba
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3bd.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3be.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3be.png
new file mode 100755
index 0000000..278d904
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3be.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3bf.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3bf.png
new file mode 100755
index 0000000..c97de3e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3bf.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c0.png
new file mode 100755
index 0000000..ef694be
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c1.png
new file mode 100755
index 0000000..ead4a68
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c2.png
new file mode 100755
index 0000000..aeda5c8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c3.png
new file mode 100755
index 0000000..1ecfd90
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c4.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c4.png
new file mode 100755
index 0000000..b067e8c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c4.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c6.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c6.png
new file mode 100755
index 0000000..95d3b63
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c6.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c7.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c7.png
new file mode 100755
index 0000000..e3bbaec
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c7.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c8.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c8.png
new file mode 100755
index 0000000..0e4e168
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c8.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c9.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c9.png
new file mode 100755
index 0000000..f8db67d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3c9.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ca.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ca.png
new file mode 100755
index 0000000..d3878a0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ca.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e0.png
new file mode 100755
index 0000000..95b9ee0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e1.png
new file mode 100755
index 0000000..eccbfe9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e2.png
new file mode 100755
index 0000000..3f20b56
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e3.png
new file mode 100755
index 0000000..43b59e3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e4.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e4.png
new file mode 100755
index 0000000..0f65b14
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e4.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e5.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e5.png
new file mode 100755
index 0000000..c05c493
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e5.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e6.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e6.png
new file mode 100755
index 0000000..1faa877
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e6.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e7.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e7.png
new file mode 100755
index 0000000..c2846e7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e7.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e8.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e8.png
new file mode 100755
index 0000000..d29f276
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e8.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e9.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e9.png
new file mode 100755
index 0000000..44d7db8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3e9.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ea.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ea.png
new file mode 100755
index 0000000..671696c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ea.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3eb.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3eb.png
new file mode 100755
index 0000000..afd922b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3eb.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ec.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ec.png
new file mode 100755
index 0000000..68d959c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ec.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ed.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ed.png
new file mode 100755
index 0000000..6404634
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ed.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ee.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ee.png
new file mode 100755
index 0000000..18730ad
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ee.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ef.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ef.png
new file mode 100755
index 0000000..f225ab2
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3ef.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3f0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3f0.png
new file mode 100755
index 0000000..8229b8a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f3f0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f400.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f400.png
new file mode 100755
index 0000000..1c463df
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f400.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f401.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f401.png
new file mode 100755
index 0000000..2d777e5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f401.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f402.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f402.png
new file mode 100755
index 0000000..f766980
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f402.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f403.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f403.png
new file mode 100755
index 0000000..3bcde3e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f403.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f404.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f404.png
new file mode 100755
index 0000000..594c921
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f404.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f405.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f405.png
new file mode 100755
index 0000000..b0c7d8d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f405.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f406.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f406.png
new file mode 100755
index 0000000..8abfc4a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f406.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f407.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f407.png
new file mode 100755
index 0000000..5bc993e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f407.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f408.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f408.png
new file mode 100755
index 0000000..977c992
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f408.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f409.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f409.png
new file mode 100755
index 0000000..e399d60
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f409.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f40a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f40a.png
new file mode 100755
index 0000000..7435d5a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f40a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f40b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f40b.png
new file mode 100755
index 0000000..4af657b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f40b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f40c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f40c.png
new file mode 100755
index 0000000..e75e69a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f40c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f40d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f40d.png
new file mode 100755
index 0000000..ef58933
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f40d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f40e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f40e.png
new file mode 100755
index 0000000..4d09c64
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f40e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f40f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f40f.png
new file mode 100755
index 0000000..5ea7bfb
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f40f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f410.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f410.png
new file mode 100755
index 0000000..4be9cf3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f410.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f411.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f411.png
new file mode 100755
index 0000000..c7277d2
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f411.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f412.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f412.png
new file mode 100755
index 0000000..6407035
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f412.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f413.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f413.png
new file mode 100755
index 0000000..fab23ad
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f413.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f414.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f414.png
new file mode 100755
index 0000000..6d25c0e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f414.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f415.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f415.png
new file mode 100755
index 0000000..c7f6a24
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f415.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f416.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f416.png
new file mode 100755
index 0000000..fec3374
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f416.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f417.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f417.png
new file mode 100755
index 0000000..8196ad4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f417.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f418.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f418.png
new file mode 100755
index 0000000..5ca0457
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f418.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f419.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f419.png
new file mode 100755
index 0000000..52ce64b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f419.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f41a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f41a.png
new file mode 100755
index 0000000..3145b56
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f41a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f41b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f41b.png
new file mode 100755
index 0000000..c2eaf7a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f41b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f41c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f41c.png
new file mode 100755
index 0000000..b92d1cc
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f41c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f41d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f41d.png
new file mode 100755
index 0000000..f537339
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f41d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f41e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f41e.png
new file mode 100755
index 0000000..222577c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f41e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f41f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f41f.png
new file mode 100755
index 0000000..dc2a3f5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f41f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f420.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f420.png
new file mode 100755
index 0000000..a6d7349
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f420.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f421.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f421.png
new file mode 100755
index 0000000..a1d47cb
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f421.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f422.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f422.png
new file mode 100755
index 0000000..04d1d96
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f422.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f423.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f423.png
new file mode 100755
index 0000000..005a555
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f423.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f424.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f424.png
new file mode 100755
index 0000000..9be8d29
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f424.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f425.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f425.png
new file mode 100755
index 0000000..39c25bc
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f425.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f426.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f426.png
new file mode 100755
index 0000000..e6be8c0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f426.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f427.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f427.png
new file mode 100755
index 0000000..d8edbcb
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f427.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f428.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f428.png
new file mode 100755
index 0000000..e17bd3c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f428.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f429.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f429.png
new file mode 100755
index 0000000..adac80b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f429.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f42a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f42a.png
new file mode 100755
index 0000000..c8c7b9f
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f42a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f42b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f42b.png
new file mode 100755
index 0000000..496c186
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f42b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f42c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f42c.png
new file mode 100755
index 0000000..9326077
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f42c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f42d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f42d.png
new file mode 100755
index 0000000..8ff162e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f42d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f42e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f42e.png
new file mode 100755
index 0000000..12e1ab6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f42e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f42f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f42f.png
new file mode 100755
index 0000000..d6cc84a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f42f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f430.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f430.png
new file mode 100755
index 0000000..5cb3ef6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f430.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f431.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f431.png
new file mode 100755
index 0000000..09b9ef7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f431.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f432.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f432.png
new file mode 100755
index 0000000..e5e556b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f432.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f433.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f433.png
new file mode 100755
index 0000000..5bb113e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f433.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f434.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f434.png
new file mode 100755
index 0000000..78d580a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f434.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f435.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f435.png
new file mode 100755
index 0000000..6964cf4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f435.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f436.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f436.png
new file mode 100755
index 0000000..389a02b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f436.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f437.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f437.png
new file mode 100755
index 0000000..f7f273c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f437.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f438.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f438.png
new file mode 100755
index 0000000..cfe11b1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f438.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f439.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f439.png
new file mode 100755
index 0000000..ada9c31
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f439.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f43a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f43a.png
new file mode 100755
index 0000000..c60c968
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f43a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f43b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f43b.png
new file mode 100755
index 0000000..f5afe92
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f43b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f43c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f43c.png
new file mode 100755
index 0000000..a794fb1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f43c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f43d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f43d.png
new file mode 100755
index 0000000..38d6124
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f43d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f43e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f43e.png
new file mode 100755
index 0000000..89b9fec
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f43e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f440.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f440.png
new file mode 100755
index 0000000..dc2216f
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f440.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f442.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f442.png
new file mode 100755
index 0000000..2bbbf10
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f442.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f443.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f443.png
new file mode 100755
index 0000000..ad17c16
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f443.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f444.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f444.png
new file mode 100755
index 0000000..826ed11
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f444.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f445.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f445.png
new file mode 100755
index 0000000..b0bab12
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f445.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f446.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f446.png
new file mode 100755
index 0000000..196d109
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f446.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f447.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f447.png
new file mode 100755
index 0000000..658c6d9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f447.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f448.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f448.png
new file mode 100755
index 0000000..fee9cac
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f448.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f449.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f449.png
new file mode 100755
index 0000000..b04e284
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f449.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f44a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f44a.png
new file mode 100755
index 0000000..2d41fd3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f44a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f44b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f44b.png
new file mode 100755
index 0000000..e78402e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f44b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f44c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f44c.png
new file mode 100755
index 0000000..3177439
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f44c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f44d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f44d.png
new file mode 100755
index 0000000..3a43eca
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f44d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f44e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f44e.png
new file mode 100755
index 0000000..e44c042
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f44e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f44f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f44f.png
new file mode 100755
index 0000000..d01c982
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f44f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f450.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f450.png
new file mode 100755
index 0000000..2cc25bd
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f450.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f451.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f451.png
new file mode 100755
index 0000000..39da1d5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f451.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f452.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f452.png
new file mode 100755
index 0000000..4cb2e6a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f452.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f453.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f453.png
new file mode 100755
index 0000000..a3cf75a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f453.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f454.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f454.png
new file mode 100755
index 0000000..80461c6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f454.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f455.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f455.png
new file mode 100755
index 0000000..297a6d6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f455.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f456.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f456.png
new file mode 100755
index 0000000..d721cea
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f456.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f457.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f457.png
new file mode 100755
index 0000000..6434e2e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f457.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f458.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f458.png
new file mode 100755
index 0000000..34ffe13
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f458.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f459.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f459.png
new file mode 100755
index 0000000..4ff63b4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f459.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f45a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f45a.png
new file mode 100755
index 0000000..aa297c7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f45a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f45b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f45b.png
new file mode 100755
index 0000000..8f06a2b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f45b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f45c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f45c.png
new file mode 100755
index 0000000..d7adf04
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f45c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f45d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f45d.png
new file mode 100755
index 0000000..0bc5879
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f45d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f45e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f45e.png
new file mode 100755
index 0000000..ecba9ba
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f45e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f45f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f45f.png
new file mode 100755
index 0000000..45b82e6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f45f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f460.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f460.png
new file mode 100755
index 0000000..525b6a0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f460.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f461.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f461.png
new file mode 100755
index 0000000..aa62cca
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f461.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f462.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f462.png
new file mode 100755
index 0000000..58d0fdb
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f462.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f463.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f463.png
new file mode 100755
index 0000000..d7a2561
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f463.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f464.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f464.png
new file mode 100755
index 0000000..d131398
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f464.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f465.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f465.png
new file mode 100755
index 0000000..1f3aabc
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f465.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f466.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f466.png
new file mode 100755
index 0000000..f79f1f2
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f466.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f467.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f467.png
new file mode 100755
index 0000000..ea41269
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f467.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f468.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f468.png
new file mode 100755
index 0000000..d9bfa26
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f468.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f469.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f469.png
new file mode 100755
index 0000000..6bf0d2b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f469.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f46a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f46a.png
new file mode 100755
index 0000000..b4b365f
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f46a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f46b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f46b.png
new file mode 100755
index 0000000..9e51f40
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f46b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f46c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f46c.png
new file mode 100755
index 0000000..d1099f2
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f46c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f46d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f46d.png
new file mode 100755
index 0000000..619646c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f46d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f46e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f46e.png
new file mode 100755
index 0000000..43a5a84
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f46e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f46f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f46f.png
new file mode 100755
index 0000000..2dfb451
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f46f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f470.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f470.png
new file mode 100755
index 0000000..dd0b0cf
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f470.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f471.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f471.png
new file mode 100755
index 0000000..c144301
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f471.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f472.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f472.png
new file mode 100755
index 0000000..7aad74b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f472.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f473.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f473.png
new file mode 100755
index 0000000..036604c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f473.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f474.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f474.png
new file mode 100755
index 0000000..149f0cf
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f474.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f475.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f475.png
new file mode 100755
index 0000000..f839565
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f475.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f476.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f476.png
new file mode 100755
index 0000000..3b29da4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f476.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f477.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f477.png
new file mode 100755
index 0000000..4d64860
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f477.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f478.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f478.png
new file mode 100755
index 0000000..1ebb2ce
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f478.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f479.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f479.png
new file mode 100755
index 0000000..e9f5471
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f479.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f47a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f47a.png
new file mode 100755
index 0000000..bd21b18
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f47a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f47b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f47b.png
new file mode 100755
index 0000000..671dd0c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f47b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f47c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f47c.png
new file mode 100755
index 0000000..da52c31
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f47c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f47d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f47d.png
new file mode 100755
index 0000000..e3fd76a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f47d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f47e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f47e.png
new file mode 100755
index 0000000..3840491
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f47e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f47f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f47f.png
new file mode 100755
index 0000000..48e5701
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f47f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f480.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f480.png
new file mode 100755
index 0000000..bd4ee38
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f480.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f481.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f481.png
new file mode 100755
index 0000000..52c0a50
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f481.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f482.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f482.png
new file mode 100755
index 0000000..b67b335
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f482.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f483.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f483.png
new file mode 100755
index 0000000..6885a0b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f483.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f484.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f484.png
new file mode 100755
index 0000000..82f990c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f484.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f485.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f485.png
new file mode 100755
index 0000000..6a66e63
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f485.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f486.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f486.png
new file mode 100755
index 0000000..dd30d15
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f486.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f487.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f487.png
new file mode 100755
index 0000000..902d273
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f487.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f488.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f488.png
new file mode 100755
index 0000000..a10cb23
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f488.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f489.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f489.png
new file mode 100755
index 0000000..e7e7ab6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f489.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f48a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f48a.png
new file mode 100755
index 0000000..cd84a78
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f48a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f48b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f48b.png
new file mode 100755
index 0000000..4ae2c2b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f48b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f48c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f48c.png
new file mode 100755
index 0000000..e29981f
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f48c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f48d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f48d.png
new file mode 100755
index 0000000..8a57fd6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f48d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f48e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f48e.png
new file mode 100755
index 0000000..8a5d8da
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f48e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f48f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f48f.png
new file mode 100755
index 0000000..d027908
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f48f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f490.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f490.png
new file mode 100755
index 0000000..ce63783
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f490.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f491.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f491.png
new file mode 100755
index 0000000..c503f40
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f491.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f492.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f492.png
new file mode 100755
index 0000000..ead19d5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f492.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f493.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f493.png
new file mode 100755
index 0000000..b6628f6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f493.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f494.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f494.png
new file mode 100755
index 0000000..a1bc850
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f494.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f495.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f495.png
new file mode 100755
index 0000000..b189e9a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f495.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f496.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f496.png
new file mode 100755
index 0000000..0826bbc
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f496.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f497.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f497.png
new file mode 100755
index 0000000..a7491cb
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f497.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f498.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f498.png
new file mode 100755
index 0000000..4987284
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f498.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f499.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f499.png
new file mode 100755
index 0000000..baa29b3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f499.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f49a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f49a.png
new file mode 100755
index 0000000..7289cb8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f49a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f49b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f49b.png
new file mode 100755
index 0000000..fa41ce7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f49b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f49c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f49c.png
new file mode 100755
index 0000000..d5f8750
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f49c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f49d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f49d.png
new file mode 100755
index 0000000..f31c26a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f49d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f49e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f49e.png
new file mode 100755
index 0000000..ea3317c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f49e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f49f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f49f.png
new file mode 100755
index 0000000..b40a486
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f49f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a0.png
new file mode 100755
index 0000000..dfd1098
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a1.png
new file mode 100755
index 0000000..23afca1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a2.png
new file mode 100755
index 0000000..6fb4dca
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a3.png
new file mode 100755
index 0000000..3289787
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a4.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a4.png
new file mode 100755
index 0000000..30be046
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a4.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a5.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a5.png
new file mode 100755
index 0000000..bddeb8f
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a5.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a6.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a6.png
new file mode 100755
index 0000000..a83b3e9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a6.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a7.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a7.png
new file mode 100755
index 0000000..9eff463
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a7.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a8.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a8.png
new file mode 100755
index 0000000..dc2c0a8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a8.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a9.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a9.png
new file mode 100755
index 0000000..73a4dc8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4a9.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4aa.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4aa.png
new file mode 100755
index 0000000..19f92ef
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4aa.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ab.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ab.png
new file mode 100755
index 0000000..55213d2
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ab.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ac.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ac.png
new file mode 100755
index 0000000..2896c27
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ac.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ad.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ad.png
new file mode 100755
index 0000000..701bdf0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ad.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ae.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ae.png
new file mode 100755
index 0000000..c0929d0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ae.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4af.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4af.png
new file mode 100755
index 0000000..bce9ab1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4af.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b0.png
new file mode 100755
index 0000000..5546c04
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b1.png
new file mode 100755
index 0000000..d5ee21f
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b2.png
new file mode 100755
index 0000000..361e26a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b3.png
new file mode 100755
index 0000000..be1c1dd
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b4.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b4.png
new file mode 100755
index 0000000..139bc93
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b4.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b5.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b5.png
new file mode 100755
index 0000000..63de884
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b5.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b6.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b6.png
new file mode 100755
index 0000000..1c5904b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b6.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b7.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b7.png
new file mode 100755
index 0000000..f8be91d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b7.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b8.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b8.png
new file mode 100755
index 0000000..135e398
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b8.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b9.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b9.png
new file mode 100755
index 0000000..ac2c4bb
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4b9.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ba.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ba.png
new file mode 100755
index 0000000..d1cb864
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ba.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4bb.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4bb.png
new file mode 100755
index 0000000..d4d2687
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4bb.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4bc.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4bc.png
new file mode 100755
index 0000000..46e82b0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4bc.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4bd.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4bd.png
new file mode 100755
index 0000000..e19cc5d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4bd.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4be.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4be.png
new file mode 100755
index 0000000..4ad5631
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4be.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4bf.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4bf.png
new file mode 100755
index 0000000..baff835
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4bf.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c0.png
new file mode 100755
index 0000000..363c83d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c1.png
new file mode 100755
index 0000000..4d8bebf
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c2.png
new file mode 100755
index 0000000..2bbbbf5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c3.png
new file mode 100755
index 0000000..bf8f979
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c4.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c4.png
new file mode 100755
index 0000000..64cd2e1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c4.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c5.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c5.png
new file mode 100755
index 0000000..6ad2efa
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c5.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c6.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c6.png
new file mode 100755
index 0000000..900b868
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c6.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c7.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c7.png
new file mode 100755
index 0000000..374e94e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c7.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c8.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c8.png
new file mode 100755
index 0000000..de3e9ba
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c8.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c9.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c9.png
new file mode 100755
index 0000000..65b82f0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4c9.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ca.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ca.png
new file mode 100755
index 0000000..7871cc6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ca.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4cb.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4cb.png
new file mode 100755
index 0000000..e2c74e6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4cb.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4cc.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4cc.png
new file mode 100755
index 0000000..540c4ec
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4cc.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4cd.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4cd.png
new file mode 100755
index 0000000..e498e92
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4cd.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ce.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ce.png
new file mode 100755
index 0000000..774412d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ce.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4cf.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4cf.png
new file mode 100755
index 0000000..af8cb4b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4cf.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d0.png
new file mode 100755
index 0000000..383677c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d1.png
new file mode 100755
index 0000000..0c4e3bf
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d2.png
new file mode 100755
index 0000000..e4f72ac
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d3.png
new file mode 100755
index 0000000..07ea608
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d4.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d4.png
new file mode 100755
index 0000000..4f3b14c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d4.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d5.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d5.png
new file mode 100755
index 0000000..484029c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d5.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d6.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d6.png
new file mode 100755
index 0000000..8b69841
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d6.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d7.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d7.png
new file mode 100755
index 0000000..e86651e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d7.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d8.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d8.png
new file mode 100755
index 0000000..e2b9e8c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d8.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d9.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d9.png
new file mode 100755
index 0000000..49650d5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4d9.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4da.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4da.png
new file mode 100755
index 0000000..dca06a1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4da.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4db.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4db.png
new file mode 100755
index 0000000..2b712dc
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4db.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4dc.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4dc.png
new file mode 100755
index 0000000..c5a10e6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4dc.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4dd.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4dd.png
new file mode 100755
index 0000000..fc97ddb
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4dd.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4de.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4de.png
new file mode 100755
index 0000000..36e21e0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4de.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4df.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4df.png
new file mode 100755
index 0000000..e3e1fc4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4df.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e0.png
new file mode 100755
index 0000000..62be2c9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e1.png
new file mode 100755
index 0000000..3481cc2
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e2.png
new file mode 100755
index 0000000..752385e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e3.png
new file mode 100755
index 0000000..5d9319e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e4.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e4.png
new file mode 100755
index 0000000..7ad15e6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e4.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e5.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e5.png
new file mode 100755
index 0000000..e2df0f8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e5.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e6.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e6.png
new file mode 100755
index 0000000..26602af
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e6.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e7.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e7.png
new file mode 100755
index 0000000..176a8e1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e7.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e8.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e8.png
new file mode 100755
index 0000000..afc8271
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e8.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e9.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e9.png
new file mode 100755
index 0000000..0e01fd5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4e9.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ea.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ea.png
new file mode 100755
index 0000000..a5982b6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ea.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4eb.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4eb.png
new file mode 100755
index 0000000..8351e70
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4eb.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ec.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ec.png
new file mode 100755
index 0000000..dae3459
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ec.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ed.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ed.png
new file mode 100755
index 0000000..59f15c5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ed.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ee.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ee.png
new file mode 100755
index 0000000..ce04b70
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ee.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ef.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ef.png
new file mode 100755
index 0000000..e9b713b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4ef.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f0.png
new file mode 100755
index 0000000..d171394
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f1.png
new file mode 100755
index 0000000..df00710
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f2.png
new file mode 100755
index 0000000..837897f
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f3.png
new file mode 100755
index 0000000..a716e96
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f4.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f4.png
new file mode 100755
index 0000000..fa16c76
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f4.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f5.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f5.png
new file mode 100755
index 0000000..41df57c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f5.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f6.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f6.png
new file mode 100755
index 0000000..a4bd23e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f6.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f7.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f7.png
new file mode 100755
index 0000000..397d03b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f7.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f9.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f9.png
new file mode 100755
index 0000000..274cecd
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4f9.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4fa.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4fa.png
new file mode 100755
index 0000000..803dc3d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4fa.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4fb.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4fb.png
new file mode 100755
index 0000000..ea589ef
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4fb.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4fc.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4fc.png
new file mode 100755
index 0000000..881081c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f4fc.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f500.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f500.png
new file mode 100755
index 0000000..25cde18
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f500.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f501.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f501.png
new file mode 100755
index 0000000..80113b6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f501.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f502.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f502.png
new file mode 100755
index 0000000..3c47bcc
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f502.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f503.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f503.png
new file mode 100755
index 0000000..5f84d7e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f503.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f504.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f504.png
new file mode 100755
index 0000000..1933ae1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f504.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f505.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f505.png
new file mode 100755
index 0000000..ea15bde
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f505.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f506.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f506.png
new file mode 100755
index 0000000..ba9de7d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f506.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f507.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f507.png
new file mode 100755
index 0000000..4cf67c3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f507.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f508.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f508.png
new file mode 100755
index 0000000..c884bd4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f508.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f509.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f509.png
new file mode 100755
index 0000000..6aa4dbf
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f509.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f50a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f50a.png
new file mode 100755
index 0000000..f63e814
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f50a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f50b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f50b.png
new file mode 100755
index 0000000..aa7eedc
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f50b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f50c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f50c.png
new file mode 100755
index 0000000..7a3d6ce
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f50c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f50d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f50d.png
new file mode 100755
index 0000000..aa5b1d7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f50d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f50e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f50e.png
new file mode 100755
index 0000000..6e6cf11
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f50e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f50f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f50f.png
new file mode 100755
index 0000000..375e67e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f50f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f510.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f510.png
new file mode 100755
index 0000000..e6fdf6c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f510.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f511.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f511.png
new file mode 100755
index 0000000..3467321
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f511.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f512.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f512.png
new file mode 100755
index 0000000..4892b02
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f512.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f513.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f513.png
new file mode 100755
index 0000000..22b429c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f513.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f514.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f514.png
new file mode 100755
index 0000000..69acceb
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f514.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f515.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f515.png
new file mode 100755
index 0000000..613b81c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f515.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f516.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f516.png
new file mode 100755
index 0000000..dbee45c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f516.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f517.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f517.png
new file mode 100755
index 0000000..ffb8f62
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f517.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f518.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f518.png
new file mode 100755
index 0000000..63755ee
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f518.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f519.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f519.png
new file mode 100755
index 0000000..0cde628
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f519.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f51a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f51a.png
new file mode 100755
index 0000000..edb0bda
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f51a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f51b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f51b.png
new file mode 100755
index 0000000..3595387
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f51b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f51c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f51c.png
new file mode 100755
index 0000000..9386615
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f51c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f51d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f51d.png
new file mode 100755
index 0000000..5aa4dd4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f51d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f51e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f51e.png
new file mode 100755
index 0000000..a789b3c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f51e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f51f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f51f.png
new file mode 100755
index 0000000..71dac1c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f51f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f520.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f520.png
new file mode 100755
index 0000000..ffc0cba
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f520.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f521.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f521.png
new file mode 100755
index 0000000..5218470
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f521.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f522.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f522.png
new file mode 100755
index 0000000..c47c2e1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f522.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f523.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f523.png
new file mode 100755
index 0000000..16bc1da
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f523.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f524.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f524.png
new file mode 100755
index 0000000..505d40a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f524.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f525.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f525.png
new file mode 100755
index 0000000..f2a3149
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f525.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f526.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f526.png
new file mode 100755
index 0000000..215940a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f526.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f527.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f527.png
new file mode 100755
index 0000000..a87072a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f527.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f528.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f528.png
new file mode 100755
index 0000000..6b75bc3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f528.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f529.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f529.png
new file mode 100755
index 0000000..bddfa72
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f529.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f52a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f52a.png
new file mode 100755
index 0000000..18eade0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f52a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f52b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f52b.png
new file mode 100755
index 0000000..c49dc52
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f52b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f52c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f52c.png
new file mode 100755
index 0000000..f11d54c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f52c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f52d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f52d.png
new file mode 100755
index 0000000..51fd8a0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f52d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f52e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f52e.png
new file mode 100755
index 0000000..6d2c6c4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f52e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f52f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f52f.png
new file mode 100755
index 0000000..010f8f5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f52f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f530.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f530.png
new file mode 100755
index 0000000..1f022d1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f530.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f531.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f531.png
new file mode 100755
index 0000000..d79a7b4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f531.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f532.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f532.png
new file mode 100755
index 0000000..7332e39
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f532.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f533.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f533.png
new file mode 100755
index 0000000..63c7a3e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f533.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f534.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f534.png
new file mode 100755
index 0000000..b391289
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f534.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f535.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f535.png
new file mode 100755
index 0000000..a5b4ad4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f535.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f536.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f536.png
new file mode 100755
index 0000000..46d52e5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f536.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f537.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f537.png
new file mode 100755
index 0000000..f4598ec
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f537.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f538.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f538.png
new file mode 100755
index 0000000..04941d3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f538.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f539.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f539.png
new file mode 100755
index 0000000..5a7b5d5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f539.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f53a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f53a.png
new file mode 100755
index 0000000..8c4428d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f53a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f53b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f53b.png
new file mode 100755
index 0000000..94832f0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f53b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f53c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f53c.png
new file mode 100755
index 0000000..1217331
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f53c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f53d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f53d.png
new file mode 100755
index 0000000..f7f2d51
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f53d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f550.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f550.png
new file mode 100755
index 0000000..ca34e89
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f550.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f551.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f551.png
new file mode 100755
index 0000000..1a12524
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f551.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f552.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f552.png
new file mode 100755
index 0000000..cd99bb1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f552.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f553.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f553.png
new file mode 100755
index 0000000..7274e8b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f553.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f554.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f554.png
new file mode 100755
index 0000000..3ed5a81
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f554.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f555.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f555.png
new file mode 100755
index 0000000..ac38cb9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f555.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f556.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f556.png
new file mode 100755
index 0000000..6a138df
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f556.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f557.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f557.png
new file mode 100755
index 0000000..6690cd7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f557.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f558.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f558.png
new file mode 100755
index 0000000..c4ad746
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f558.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f559.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f559.png
new file mode 100755
index 0000000..f710bef
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f559.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f55a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f55a.png
new file mode 100755
index 0000000..fbc165b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f55a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f55b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f55b.png
new file mode 100755
index 0000000..c1ca82f
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f55b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f55c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f55c.png
new file mode 100755
index 0000000..df93920
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f55c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f55d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f55d.png
new file mode 100755
index 0000000..f12c691
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f55d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f55e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f55e.png
new file mode 100755
index 0000000..1dc9628
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f55e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f55f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f55f.png
new file mode 100755
index 0000000..7726aae
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f55f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f560.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f560.png
new file mode 100755
index 0000000..e08d4ad
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f560.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f561.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f561.png
new file mode 100755
index 0000000..46f0681
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f561.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f562.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f562.png
new file mode 100755
index 0000000..18aab22
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f562.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f563.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f563.png
new file mode 100755
index 0000000..ec3e382
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f563.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f564.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f564.png
new file mode 100755
index 0000000..fd35221
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f564.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f565.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f565.png
new file mode 100755
index 0000000..84a3bc8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f565.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f566.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f566.png
new file mode 100755
index 0000000..415999e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f566.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f567.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f567.png
new file mode 100755
index 0000000..a652715
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f567.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f5fb.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f5fb.png
new file mode 100755
index 0000000..4c313e5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f5fb.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f5fc.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f5fc.png
new file mode 100755
index 0000000..e1cbd7a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f5fc.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f5fd.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f5fd.png
new file mode 100755
index 0000000..9ad9028
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f5fd.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f5fe.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f5fe.png
new file mode 100755
index 0000000..4593280
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f5fe.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f5ff.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f5ff.png
new file mode 100755
index 0000000..61a1a9c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f5ff.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f600.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f600.png
new file mode 100755
index 0000000..0ef00d7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f600.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f601.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f601.png
new file mode 100755
index 0000000..591cfce
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f601.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f602.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f602.png
new file mode 100755
index 0000000..47df693
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f602.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f603.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f603.png
new file mode 100755
index 0000000..77b581d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f603.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f604.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f604.png
new file mode 100755
index 0000000..81a8396
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f604.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f605.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f605.png
new file mode 100755
index 0000000..3903f71
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f605.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f606.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f606.png
new file mode 100755
index 0000000..11c91eb
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f606.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f607.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f607.png
new file mode 100755
index 0000000..503b614
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f607.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f608.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f608.png
new file mode 100755
index 0000000..d904049
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f608.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f609.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f609.png
new file mode 100755
index 0000000..756766d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f609.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f60a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f60a.png
new file mode 100755
index 0000000..1e9021c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f60a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f60b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f60b.png
new file mode 100755
index 0000000..fc39637
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f60b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f60c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f60c.png
new file mode 100755
index 0000000..820cf31
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f60c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f60d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f60d.png
new file mode 100755
index 0000000..0e57942
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f60d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f60e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f60e.png
new file mode 100755
index 0000000..1c468a1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f60e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f60f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f60f.png
new file mode 100755
index 0000000..bc6e508
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f60f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f610.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f610.png
new file mode 100755
index 0000000..682a1ba
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f610.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f611.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f611.png
new file mode 100755
index 0000000..1798f24
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f611.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f612.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f612.png
new file mode 100755
index 0000000..3722e6f
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f612.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f613.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f613.png
new file mode 100755
index 0000000..e894b76
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f613.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f614.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f614.png
new file mode 100755
index 0000000..2f3bad9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f614.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f615.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f615.png
new file mode 100755
index 0000000..18ff760
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f615.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f616.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f616.png
new file mode 100755
index 0000000..a5877a0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f616.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f617.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f617.png
new file mode 100755
index 0000000..eb049c8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f617.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f618.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f618.png
new file mode 100755
index 0000000..af9a80b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f618.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f619.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f619.png
new file mode 100755
index 0000000..d85706e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f619.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f61a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f61a.png
new file mode 100755
index 0000000..449de19
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f61a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f61b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f61b.png
new file mode 100755
index 0000000..53c4143
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f61b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f61c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f61c.png
new file mode 100755
index 0000000..6ae9d49
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f61c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f61d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f61d.png
new file mode 100755
index 0000000..333716e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f61d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f61e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f61e.png
new file mode 100755
index 0000000..8255200
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f61e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f61f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f61f.png
new file mode 100755
index 0000000..afd9283
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f61f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f620.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f620.png
new file mode 100755
index 0000000..34174f5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f620.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f621.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f621.png
new file mode 100755
index 0000000..c65ddff
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f621.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f622.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f622.png
new file mode 100755
index 0000000..6d0d9af
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f622.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f623.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f623.png
new file mode 100755
index 0000000..c7e433e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f623.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f624.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f624.png
new file mode 100755
index 0000000..92f93bd
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f624.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f625.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f625.png
new file mode 100755
index 0000000..fa5f9e7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f625.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f626.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f626.png
new file mode 100755
index 0000000..7f8b6c7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f626.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f627.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f627.png
new file mode 100755
index 0000000..c2edad7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f627.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f628.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f628.png
new file mode 100755
index 0000000..513fce4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f628.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f629.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f629.png
new file mode 100755
index 0000000..0c54754
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f629.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f62a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f62a.png
new file mode 100755
index 0000000..df4f55e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f62a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f62b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f62b.png
new file mode 100755
index 0000000..3a8eefe
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f62b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f62c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f62c.png
new file mode 100755
index 0000000..f78e940
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f62c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f62d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f62d.png
new file mode 100755
index 0000000..7d43318
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f62d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f62e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f62e.png
new file mode 100755
index 0000000..e528358
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f62e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f62f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f62f.png
new file mode 100755
index 0000000..afa3f66
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f62f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f630.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f630.png
new file mode 100755
index 0000000..b9e39bc
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f630.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f631.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f631.png
new file mode 100755
index 0000000..76bfc6b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f631.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f632.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f632.png
new file mode 100755
index 0000000..858a834
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f632.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f633.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f633.png
new file mode 100755
index 0000000..9b49410
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f633.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f634.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f634.png
new file mode 100755
index 0000000..a2f3bf7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f634.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f635.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f635.png
new file mode 100755
index 0000000..8001d6f
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f635.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f636.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f636.png
new file mode 100755
index 0000000..d9ec7ca
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f636.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f637.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f637.png
new file mode 100755
index 0000000..05887e9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f637.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f638.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f638.png
new file mode 100755
index 0000000..ad333ba
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f638.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f639.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f639.png
new file mode 100755
index 0000000..6c60cb0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f639.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f63a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f63a.png
new file mode 100755
index 0000000..dbf1b02
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f63a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f63b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f63b.png
new file mode 100755
index 0000000..eeba240
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f63b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f63c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f63c.png
new file mode 100755
index 0000000..351565e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f63c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f63d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f63d.png
new file mode 100755
index 0000000..adc62fb
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f63d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f63e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f63e.png
new file mode 100755
index 0000000..4325fd4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f63e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f63f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f63f.png
new file mode 100755
index 0000000..42d4c27
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f63f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f640.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f640.png
new file mode 100755
index 0000000..d94cd34
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f640.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f645.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f645.png
new file mode 100755
index 0000000..d459a35
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f645.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f646.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f646.png
new file mode 100755
index 0000000..e8b9819
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f646.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f647.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f647.png
new file mode 100755
index 0000000..024cb61
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f647.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f648.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f648.png
new file mode 100755
index 0000000..0890a62
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f648.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f649.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f649.png
new file mode 100755
index 0000000..f97a1f9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f649.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f64a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f64a.png
new file mode 100755
index 0000000..87944c4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f64a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f64b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f64b.png
new file mode 100755
index 0000000..e1741a4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f64b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f64c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f64c.png
new file mode 100755
index 0000000..e03142b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f64c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f64d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f64d.png
new file mode 100755
index 0000000..6f34d5e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f64d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f64e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f64e.png
new file mode 100755
index 0000000..c4a95c3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f64e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f64f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f64f.png
new file mode 100755
index 0000000..f86c992
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f64f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f680.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f680.png
new file mode 100755
index 0000000..783078d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f680.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f681.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f681.png
new file mode 100755
index 0000000..8e82a0d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f681.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f682.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f682.png
new file mode 100755
index 0000000..5495077
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f682.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f683.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f683.png
new file mode 100755
index 0000000..2236115
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f683.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f684.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f684.png
new file mode 100755
index 0000000..8eca368
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f684.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f685.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f685.png
new file mode 100755
index 0000000..16651ac
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f685.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f686.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f686.png
new file mode 100755
index 0000000..9c0d3ab
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f686.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f687.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f687.png
new file mode 100755
index 0000000..7f34f6b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f687.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f688.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f688.png
new file mode 100755
index 0000000..bcfe801
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f688.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f689.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f689.png
new file mode 100755
index 0000000..e77daa8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f689.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f68a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f68a.png
new file mode 100755
index 0000000..5eb29fb
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f68a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f68b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f68b.png
new file mode 100755
index 0000000..0a8ea52
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f68b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f68c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f68c.png
new file mode 100755
index 0000000..823aa39
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f68c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f68d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f68d.png
new file mode 100755
index 0000000..3695f76
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f68d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f68e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f68e.png
new file mode 100755
index 0000000..b9740a5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f68e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f68f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f68f.png
new file mode 100755
index 0000000..99af232
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f68f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f690.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f690.png
new file mode 100755
index 0000000..c52cef2
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f690.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f691.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f691.png
new file mode 100755
index 0000000..b740f45
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f691.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f692.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f692.png
new file mode 100755
index 0000000..9e6c59c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f692.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f693.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f693.png
new file mode 100755
index 0000000..b8f1727
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f693.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f694.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f694.png
new file mode 100755
index 0000000..af20e7e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f694.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f695.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f695.png
new file mode 100755
index 0000000..60a50d3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f695.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f696.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f696.png
new file mode 100755
index 0000000..f78cf31
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f696.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f697.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f697.png
new file mode 100755
index 0000000..d70a2f0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f697.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f698.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f698.png
new file mode 100755
index 0000000..cb46de2
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f698.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f699.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f699.png
new file mode 100755
index 0000000..978291e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f699.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f69a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f69a.png
new file mode 100755
index 0000000..3f25ba1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f69a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f69b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f69b.png
new file mode 100755
index 0000000..81ec1f9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f69b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f69c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f69c.png
new file mode 100755
index 0000000..058fd3e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f69c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f69d.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f69d.png
new file mode 100755
index 0000000..913d300
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f69d.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f69e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f69e.png
new file mode 100755
index 0000000..1f3d1aa
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f69e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f69f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f69f.png
new file mode 100755
index 0000000..aaa45f6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f69f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a0.png
new file mode 100755
index 0000000..5688bb2
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a1.png
new file mode 100755
index 0000000..38f6dfe
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a2.png
new file mode 100755
index 0000000..5d2d8b6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a3.png
new file mode 100755
index 0000000..fe8ae3e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a4.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a4.png
new file mode 100755
index 0000000..da6689b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a4.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a5.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a5.png
new file mode 100755
index 0000000..42eaf70
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a5.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a6.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a6.png
new file mode 100755
index 0000000..7a5ba35
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a6.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a7.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a7.png
new file mode 100755
index 0000000..523e9f1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a7.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a8.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a8.png
new file mode 100755
index 0000000..6cf4a77
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a8.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a9.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a9.png
new file mode 100755
index 0000000..f9a3f32
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6a9.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6aa.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6aa.png
new file mode 100755
index 0000000..83c819a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6aa.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6ab.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6ab.png
new file mode 100755
index 0000000..a8444d1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6ab.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6ac.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6ac.png
new file mode 100755
index 0000000..4aad6cb
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6ac.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6ad.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6ad.png
new file mode 100755
index 0000000..eb11d79
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6ad.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6ae.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6ae.png
new file mode 100755
index 0000000..c2e350c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6ae.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6af.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6af.png
new file mode 100755
index 0000000..38c7ae7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6af.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b0.png
new file mode 100755
index 0000000..e9fd560
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b1.png
new file mode 100755
index 0000000..1b29d35
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b2.png
new file mode 100755
index 0000000..6573860
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b3.png
new file mode 100755
index 0000000..4b26216
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b4.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b4.png
new file mode 100755
index 0000000..4e3e054
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b4.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b5.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b5.png
new file mode 100755
index 0000000..b698897
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b5.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b6.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b6.png
new file mode 100755
index 0000000..7a2bfac
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b6.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b7.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b7.png
new file mode 100755
index 0000000..c35f530
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b7.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b8.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b8.png
new file mode 100755
index 0000000..b0302ae
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b8.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b9.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b9.png
new file mode 100755
index 0000000..abccfc9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6b9.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6ba.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6ba.png
new file mode 100755
index 0000000..518b76a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6ba.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6bb.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6bb.png
new file mode 100755
index 0000000..312ca3d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6bb.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6bc.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6bc.png
new file mode 100755
index 0000000..2e58725
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6bc.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6bd.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6bd.png
new file mode 100755
index 0000000..e5cc411
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6bd.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6be.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6be.png
new file mode 100755
index 0000000..dfe84d2
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6be.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6bf.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6bf.png
new file mode 100755
index 0000000..94f82aa
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6bf.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6c0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6c0.png
new file mode 100755
index 0000000..8f75d1d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6c0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6c1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6c1.png
new file mode 100755
index 0000000..1c3f844
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6c1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6c2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6c2.png
new file mode 100755
index 0000000..675b76d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6c2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6c3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6c3.png
new file mode 100755
index 0000000..92691e3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6c3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6c4.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6c4.png
new file mode 100755
index 0000000..59ae044
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6c4.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6c5.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6c5.png
new file mode 100755
index 0000000..1c08b46
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/1f6c5.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/203c-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/203c-fe0f.png
new file mode 100755
index 0000000..7270f0a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/203c-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2049-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2049-fe0f.png
new file mode 100755
index 0000000..64304b9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2049-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2122.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2122.png
new file mode 100755
index 0000000..9ba71b7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2122.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2139-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2139-fe0f.png
new file mode 100755
index 0000000..9cb8b09
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2139-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2194-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2194-fe0f.png
new file mode 100755
index 0000000..b9fd11c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2194-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2195-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2195-fe0f.png
new file mode 100755
index 0000000..b718c21
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2195-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2196-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2196-fe0f.png
new file mode 100755
index 0000000..12aebd9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2196-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2197-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2197-fe0f.png
new file mode 100755
index 0000000..0daf4e9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2197-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2198-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2198-fe0f.png
new file mode 100755
index 0000000..2a15cc7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2198-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2199-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2199-fe0f.png
new file mode 100755
index 0000000..a4438cb
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2199-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/21a9-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/21a9-fe0f.png
new file mode 100755
index 0000000..bc45dfe
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/21a9-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/21aa-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/21aa-fe0f.png
new file mode 100755
index 0000000..8b4ea6e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/21aa-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/231a-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/231a-fe0f.png
new file mode 100755
index 0000000..d503bb8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/231a-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/231b-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/231b-fe0f.png
new file mode 100755
index 0000000..405aab4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/231b-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/23e9.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/23e9.png
new file mode 100755
index 0000000..b94a117
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/23e9.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/23ea.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/23ea.png
new file mode 100755
index 0000000..13ba866
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/23ea.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/23eb.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/23eb.png
new file mode 100755
index 0000000..d42979d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/23eb.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/23ec.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/23ec.png
new file mode 100755
index 0000000..2ecbebc
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/23ec.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/23f0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/23f0.png
new file mode 100755
index 0000000..86ca8c8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/23f0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/23f3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/23f3.png
new file mode 100755
index 0000000..52c9eb7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/23f3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/24c2-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/24c2-fe0f.png
new file mode 100755
index 0000000..7424665
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/24c2-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25aa-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25aa-fe0f.png
new file mode 100755
index 0000000..a247751
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25aa-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25ab-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25ab-fe0f.png
new file mode 100755
index 0000000..24ba879
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25ab-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25b6-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25b6-fe0f.png
new file mode 100755
index 0000000..fbfe711
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25b6-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25c0-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25c0-fe0f.png
new file mode 100755
index 0000000..2be422b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25c0-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25fb-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25fb-fe0f.png
new file mode 100755
index 0000000..199808b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25fb-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25fc-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25fc-fe0f.png
new file mode 100755
index 0000000..204cce1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25fc-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25fd-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25fd-fe0f.png
new file mode 100755
index 0000000..a115cdc
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25fd-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25fe-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25fe-fe0f.png
new file mode 100755
index 0000000..25bfe9c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/25fe-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2600-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2600-fe0f.png
new file mode 100755
index 0000000..d23c095
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2600-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2601-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2601-fe0f.png
new file mode 100755
index 0000000..b31c08c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2601-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/260e-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/260e-fe0f.png
new file mode 100755
index 0000000..87d2559
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/260e-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2611-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2611-fe0f.png
new file mode 100755
index 0000000..f07a466
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2611-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2614-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2614-fe0f.png
new file mode 100755
index 0000000..1db722f
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2614-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2615-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2615-fe0f.png
new file mode 100755
index 0000000..57e1adc
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2615-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/261d-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/261d-fe0f.png
new file mode 100755
index 0000000..01896e2
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/261d-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/263a-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/263a-fe0f.png
new file mode 100755
index 0000000..bbab82d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/263a-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2648-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2648-fe0f.png
new file mode 100755
index 0000000..d676fd3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2648-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2649-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2649-fe0f.png
new file mode 100755
index 0000000..6af582f
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2649-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/264a-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/264a-fe0f.png
new file mode 100755
index 0000000..d926f6e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/264a-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/264b-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/264b-fe0f.png
new file mode 100755
index 0000000..ea43a4a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/264b-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/264c-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/264c-fe0f.png
new file mode 100755
index 0000000..e025933
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/264c-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/264d-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/264d-fe0f.png
new file mode 100755
index 0000000..72e1763
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/264d-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/264e-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/264e-fe0f.png
new file mode 100755
index 0000000..c9062dd
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/264e-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/264f-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/264f-fe0f.png
new file mode 100755
index 0000000..67fcea1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/264f-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2650-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2650-fe0f.png
new file mode 100755
index 0000000..8b5435b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2650-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2651-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2651-fe0f.png
new file mode 100755
index 0000000..f2044e7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2651-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2652-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2652-fe0f.png
new file mode 100755
index 0000000..cbff66e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2652-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2653-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2653-fe0f.png
new file mode 100755
index 0000000..5a2da0a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2653-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2660-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2660-fe0f.png
new file mode 100755
index 0000000..133a1ab
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2660-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2663-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2663-fe0f.png
new file mode 100755
index 0000000..bfab536
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2663-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2665-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2665-fe0f.png
new file mode 100755
index 0000000..e894715
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2665-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2666-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2666-fe0f.png
new file mode 100755
index 0000000..fe08277
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2666-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2668-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2668-fe0f.png
new file mode 100755
index 0000000..a0bc9d7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2668-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/267b-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/267b-fe0f.png
new file mode 100755
index 0000000..99104c0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/267b-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/267f-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/267f-fe0f.png
new file mode 100755
index 0000000..eddcdd7
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/267f-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2693-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2693-fe0f.png
new file mode 100755
index 0000000..0c5192e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2693-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26a0-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26a0-fe0f.png
new file mode 100755
index 0000000..466658d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26a0-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26a1-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26a1-fe0f.png
new file mode 100755
index 0000000..260c531
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26a1-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26aa-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26aa-fe0f.png
new file mode 100755
index 0000000..da782ae
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26aa-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26ab-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26ab-fe0f.png
new file mode 100755
index 0000000..e46f9df
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26ab-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26bd-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26bd-fe0f.png
new file mode 100755
index 0000000..1e118b5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26bd-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26be-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26be-fe0f.png
new file mode 100755
index 0000000..da004e2
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26be-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26c4-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26c4-fe0f.png
new file mode 100755
index 0000000..a97902e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26c4-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26c5-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26c5-fe0f.png
new file mode 100755
index 0000000..020dd5f
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26c5-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26ce.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26ce.png
new file mode 100755
index 0000000..4eef715
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26ce.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26d4-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26d4-fe0f.png
new file mode 100755
index 0000000..cf2086a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26d4-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26ea-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26ea-fe0f.png
new file mode 100755
index 0000000..4c07c6b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26ea-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26f2-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26f2-fe0f.png
new file mode 100755
index 0000000..da126e6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26f2-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26f3-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26f3-fe0f.png
new file mode 100755
index 0000000..cba2116
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26f3-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26f5-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26f5-fe0f.png
new file mode 100755
index 0000000..ff656dc
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26f5-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26fa-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26fa-fe0f.png
new file mode 100755
index 0000000..5c0d20e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26fa-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26fd-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26fd-fe0f.png
new file mode 100755
index 0000000..54c29ae
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/26fd-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2702-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2702-fe0f.png
new file mode 100755
index 0000000..020e052
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2702-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2705.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2705.png
new file mode 100755
index 0000000..61dc058
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2705.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2708-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2708-fe0f.png
new file mode 100755
index 0000000..8407cb6
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2708-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2709-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2709-fe0f.png
new file mode 100755
index 0000000..3631861
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2709-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/270a.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/270a.png
new file mode 100755
index 0000000..ecc8874
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/270a.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/270b.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/270b.png
new file mode 100755
index 0000000..5e45c25
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/270b.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/270c-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/270c-fe0f.png
new file mode 100755
index 0000000..f61267c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/270c-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/270f-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/270f-fe0f.png
new file mode 100755
index 0000000..e624373
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/270f-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2712-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2712-fe0f.png
new file mode 100755
index 0000000..29f6994
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2712-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2714-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2714-fe0f.png
new file mode 100755
index 0000000..336d262
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2714-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2716-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2716-fe0f.png
new file mode 100755
index 0000000..13d6660
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2716-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2728.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2728.png
new file mode 100755
index 0000000..9213882
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2728.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2733-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2733-fe0f.png
new file mode 100755
index 0000000..946a203
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2733-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2734-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2734-fe0f.png
new file mode 100755
index 0000000..73dc6a0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2734-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2744-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2744-fe0f.png
new file mode 100755
index 0000000..54b68ff
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2744-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2747-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2747-fe0f.png
new file mode 100755
index 0000000..23a68ce
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2747-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/274c.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/274c.png
new file mode 100755
index 0000000..b84f635
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/274c.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/274e.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/274e.png
new file mode 100755
index 0000000..b47a0ce
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/274e.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2753.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2753.png
new file mode 100755
index 0000000..63fd7f8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2753.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2754.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2754.png
new file mode 100755
index 0000000..57db41e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2754.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2755.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2755.png
new file mode 100755
index 0000000..a50d265
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2755.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2757-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2757-fe0f.png
new file mode 100755
index 0000000..4c560f5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2757-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2764-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2764-fe0f.png
new file mode 100755
index 0000000..7d7790c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2764-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2795.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2795.png
new file mode 100755
index 0000000..6159538
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2795.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2796.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2796.png
new file mode 100755
index 0000000..b8d3d82
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2796.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2797.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2797.png
new file mode 100755
index 0000000..ac757a2
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2797.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/27a1-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/27a1-fe0f.png
new file mode 100755
index 0000000..e5cca85
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/27a1-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/27b0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/27b0.png
new file mode 100755
index 0000000..8f051ac
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/27b0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/27bf.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/27bf.png
new file mode 100755
index 0000000..ef34df3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/27bf.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2934-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2934-fe0f.png
new file mode 100755
index 0000000..c8f670a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2934-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2935-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2935-fe0f.png
new file mode 100755
index 0000000..56dd3b9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2935-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b05-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b05-fe0f.png
new file mode 100755
index 0000000..9d7d1b5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b05-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b06-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b06-fe0f.png
new file mode 100755
index 0000000..565ce29
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b06-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b07-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b07-fe0f.png
new file mode 100755
index 0000000..3956eb3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b07-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b1b-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b1b-fe0f.png
new file mode 100755
index 0000000..71da10d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b1b-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b1c-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b1c-fe0f.png
new file mode 100755
index 0000000..60cb19a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b1c-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b50-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b50-fe0f.png
new file mode 100755
index 0000000..1bfddc8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b50-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b55-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b55-fe0f.png
new file mode 100755
index 0000000..0ededeb
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/2b55-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/3030.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/3030.png
new file mode 100755
index 0000000..77f626c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/3030.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/303d-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/303d-fe0f.png
new file mode 100755
index 0000000..45dc9b8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/303d-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/3297-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/3297-fe0f.png
new file mode 100755
index 0000000..dcbb1d2
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/3297-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/3299-fe0f.png b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/3299-fe0f.png
new file mode 100755
index 0000000..82e383a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/Separated/3299-fe0f.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat0_part0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat0_part0.png
new file mode 100755
index 0000000..89ac8ac
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat0_part0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat0_part1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat0_part1.png
new file mode 100755
index 0000000..28bce47
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat0_part1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat0_part2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat0_part2.png
new file mode 100755
index 0000000..ec21682
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat0_part2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat0_part3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat0_part3.png
new file mode 100755
index 0000000..b0a67f3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat0_part3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat0_part4.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat0_part4.png
new file mode 100755
index 0000000..61c5437
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat0_part4.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat0_part5.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat0_part5.png
new file mode 100755
index 0000000..16ddf15
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat0_part5.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat1_part0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat1_part0.png
new file mode 100755
index 0000000..5e5e4cd
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat1_part0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat1_part1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat1_part1.png
new file mode 100755
index 0000000..87b7425
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat1_part1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat1_part2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat1_part2.png
new file mode 100755
index 0000000..a06ef4e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat1_part2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat1_part3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat1_part3.png
new file mode 100755
index 0000000..1ce74a4
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat1_part3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part0.png
new file mode 100755
index 0000000..665bb59
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part1.png
new file mode 100755
index 0000000..6addd30
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part2.png
new file mode 100755
index 0000000..f581833
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part3.png
new file mode 100755
index 0000000..bc7e5d1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part4.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part4.png
new file mode 100755
index 0000000..ddaa1e9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part4.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part5.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part5.png
new file mode 100755
index 0000000..2b494ae
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part5.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part6.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part6.png
new file mode 100755
index 0000000..a06875b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat2_part6.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat3_part0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat3_part0.png
new file mode 100755
index 0000000..c506439
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat3_part0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat3_part1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat3_part1.png
new file mode 100755
index 0000000..6b2aac1
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat3_part1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat3_part2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat3_part2.png
new file mode 100755
index 0000000..3e2c0c5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat3_part2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat4_part0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat4_part0.png
new file mode 100755
index 0000000..36f31a3
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat4_part0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat4_part1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat4_part1.png
new file mode 100755
index 0000000..1bc77a8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat4_part1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat4_part2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat4_part2.png
new file mode 100755
index 0000000..c9ea9d5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat4_part2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat4_part3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat4_part3.png
new file mode 100755
index 0000000..da0064b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat4_part3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat4_part4.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat4_part4.png
new file mode 100755
index 0000000..04531d0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat4_part4.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat4_part5.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat4_part5.png
new file mode 100755
index 0000000..e5b3a88
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSprites/sprite64_cat4_part5.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat0_part0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat0_part0.png
new file mode 100755
index 0000000..a1aab42
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat0_part0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat0_part1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat0_part1.png
new file mode 100755
index 0000000..e3b9d22
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat0_part1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat0_part2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat0_part2.png
new file mode 100755
index 0000000..36b2727
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat0_part2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat0_part3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat0_part3.png
new file mode 100755
index 0000000..dd4ca7b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat0_part3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat1_part0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat1_part0.png
new file mode 100755
index 0000000..53daf0e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat1_part0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat1_part1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat1_part1.png
new file mode 100755
index 0000000..7eb3b0c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat1_part1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat1_part2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat1_part2.png
new file mode 100755
index 0000000..37ec77c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat1_part2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat2_part0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat2_part0.png
new file mode 100755
index 0000000..c0b216b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat2_part0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat2_part1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat2_part1.png
new file mode 100755
index 0000000..082786c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat2_part1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat2_part2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat2_part2.png
new file mode 100755
index 0000000..bdf3a94
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat2_part2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat2_part3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat2_part3.png
new file mode 100755
index 0000000..96a1804
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat2_part3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat2_part4.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat2_part4.png
new file mode 100755
index 0000000..539ae11
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat2_part4.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat3_part0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat3_part0.png
new file mode 100755
index 0000000..7e80868
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat3_part0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat3_part1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat3_part1.png
new file mode 100755
index 0000000..7c72d23
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat3_part1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat3_part2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat3_part2.png
new file mode 100755
index 0000000..b8ab291
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat3_part2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat4_part0.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat4_part0.png
new file mode 100755
index 0000000..ed22b18
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat4_part0.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat4_part1.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat4_part1.png
new file mode 100755
index 0000000..38840e9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat4_part1.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat4_part2.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat4_part2.png
new file mode 100755
index 0000000..f07b4a8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat4_part2.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat4_part3.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat4_part3.png
new file mode 100755
index 0000000..8bbe910
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat4_part3.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat4_part4.png b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat4_part4.png
new file mode 100755
index 0000000..7a630f9
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Emoji/SpacedSpritesLandscape/sprite64_landscape_cat4_part4.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Sounds/KbdFunction.wav b/EmojiPanel/EmojiPanel/Assets/Sounds/KbdFunction.wav
new file mode 100755
index 0000000..bf68554
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Sounds/KbdFunction.wav differ
diff --git a/EmojiPanel/EmojiPanel/Assets/Sounds/KbdKeyTap.wav b/EmojiPanel/EmojiPanel/Assets/Sounds/KbdKeyTap.wav
new file mode 100755
index 0000000..e67780f
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/Sounds/KbdKeyTap.wav differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.abc-720p.png b/EmojiPanel/EmojiPanel/Assets/emoji.abc-720p.png
new file mode 100755
index 0000000..92e3496
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.abc-720p.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.abc-WVGA.png b/EmojiPanel/EmojiPanel/Assets/emoji.abc-WVGA.png
new file mode 100755
index 0000000..3aa1199
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.abc-WVGA.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.abc-WXGA.png b/EmojiPanel/EmojiPanel/Assets/emoji.abc-WXGA.png
new file mode 100755
index 0000000..51b5d34
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.abc-WXGA.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.backspace-720p.png b/EmojiPanel/EmojiPanel/Assets/emoji.backspace-720p.png
new file mode 100755
index 0000000..6ab19a0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.backspace-720p.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.backspace-WVGA.png b/EmojiPanel/EmojiPanel/Assets/emoji.backspace-WVGA.png
new file mode 100755
index 0000000..3a2cd7e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.backspace-WVGA.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.backspace-WXGA.png b/EmojiPanel/EmojiPanel/Assets/emoji.backspace-WXGA.png
new file mode 100755
index 0000000..849473c
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.backspace-WXGA.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.category.1-720p.png b/EmojiPanel/EmojiPanel/Assets/emoji.category.1-720p.png
new file mode 100755
index 0000000..c7eaf20
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.category.1-720p.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.category.1-WVGA.png b/EmojiPanel/EmojiPanel/Assets/emoji.category.1-WVGA.png
new file mode 100755
index 0000000..605311d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.category.1-WVGA.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.category.1-WXGA.png b/EmojiPanel/EmojiPanel/Assets/emoji.category.1-WXGA.png
new file mode 100755
index 0000000..6a87e8a
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.category.1-WXGA.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.category.2-720p.png b/EmojiPanel/EmojiPanel/Assets/emoji.category.2-720p.png
new file mode 100755
index 0000000..bf756ab
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.category.2-720p.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.category.2-WVGA.png b/EmojiPanel/EmojiPanel/Assets/emoji.category.2-WVGA.png
new file mode 100755
index 0000000..838b601
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.category.2-WVGA.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.category.2-WXGA.png b/EmojiPanel/EmojiPanel/Assets/emoji.category.2-WXGA.png
new file mode 100755
index 0000000..3015a13
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.category.2-WXGA.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.category.3-720p.png b/EmojiPanel/EmojiPanel/Assets/emoji.category.3-720p.png
new file mode 100755
index 0000000..79401f5
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.category.3-720p.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.category.3-WVGA.png b/EmojiPanel/EmojiPanel/Assets/emoji.category.3-WVGA.png
new file mode 100755
index 0000000..b8ac7e8
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.category.3-WVGA.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.category.3-WXGA.png b/EmojiPanel/EmojiPanel/Assets/emoji.category.3-WXGA.png
new file mode 100755
index 0000000..1d446d0
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.category.3-WXGA.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.category.4-720p.png b/EmojiPanel/EmojiPanel/Assets/emoji.category.4-720p.png
new file mode 100755
index 0000000..6f95b3b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.category.4-720p.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.category.4-WVGA.png b/EmojiPanel/EmojiPanel/Assets/emoji.category.4-WVGA.png
new file mode 100755
index 0000000..ee2908e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.category.4-WVGA.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.category.4-WXGA.png b/EmojiPanel/EmojiPanel/Assets/emoji.category.4-WXGA.png
new file mode 100755
index 0000000..97cfc53
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.category.4-WXGA.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.category.5-720p.png b/EmojiPanel/EmojiPanel/Assets/emoji.category.5-720p.png
new file mode 100755
index 0000000..b0fb3bc
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.category.5-720p.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.category.5-WVGA.png b/EmojiPanel/EmojiPanel/Assets/emoji.category.5-WVGA.png
new file mode 100755
index 0000000..b78dbcd
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.category.5-WVGA.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.category.5-WXGA.png b/EmojiPanel/EmojiPanel/Assets/emoji.category.5-WXGA.png
new file mode 100755
index 0000000..6ca64ed
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.category.5-WXGA.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.recent-720p.png b/EmojiPanel/EmojiPanel/Assets/emoji.recent-720p.png
new file mode 100755
index 0000000..e19d42b
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.recent-720p.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.recent-WVGA.png b/EmojiPanel/EmojiPanel/Assets/emoji.recent-WVGA.png
new file mode 100755
index 0000000..977a942
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.recent-WVGA.png differ
diff --git a/EmojiPanel/EmojiPanel/Assets/emoji.recent-WXGA.png b/EmojiPanel/EmojiPanel/Assets/emoji.recent-WXGA.png
new file mode 100755
index 0000000..0680b5e
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Assets/emoji.recent-WXGA.png differ
diff --git a/EmojiPanel/EmojiPanel/Background.png b/EmojiPanel/EmojiPanel/Background.png
new file mode 100755
index 0000000..e46f21d
Binary files /dev/null and b/EmojiPanel/EmojiPanel/Background.png differ
diff --git a/EmojiPanel/EmojiPanel/Controls/Emoji/EmojiControl.xaml b/EmojiPanel/EmojiPanel/Controls/Emoji/EmojiControl.xaml
new file mode 100755
index 0000000..23df76b
--- /dev/null
+++ b/EmojiPanel/EmojiPanel/Controls/Emoji/EmojiControl.xaml
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/EmojiPanel/EmojiPanel/Controls/Emoji/EmojiControl.xaml.cs b/EmojiPanel/EmojiPanel/Controls/Emoji/EmojiControl.xaml.cs
new file mode 100755
index 0000000..c5454a8
--- /dev/null
+++ b/EmojiPanel/EmojiPanel/Controls/Emoji/EmojiControl.xaml.cs
@@ -0,0 +1,654 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.IO;
+using System.IO.IsolatedStorage;
+using System.Linq;
+using System.Reflection;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
+using System.Windows.Data;
+using System.Windows.Media;
+using System.Windows.Media.Animation;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+using EmojiPanel.Controls.Utilites;
+using Microsoft.Phone.Controls;
+using Telegram.Controls.VirtualizedView;
+
+namespace EmojiPanel.Controls.Emoji
+{
+ public partial class EmojiControl
+ {
+ private List _category1Sprites;
+ private List _category2Sprites;
+ private List _category3Sprites;
+ private List _category4Sprites;
+ private List _category5Sprites;
+
+ public EventHandler IsOpenedChanged = delegate { };
+
+ public TextBox TextBoxTarget { get; set; }
+
+ private const int AlbumOrientationHeight = 328;
+ private const int PortraitOrientationHeight = 408;
+
+ private bool _isOpen;
+ private bool _isPortrait = true;
+ private bool _isTextBoxTargetFocused;
+ private bool _isBlocked; // Block IsOpen during animation
+ private int _currentCategory;
+ private bool _wasRendered;
+ private readonly TranslateTransform _frameTransform;
+ private static EmojiControl _instance;
+
+ public static EmojiControl GetInstance()
+ {
+ return _instance ?? (_instance = new EmojiControl());
+ }
+
+ public static readonly DependencyProperty RootFrameTransformProperty = DependencyProperty.Register(
+ "RootFrameTransform",
+ typeof(double),
+ typeof(EmojiControl),
+ new PropertyMetadata(OnRootFrameTransformChanged));
+
+ public EmojiControl()
+ {
+ InitializeComponent();
+
+ var frame = (Frame)Application.Current.RootVisual;
+ _frameTransform = ((TranslateTransform)((TransformGroup)frame.RenderTransform).Children[0]);
+ var binding = new Binding("Y")
+ {
+ Source = _frameTransform
+ };
+ SetBinding(RootFrameTransformProperty, binding);
+
+ VirtPanel.InitializeWithScrollViewer(CSV);
+ VirtPanel.ScrollPositionChanged += VirtPanelOnScrollPositionChanged;
+ SizeChanged += OnSizeChanged;
+ OnSizeChanged(null, null);
+
+ LoadButtons();
+ CurrentCategory = 0;
+
+
+ }
+
+ public void BindTextBox(TextBox textBox)
+ {
+ TextBoxTarget = textBox;
+ textBox.GotFocus += TextBoxOnGotFocus;
+ textBox.LostFocus += TextBoxOnLostFocus;
+ }
+
+ public void UnbindTextBox()
+ {
+ TextBoxTarget.GotFocus -= TextBoxOnGotFocus;
+ TextBoxTarget.LostFocus -= TextBoxOnLostFocus;
+ TextBoxTarget = null;
+ }
+
+ public bool IsOpen
+ {
+ get
+ {
+ return !_isTextBoxTargetFocused && _isOpen;
+ }
+ set
+ {
+ // Dont hide EmojiControl when keyboard is shown (or to be shown)
+ if (!_isTextBoxTargetFocused && _isOpen == value || _isBlocked) return;
+
+ if (value) Open();
+ else Hide();
+ IsOpenedChanged(null, value);
+ }
+ }
+
+ private void Open()
+ {
+ _isOpen = true;
+
+ VisualStateManager.GoToState(TextBoxTarget, "Focused", false);
+
+ var frame = (PhoneApplicationFrame)Application.Current.RootVisual;
+ EmojiContainer.Visibility = Visibility.Visible;
+ frame.BackKeyPress += OnBackKeyPress;
+
+ if (!(EmojiContainer.RenderTransform is TranslateTransform))
+ EmojiContainer.RenderTransform = new TranslateTransform();
+ var transform = (TranslateTransform)EmojiContainer.RenderTransform;
+
+ var offset = _isPortrait ? PortraitOrientationHeight : AlbumOrientationHeight;
+ EmojiContainer.Height = offset;
+
+ var from = 0;
+
+ if (_frameTransform.Y < 0) // Keyboard is in view
+ {
+ from = (int)_frameTransform.Y;
+ //_frameTransform.Y = -offset;
+ //transform.Y = offset;// -72;
+ }
+ transform.Y = offset;// -72
+
+ if (from == offset) return;
+
+ frame.IsHitTestVisible = false;
+ _isBlocked = true;
+
+ var storyboard = new Storyboard();
+ var doubleTransformFrame = new DoubleAnimation
+ {
+ From = from,
+ To = -offset,
+ Duration = TimeSpan.FromMilliseconds(440),
+ EasingFunction = new ExponentialEase
+ {
+ EasingMode = EasingMode.EaseOut,
+ Exponent = 6
+ }
+ };
+ storyboard.Children.Add(doubleTransformFrame);
+ Storyboard.SetTarget(doubleTransformFrame, _frameTransform);
+ Storyboard.SetTargetProperty(doubleTransformFrame, new PropertyPath("Y"));
+
+ EmojiContainer.Dispatcher.BeginInvoke(async () =>
+ {
+ storyboard.Begin();
+
+ if (_frameTransform.Y < 0) // Keyboard is in view
+ {
+ Focus();
+ TextBoxTarget.Dispatcher.BeginInvoke(() // no effect without dispatcher
+ => VisualStateManager.GoToState(TextBoxTarget, "Focused", false));
+ }
+
+ if (_wasRendered) return;
+ await Task.Delay(50);
+ LoadCategory(0);
+ });
+
+ storyboard.Completed += (sender, args) =>
+ {
+ frame.IsHitTestVisible = true;
+ _isBlocked = false;
+ };
+ }
+
+ private void Hide()
+ {
+ _isOpen = false;
+
+ var frame = (PhoneApplicationFrame)Application.Current.RootVisual;
+ frame.BackKeyPress -= OnBackKeyPress;
+
+ if (_isTextBoxTargetFocused)
+ {
+ _frameTransform.Y = 0;
+
+ EmojiContainer.Visibility = Visibility.Collapsed;
+
+ return;
+ }
+
+ VisualStateManager.GoToState(TextBoxTarget, "Unfocused", false);
+
+ frame.IsHitTestVisible = false;
+ _isBlocked = true;
+
+ var transform = (TranslateTransform)EmojiContainer.RenderTransform;
+
+ var storyboard = new Storyboard();
+ var doubleTransformFrame = new DoubleAnimation
+ {
+ From = -transform.Y,
+ To = 0,
+ Duration = TimeSpan.FromMilliseconds(440),
+ EasingFunction = new ExponentialEase
+ {
+ EasingMode = EasingMode.EaseOut,
+ Exponent = 6
+ }
+ };
+ storyboard.Children.Add(doubleTransformFrame);
+ Storyboard.SetTarget(doubleTransformFrame, _frameTransform);
+ Storyboard.SetTargetProperty(doubleTransformFrame, new PropertyPath("Y"));
+ storyboard.Begin();
+
+ storyboard.Completed += (sender, args) =>
+ {
+ EmojiContainer.Visibility = Visibility.Collapsed;
+
+ frame.IsHitTestVisible = true;
+ _isBlocked = false;
+ transform.Y = 0;
+ };
+
+ }
+
+ #region _isTextBoxTargetFocused listeners
+ private void TextBoxOnGotFocus(object sender, RoutedEventArgs routedEventArgs)
+ {
+ _isTextBoxTargetFocused = true;
+ }
+ private void TextBoxOnLostFocus(object sender, RoutedEventArgs routedEventArgs)
+ {
+ _isTextBoxTargetFocused = false;
+ }
+ #endregion
+
+ ///
+ /// Hide instance on pressing hardware Back button. Fires only when instance is opened.
+ ///
+ private void OnBackKeyPress(object sender, CancelEventArgs cancelEventArgs)
+ {
+ IsOpen = false;
+ cancelEventArgs.Cancel = true;
+ }
+
+ ///
+ /// Clear current highlight on scroll
+ ///
+ private static void VirtPanelOnScrollPositionChanged(object sender, MyVirtualizingPanel.ScrollPositionChangedEventAgrs scrollPositionChangedEventAgrs)
+ {
+ EmojiSpriteItem.ClearCurrentHighlight();
+ }
+
+ ///
+ /// Changes tabs in UI and _currentCategory property
+ ///
+ public int CurrentCategory
+ {
+ get { return _currentCategory; }
+ set
+ {
+ var previousCategory = GetCategoryButtonByIndex(_currentCategory);
+ var nextCategory = GetCategoryButtonByIndex(value);
+
+ if (previousCategory != null)
+ previousCategory.Background = new SolidColorBrush(Color.FromArgb(255, 71, 71, 71));
+
+ nextCategory.Background = (Brush)Application.Current.Resources["PhoneAccentBrush"];
+ _currentCategory = value;
+ }
+ }
+
+ public async void LoadCategory(int index)
+ {
+ VirtPanel.ClearItems();
+
+ if (_currentCategory == RecentsCategoryIndex)
+ UnloadRecents();
+
+ if (index == RecentsCategoryIndex)
+ {
+ LoadRecents();
+ return;
+ }
+
+ List sprites = null;
+
+ switch (index)
+ {
+ case 0:
+ sprites = _category1Sprites;
+ break;
+ case 1:
+ sprites = _category2Sprites;
+ break;
+ case 2:
+ sprites = _category3Sprites;
+ break;
+ case 3:
+ sprites = _category4Sprites;
+ break;
+ case 4:
+ sprites = _category5Sprites;
+ break;
+ }
+
+ if (sprites == null)
+ {
+ sprites = new List();
+
+ for (var i = 0; i < EmojiData.SpritesByCategory[index].Length; i++)
+ {
+ //var item = new EmojiSpriteItem(index, i);
+ var item = new EmojiSpriteItem(EmojiData.SpritesByCategory[index][i], index, i);
+ item.EmojiSelected += OnEmojiSelected;
+ sprites.Add(item);
+ }
+
+ switch (index)
+ {
+ case 0:
+ _category1Sprites = sprites;
+ break;
+ case 1:
+ _category2Sprites = sprites;
+ break;
+ case 2:
+ _category3Sprites = sprites;
+ break;
+ case 3:
+ _category4Sprites = sprites;
+ break;
+ case 4:
+ _category5Sprites = sprites;
+ break;
+ }
+ }
+
+ CurrentCategory = index;
+
+ VirtPanel.AddItems(new List { sprites[0] });
+ CreateButtonsBackgrounds(index);
+
+ if (!_wasRendered)
+ {
+ // Display LoadingProgressBar only once
+ LoadingProgressBar.Visibility = Visibility.Collapsed;
+ _wasRendered = true;
+ }
+
+ // Delayed rendering of the rest parts - speeds up initial load
+ await Task.Delay(100);
+ if (_currentCategory != index)
+ return;
+
+ var listList = sprites.ToList();
+ listList.RemoveAt(0);
+ VirtPanel.AddItems(listList);
+ }
+
+ public static void OnRootFrameTransformChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
+ {
+ ((EmojiControl)source).OnRootFrameTransformChanged();
+ }
+
+ public void OnRootFrameTransformChanged()
+ {
+ if (!_isOpen) return;
+
+ var offset = _isPortrait ? -PortraitOrientationHeight : -AlbumOrientationHeight;
+ _frameTransform.Y = offset;
+ }
+
+ #region Recents
+ public void LoadRecents()
+ {
+ CurrentCategory = RecentsCategoryIndex;
+
+ var recents = EmojiData.Recents;
+ //recents = recents.ToList();
+ }
+
+ public void UnloadRecents()
+ {
+
+ }
+
+
+ #endregion Recents
+
+ private void OnEmojiSelected(object sender, EmojiDataItem emojiDataItem)
+ {
+ TextBoxTarget.Dispatcher.BeginInvoke(() =>
+ {
+ var selectionStart = TextBoxTarget.SelectionStart;
+ TextBoxTarget.Text = TextBoxTarget.Text.Insert(selectionStart, emojiDataItem.String);
+ TextBoxTarget.Select(selectionStart + emojiDataItem.String.Length, 0);
+ });
+
+ if (_currentCategory == RecentsCategoryIndex) return;
+
+ var that = emojiDataItem;
+ ThreadPool.QueueUserWorkItem(state => EmojiData.AddToRecents(that));
+ }
+
+
+ ///
+ /// Emoji control backspace button logic
+ ///
+ private void BackspaceButtonOnClick(object sender, RoutedEventArgs routedEventArgs)
+ {
+ var text = TextBoxTarget.Text;
+ var selectionStart = TextBoxTarget.SelectionStart;
+
+ if (text.Length <= 0) return;
+ if (selectionStart == 0) return;
+
+ int toSubstring;
+
+ if (text.Length > 1)
+ {
+ var prevSymbol = text[selectionStart - 2];
+ var prevBytes = BitConverter.GetBytes(prevSymbol);
+
+ var curSymbol = text[selectionStart - 1];
+ var curBytes = BitConverter.GetBytes(curSymbol);
+
+ if (prevBytes[1] == 0xD8 && (prevBytes[0] == 0x3D || prevBytes[0] == 0x3C))
+ toSubstring = 2;
+ else if (curBytes[1] == 0x20 && curBytes[0] == 0xE3)
+ toSubstring = 2;
+ else
+ toSubstring = 1;
+ }
+ else
+ {
+ toSubstring = 1;
+ }
+
+ TextBoxTarget.Text = text.Remove(selectionStart - toSubstring, toSubstring);
+ TextBoxTarget.SelectionStart = selectionStart - toSubstring;
+ }
+
+ #region User Interface
+
+ private readonly Button _abcButton = new Button { ClickMode = ClickMode.Release };
+ private readonly Button _recentsButton = new Button { ClickMode = ClickMode.Press };
+ private readonly Button _cat0Button = new Button { ClickMode = ClickMode.Press };
+ private readonly Button _cat1Button = new Button { ClickMode = ClickMode.Press };
+ private readonly Button _cat2Button = new Button { ClickMode = ClickMode.Press };
+ private readonly Button _cat3Button = new Button { ClickMode = ClickMode.Press };
+ private readonly Button _cat4Button = new Button { ClickMode = ClickMode.Press };
+ private readonly RepeatButton _backspaceButton = new RepeatButton { ClickMode = ClickMode.Release, Interval = 100 };
+ public const int RecentsCategoryIndex = 5;
+
+ private Button GetCategoryButtonByIndex(int index)
+ {
+ switch (index)
+ {
+ case 0:
+ return _cat0Button;
+ case 1:
+ return _cat1Button;
+ case 2:
+ return _cat2Button;
+ case 3:
+ return _cat3Button;
+ case 4:
+ return _cat4Button;
+ case RecentsCategoryIndex:
+ return _recentsButton;
+ default:
+ return null;
+ }
+ }
+ public void LoadButtons()
+ {
+ var buttonStyle = (Style)Resources["CategoryButtonStyle"];
+ _abcButton.Style = buttonStyle;
+ _recentsButton.Style = buttonStyle;
+ _cat0Button.Style = buttonStyle;
+ _cat1Button.Style = buttonStyle;
+ _cat2Button.Style = buttonStyle;
+ _cat3Button.Style = buttonStyle;
+ _cat4Button.Style = buttonStyle;
+ _backspaceButton.Style = (Style)Resources["RepeatButtonStyle"];
+
+ _abcButton.Content = new Image
+ {
+ Source = new BitmapImage(Helpers.GetAssetUri("emoji.abc")),
+ Width = 34,
+ Height = 32
+ };
+ _recentsButton.Content = new Image
+ {
+ Source = new BitmapImage(Helpers.GetAssetUri("emoji.recent")),
+ Width = 34,
+ Height = 32
+ };
+ _cat0Button.Content = new Image
+ {
+ Source = new BitmapImage(Helpers.GetAssetUri("emoji.category.1")),
+ Width = 34,
+ Height = 32
+ };
+ _cat1Button.Content = new Image
+ {
+ Source = new BitmapImage(Helpers.GetAssetUri("emoji.category.2")),
+ Width = 34,
+ Height = 32
+ };
+ _cat2Button.Content = new Image
+ {
+ Source = new BitmapImage(Helpers.GetAssetUri("emoji.category.3")),
+ Width = 34,
+ Height = 32
+ };
+ _cat3Button.Content = new Image
+ {
+ Source = new BitmapImage(Helpers.GetAssetUri("emoji.category.4")),
+ Width = 34,
+ Height = 32
+ };
+ _cat4Button.Content = new Image
+ {
+ Source = new BitmapImage(Helpers.GetAssetUri("emoji.category.5")),
+ Width = 34,
+ Height = 32
+ };
+ _backspaceButton.Content = new Image
+ {
+ Source = new BitmapImage(Helpers.GetAssetUri("emoji.backspace")),
+ Width = 34,
+ Height = 32
+ };
+
+ Grid.SetColumn(_abcButton, 0);
+ Grid.SetColumn(_recentsButton, 1);
+ Grid.SetColumn(_cat0Button, 2);
+ Grid.SetColumn(_cat1Button, 3);
+ Grid.SetColumn(_cat2Button, 4);
+ Grid.SetColumn(_cat3Button, 5);
+ Grid.SetColumn(_cat4Button, 6);
+ Grid.SetColumn(_backspaceButton, 7);
+
+ ButtonsGrid.Children.Add(_abcButton);
+ ButtonsGrid.Children.Add(_recentsButton);
+ ButtonsGrid.Children.Add(_cat0Button);
+ ButtonsGrid.Children.Add(_cat1Button);
+ ButtonsGrid.Children.Add(_cat2Button);
+ ButtonsGrid.Children.Add(_cat3Button);
+ ButtonsGrid.Children.Add(_cat4Button);
+ ButtonsGrid.Children.Add(_backspaceButton);
+
+ _abcButton.Click += AbcButtonOnClick;
+ _cat0Button.Click += CategoryButtonClick;
+ _cat1Button.Click += CategoryButtonClick;
+ _cat2Button.Click += CategoryButtonClick;
+ _cat3Button.Click += CategoryButtonClick;
+ _cat4Button.Click += CategoryButtonClick;
+ _recentsButton.Click += CategoryButtonClick;
+ _backspaceButton.Click += BackspaceButtonOnClick;
+ }
+
+ private void AbcButtonOnClick(object sender, RoutedEventArgs routedEventArgs)
+ {
+ TextBoxTarget.Focus();
+ }
+
+ private void CategoryButtonClick(object sender, RoutedEventArgs routedEventArgs)
+ {
+ if (sender == _cat0Button)
+ LoadCategory(0);
+ else if (sender == _cat1Button)
+ LoadCategory(1);
+ else if (sender == _cat2Button)
+ LoadCategory(2);
+ else if (sender == _cat3Button)
+ LoadCategory(3);
+ else if (sender == _cat4Button)
+ LoadCategory(4);
+ else if (sender == _recentsButton)
+ LoadCategory(RecentsCategoryIndex);
+ }
+
+ private void CreateButtonsBackgrounds(int categoryIndex)
+ {
+ var sprites = EmojiData.SpriteRowsCountByCategory[categoryIndex];
+
+ for (var i = 0; i < sprites.Length; i++)
+ {
+ var rowsCount = sprites[i];
+
+ var block = new Rectangle
+ {
+ Width = EmojiSpriteItem.SpriteWidth,
+ Height = EmojiSpriteItem.RowHeight * rowsCount,
+ Fill = new SolidColorBrush(Color.FromArgb(255, 71, 71, 71)),
+ Margin = new Thickness(4, 0, 4, 0)
+ };
+ Canvas.SetTop(block, (EmojiSpriteItem.SpriteHeight) * i);
+ VirtPanel.Children.Insert(0, block);
+ }
+ }
+
+ private void InitializeOrientation(Orientation orientation)
+ {
+ switch (orientation)
+ {
+ case Orientation.Vertical:
+ ButtonsGrid.Height = 78;
+ ButtonsGrid.Margin = new Thickness(0, 6, 0, 0);
+ EmojiContainer.Height = PortraitOrientationHeight;
+ _frameTransform.Y = -PortraitOrientationHeight;
+ break;
+
+ case Orientation.Horizontal:
+ ButtonsGrid.Height = 58;
+ ButtonsGrid.Margin = new Thickness(0, 6, 0, 3);
+ EmojiContainer.Height = AlbumOrientationHeight;
+ _frameTransform.Y = -AlbumOrientationHeight;
+ break;
+ }
+ }
+
+ #endregion User Interface
+
+
+ ///
+ /// Orientation change handler
+ ///
+ private void OnSizeChanged(object sender, SizeChangedEventArgs sizeChangedEventArgs)
+ {
+ var currentOrientation = ((PhoneApplicationFrame)Application.Current.RootVisual).Orientation;
+ var isPortrait = currentOrientation == PageOrientation.PortraitUp ||
+ currentOrientation == PageOrientation.PortraitDown ||
+ currentOrientation == PageOrientation.Portrait;
+
+ if (_isPortrait == isPortrait && _wasRendered) return;
+
+ _isPortrait = isPortrait;
+ InitializeOrientation(isPortrait ? Orientation.Vertical : Orientation.Horizontal);
+ }
+ }
+}
diff --git a/EmojiPanel/EmojiPanel/Controls/Emoji/EmojiData.cs b/EmojiPanel/EmojiPanel/Controls/Emoji/EmojiData.cs
new file mode 100755
index 0000000..e4b4409
--- /dev/null
+++ b/EmojiPanel/EmojiPanel/Controls/Emoji/EmojiData.cs
@@ -0,0 +1,389 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.IO.IsolatedStorage;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace EmojiPanel.Controls.Emoji
+{
+ public class EmojiDataItem
+ {
+ public EmojiDataItem() { }
+
+ public EmojiDataItem(string string2, ulong code)
+ {
+ String = string2;
+ Code = code;
+ }
+
+ public string String { get; set; }
+ public ulong Code { get; set; }
+ public Uri Uri { get; set; }
+
+ public static string BuildString(ulong code)
+ {
+ var bytes = BitConverter.GetBytes(code);
+
+ var char1 = BitConverter.ToChar(bytes, 6);
+ var char2 = BitConverter.ToChar(bytes, 4);
+ var char3 = BitConverter.ToChar(bytes, 2);
+ var char4 = BitConverter.ToChar(bytes, 0);
+
+ string text;
+
+ if (char1 != 0)
+ {
+ text = new string(new [] { char1, char2, char3, char4 });
+ }
+ else if (char3 != 0)
+ {
+ text = new string(new [] { char3, char4 });
+ }
+ else
+ {
+ text = char4.ToString();
+ }
+
+ return text;
+ }
+
+ public static Uri BuildUri(string string2)
+ {
+ //var string3 = BitConverter.ToString(bytes.Take(4).Reverse().ToArray())
+ var string3 = string.Format("{0:X}", (Int16) string2[0]);
+
+ switch (string2.Length)
+ {
+ case 2:
+ {
+ uint emoji = 0;
+ emoji |= (uint) string2[0] << 16;
+ emoji |= (uint) string2[1];
+
+ return new Uri(string.Format("/Assets/Emoji/Separated/{0:X}.png", emoji), UriKind.Relative);
+ }
+ case 4:
+ {
+ uint emoji1 = 0;
+ emoji1 |= (uint) string2[0] << 16;
+ emoji1 |= (uint) string2[1];
+
+ ulong emoji2 = 0;
+ emoji2 |= (uint) string2[2] << 16;
+ emoji2 |= (uint) string2[3];
+
+ return new Uri(string.Format("/Assets/Emoji/Separated/{0:X}-{1:X}.png", emoji1, emoji2), UriKind.Relative);
+ }
+ default:
+ return new Uri(string.Format("/Assets/Emoji/Separated/{0:X}.png", (Int16) string2[0]), UriKind.Relative);
+ }
+ }
+
+ public static EmojiDataItem GetByIndex(int categoryIndex, int spriteIndex, int itemIndex)
+ {
+
+ var category = EmojiData.CodesByCategory[categoryIndex];
+ var emojiIndex = spriteIndex * EmojiData.ItemsInSprite + itemIndex;
+
+ if (category.Length <= emojiIndex) return null; // out of bounds
+
+ ulong code = category[emojiIndex];
+
+ var result = new EmojiDataItem
+ {
+ Code = code,
+ String = BuildString(code)
+ };
+ result.Uri = BuildUri(result.String);
+
+ return result;
+ }
+ }
+
+ public static class EmojiData
+ {
+ public static List Recents;
+
+ public static void AddToRecents(EmojiDataItem emojiDataItem)
+ {
+ if (Recents == null)
+ {
+ LoadRecents();
+ if (Recents == null) return;
+ }
+
+ var prevItem = Recents.FirstOrDefault(x => x.Code == emojiDataItem.Code);
+ if (prevItem != null)
+ {
+ Recents.Remove(prevItem);
+ Recents.Insert(0, prevItem);
+ }
+ else
+ {
+ Recents.Insert(0, emojiDataItem);
+ Recents = Recents.Take(30).ToList();
+ }
+
+ SaveRecents();
+ }
+
+ public static void LoadRecents()
+ {
+
+ using (var store = IsolatedStorageFile.GetUserStoreForApplication())
+ {
+ if (!store.FileExists("EmojiRecents")) return;
+ using (var stream = new IsolatedStorageFileStream("EmojiRecents", FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite, store))
+ {
+ if (stream.Length <= 0) return;
+
+ using (var br = new BinaryReader(stream))
+ {
+ var count = br.ReadInt32();
+
+ Recents = new List();
+
+ for (var i = 0; i < count; i++)
+ {
+ var emoji = new EmojiDataItem(br.ReadString(), br.ReadUInt64());
+ Recents.Add(emoji);
+ }
+ }
+ }
+ }
+ }
+
+ public static void SaveRecents()
+ {
+ using (var store = IsolatedStorageFile.GetUserStoreForApplication())
+ {
+ using (var stream = new IsolatedStorageFileStream("EmojiRecents", FileMode.Create, FileAccess.Write, FileShare.ReadWrite, store))
+ {
+ using (var bw = new BinaryWriter(stream))
+ {
+ var emojies = Recents.ToList();
+
+ bw.Write(emojies.Count);
+
+ foreach (var item in emojies)
+ {
+ bw.Write(item.String);
+ bw.Write(item.Code);
+ }
+ }
+ }
+ }
+ }
+
+ public const int ItemsInRow = 6;
+ public const int ItemsInSprite = 36;
+
+ ///
+ /// Custom spaced sprites by category
+ ///
+ public static Uri[][] SpritesByCategory =
+ {
+ new[]
+ {
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat0_part0.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat0_part1.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat0_part2.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat0_part3.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat0_part4.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat0_part5.png", UriKind.Relative),
+ },
+ new[]
+ {
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat1_part0.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat1_part1.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat1_part2.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat1_part3.png", UriKind.Relative),
+ },
+ new[]
+ {
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat2_part0.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat2_part1.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat2_part2.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat2_part3.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat2_part4.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat2_part5.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat2_part6.png", UriKind.Relative),
+ },
+ new[]
+ {
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat3_part0.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat3_part1.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat3_part2.png", UriKind.Relative),
+ },
+ new[]
+ {
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat4_part0.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat4_part1.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat4_part2.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat4_part3.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat4_part4.png", UriKind.Relative),
+ new Uri("/Assets/Emoji/SpacedSprites/sprite64_cat4_part5.png", UriKind.Relative),
+ },
+ };
+
+ ///
+ /// Config of rows count for sprites in categories
+ ///
+ public static int[][] SpriteRowsCountByCategory =
+ {
+ new [] { 6, 6, 6, 6, 6, 2 },
+ new [] { 6, 6, 6, 2 },
+ new [] { 6, 6, 6, 6, 6, 6, 3 },
+ new [] { 6, 6, 5 },
+ new [] { 6, 6, 6, 6, 6, 5 }
+ };
+
+ ///
+ /// Config of missing cells in last row for each last category's sprite
+ ///
+ public static int[] SpriteMissingCellsByCategory =
+ {
+ 3, 4, 4, 1, 1
+ };
+
+ ///
+ /// Emoji codes combined into the groups corresponding to the categories in the interface
+ ///
+ public static ulong[][] CodesByCategory = {
+ new ulong[]{
+ 0x00000000D83DDE04L, 0x00000000D83DDE03L, 0x00000000D83DDE00L, 0x00000000D83DDE0AL, 0x000000000000263AL, 0x00000000D83DDE09L, 0x00000000D83DDE0DL,
+ 0x00000000D83DDE18L, 0x00000000D83DDE1AL, 0x00000000D83DDE17L, 0x00000000D83DDE19L, 0x00000000D83DDE1CL, 0x00000000D83DDE1DL, 0x00000000D83DDE1BL,
+ 0x00000000D83DDE33L, 0x00000000D83DDE01L, 0x00000000D83DDE14L, 0x00000000D83DDE0CL, 0x00000000D83DDE12L, 0x00000000D83DDE1EL, 0x00000000D83DDE23L,
+ 0x00000000D83DDE22L, 0x00000000D83DDE02L, 0x00000000D83DDE2DL, 0x00000000D83DDE2AL, 0x00000000D83DDE25L, 0x00000000D83DDE30L, 0x00000000D83DDE05L,
+ 0x00000000D83DDE13L, 0x00000000D83DDE29L, 0x00000000D83DDE2BL, 0x00000000D83DDE28L, 0x00000000D83DDE31L, 0x00000000D83DDE20L, 0x00000000D83DDE21L,
+ 0x00000000D83DDE24L, 0x00000000D83DDE16L, 0x00000000D83DDE06L, 0x00000000D83DDE0BL, 0x00000000D83DDE37L, 0x00000000D83DDE0EL, 0x00000000D83DDE34L,
+ 0x00000000D83DDE35L, 0x00000000D83DDE32L, 0x00000000D83DDE1FL, 0x00000000D83DDE26L, 0x00000000D83DDE27L, 0x00000000D83DDE08L, 0x00000000D83DDC7FL,
+ 0x00000000D83DDE2EL, 0x00000000D83DDE2CL, 0x00000000D83DDE10L, 0x00000000D83DDE15L, 0x00000000D83DDE2FL, 0x00000000D83DDE36L, 0x00000000D83DDE07L,
+ 0x00000000D83DDE0FL, 0x00000000D83DDE11L, 0x00000000D83DDC72L, 0x00000000D83DDC73L, 0x00000000D83DDC6EL, 0x00000000D83DDC77L, 0x00000000D83DDC82L,
+ 0x00000000D83DDC76L, 0x00000000D83DDC66L, 0x00000000D83DDC67L, 0x00000000D83DDC68L, 0x00000000D83DDC69L, 0x00000000D83DDC74L, 0x00000000D83DDC75L,
+ 0x00000000D83DDC71L, 0x00000000D83DDC7CL, 0x00000000D83DDC78L, 0x00000000D83DDE3AL, 0x00000000D83DDE38L, 0x00000000D83DDE3BL, 0x00000000D83DDE3DL,
+ 0x00000000D83DDE3CL, 0x00000000D83DDE40L, 0x00000000D83DDE3FL, 0x00000000D83DDE39L, 0x00000000D83DDE3EL, 0x00000000D83DDC79L, 0x00000000D83DDC7AL,
+ 0x00000000D83DDE48L, 0x00000000D83DDE49L, 0x00000000D83DDE4AL, 0x00000000D83DDC80L, 0x00000000D83DDC7DL, 0x00000000D83DDCA9L, 0x00000000D83DDD25L,
+ 0x0000000000002728L, 0x00000000D83CDF1FL, 0x00000000D83DDCABL, 0x00000000D83DDCA5L, 0x00000000D83DDCA2L, 0x00000000D83DDCA6L, 0x00000000D83DDCA7L,
+ 0x00000000D83DDCA4L, 0x00000000D83DDCA8L, 0x00000000D83DDC42L, 0x00000000D83DDC40L, 0x00000000D83DDC43L, 0x00000000D83DDC45L, 0x00000000D83DDC44L,
+ 0x00000000D83DDC4DL, 0x00000000D83DDC4EL, 0x00000000D83DDC4CL, 0x00000000D83DDC4AL, 0x000000000000270AL, 0x000000000000270CL, 0x00000000D83DDC4BL,
+ 0x000000000000270BL, 0x00000000D83DDC50L, 0x00000000D83DDC46L, 0x00000000D83DDC47L, 0x00000000D83DDC49L, 0x00000000D83DDC48L, 0x00000000D83DDE4CL,
+ 0x00000000D83DDE4FL, 0x000000000000261DL, 0x00000000D83DDC4FL, 0x00000000D83DDCAAL, 0x00000000D83DDEB6L, 0x00000000D83CDFC3L, 0x00000000D83DDC83L,
+ 0x00000000D83DDC6BL, 0x00000000D83DDC6AL, 0x00000000D83DDC6CL, 0x00000000D83DDC6DL, 0x00000000D83DDC8FL, 0x00000000D83DDC91L, 0x00000000D83DDC6FL,
+ 0x00000000D83DDE46L, 0x00000000D83DDE45L, 0x00000000D83DDC81L, 0x00000000D83DDE4BL, 0x00000000D83DDC86L, 0x00000000D83DDC87L, 0x00000000D83DDC85L,
+ 0x00000000D83DDC70L, 0x00000000D83DDE4EL, 0x00000000D83DDE4DL, 0x00000000D83DDE47L, 0x00000000D83CDFA9L, 0x00000000D83DDC51L, 0x00000000D83DDC52L,
+ 0x00000000D83DDC5FL, 0x00000000D83DDC5EL, 0x00000000D83DDC61L, 0x00000000D83DDC60L, 0x00000000D83DDC62L, 0x00000000D83DDC55L, 0x00000000D83DDC54L,
+ 0x00000000D83DDC5AL, 0x00000000D83DDC57L, 0x00000000D83CDFBDL, 0x00000000D83DDC56L, 0x00000000D83DDC58L, 0x00000000D83DDC59L, 0x00000000D83DDCBCL,
+ 0x00000000D83DDC5CL, 0x00000000D83DDC5DL, 0x00000000D83DDC5BL, 0x00000000D83DDC53L, 0x00000000D83CDF80L, 0x00000000D83CDF02L, 0x00000000D83DDC84L,
+ 0x00000000D83DDC9BL, 0x00000000D83DDC99L, 0x00000000D83DDC9CL, 0x00000000D83DDC9AL, 0x0000000000002764L, 0x00000000D83DDC94L, 0x00000000D83DDC97L,
+ 0x00000000D83DDC93L, 0x00000000D83DDC95L, 0x00000000D83DDC96L, 0x00000000D83DDC9EL, 0x00000000D83DDC98L, 0x00000000D83DDC8CL, 0x00000000D83DDC8BL,
+ 0x00000000D83DDC8DL, 0x00000000D83DDC8EL, 0x00000000D83DDC64L, 0x00000000D83DDC65L, 0x00000000D83DDCACL, 0x00000000D83DDC63L, 0x00000000D83DDCADL},
+ new ulong[]{
+ 0x00000000D83DDC36L, 0x00000000D83DDC3AL, 0x00000000D83DDC31L, 0x00000000D83DDC2DL, 0x00000000D83DDC39L, 0x00000000D83DDC30L, 0x00000000D83DDC38L, 0x00000000D83DDC2FL,
+ 0x00000000D83DDC28L, 0x00000000D83DDC3BL, 0x00000000D83DDC37L, 0x00000000D83DDC3DL, 0x00000000D83DDC2EL, 0x00000000D83DDC17L, 0x00000000D83DDC35L,
+ 0x00000000D83DDC12L, 0x00000000D83DDC34L, 0x00000000D83DDC11L, 0x00000000D83DDC18L, 0x00000000D83DDC3CL, 0x00000000D83DDC27L, 0x00000000D83DDC26L,
+ 0x00000000D83DDC24L, 0x00000000D83DDC25L, 0x00000000D83DDC23L, 0x00000000D83DDC14L, 0x00000000D83DDC0DL, 0x00000000D83DDC22L, 0x00000000D83DDC1BL,
+ 0x00000000D83DDC1DL, 0x00000000D83DDC1CL, 0x00000000D83DDC1EL, 0x00000000D83DDC0CL, 0x00000000D83DDC19L, 0x00000000D83DDC1AL, 0x00000000D83DDC20L,
+ 0x00000000D83DDC1FL, 0x00000000D83DDC2CL, 0x00000000D83DDC33L, 0x00000000D83DDC0BL, 0x00000000D83DDC04L, 0x00000000D83DDC0FL, 0x00000000D83DDC00L,
+ 0x00000000D83DDC03L, 0x00000000D83DDC05L, 0x00000000D83DDC07L, 0x00000000D83DDC09L, 0x00000000D83DDC0EL, 0x00000000D83DDC10L, 0x00000000D83DDC13L,
+ 0x00000000D83DDC15L, 0x00000000D83DDC16L, 0x00000000D83DDC01L, 0x00000000D83DDC02L, 0x00000000D83DDC32L, 0x00000000D83DDC21L, 0x00000000D83DDC0AL,
+ 0x00000000D83DDC2BL, 0x00000000D83DDC2AL, 0x00000000D83DDC06L, 0x00000000D83DDC08L, 0x00000000D83DDC29L, 0x00000000D83DDC3EL, 0x00000000D83DDC90L,
+ 0x00000000D83CDF38L, 0x00000000D83CDF37L, 0x00000000D83CDF40L, 0x00000000D83CDF39L, 0x00000000D83CDF3BL, 0x00000000D83CDF3AL, 0x00000000D83CDF41L,
+ 0x00000000D83CDF43L, 0x00000000D83CDF42L, 0x00000000D83CDF3FL, 0x00000000D83CDF3EL, 0x00000000D83CDF44L, 0x00000000D83CDF35L, 0x00000000D83CDF34L,
+ 0x00000000D83CDF32L, 0x00000000D83CDF33L, 0x00000000D83CDF30L, 0x00000000D83CDF31L, 0x00000000D83CDF3CL, 0x00000000D83CDF10L, 0x00000000D83CDF1EL,
+ 0x00000000D83CDF1DL, 0x00000000D83CDF1AL, 0x00000000D83CDF11L, 0x00000000D83CDF12L, 0x00000000D83CDF13L, 0x00000000D83CDF14L, 0x00000000D83CDF15L,
+ 0x00000000D83CDF16L, 0x00000000D83CDF17L, 0x00000000D83CDF18L, 0x00000000D83CDF1CL, 0x00000000D83CDF1BL, 0x00000000D83CDF19L, 0x00000000D83CDF0DL,
+ 0x00000000D83CDF0EL, 0x00000000D83CDF0FL, 0x00000000D83CDF0BL, 0x00000000D83CDF0CL, 0x00000000D83CDF20L, 0x0000000000002B50L, 0x0000000000002600L,
+ 0x00000000000026C5L, 0x0000000000002601L, 0x00000000000026A1L, 0x0000000000002614L, 0x0000000000002744L, 0x00000000000026C4L, 0x00000000D83CDF00L,
+ 0x00000000D83CDF01L, 0x00000000D83CDF08L, 0x00000000D83CDF0AL},
+ new ulong[]{
+ 0x00000000D83CDF8DL, 0x00000000D83DDC9DL, 0x00000000D83CDF8EL, 0x00000000D83CDF92L, 0x00000000D83CDF93L, 0x00000000D83CDF8FL, 0x00000000D83CDF86L, 0x00000000D83CDF87L,
+ 0x00000000D83CDF90L, 0x00000000D83CDF91L, 0x00000000D83CDF83L, 0x00000000D83DDC7BL, 0x00000000D83CDF85L, 0x00000000D83CDF84L, 0x00000000D83CDF81L,
+ 0x00000000D83CDF8BL, 0x00000000D83CDF89L, 0x00000000D83CDF8AL, 0x00000000D83CDF88L, 0x00000000D83CDF8CL, 0x00000000D83DDD2EL, 0x00000000D83CDFA5L,
+ 0x00000000D83DDCF7L, 0x00000000D83DDCF9L, 0x00000000D83DDCFCL, 0x00000000D83DDCBFL, 0x00000000D83DDCC0L, 0x00000000D83DDCBDL, 0x00000000D83DDCBEL,
+ 0x00000000D83DDCBBL, 0x00000000D83DDCF1L, 0x000000000000260EL, 0x00000000D83DDCDEL, 0x00000000D83DDCDFL, 0x00000000D83DDCE0L, 0x00000000D83DDCE1L,
+ 0x00000000D83DDCFAL, 0x00000000D83DDCFBL, 0x00000000D83DDD0AL, 0x00000000D83DDD09L, 0x00000000D83DDD08L, 0x00000000D83DDD07L, 0x00000000D83DDD14L,
+ 0x00000000D83DDD14L, 0x00000000D83DDCE2L, 0x00000000D83DDCE3L, 0x00000000000023F3L, 0x000000000000231BL, 0x00000000000023F0L, 0x000000000000231AL,
+ 0x00000000D83DDD13L, 0x00000000D83DDD12L, 0x00000000D83DDD0FL, 0x00000000D83DDD10L, 0x00000000D83DDD11L, 0x00000000D83DDD0EL, 0x00000000D83DDCA1L,
+ 0x00000000D83DDD26L, 0x00000000D83DDD06L, 0x00000000D83DDD05L, 0x00000000D83DDD0CL, 0x00000000D83DDD0BL, 0x00000000D83DDD0DL, 0x00000000D83DDEC1L /* was missing */, 0x00000000D83DDEC0L,
+ 0x00000000D83DDEBFL, 0x00000000D83DDEBDL, 0x00000000D83DDD27L, 0x00000000D83DDD29L, 0x00000000D83DDD28L, 0x00000000D83DDEAAL, 0x00000000D83DDEACL,
+ 0x00000000D83DDCA3L, 0x00000000D83DDD2BL, 0x00000000D83DDD2AL, 0x00000000D83DDC8AL, 0x00000000D83DDC89L, 0x00000000D83DDCB0L, 0x00000000D83DDCB4L,
+ 0x00000000D83DDCB5L, 0x00000000D83DDCB7L, 0x00000000D83DDCB6L, 0x00000000D83DDCB3L, 0x00000000D83DDCB8L, 0x00000000D83DDCF2L, 0x00000000D83DDCE7L,
+ 0x00000000D83DDCE5L, 0x00000000D83DDCE4L, 0x0000000000002709L, 0x00000000D83DDCE9L, 0x00000000D83DDCE8L, 0x00000000D83DDCEFL, 0x00000000D83DDCEBL,
+ 0x00000000D83DDCEAL, 0x00000000D83DDCECL, 0x00000000D83DDCEDL, 0x00000000D83DDCEEL, 0x00000000D83DDCE6L, 0x00000000D83DDCDDL, 0x00000000D83DDCC4L,
+ 0x00000000D83DDCC3L, 0x00000000D83DDCD1L, 0x00000000D83DDCCAL, 0x00000000D83DDCC8L, 0x00000000D83DDCC9L, 0x00000000D83DDCDCL, 0x00000000D83DDCCBL,
+ 0x00000000D83DDCC5L, 0x00000000D83DDCC6L, 0x00000000D83DDCC7L, 0x00000000D83DDCC1L, 0x00000000D83DDCC2L, 0x0000000000002702L, 0x00000000D83DDCCCL,
+ 0x00000000D83DDCCEL, 0x0000000000002712L, 0x000000000000270FL, 0x00000000D83DDCCFL, 0x00000000D83DDCD0L, 0x00000000D83DDCD5L, 0x00000000D83DDCD7L,
+ 0x00000000D83DDCD8L, 0x00000000D83DDCD9L, 0x00000000D83DDCD3L, 0x00000000D83DDCD4L, 0x00000000D83DDCD2L, 0x00000000D83DDCDAL, 0x00000000D83DDCD6L,
+ 0x00000000D83DDD16L, 0x00000000D83DDCDBL, 0x00000000D83DDD2CL, 0x00000000D83DDD2DL, 0x00000000D83DDCF0L, 0x00000000D83CDFA8L, 0x00000000D83CDFACL,
+ 0x00000000D83CDFA4L, 0x00000000D83CDFA7L, 0x00000000D83CDFBCL, 0x00000000D83CDFB5L, 0x00000000D83CDFB6L, 0x00000000D83CDFB9L, 0x00000000D83CDFBBL,
+ 0x00000000D83CDFBAL, 0x00000000D83CDFB7L, 0x00000000D83CDFB8L, 0x00000000D83DDC7EL, 0x00000000D83CDFAEL, 0x00000000D83CDCCFL, 0x00000000D83CDFB4L,
+ 0x00000000D83CDC04L, 0x00000000D83CDFB2L, 0x00000000D83CDFAFL, 0x00000000D83CDFC8L, 0x00000000D83CDFC0L, 0x00000000000026BDL, 0x00000000000026BEL,
+ 0x00000000D83CDFBEL, 0x00000000D83CDFB1L, 0x00000000D83CDFC9L, 0x00000000D83CDFB3L, 0x00000000000026F3L, 0x00000000D83DDEB5L, 0x00000000D83DDEB4L,
+ 0x00000000D83CDFC1L, 0x00000000D83CDFC7L, 0x00000000D83CDFC6L, 0x00000000D83CDFBFL, 0x00000000D83CDFC2L, 0x00000000D83CDFCAL, 0x00000000D83CDFC4L,
+ 0x00000000D83CDFA3L, 0x0000000000002615L, 0x00000000D83CDF75L, 0x00000000D83CDF76L, 0x00000000D83CDF7CL, 0x00000000D83CDF7AL, 0x00000000D83CDF7BL,
+ 0x00000000D83CDF78L, 0x00000000D83CDF79L, 0x00000000D83CDF77L, 0x00000000D83CDF74L, 0x00000000D83CDF55L, 0x00000000D83CDF54L, 0x00000000D83CDF5FL,
+ 0x00000000D83CDF57L, 0x00000000D83CDF56L, 0x00000000D83CDF5DL, 0x00000000D83CDF5BL, 0x00000000D83CDF64L, 0x00000000D83CDF71L, 0x00000000D83CDF63L,
+ 0x00000000D83CDF65L, 0x00000000D83CDF59L, 0x00000000D83CDF58L, 0x00000000D83CDF5AL, 0x00000000D83CDF5CL, 0x00000000D83CDF72L, 0x00000000D83CDF62L,
+ 0x00000000D83CDF61L, 0x00000000D83CDF73L, 0x00000000D83CDF5EL, 0x00000000D83CDF69L, 0x00000000D83CDF6EL, 0x00000000D83CDF66L, 0x00000000D83CDF68L,
+ 0x00000000D83CDF67L, 0x00000000D83CDF82L, 0x00000000D83CDF70L, 0x00000000D83CDF6AL, 0x00000000D83CDF6BL, 0x00000000D83CDF6CL, 0x00000000D83CDF6DL,
+ 0x00000000D83CDF6FL, 0x00000000D83CDF4EL, 0x00000000D83CDF4FL, 0x00000000D83CDF4AL, 0x00000000D83CDF4BL, 0x00000000D83CDF52L, 0x00000000D83CDF47L,
+ 0x00000000D83CDF49L, 0x00000000D83CDF53L, 0x00000000D83CDF51L, 0x00000000D83CDF48L, 0x00000000D83CDF4CL, 0x00000000D83CDF50L, 0x00000000D83CDF4DL,
+ 0x00000000D83CDF60L, 0x00000000D83CDF46L, 0x00000000D83CDF45L, 0x00000000D83CDF3DL},
+ new ulong[]{
+ 0x00000000D83CDFE0L, 0x00000000D83CDFE1L, 0x00000000D83CDFEBL, 0x00000000D83CDFE2L, 0x00000000D83CDFE3L, 0x00000000D83CDFE5L, 0x00000000D83CDFE6L, 0x00000000D83CDFEAL,
+ 0x00000000D83CDFE9L, 0x00000000D83CDFE8L, 0x00000000D83DDC92L, 0x00000000000026EAL, 0x00000000D83CDFECL, 0x00000000D83CDFE4L, 0x00000000D83CDF07L,
+ 0x00000000D83CDF06L, 0x00000000D83CDFEFL, 0x00000000D83CDFF0L, 0x00000000000026FAL, 0x00000000D83CDFEDL, 0x00000000D83DDDFCL, 0x00000000D83DDDFEL,
+ 0x00000000D83DDDFBL, 0x00000000D83CDF04L, 0x00000000D83CDF05L, 0x00000000D83CDF03L, 0x00000000D83DDDFDL, 0x00000000D83CDF09L, 0x00000000D83CDFA0L,
+ 0x00000000D83CDFA1L, 0x00000000000026F2L, 0x00000000D83CDFA2L, 0x00000000D83DDEA2L, 0x00000000000026F5L, 0x00000000D83DDEA4L, 0x00000000D83DDEA3L,
+ 0x0000000000002693L, 0x00000000D83DDE80L, 0x0000000000002708L, 0x00000000D83DDCBAL, 0x00000000D83DDE81L, 0x00000000D83DDE82L, 0x00000000D83DDE8AL,
+ 0x00000000D83DDE89L, 0x00000000D83DDE9EL, 0x00000000D83DDE86L, 0x00000000D83DDE84L, 0x00000000D83DDE85L, 0x00000000D83DDE88L, 0x00000000D83DDE87L,
+ 0x00000000D83DDE9DL, 0x00000000D83DDE8BL, 0x00000000D83DDE83L, 0x00000000D83DDE8EL, 0x00000000D83DDE8CL, 0x00000000D83DDE8DL, 0x00000000D83DDE99L,
+ 0x00000000D83DDE98L, 0x00000000D83DDE97L, 0x00000000D83DDE95L, 0x00000000D83DDE96L, 0x00000000D83DDE9BL, 0x00000000D83DDE9AL, 0x00000000D83DDEA8L,
+ 0x00000000D83DDE93L, 0x00000000D83DDE94L, 0x00000000D83DDE92L, 0x00000000D83DDE91L, 0x00000000D83DDE90L, 0x00000000D83DDEB2L, 0x00000000D83DDEA1L,
+ 0x00000000D83DDE9FL, 0x00000000D83DDEA0L, 0x00000000D83DDE9CL, 0x00000000D83DDC88L, 0x00000000D83DDE8FL, 0x00000000D83CDFABL, 0x00000000D83DDEA6L,
+ 0x00000000D83DDEA5L, 0x00000000000026A0L, 0x00000000D83DDEA7L, 0x00000000D83DDD30L, 0x00000000000026FDL, 0x00000000D83CDFEEL, 0x00000000D83CDFB0L,
+ 0x0000000000002668L, 0x00000000D83DDDFFL, 0x00000000D83CDFAAL, 0x00000000D83CDFADL, 0x00000000D83DDCCDL, 0x00000000D83DDEA9L, 0xD83CDDEFD83CDDF5L,
+ 0xD83CDDF0D83CDDF7L, 0xD83CDDE9D83CDDEAL, 0xD83CDDE8D83CDDF3L, 0xD83CDDFAD83CDDF8L, 0xD83CDDEBD83CDDF7L, 0xD83CDDEAD83CDDF8L, 0xD83CDDEED83CDDF9L,
+ 0xD83CDDF7D83CDDFAL, 0xD83CDDECD83CDDE7L},
+ new ulong[]{
+ 0x00000000003120E3L, 0x00000000003220E3L, 0x00000000003320E3L, 0x00000000003420E3L, 0x00000000003520E3L, 0x00000000003620E3L, 0x00000000003720E3L, 0x00000000003820E3L,
+ 0x00000000003920E3L, 0x00000000003020E3L, 0x00000000D83DDD1FL, 0x00000000D83DDD22L, 0x00000000002320E3L, 0x00000000D83DDD23L, 0x0000000000002B06L,
+ 0x0000000000002B07L, 0x0000000000002B05L, 0x00000000000027A1L, 0x00000000D83DDD20L, 0x00000000D83DDD21L, 0x00000000D83DDD24L, 0x0000000000002197L,
+ 0x0000000000002196L, 0x0000000000002198L, 0x0000000000002199L, 0x0000000000002194L, 0x0000000000002195L, 0x00000000D83DDD04L, 0x00000000000025C0L,
+ 0x00000000000025B6L, 0x00000000D83DDD3CL, 0x00000000D83DDD3DL, 0x00000000000021A9L, 0x00000000000021AAL, 0x0000000000002139L, 0x00000000000023EAL,
+ 0x00000000000023E9L, 0x00000000000023EBL, 0x00000000000023ECL, 0x0000000000002935L, 0x0000000000002934L, 0x00000000D83CDD97L, 0x00000000D83DDD00L,
+ 0x00000000D83DDD01L, 0x00000000D83DDD02L, 0x00000000D83CDD95L, 0x00000000D83CDD99L, 0x00000000D83CDD92L, 0x00000000D83CDD93L, 0x00000000D83CDD96L,
+ 0x00000000D83DDCF6L, 0x00000000D83CDFA6L, 0x00000000D83CDE01L, 0x00000000D83CDE2FL, 0x00000000D83CDE33L, 0x00000000D83CDE35L, 0x00000000D83CDE34L /* was missing */, 0x00000000D83CDE32L,
+ 0x00000000D83CDE50L /* //34 was wrong */, 0x00000000D83CDE39L /* //32 was duplicate */, /* removed 3 */ 0x00000000D83CDE3AL, 0x00000000D83CDE36L, 0x00000000D83CDE1AL,
+ 0x00000000D83DDEBBL, 0x00000000D83DDEB9L, 0x00000000D83DDEBAL, 0x00000000D83DDEBCL, 0x00000000D83DDEBEL, 0x00000000D83DDEB0L, 0x00000000D83DDEAEL,
+ 0x00000000D83CDD7FL, 0x000000000000267FL, 0x00000000D83DDEADL, 0x00000000D83CDE37L, 0x00000000D83CDE38L, 0x00000000D83CDE02L, 0x00000000000024C2L,
+ /* missing 4 unicodes */
+ 0x00000000D83DDEC2L, 0x00000000D83DDEC4L, 0x00000000D83DDEC5L, 0x00000000D83DDEC3L,
+ 0x00000000D83CDE51L, 0x0000000000003299L, 0x0000000000003297L, 0x00000000D83CDD91L, 0x00000000D83CDD98L, 0x00000000D83CDD94L, 0x00000000D83DDEABL,
+ 0x00000000D83DDD1EL, 0x00000000D83DDCF5L, 0x00000000D83DDEAFL, 0x00000000D83DDEB1L, 0x00000000D83DDEB3L, 0x00000000D83DDEB7L, 0x00000000D83DDEB8L,
+ 0x00000000000026D4L, 0x0000000000002733L, 0x0000000000002747L, 0x000000000000274EL, 0x0000000000002705L, 0x0000000000002734L, 0x00000000D83DDC9FL,
+ 0x00000000D83CDD9AL, 0x00000000D83DDCF3L, 0x00000000D83DDCF4L, 0x00000000D83CDD70L, 0x00000000D83CDD71L, 0x00000000D83CDD8EL, 0x00000000D83CDD7EL,
+ 0x00000000D83DDCA0L, 0x00000000000027BFL, 0x000000000000267BL, 0x0000000000002648L, 0x0000000000002649L, 0x000000000000264AL, 0x000000000000264BL,
+ 0x000000000000264CL, 0x000000000000264DL, 0x000000000000264EL, 0x000000000000264FL, 0x0000000000002650L, 0x0000000000002651L, 0x0000000000002652L,
+ 0x0000000000002653L, 0x00000000000026CEL, 0x00000000D83DDD2FL, 0x00000000D83CDFE7L, 0x00000000D83DDCB9L, 0x00000000D83DDCB2L, 0x00000000D83DDCB1L,
+ 0x00000000000000A9L, 0x00000000000000AEL, 0x0000000000002122L /* TM */,
+ /* was mixed, missing 2-3 */
+ 0x000000000000274CL, 0x000000000000203CL, 0x0000000000002049L, 0x0000000000002757L, 0x0000000000002753L, 0x0000000000002755L, 0x0000000000002754L, 0x0000000000002B55L,
+ 0x00000000D83DDD1DL, 0x00000000D83DDD1AL,
+ 0x00000000D83DDD19L, 0x00000000D83DDD1BL, 0x00000000D83DDD1CL,
+ 0x00000000D83DDD03L, 0x00000000D83DDD5BL, 0x00000000D83DDD67L, 0x00000000D83DDD50L, 0x00000000D83DDD5CL,
+ 0x00000000D83DDD51L, 0x00000000D83DDD5DL, 0x00000000D83DDD52L, 0x00000000D83DDD5EL, 0x00000000D83DDD53L, 0x00000000D83DDD5FL, 0x00000000D83DDD54L,
+ 0x00000000D83DDD60L, 0x00000000D83DDD55L, 0x00000000D83DDD56L, 0x00000000D83DDD57L, 0x00000000D83DDD58L, 0x00000000D83DDD59L, 0x00000000D83DDD5AL,
+ 0x00000000D83DDD61L, 0x00000000D83DDD62L, 0x00000000D83DDD63L, 0x00000000D83DDD64L, 0x00000000D83DDD65L, 0x00000000D83DDD66L, 0x0000000000002716L,
+ 0x0000000000002795L, 0x0000000000002796L, 0x0000000000002797L, 0x0000000000002660L, 0x0000000000002665L, 0x0000000000002663L, 0x0000000000002666L,
+ 0x00000000D83DDCAEL, 0x00000000D83DDCAFL, 0x0000000000002714L, 0x0000000000002611L, 0x00000000D83DDD18L, 0x00000000D83DDD17L, 0x00000000000027B0L,
+ 0x0000000000003030L, 0x000000000000303DL, 0x00000000D83DDD31L,
+ 0x00000000000025FCL, 0x00000000000025FBL, 0x00000000000025FEL, 0x00000000000025FDL,
+ 0x00000000000025AAL, 0x00000000000025ABL,
+ 0x00000000D83DDD3AL, 0x00000000D83DDD32L, 0x00000000D83DDD33L, 0x00000000000026ABL, 0x00000000000026AAL,
+ 0x00000000D83DDD34L, 0x00000000D83DDD35L, 0x00000000D83DDD3BL, 0x0000000000002B1CL, 0x0000000000002B1BL, 0x00000000D83DDD36L, 0x00000000D83DDD37L, 0x00000000D83DDD38L, 0x00000000D83DDD39L}};
+ }
+}
diff --git a/EmojiPanel/EmojiPanel/Controls/Emoji/EmojiSpriteItem.cs b/EmojiPanel/EmojiPanel/Controls/Emoji/EmojiSpriteItem.cs
new file mode 100755
index 0000000..edcdc34
--- /dev/null
+++ b/EmojiPanel/EmojiPanel/Controls/Emoji/EmojiSpriteItem.cs
@@ -0,0 +1,244 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+using Telegram.Controls.VirtualizedView;
+
+namespace EmojiPanel.Controls.Emoji
+{
+ public class EmojiSpriteItem : VListItemBase
+ {
+ public int CategoryIndex;
+ public int SpriteOffset;
+ public int Rows;
+
+ public EventHandler EmojiSelected = delegate { };
+
+ public EmojiSpriteItem(int categoryIndex, int spriteOffset)
+ {
+ CategoryIndex = categoryIndex;
+ SpriteOffset = spriteOffset;
+ Rows = EmojiData.SpriteRowsCountByCategory[categoryIndex][spriteOffset];
+
+ var emojiInCategory = EmojiData.CodesByCategory[categoryIndex];
+ ulong[] emojis = null;
+ emojis = spriteOffset != 0 ?
+ emojiInCategory.Skip(spriteOffset*EmojiData.ItemsInSprite).Take(EmojiData.ItemsInSprite).ToArray() :
+ emojiInCategory.Take(EmojiData.ItemsInSprite).ToArray();
+
+ View.Width = SpriteWidth + 8;
+ var decodePixelWidth = SpriteWidth;
+ switch (Application.Current.Host.Content.ScaleFactor)
+ {
+ case 100:
+ break;
+ case 150:
+ decodePixelWidth = 711;
+ break;
+ case 160:
+ decodePixelWidth = 758;
+ break;
+ }
+
+ var image = new Image
+ {
+ Width = SpriteWidth,
+ Source = new BitmapImage
+ {
+ DecodePixelWidth = decodePixelWidth,
+ DecodePixelType = DecodePixelType.Physical
+ //UriSource = spriteUri
+ },
+ Margin = new Thickness(4, 1, 4, 1),
+ VerticalAlignment = VerticalAlignment.Top
+ };
+ Children.Add(image);
+
+ View.MouseLeftButtonDown += ViewOnMouseLeftButtonDown;
+ View.LostMouseCapture += ViewOnLostMouseCapture;
+ View.MouseLeftButtonUp += ViewOnLostMouseCapture;
+ View.MouseLeave += ViewOnLostMouseCapture;
+ View.Tap += ViewOnTap;
+
+ CreateBorders();
+ }
+
+ public EmojiSpriteItem(Uri spriteUri, int categoryIndex, int spriteOffset)
+ {
+ CategoryIndex = categoryIndex;
+ SpriteOffset = spriteOffset;
+ Rows = EmojiData.SpriteRowsCountByCategory[categoryIndex][spriteOffset];
+
+ View.Width = SpriteWidth + 8;
+ var decodePixelWidth = SpriteWidth;
+ switch (Application.Current.Host.Content.ScaleFactor)
+ {
+ case 100:
+ break;
+ case 150:
+ decodePixelWidth = 711;
+ break;
+ case 160:
+ decodePixelWidth = 758;
+ break;
+ }
+
+ var image = new Image
+ {
+ Width = SpriteWidth,
+ Source = new BitmapImage
+ {
+ DecodePixelWidth = decodePixelWidth,
+ DecodePixelType = DecodePixelType.Physical,
+ UriSource = spriteUri
+ },
+ Margin = new Thickness(4, 1, 4, 1),
+ VerticalAlignment = VerticalAlignment.Top
+ };
+ Children.Add(image);
+
+ View.MouseLeftButtonDown += ViewOnMouseLeftButtonDown;
+ View.LostMouseCapture += ViewOnLostMouseCapture;
+ View.MouseLeftButtonUp += ViewOnLostMouseCapture;
+ View.MouseLeave += ViewOnLostMouseCapture;
+ View.Tap += ViewOnTap;
+
+ CreateBorders();
+ }
+
+ private static void ViewOnLostMouseCapture(object sender, MouseEventArgs mouseEventArgs)
+ {
+ ClearCurrentHighlight();
+ }
+
+ public static void ClearCurrentHighlight()
+ {
+ if (_currentHighlight == null) return;
+
+ var parent = _currentHighlight.Parent as Grid;
+ if (parent != null)
+ parent.Children.Remove(_currentHighlight);
+
+ _currentHighlight = null;
+ }
+
+ private void ViewOnMouseLeftButtonDown(object sender, MouseButtonEventArgs args)
+ {
+ var point = args.GetPosition(View);
+ var column = (int) Math.Ceiling(point.X / ColumnWidth);
+ var row = (int) Math.Ceiling(point.Y / RowHeight);
+
+ if (column <= 0 || row <= 0) return;
+ if (Rows < MaxRowsInSprite && row == Rows)
+ {
+ if (EmojiData.ItemsInRow - EmojiData.SpriteMissingCellsByCategory[CategoryIndex] < column)
+ return;
+ }
+
+ var emojiHoverBackground = new Rectangle
+ {
+ Width = ColumnWidth - 2, //width without 2px border
+ Height = RowHeight,
+ Fill = (Brush) Application.Current.Resources["PhoneAccentBrush"],
+ Margin = new Thickness((column - 1) * 79 + 4, (row - 1) * 70 + 2, 0, 0),
+ HorizontalAlignment = HorizontalAlignment.Left,
+ VerticalAlignment = VerticalAlignment.Top
+ };
+ View.Children.Insert(0, emojiHoverBackground);
+
+ ClearCurrentHighlight();
+ _currentHighlight = emojiHoverBackground;
+ }
+
+ private void ViewOnTap(object sender, GestureEventArgs args)
+ {
+ var point = args.GetPosition(View);
+ var column = (int) Math.Ceiling(point.X / 79);
+ var row = (int) Math.Ceiling(point.Y / 70);
+
+ if (column <= 0 || row <= 0) return;
+
+ //Debug.WriteLine("{0}-{1}", column, row);
+
+ var itemIndex = (row - 1) * EmojiData.ItemsInRow + (column - 1);
+
+ var emoji = EmojiDataItem.GetByIndex(CategoryIndex, SpriteOffset, itemIndex);
+ if (emoji != null)
+ EmojiSelected(null, emoji);
+ }
+
+ private static Rectangle _currentHighlight;
+
+ private void CreateBorders()
+ {
+ for (int i = 0; i < Rows + 1; i++)
+ {
+ var line = new Rectangle
+ {
+ Width = SpriteWidth + 4,
+ Height = 2,
+ Fill = (Brush) Application.Current.Resources["PhoneChromeBrush"],
+ Margin = new Thickness(0, i * RowHeight, 0, 0),
+ HorizontalAlignment = HorizontalAlignment.Left,
+ VerticalAlignment = VerticalAlignment.Top
+ };
+ Children.Add(line);
+ }
+
+ for (int i = 0; i < 5; i++)
+ {
+ var line = new Rectangle
+ {
+ Width = 2,
+ Height = RowHeight * Rows,
+ Fill = (Brush) Application.Current.Resources["PhoneChromeBrush"],
+ Margin = new Thickness((i + 1) * ColumnWidth + 2, 0, 0, 0),
+ HorizontalAlignment = HorizontalAlignment.Left,
+ VerticalAlignment = VerticalAlignment.Top
+ };
+ Children.Add(line);
+ }
+
+ if (Rows < MaxRowsInSprite)
+ {
+ var missingRows = EmojiData.SpriteMissingCellsByCategory[CategoryIndex];
+ var startIndex = EmojiData.ItemsInRow - missingRows;
+
+ var width = missingRows * ColumnWidth;
+ var horizontalOffset = startIndex * ColumnWidth + 4;
+
+ var rect = new Rectangle
+ {
+ Fill = (Brush) Application.Current.Resources["PhoneChromeBrush"],
+ Width = width,
+ Height = RowHeight,
+ Margin = new Thickness(horizontalOffset, (Rows - 1) * RowHeight, 0, 0),
+ HorizontalAlignment = HorizontalAlignment.Left,
+ VerticalAlignment = VerticalAlignment.Top
+ };
+ Children.Add(rect);
+ }
+ }
+
+ public const int SpriteWidth = 472;
+ public const int SpriteHeight = 420;
+ public const int ColumnWidth = 79;
+ public const int RowHeight = 70; // 105 in pixel logic
+
+ public const int MaxRowsInSprite = 6;
+
+ public override double FixedHeight
+ {
+ get { return RowHeight * Rows; }
+ set { }
+ }
+ }
+}
diff --git a/EmojiPanel/EmojiPanel/Controls/Utilites/DelayedExecutor.cs b/EmojiPanel/EmojiPanel/Controls/Utilites/DelayedExecutor.cs
new file mode 100755
index 0000000..5dd7a1e
--- /dev/null
+++ b/EmojiPanel/EmojiPanel/Controls/Utilites/DelayedExecutor.cs
@@ -0,0 +1,92 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.Phone.Logging;
+
+namespace Telegram.Controls.Utilities
+{
+ public class DelayedExecutor
+ {
+ class ExecutionInfo
+ {
+ public Action Action { get; set; }
+ public DateTime Timestamp { get; set; }
+ }
+
+ ExecutionInfo m_executionInfo;
+ Timer m_timer;
+ int m_delay;
+ bool m_timerIsActive;
+ object m_lockObj = new object();
+
+ public DelayedExecutor(int delay) // TO DO : add IDateTimeProvider dependency to remove dependency on DateTime
+ {
+ m_delay = delay;
+ m_timer = new Timer(TimerCallback);
+ }
+
+ public void AddToDelayedExecution(Action action)
+ {
+ lock (m_lockObj)
+ {
+ m_executionInfo = new ExecutionInfo() { Action = action, Timestamp = DateTime.Now };
+ }
+
+ ChangeTimer(true);
+ }
+
+ private void TimerCallback(object state)
+ {
+ Action executeAction = null;
+
+ lock (m_lockObj)
+ {
+ if (m_executionInfo != null)
+ {
+ if (DateTime.Now - m_executionInfo.Timestamp >= TimeSpan.FromMilliseconds(m_delay))
+ {
+ Debug.WriteLine("Action is set to be executed.");
+ executeAction = m_executionInfo.Action;
+ m_executionInfo = null;
+ ChangeTimer(false);
+ }
+ }
+ }
+ if (executeAction != null)
+ {
+ try
+ {
+ executeAction();
+ }
+ catch (Exception exc)
+ {
+ //Logger.Instance.Error("Exeption during delayed execution", exc);
+ }
+ }
+ }
+
+ private void ChangeTimer(bool activate)
+ {
+ if (activate && !m_timerIsActive)
+ {
+ lock (m_timer)
+ {
+ m_timerIsActive = true;
+ m_timer.Change(m_delay, m_delay);
+ }
+ }
+ else if (!activate && m_timerIsActive)
+ {
+ lock (m_timer)
+ {
+ m_timerIsActive = false;
+ m_timer.Change(Timeout.Infinite, 0);
+ }
+ }
+ }
+ }
+}
diff --git a/EmojiPanel/EmojiPanel/Controls/Utilites/Helpers.cs b/EmojiPanel/EmojiPanel/Controls/Utilites/Helpers.cs
new file mode 100755
index 0000000..6f067e5
--- /dev/null
+++ b/EmojiPanel/EmojiPanel/Controls/Utilites/Helpers.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+
+namespace EmojiPanel.Controls.Utilites
+{
+ public static class Helpers
+ {
+ public static Uri GetAssetUri(string assetName)
+ {
+ switch (Application.Current.Host.Content.ScaleFactor)
+ {
+ case 100:
+ return new Uri(String.Format("/Assets/{0}-WVGA.png", assetName), UriKind.Relative);
+ case 160:
+ return new Uri(String.Format("/Assets/{0}-WXGA.png", assetName), UriKind.Relative);
+ case 150:
+ return new Uri(String.Format("/Assets/{0}-720p.png", assetName), UriKind.Relative);
+ default:
+ return new Uri(String.Format("/Assets/{0}-WVGA.png", assetName), UriKind.Relative);
+ }
+ }
+ }
+}
diff --git a/EmojiPanel/EmojiPanel/Controls/Utilites/MyListItemBase.cs b/EmojiPanel/EmojiPanel/Controls/Utilites/MyListItemBase.cs
new file mode 100755
index 0000000..8ef5c45
--- /dev/null
+++ b/EmojiPanel/EmojiPanel/Controls/Utilites/MyListItemBase.cs
@@ -0,0 +1,25 @@
+using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
+using Telegram.Controls.VirtualizedView;
+
+namespace Telegram.Controls.VirtualizedView
+{
+ public class MyListItemBase : Grid
+ {
+ //private Panel _contentPanel;
+ //public Panel ContentPanel
+ //{
+ // get
+ // {
+ // return _contentPanel;
+ // }
+ // set
+ // {
+ // _contentPanel = value;
+ // Content = _contentPanel;
+ // }
+ //}
+
+ public VListItemBase VirtSource { get; set; }
+ }
+}
diff --git a/EmojiPanel/EmojiPanel/Controls/Utilites/MyVirtualizingPanel.cs b/EmojiPanel/EmojiPanel/Controls/Utilites/MyVirtualizingPanel.cs
new file mode 100755
index 0000000..597b8ea
--- /dev/null
+++ b/EmojiPanel/EmojiPanel/Controls/Utilites/MyVirtualizingPanel.cs
@@ -0,0 +1,586 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Linq;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Media;
+using Telegram.Controls.Utilities;
+
+namespace Telegram.Controls.VirtualizedView
+{
+ public class MyVirtualizingPanel : Canvas
+ {
+ private const bool IsLogEnabled = false;
+
+ private static void Log(string str)
+ {
+ if (IsLogEnabled)
+ {
+ Debug.WriteLine(str);
+ }
+ }
+
+
+ private const double LoadUnloadThreshold = 500;
+ private const double LoadedHeightUpwards = 300;
+ private const double LoadedHeightDownwards = 900;
+ private const double LoadedHeightDownwardsNotScrolling = 800;
+
+ private bool _changingVerticalOffset = false;
+
+ readonly DependencyProperty _listVerticalOffsetProperty = DependencyProperty.Register(
+ "ListVerticalOffset",
+ typeof(double),
+ typeof(MyVirtualizingPanel),
+ new PropertyMetadata(new PropertyChangedCallback(OnListVerticalOffsetChanged)));
+
+ public double ListVerticalOffset
+ {
+ get { return (double) this.GetValue(_listVerticalOffsetProperty); }
+ set { this.SetValue(_listVerticalOffsetProperty, value); }
+ }
+
+ private static void OnListVerticalOffsetChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
+ {
+ var control = (MyVirtualizingPanel) obj;
+ control.OnListVerticalOffsetChanged();
+ }
+
+ private ScrollViewer _scrollViewer;
+ bool _isScrolling = false;
+
+ public ScrollViewer ScrollViewer
+ {
+ get { return _scrollViewer; }
+ }
+
+ public void InitializeWithScrollViewer(ScrollViewer scrollViewer)
+ {
+ _scrollViewer = scrollViewer;
+ EnsureBoundToScrollViewer();
+ }
+
+ protected void EnsureBoundToScrollViewer()
+ {
+ Binding binding = new Binding
+ {
+ Source = _scrollViewer,
+ Path = new PropertyPath("VerticalOffset"),
+ Mode = BindingMode.OneWay
+ };
+ this.SetBinding(_listVerticalOffsetProperty, binding);
+
+
+ }
+
+ bool _notReactToScroll = false;
+ private double _savedDelta;
+ //private DelayedExecutor _de = new DelayedExecutor(300);
+ //internal void PrepareForScrollToBottom()
+ //{
+ // _notReactToScroll = true;
+ // _savedDelta = DeltaOffset;
+ // // load in the end
+ // DeltaOffset = _scrollViewer.ExtentHeight - _scrollViewer.ViewportHeight - _scrollViewer.VerticalOffset;
+ // Debug.WriteLine("PrepareForScrollToBottom");
+ // PerformLoadUnload2(VirtualizableState.LoadedPartially, false);
+ // _de.AddToDelayedExecution(() =>
+ // {
+ // Execute.ExecuteOnUIThread(() => ScrollToBottomCompleted());
+ // });
+ //}
+
+ //internal void ScrollToBottomCompleted()
+ //{
+ // _notReactToScroll = false;
+ // DeltaOffset = _savedDelta;
+ // PerformLoadUnload(VirtualizableState.LoadedFully);
+ // Debug.WriteLine("ScrolltoBottomCompleted");
+ //}
+
+ private void group_CurrentStateChanging(object sender, VisualStateChangedEventArgs e)
+ {
+ if (e.NewState.Name == "Scrolling")
+ {
+ _isScrolling = true;
+ }
+ else
+ {
+ _isScrolling = false;
+ PerformLoadUnload(true);
+ }
+ }
+
+ private static VisualStateGroup FindVisualState(FrameworkElement element, string name)
+ {
+ if (element == null)
+ return null;
+
+ IList groups = VisualStateManager.GetVisualStateGroups(element);
+ foreach (VisualStateGroup group in groups)
+ if (group.Name == name)
+ return group;
+
+ return null;
+ }
+
+ public class ScrollPositionChangedEventAgrs : EventArgs
+ {
+ public double CurrentPosition { get; private set; }
+ public double ScrollHeight { get; private set; }
+
+ public ScrollPositionChangedEventAgrs(double currentPosition,
+ double scrollHeight)
+ {
+ CurrentPosition = currentPosition;
+ ScrollHeight = scrollHeight;
+ }
+ }
+
+ public event EventHandler ScrollPositionChanged;
+
+ private double _previousScrollOffset = 0;
+ private DateTime _previousScrollOffsetChangedTime = DateTime.MinValue;
+ private const double PixelsPerSecondThreshold = 200;
+
+ private void OnListVerticalOffsetChanged()
+ {
+ if (_notReactToScroll) return;
+
+ if (!_changingVerticalOffset)
+ {
+
+ var w = new Stopwatch();
+ w.Start();
+ PerformLoadUnload(true);
+ w.Stop();
+
+ Log("LOADUNLOAD performed in " + w.ElapsedMilliseconds);
+
+ if (ScrollPositionChanged != null)
+ {
+ ScrollPositionChanged(this, new ScrollPositionChangedEventAgrs(
+ _scrollViewer.VerticalOffset,
+ Height));
+ }
+
+ Log("Reported Offset: " + _scrollViewer.VerticalOffset);
+ }
+ }
+
+ private bool DetermineIfScrollingIsFast()
+ {
+ var now = DateTime.Now;
+ var result = false;
+ if (_previousScrollOffsetChangedTime != DateTime.Now)
+ {
+ var scrolledPixels = Math.Abs(_scrollViewer.VerticalOffset - _previousScrollOffset);
+ var timeInSeconds = (now - _previousScrollOffsetChangedTime).TotalSeconds;
+
+ if (scrolledPixels != 0)
+ {
+ var speedPixelsPerSecond = scrolledPixels / timeInSeconds;
+ Log(String.Format("Speed of scroll {0} ", speedPixelsPerSecond));
+
+ if (speedPixelsPerSecond > PixelsPerSecondThreshold)
+ {
+ result = true;
+ }
+ }
+ }
+
+ _previousScrollOffsetChangedTime = now;
+ _previousScrollOffset = _scrollViewer.VerticalOffset;
+ return result;
+ }
+
+ private readonly List _virtItems = new List();
+
+ // indexes of loaded items
+ private Segment _loadedSegment = new Segment();
+
+ // maps a point to its index in _virtItems
+ // covers only points 0, LoadUnloadThreshold, 2*LoadUnloadThreshold, etc
+ private readonly Dictionary _thresholdPointIndexes = new Dictionary();
+
+
+ // do not change through this property
+ public List VirtItems
+ {
+ get { return _virtItems; }
+ }
+
+ public MyVirtualizingPanel()
+ {
+ Loaded += MyVirtualizingPanel_Loaded;
+ }
+
+ void MyVirtualizingPanel_Loaded(object sender, RoutedEventArgs e)
+ {
+ if (!DesignerProperties.GetIsInDesignMode(this))
+ {
+ // Visual States are always on the first child of the control template
+ FrameworkElement element = VisualTreeHelper.GetChild(_scrollViewer, 0) as FrameworkElement;
+ if (element != null)
+ {
+ VisualStateGroup group = FindVisualState(element, "ScrollStates");
+ if (group != null)
+ {
+ group.CurrentStateChanging += group_CurrentStateChanging;
+ }
+ }
+ }
+ }
+
+ public void AddItems(IEnumerable _itemsToBeAdded)
+ {
+ var sw = new Stopwatch();
+ sw.Start();
+
+ double topMargin = 0;
+
+ if (_virtItems.Count > 0)
+ {
+ topMargin = _virtItems.Sum(vi => vi.FixedHeight);
+ }
+
+ foreach (var itemToBeAdded in _itemsToBeAdded)
+ {
+ itemToBeAdded.View.Margin = new Thickness(itemToBeAdded.Margin.Left, itemToBeAdded.Margin.Top + topMargin, itemToBeAdded.Margin.Right, itemToBeAdded.Margin.Bottom);
+
+ _virtItems.Add(itemToBeAdded);
+
+ var itemHeightIncludingMargin = itemToBeAdded.FixedHeight;
+
+ List coveredPoints = GetCoveredPoints(topMargin, topMargin + itemHeightIncludingMargin);
+
+ foreach (var coveredPoint in coveredPoints)
+ {
+ _thresholdPointIndexes[coveredPoint] = _virtItems.Count - 1; // index of the last
+ }
+
+ topMargin += itemHeightIncludingMargin;
+ }
+
+ PerformLoadUnload(true);
+
+ Height = topMargin;
+
+ sw.Stop();
+
+ Log(String.Format("MyVirtualizingPanel.AddItems {0}", sw.ElapsedMilliseconds));
+ }
+
+
+ public void InsertRemoveItems(int index, List itemsToInsert, bool keepItemsBelowIndexFixed = false, VListItemBase itemToRemove = null)
+ {
+ bool needToAdjustScrollPositionAfterInsertion = false;
+
+ if (keepItemsBelowIndexFixed)
+ {
+ double totalHeightOfAllItemsBeforeIndex = 0;
+
+ for (int i = 0; i < index; i++)
+ {
+ totalHeightOfAllItemsBeforeIndex += VirtItems[i].FixedHeight + VirtItems[i].Margin.Top + VirtItems[i].Margin.Bottom;
+ }
+
+ if (totalHeightOfAllItemsBeforeIndex < _scrollViewer.VerticalOffset + _scrollViewer.ViewportHeight)
+ {
+ needToAdjustScrollPositionAfterInsertion = true;
+ }
+ }
+
+ // UnloadItemsInSegment(_loadedSegment);
+ _loadedSegment = new Segment();
+
+ var totalHeight = itemsToInsert.Sum(i => i.FixedHeight + i.Margin.Top + i.Margin.Bottom);
+
+ _virtItems.InsertRange(index, itemsToInsert);
+
+ if (itemToRemove != null)
+ {
+ itemToRemove.IsVLoaded = false;
+ totalHeight -= itemToRemove.FixedHeight + itemToRemove.Margin.Top + itemToRemove.Margin.Bottom;
+ _virtItems.Remove(itemToRemove);
+ }
+
+
+ RearrangeAllItems();
+
+
+ if (needToAdjustScrollPositionAfterInsertion)
+ {
+ _changingVerticalOffset = true;
+ //Debug.WriteLine("SCROLLING TO " + _scrollViewer.VerticalOffset + totalHeight + " scroll height : " + _scrollViewer.ExtentHeight);
+ _scrollViewer.ScrollToVerticalOffset(_scrollViewer.VerticalOffset + totalHeight);
+ _changingVerticalOffset = false;
+ }
+
+ PerformLoadUnload(false);
+ }
+
+ public void RemoveItem(VListItemBase itemToBeRemoved)
+ {
+ itemToBeRemoved.IsVLoaded = false;
+
+
+ _virtItems.Remove(itemToBeRemoved);
+ _loadedSegment = new Segment();
+ RearrangeAllItems();
+
+ PerformLoadUnload(true);
+ }
+
+ private void RearrangeAllItems()
+ {
+ double topMargin = 0;
+ _thresholdPointIndexes.Clear();
+ int ind = 0;
+ foreach (var item in _virtItems)
+ {
+ item.View.Margin = new Thickness(item.Margin.Left, item.Margin.Top + topMargin, item.Margin.Right, item.Margin.Bottom);
+
+ var itemHeightIncludingMargin = item.FixedHeight + item.Margin.Top + item.Margin.Bottom;
+
+ List coveredPoints = GetCoveredPoints(topMargin, topMargin + itemHeightIncludingMargin);
+
+ foreach (var coveredPoint in coveredPoints)
+ {
+ _thresholdPointIndexes[coveredPoint] = ind; // index of the last
+ }
+
+ topMargin += itemHeightIncludingMargin;
+ ind++;
+ }
+
+ Height = topMargin;
+ _scrollViewer.UpdateLayout();
+ }
+
+ private void PerformLoadUnload2(bool isToLoad, bool bypassUnload = false)
+ {
+ if (_virtItems.Count == 0)
+ return;
+
+ double currentOffset = GetRealOffset();
+
+ int lowestLoadedInd = 0;
+ int upperInd = 0;
+
+ bool triggerLoading = false;
+
+ if (isToLoad || _loadedSegment.IsEmpty)
+ {
+ triggerLoading = true;
+ }
+ else
+ {
+ lowestLoadedInd = _loadedSegment.LowerBound;
+ upperInd = _loadedSegment.UpperBound;
+
+ double topPoint = _virtItems[lowestLoadedInd].View.Margin.Top;
+ double bottomPoint = _virtItems[upperInd].View.Margin.Top + _virtItems[upperInd].FixedHeight;
+
+ if (currentOffset - topPoint < 500 ||
+ bottomPoint - currentOffset < 1500)
+ {
+ triggerLoading = true;
+ }
+ }
+
+ if (triggerLoading)
+ {
+ if (_scrollViewer.ExtentHeight < 3000 && _isScrolling)
+ {
+ //Debug.WriteLine("Detected short scroll; loading all items");
+ // otherwise there are glitches in scrolling
+ lowestLoadedInd = 0;
+ upperInd = VirtItems.Count - 1;
+ isToLoad = true;
+ }
+ else
+ {
+ var threshold = (int) Math.Floor((currentOffset - (currentOffset % LoadUnloadThreshold)));
+
+ int indexOfBaseItem = _thresholdPointIndexes.ContainsKey(threshold) ? _thresholdPointIndexes[threshold] : -1;
+
+ lowestLoadedInd = upperInd = indexOfBaseItem < 0 ? 0 : indexOfBaseItem;
+
+ double loadUpwards = LoadedHeightUpwards;
+ double loadDownwards = _isScrolling ? LoadedHeightDownwards : LoadedHeightDownwardsNotScrolling;
+
+ //if (_isScrolling)
+ //{
+ // loadUpwards = LoadUpwardsWhenScrolling;
+ // loadDownwards = LoadDownwardsWhenScrolling;
+ //}
+
+ // count up from the lower point on view
+ while (lowestLoadedInd > 0 && currentOffset - _virtItems[lowestLoadedInd].View.Margin.Top < loadUpwards)
+ {
+ lowestLoadedInd--;
+ }
+
+ while (upperInd < _virtItems.Count - 1 && _virtItems[upperInd].View.Margin.Top - currentOffset < loadDownwards)
+ {
+ upperInd++;
+ }
+
+ }
+
+ SetLoadedBounds(lowestLoadedInd, upperInd, isToLoad, bypassUnload);
+
+
+ if (IsLogEnabled)
+ {
+ string loadedIndexes = "Loaded indexes : ";
+ for (int i = 0; i < _virtItems.Count; i++)
+ {
+ if (_virtItems[i].IsVLoaded)
+ {
+ loadedIndexes += i + ",";
+ }
+ }
+
+ Log(loadedIndexes);
+ }
+ }
+
+ }
+
+ public double DeltaOffset
+ {
+ get;
+ set;
+ }
+
+ private double GetRealOffset()
+ {
+ //// it might throw exception
+ //try
+ //{
+ // GeneralTransform childTransform = this.TransformToVisual(_listScrollViewer);
+
+ // var p = childTransform.Transform(new Point(0, 0));
+
+ // var delta = p.Y;
+ // Debug.WriteLine("DELTA offset =" + delta + "; VerticalOffset=" + _listScrollViewer.VerticalOffset);
+
+ // return -delta;
+ //}
+ //catch (Exception exc)
+ //{
+ // return _listScrollViewer.VerticalOffset;
+ //}
+
+ return _scrollViewer.VerticalOffset + DeltaOffset;
+ }
+
+ private void PerformLoadUnload(bool isToLoad)
+ {
+ PerformLoadUnload2(isToLoad);
+ }
+
+ private void SetLoadedBounds(int lowerBoundInd, int upperBoundInd, bool isToLoad, bool bypassUnload = false)
+ {
+ var newLoadedSegment = new Segment(lowerBoundInd, upperBoundInd);
+
+ Segment newMinusLoaded1;
+ Segment newMinusLoaded2;
+ Segment intersection;
+ Segment loadedMinusNew1;
+ Segment loadedMinusNew2;
+
+ newLoadedSegment.CompareToSegment(_loadedSegment,
+ out newMinusLoaded1,
+ out newMinusLoaded2,
+ out intersection,
+ out loadedMinusNew1,
+ out loadedMinusNew2);
+
+
+ Log(String.Format("LoadedSegment:{0}, NewSegment:{1}, NewMinusLoaded1:{2}, NewMinusLoaded2:{3}, loadedMinusNew1:{4}, loadedMinusNew2:{5}",
+ _loadedSegment,
+ newLoadedSegment,
+ newMinusLoaded1,
+ newMinusLoaded2,
+ loadedMinusNew1,
+ loadedMinusNew2));
+
+ if (isToLoad)
+ {
+ // ensure items are loaded fully for the whole segment
+ LoadItemsInSegment(newLoadedSegment);
+ }
+
+ if (!bypassUnload)
+ {
+ UnloadItemsInSegment(loadedMinusNew1);
+ UnloadItemsInSegment(loadedMinusNew2);
+ }
+ _loadedSegment = newLoadedSegment;
+
+ }
+
+ private void UnloadItemsInSegment(Segment segment)
+ {
+ for (int i = segment.LowerBound; i <= segment.UpperBound; i++)
+ {
+ var item = _virtItems[i];
+
+ Children.Remove(item.View);
+
+ item.IsVLoaded = false;
+ }
+ }
+
+ private void LoadItemsInSegment(Segment segment)
+ {
+ for (int i = segment.LowerBound; i <= segment.UpperBound; i++)
+ {
+ var item = _virtItems[i];
+
+ item.IsVLoaded = true;
+
+ if (!Children.Contains(item.View))
+ {
+ Children.Add(item.View);
+ }
+ }
+ }
+
+ private List GetCoveredPoints(double from, double to)
+ {
+
+ var result = new List();
+
+ var candidate = from - (from % LoadUnloadThreshold);
+
+ while (candidate <= to)
+ {
+ if (candidate >= from)
+ {
+ result.Add((int) Math.Floor(candidate));
+ }
+ candidate += LoadUnloadThreshold;
+ }
+
+ return result;
+ }
+
+ public void ClearItems()
+ {
+ _virtItems.Clear();
+ Children.Clear();
+ _loadedSegment = new Segment();
+ _thresholdPointIndexes.Clear();
+ _scrollViewer.ScrollToVerticalOffset(0);
+ Height = 0;
+ }
+ }
+}
diff --git a/EmojiPanel/EmojiPanel/Controls/Utilites/VListItemBase.cs b/EmojiPanel/EmojiPanel/Controls/Utilites/VListItemBase.cs
new file mode 100755
index 0000000..edfeb47
--- /dev/null
+++ b/EmojiPanel/EmojiPanel/Controls/Utilites/VListItemBase.cs
@@ -0,0 +1,60 @@
+using System.Collections.Generic;
+using System.Windows;
+using Rectangle = System.Windows.Shapes.Rectangle;
+
+namespace Telegram.Controls.VirtualizedView
+{
+ public abstract class VListItemBase
+ {
+ private readonly List _children = new List();
+
+ public MyListItemBase View { get; private set; }
+
+ public List Children
+ {
+ get { return _children; }
+ }
+
+ protected VListItemBase()
+ {
+ View = new MyListItemBase
+ {
+ VirtSource = this,
+ Width = 440
+ };
+ }
+ public abstract double FixedHeight { get; set; }
+
+ public Thickness Margin = new Thickness();
+
+ public virtual object ItemSource { get; set; }
+
+ private bool _isVLoaded;
+
+ public bool IsVLoaded
+ {
+ get { return _isVLoaded; }
+ set
+ {
+ if (value != IsVLoaded)
+ {
+ if (value) Load();
+ else Unload();
+ }
+ _isVLoaded = value;
+ }
+ }
+
+ public virtual void Load()
+ {
+ if (View.Children.Count == 0)
+ foreach (var child in _children)
+ View.Children.Add(child);
+ }
+
+ public virtual void Unload()
+ {
+ View.Children.Clear();
+ }
+ }
+}
diff --git a/EmojiPanel/EmojiPanel/Controls/Utilites/VirtSegment.cs b/EmojiPanel/EmojiPanel/Controls/Utilites/VirtSegment.cs
new file mode 100755
index 0000000..bc883aa
--- /dev/null
+++ b/EmojiPanel/EmojiPanel/Controls/Utilites/VirtSegment.cs
@@ -0,0 +1,102 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Telegram.Controls.Utilities
+{
+ public class Segment
+ {
+ public int LowerBound { get; private set; }
+ public int UpperBound { get; private set; }
+
+ public bool IsEmpty { get { return UpperBound < LowerBound; } }
+
+ public Segment(int lowerBound, int upperBound)
+ {
+ LowerBound = lowerBound;
+ UpperBound = upperBound;
+ }
+
+ public Segment()
+ : this(0, -1)
+ {
+ }
+
+ public override string ToString()
+ {
+ if (IsEmpty) return "[]";
+ return String.Format("[{0},{1}]", LowerBound, UpperBound);
+ }
+
+ public void CompareToSegment(
+ Segment otherSegment,
+ out Segment thisMinusOther1,
+ out Segment thisMinusOther2,
+ out Segment intersection,
+ out Segment otherMinusThis1,
+ out Segment otherMinusThis2)
+ {
+
+ thisMinusOther1 = new Segment();
+ thisMinusOther2 = new Segment();
+ intersection = new Segment();
+ otherMinusThis1 = new Segment();
+ otherMinusThis2 = new Segment();
+
+
+ if (this.IsEmpty)
+ {
+ otherMinusThis1 = otherSegment;
+ return;
+ }
+
+ if (otherSegment.IsEmpty)
+ {
+ thisMinusOther1 = this;
+ return;
+ }
+
+ if (this.UpperBound < otherSegment.LowerBound)
+ {
+
+ // do not intersect
+
+ thisMinusOther1 = this;
+
+ otherMinusThis1 = otherSegment;
+
+ return;
+ }
+
+
+ if (this.LowerBound < otherSegment.LowerBound &&
+ this.UpperBound >= otherSegment.LowerBound &&
+ this.UpperBound <= otherSegment.UpperBound)
+ {
+ thisMinusOther1 = new Segment(this.LowerBound, otherSegment.LowerBound - 1);
+ intersection = new Segment(otherSegment.LowerBound, this.UpperBound);
+ otherMinusThis1 = new Segment(this.UpperBound + 1, otherSegment.UpperBound);
+ return;
+ }
+
+ if (this.LowerBound >= otherSegment.LowerBound &&
+ this.UpperBound <= otherSegment.UpperBound)
+ {
+ intersection = this;
+ otherMinusThis1 = new Segment(otherSegment.LowerBound, this.LowerBound - 1);
+ otherMinusThis2 = new Segment(this.UpperBound + 1, otherSegment.UpperBound);
+ return;
+ }
+
+ otherSegment.CompareToSegment(this,
+ out otherMinusThis1,
+ out otherMinusThis2,
+ out intersection,
+ out thisMinusOther1,
+ out thisMinusOther2);
+
+ }
+ }
+}
diff --git a/EmojiPanel/EmojiPanel/EmojiPanel.csproj b/EmojiPanel/EmojiPanel/EmojiPanel.csproj
new file mode 100755
index 0000000..b71ac5a
--- /dev/null
+++ b/EmojiPanel/EmojiPanel/EmojiPanel.csproj
@@ -0,0 +1,1094 @@
+
+
+
+ Debug
+ AnyCPU
+ 10.0.20506
+ 2.0
+ {2FCB4C15-FE40-496F-87D6-84220F3F07F8}
+ {C089C8C0-30E0-4E22-80C0-CE093F111A43};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}
+ Library
+ Properties
+ EmojiPanel
+ EmojiPanel
+ v8.0
+
+
+
+
+ WindowsPhone
+ true
+
+
+ true
+ true
+ EmojiPanel_$(Configuration)_$(Platform).xap
+ Properties\AppManifest.xml
+ EmojiPanel.App
+ true
+ true
+
+
+
+
+ 4.0
+ 11.0
+ publish\
+ true
+ Disk
+ false
+ Foreground
+ 7
+ Days
+ false
+ false
+ true
+ 0
+ 1.0.0.%2a
+ false
+ false
+ true
+
+
+ true
+ full
+ false
+ Bin\Debug
+ DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE
+ true
+ true
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ Bin\Release
+ TRACE;SILVERLIGHT;WINDOWS_PHONE
+ true
+ true
+ prompt
+ 4
+
+
+
+ Bin\x86\Debug
+ true
+ full
+ false
+
+
+
+ Bin\x86\Release
+ pdbonly
+ true
+
+
+
+ Bin\ARM\Debug
+ true
+ full
+ false
+
+
+
+ Bin\ARM\Release
+ pdbonly
+ true
+
+
+
+ App.xaml
+
+
+ EmojiControl.xaml
+
+
+
+
+
+
+
+
+
+
+ MainPage.xaml
+
+
+
+
+
+ Designer
+ MSBuild:Compile
+ MSBuild:Compile
+ Designer
+
+
+ Designer
+ MSBuild:Compile
+
+
+ Designer
+ MSBuild:Compile
+ MSBuild:Compile
+ Designer
+
+
+
+
+
+ Designer
+
+
+
+
+ PreserveNewest
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+
+
+ False
+ Клиентский профиль .NET Framework 3.5 с пакетом обновления 1 %28SP1%29
+ false
+
+
+ False
+ .NET Framework 3.5 SP1
+ false
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/EmojiPanel/EmojiPanel/MainPage.xaml b/EmojiPanel/EmojiPanel/MainPage.xaml
new file mode 100755
index 0000000..034be70
--- /dev/null
+++ b/EmojiPanel/EmojiPanel/MainPage.xaml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/EmojiPanel/EmojiPanel/MainPage.xaml.cs b/EmojiPanel/EmojiPanel/MainPage.xaml.cs
new file mode 100755
index 0000000..164fff5
--- /dev/null
+++ b/EmojiPanel/EmojiPanel/MainPage.xaml.cs
@@ -0,0 +1,52 @@
+using System;
+using System.ComponentModel;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Navigation;
+using EmojiPanel.Controls.Emoji;
+using Microsoft.Phone.Controls;
+
+namespace EmojiPanel
+{
+ public partial class MainPage
+ {
+ public EmojiControl EmojiInstance;
+
+ public MainPage()
+ {
+ InitializeComponent();
+ }
+
+ private void OnSmileIconClick(object sender, EventArgs e)
+ {
+ if (EmojiInstance == null)
+ {
+ // Initialize EmojiControl
+ EmojiInstance = EmojiControl.GetInstance();
+ EmojiInstance.BindTextBox(InputTextBox);
+
+ ContentPanel.Children.Add(EmojiInstance); // Add to view
+ }
+
+ EmojiInstance.IsOpen = !EmojiInstance.IsOpen;
+ }
+
+ protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
+ {
+ base.OnNavigatingFrom(e);
+
+ if (EmojiInstance == null) return;
+
+ // Destroy EmojiControl
+ EmojiInstance.IsOpen = false;
+ EmojiInstance.UnbindTextBox();
+ ContentPanel.Children.Remove(EmojiInstance); // Remove from view
+ EmojiInstance = null;
+ }
+
+ private void ClearAllButtonClick(object sender, EventArgs e)
+ {
+ InputTextBox.Text = "";
+ }
+ }
+}
\ No newline at end of file
diff --git a/EmojiPanel/EmojiPanel/Properties/AppManifest.xml b/EmojiPanel/EmojiPanel/Properties/AppManifest.xml
new file mode 100755
index 0000000..a955232
--- /dev/null
+++ b/EmojiPanel/EmojiPanel/Properties/AppManifest.xml
@@ -0,0 +1,6 @@
+
+
+
+
diff --git a/EmojiPanel/EmojiPanel/Properties/AssemblyInfo.cs b/EmojiPanel/EmojiPanel/Properties/AssemblyInfo.cs
new file mode 100755
index 0000000..077d49d
--- /dev/null
+++ b/EmojiPanel/EmojiPanel/Properties/AssemblyInfo.cs
@@ -0,0 +1,37 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Resources;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("EmojiPanel")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("EmojiPanel")]
+[assembly: AssemblyCopyright("Copyright © 2014")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("d6cfdaad-1212-43b4-9539-203b0c855191")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: NeutralResourcesLanguage("en-US")]
diff --git a/EmojiPanel/EmojiPanel/Properties/WMAppManifest.xml b/EmojiPanel/EmojiPanel/Properties/WMAppManifest.xml
new file mode 100755
index 0000000..39197ce
--- /dev/null
+++ b/EmojiPanel/EmojiPanel/Properties/WMAppManifest.xml
@@ -0,0 +1,52 @@
+
+
+
+
+ ApplicationIcon.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Background.png
+ 0
+ Background.png
+ EmojiPanel
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ExifLib.WP8/ExifLib.WP8.csproj b/ExifLib.WP8/ExifLib.WP8.csproj
new file mode 100755
index 0000000..8d275bd
--- /dev/null
+++ b/ExifLib.WP8/ExifLib.WP8.csproj
@@ -0,0 +1,113 @@
+
+
+
+ Debug
+ AnyCPU
+ 10.0.20506
+ 2.0
+ {ED7BD6FE-8929-490A-81BE-521BB2C6D6F5}
+ {C089C8C0-30E0-4E22-80C0-CE093F111A43};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}
+ Library
+ Properties
+ ExifLib.WP8
+ ExifLib.WP8
+ WindowsPhone
+ v8.0
+ $(TargetFrameworkVersion)
+ false
+ true
+ 11.0
+ true
+
+
+ true
+ full
+ false
+ Bin\Debug
+ DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE
+ true
+ true
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ Bin\Release
+ TRACE;SILVERLIGHT;WINDOWS_PHONE
+ true
+ true
+ prompt
+ 4
+
+
+ true
+ full
+ false
+ Bin\x86\Debug
+ DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE
+ true
+ true
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ Bin\x86\Release
+ TRACE;SILVERLIGHT;WINDOWS_PHONE
+ true
+ true
+ prompt
+ 4
+
+
+ true
+ full
+ false
+ Bin\ARM\Debug
+ DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE
+ true
+ true
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ Bin\ARM\Release
+ TRACE;SILVERLIGHT;WINDOWS_PHONE
+ true
+ true
+ prompt
+ 4
+
+
+
+ ExifIds.cs
+
+
+ ExifIO.cs
+
+
+ ExifReader.cs
+
+
+ ExifTag.cs
+
+
+ JpegInfo.cs
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ExifLib.WP8/Properties/AssemblyInfo.cs b/ExifLib.WP8/Properties/AssemblyInfo.cs
new file mode 100755
index 0000000..c4494f0
--- /dev/null
+++ b/ExifLib.WP8/Properties/AssemblyInfo.cs
@@ -0,0 +1,37 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Resources;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("ExifLib.WP8")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ExifLib.WP8")]
+[assembly: AssemblyCopyright("Copyright © 2015")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("ed7bd6fe-8929-490a-81be-521bb2c6d6f5")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: NeutralResourcesLanguageAttribute("en-US")]
diff --git a/ExifLib/ExifIO.cs b/ExifLib/ExifIO.cs
new file mode 100755
index 0000000..26d1a1d
--- /dev/null
+++ b/ExifLib/ExifIO.cs
@@ -0,0 +1,100 @@
+using System;
+
+namespace ExifLib
+{
+ ///
+ /// Utility to handle multi-byte primitives in both big and little endian.
+ /// http://msdn.microsoft.com/en-us/library/system.bitconverter.islittleendian.aspx
+ /// http://en.wikipedia.org/wiki/Endianness
+ ///
+ public static class ExifIO
+ {
+ public static short ReadShort(byte[] Data, int offset, bool littleEndian)
+ {
+ if ((littleEndian && BitConverter.IsLittleEndian) ||
+ (!littleEndian && !BitConverter.IsLittleEndian))
+ {
+ return BitConverter.ToInt16(Data, offset);
+ }
+ else
+ {
+ byte[] beBytes = new byte[2] { Data[offset + 1], Data[offset] };
+ return BitConverter.ToInt16(beBytes, 0);
+ }
+ }
+
+ public static ushort ReadUShort(byte[] Data, int offset, bool littleEndian)
+ {
+ if ((littleEndian && BitConverter.IsLittleEndian) ||
+ (!littleEndian && !BitConverter.IsLittleEndian))
+ {
+ return BitConverter.ToUInt16(Data, offset);
+ }
+ else
+ {
+ byte[] beBytes = new byte[2] { Data[offset + 1], Data[offset] };
+ return BitConverter.ToUInt16(beBytes, 0);
+ }
+ }
+
+ public static int ReadInt(byte[] Data, int offset, bool littleEndian)
+ {
+ if ((littleEndian && BitConverter.IsLittleEndian) ||
+ (!littleEndian && !BitConverter.IsLittleEndian))
+ {
+ return BitConverter.ToInt32(Data, offset);
+ }
+ else
+ {
+ byte[] beBytes = new byte[4] { Data[offset + 3], Data[offset + 2], Data[offset + 1], Data[offset] };
+ return BitConverter.ToInt32(beBytes, 0);
+ }
+ }
+
+ public static uint ReadUInt(byte[] Data, int offset, bool littleEndian)
+ {
+ if ((littleEndian && BitConverter.IsLittleEndian) ||
+ (!littleEndian && !BitConverter.IsLittleEndian))
+ {
+ return BitConverter.ToUInt32(Data, offset);
+ }
+ else
+ {
+ byte[] beBytes = new byte[4] { Data[offset + 3], Data[offset + 2], Data[offset + 1], Data[offset] };
+ return BitConverter.ToUInt32(beBytes, 0);
+ }
+ }
+
+ public static float ReadSingle(byte[] Data, int offset, bool littleEndian)
+ {
+ if ((littleEndian && BitConverter.IsLittleEndian) ||
+ (!littleEndian && !BitConverter.IsLittleEndian))
+ {
+ return BitConverter.ToSingle(Data, offset);
+ }
+ else
+ {
+ // need to swap the data first
+ byte[] beBytes = new byte[4] { Data[offset + 3], Data[offset + 2], Data[offset + 1], Data[offset] };
+ return BitConverter.ToSingle(beBytes, 0);
+ }
+ }
+
+ public static double ReadDouble(byte[] Data, int offset, bool littleEndian)
+ {
+ if ((littleEndian && BitConverter.IsLittleEndian) ||
+ (!littleEndian && !BitConverter.IsLittleEndian))
+ {
+ return BitConverter.ToDouble(Data, offset);
+ }
+ else
+ {
+ // need to swap the data first
+ byte[] beBytes = new byte[8] {
+ Data[offset + 7], Data[offset + 6], Data[offset + 5], Data[offset + 4],
+ Data[offset + 3], Data[offset + 2], Data[offset + 1], Data[offset]};
+ return BitConverter.ToDouble(beBytes, 0);
+ }
+ }
+ }
+}
diff --git a/ExifLib/ExifIds.cs b/ExifLib/ExifIds.cs
new file mode 100755
index 0000000..a476151
--- /dev/null
+++ b/ExifLib/ExifIds.cs
@@ -0,0 +1,128 @@
+using System;
+
+namespace ExifLib
+{
+ public static class JpegId
+ {
+ public const int START = 0xFF;
+ public const int SOI = 0xD8;
+ public const int SOS = 0xDA;
+ public const int EOI = 0xD9;
+ public const int COM = 0xFE;
+ public const int JFIF = 0xE0;
+ public const int EXIF = 0xE1;
+ public const int IPTC = 0xED;
+ }
+
+ public enum ExifIFD
+ {
+ Exif = 0x8769,
+ Gps = 0x8825
+ }
+
+ public enum ExifId
+ {
+ Unknown = -1,
+
+ ImageWidth = 0x100,
+ ImageHeight = 0x101,
+ Orientation = 0x112,
+ XResolution = 0x11A,
+ YResolution = 0x11B,
+ ResolutionUnit = 0x128,
+ DateTime = 0x132,
+ Description = 0x10E,
+ Make = 0x10F,
+ Model = 0x110,
+ Software = 0x131,
+ Artist = 0x13B,
+ ThumbnailOffset = 0x201,
+ ThumbnailLength = 0x202,
+ ExposureTime = 0x829A,
+ FNumber = 0x829D,
+ Copyright = 0x8298,
+ FlashUsed = 0x9209,
+ UserComment = 0x9286
+ }
+
+ public enum ExifGps
+ {
+ Version = 0x0,
+ LatitudeRef = 0x1,
+ Latitude = 0x2,
+ LongitudeRef = 0x3,
+ Longitude = 0x4,
+ AltitudeRef = 0x5,
+ Altitude = 0x6,
+ TimeStamp = 0x7,
+ Satellites = 0x8,
+ Status = 0x9,
+ MeasureMode = 0xA,
+ DOP = 0xB,
+ SpeedRef = 0xC,
+ Speed = 0xD,
+ TrackRef = 0xE,
+ Track = 0xF,
+ ImgDirectionRef = 0x10,
+ ImgDirection = 0x11,
+ MapDatum = 0x12,
+ DestLatitudeRef = 0x13,
+ DestLatitude = 0x14,
+ DestLongitudeRef = 0x15,
+ DestLongitude = 0x16,
+ DestBearingRef = 0x17,
+ DestBearing = 0x18,
+ DestDistanceRef = 0x19,
+ DestDistance = 0x1A,
+ ProcessingMethod = 0x1B,
+ AreaInformation = 0x1C,
+ DateStamp = 0x1D,
+ Differential = 0x1E
+ }
+
+ public enum ExifOrientation
+ {
+ TopLeft = 1,
+ BottomRight = 3,
+ TopRight = 6,
+ BottomLeft = 8,
+ Undefined = 9
+ }
+
+ public enum ExifUnit
+ {
+ Undefined = 1,
+ Inch = 2,
+ Centimeter = 3
+ }
+
+ ///
+ /// As per http://www.exif.org/Exif2-2.PDF
+ ///
+ [Flags]
+ public enum ExifFlash
+ {
+ No = 0x0,
+ Fired = 0x1,
+ StrobeReturnLightDetected = 0x6,
+ On = 0x8,
+ Off = 0x10,
+ Auto = 0x18,
+ FlashFunctionPresent = 0x20,
+ RedEyeReduction = 0x40
+ }
+
+ public enum ExifGpsLatitudeRef
+ {
+ Unknown = 0,
+ North,
+ South
+ }
+
+ public enum ExifGpsLongitudeRef
+ {
+ Unknown = 0,
+ East,
+ West
+ }
+}
diff --git a/ExifLib/ExifLib.csproj b/ExifLib/ExifLib.csproj
new file mode 100755
index 0000000..0cf0f44
--- /dev/null
+++ b/ExifLib/ExifLib.csproj
@@ -0,0 +1,69 @@
+
+
+
+ Debug
+ AnyCPU
+ 10.0.20506
+ 2.0
+ {1E7F202B-8830-42F6-BCDA-2A6C590A7E10}
+ {C089C8C0-30E0-4E22-80C0-CE093F111A43};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}
+ Library
+ Properties
+ ExifLib
+ ExifLib
+ v4.0
+ $(TargetFrameworkVersion)
+ WindowsPhone71
+ Silverlight
+ false
+ true
+ true
+
+
+ true
+ full
+ false
+ Bin\Debug
+ DEBUG;TRACE;SILVERLIGHT;WINDOWS_PHONE
+ true
+ true
+ prompt
+ 4
+
+
+ pdbonly
+ true
+ Bin\Release
+ TRACE;SILVERLIGHT;WINDOWS_PHONE
+ true
+ true
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ExifLib/ExifReader.cs b/ExifLib/ExifReader.cs
new file mode 100755
index 0000000..9e2b7b2
--- /dev/null
+++ b/ExifLib/ExifReader.cs
@@ -0,0 +1,262 @@
+using System;
+using System.IO;
+
+namespace ExifLib
+{
+ ///
+ /// Based on http://www.media.mit.edu/pia/Research/deepview/exif.html
+ /// http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html
+ ///
+ public class ExifReader
+ {
+ public JpegInfo info { get; private set; }
+ private bool littleEndian = false;
+
+ public static JpegInfo ReadJpeg(FileInfo fi)
+ {
+ DateTime then = DateTime.Now;
+ using (FileStream fs = fi.OpenRead())
+ {
+ ExifReader reader = new ExifReader(fs);
+ reader.info.FileSize = (int)fi.Length;
+ reader.info.FileName = fi.Name;
+ reader.info.LoadTime = (DateTime.Now - then);
+ return reader.info;
+ }
+ }
+
+ public static JpegInfo ReadJpeg(Stream stream)
+ {
+ var reader = new ExifReader(stream);
+ return reader.info;
+ }
+
+ protected ExifReader(Stream stream)
+ {
+ info = new JpegInfo();
+ int a = stream.ReadByte();
+
+ // ensure SOI marker
+ if (a != JpegId.START || stream.ReadByte() != JpegId.SOI)
+ return;
+
+ info.IsValid = true;
+
+ for (; ; )
+ {
+ int marker = 0, prev = 0;
+
+ // find next marker
+ for (a = 0; ; ++a)
+ {
+ marker = stream.ReadByte();
+ if (marker != JpegId.START && prev == JpegId.START) break;
+ prev = marker;
+ }
+
+ // read section length
+ int lenHigh = stream.ReadByte();
+ int lenLow = stream.ReadByte();
+ int itemlen = (lenHigh << 8) | lenLow;
+
+ // read the section
+ byte[] section = new byte[itemlen];
+ section[0] = (byte)lenHigh;
+ section[1] = (byte)lenLow;
+ int bytesRead = stream.Read(section, 2, itemlen - 2);
+ if (bytesRead != itemlen - 2)
+ return;
+
+ switch (marker)
+ {
+ case JpegId.SOS:
+ // start of stream: and we're done
+ return;
+ case JpegId.EOI:
+ // no data? no good.
+ return;
+ case JpegId.EXIF:
+ {
+ if (section[2] == 'E' &&
+ section[3] == 'x' &&
+ section[4] == 'i' &&
+ section[5] == 'f')
+ {
+ ProcessExif(section);
+ }
+ } break;
+ case JpegId.IPTC:
+ {
+ // don't care.
+ } break;
+ case 0xC0:
+ case 0xC1:
+ case 0xC2:
+ case 0xC3:
+ // case 0xC4: // not SOF
+ case 0xC5:
+ case 0xC6:
+ case 0xC7:
+ // case 0xC8: // not SOF
+ case 0xC9:
+ case 0xCA:
+ case 0xCB:
+ // case 0xCC: // not SOF
+ case 0xCD:
+ case 0xCE:
+ case 0xCF:
+ {
+ ProcessSOF(section, marker);
+ } break;
+ default:
+ {
+ // don't care.
+ } break;
+ }
+
+ section = null;
+ GC.Collect();
+ }
+ }
+
+ private void ProcessExif(byte[] section)
+ {
+ int idx = 6;
+ if (section[idx++] != 0 ||
+ section[idx++] != 0)
+ {
+ // "Exif" is not followed by 2 null bytes.
+ return;
+ }
+
+ if (section[idx] == 'I' && section[idx + 1] == 'I')
+ {
+ // intel order
+ littleEndian = true;
+ }
+ else
+ {
+ if (section[idx] == 'M' && section[idx + 1] == 'M')
+ littleEndian = false;
+ else
+ {
+ // unknown order...
+ return;
+ }
+ }
+ idx += 2;
+
+ int a = ExifIO.ReadUShort(section, idx, littleEndian);
+ idx += 2;
+
+ if (a != 0x002A)
+ {
+ // bad start...
+ return;
+ }
+
+ a = ExifIO.ReadInt(section, idx, littleEndian);
+ idx += 4;
+
+ if (a < 8 || a > 16)
+ {
+ if (a < 16 || a > section.Length - 16)
+ {
+ // invalid offset
+ return;
+ }
+ }
+
+ ProcessExifDir(section, a + 8, 8, section.Length - 8, 0, ExifIFD.Exif);
+ }
+
+ private int DirOffset(int start, int num)
+ {
+ return start + 2 + 12 * num;
+ }
+
+ private void ProcessExifDir(byte[] section, int offsetDir, int offsetBase, int length, int depth, ExifIFD ifd)
+ {
+ if (depth > 4)
+ {
+ // corrupted Exif header...
+ return;
+ }
+
+ ushort numEntries = ExifIO.ReadUShort(section, offsetDir, littleEndian);
+ if (offsetDir + 2 + 12 * numEntries >= offsetDir + length)
+ {
+ // too long
+ return;
+ }
+
+ int offset = 0;
+
+ for (int de = 0; de < numEntries; ++de)
+ {
+ offset = DirOffset(offsetDir, de);
+ ExifTag exifTag = new ExifTag(section, offset, offsetBase, length, littleEndian);
+
+ if (!exifTag.IsValid)
+ continue;
+
+ switch (exifTag.Tag)
+ {
+ case (int)ExifIFD.Exif:
+ {
+ int dirStart = offsetBase + exifTag.GetInt(0);
+ if (dirStart <= offsetBase + length)
+ {
+ ProcessExifDir(section, dirStart, offsetBase, length, depth + 1, ExifIFD.Exif);
+ }
+ } break;
+ case (int)ExifIFD.Gps:
+ {
+ int dirStart = offsetBase + exifTag.GetInt(0);
+ if (dirStart <= offsetBase + length)
+ {
+ ProcessExifDir(section, dirStart, offsetBase, length, depth + 1, ExifIFD.Gps);
+ }
+ } break;
+ default:
+ {
+ exifTag.Populate(info, ifd);
+ } break;
+ }
+ }
+
+ // final link defined?
+ offset = DirOffset(offsetDir, numEntries) + 4;
+ if (offset <= offsetBase + length)
+ {
+ offset = ExifIO.ReadInt(section, offsetDir + 2 + 12 * numEntries, littleEndian);
+ if (offset > 0)
+ {
+ int subDirStart = offsetBase + offset;
+ if (subDirStart <= offsetBase + length && subDirStart >= offsetBase)
+ {
+ ProcessExifDir(section, subDirStart, offsetBase, length, depth + 1, ifd);
+ }
+ }
+ }
+
+ if (info.ThumbnailData == null && info.ThumbnailOffset > 0 && info.ThumbnailSize > 0)
+ {
+ // store it.
+ info.ThumbnailData = new byte[info.ThumbnailSize];
+ Array.Copy(section, offsetBase + info.ThumbnailOffset, info.ThumbnailData, 0, info.ThumbnailSize);
+ }
+ }
+
+ private void ProcessSOF(byte[] section, int marker)
+ {
+ // bytes 1,2 is section len
+ // byte 3 is precision (bytes per sample)
+ info.Height = ((int)section[3] << 8) | (int)section[4];
+ info.Width = ((int)section[5] << 8) | (int)section[6];
+ int components = (int)section[7];
+
+ info.IsColor = (components == 3);
+ }
+ }
+}
diff --git a/ExifLib/ExifTag.cs b/ExifLib/ExifTag.cs
new file mode 100755
index 0000000..f046958
--- /dev/null
+++ b/ExifLib/ExifTag.cs
@@ -0,0 +1,254 @@
+using System;
+using System.Text;
+
+namespace ExifLib
+{
+ ///
+ /// As per: http://www.media.mit.edu/pia/Research/deepview/exif.html
+ ///
+ public enum ExifTagFormat
+ {
+ BYTE = 1,
+ STRING = 2,
+ USHORT = 3,
+ ULONG = 4,
+ URATIONAL = 5,
+ SBYTE = 6,
+ UNDEFINED = 7,
+ SSHORT = 8,
+ SLONG = 9,
+ SRATIONAL = 10,
+ SINGLE = 11,
+ DOUBLE = 12,
+
+ NUM_FORMATS = 12
+ }
+
+ public class ExifTag
+ {
+ public int Tag { get; private set; }
+ public ExifTagFormat Format { get; private set; }
+ public int Components { get; private set; }
+ public byte[] Data { get; private set; }
+ public bool LittleEndian { get; private set; }
+
+ private static int[] BytesPerFormat = new int[] { 0, 1, 1, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8 };
+
+ public ExifTag(byte[] section, int sectionOffset, int offsetBase, int length, bool littleEndian)
+ {
+ this.IsValid = false;
+ this.Tag = ExifIO.ReadUShort(section, sectionOffset, littleEndian);
+ int format = ExifIO.ReadUShort(section, sectionOffset + 2, littleEndian);
+ if (format < 1 || format > 12)
+ return;
+ this.Format = (ExifTagFormat)format;
+ this.Components = ExifIO.ReadInt(section, sectionOffset + 4, littleEndian);
+ if (this.Components > 0x10000)
+ return;
+ this.LittleEndian = littleEndian;
+
+ int byteCount = this.Components * BytesPerFormat[format];
+ int valueOffset = 0;
+
+ if (byteCount > 4)
+ {
+ int offsetVal = ExifIO.ReadInt(section, sectionOffset + 8, littleEndian);
+ if (offsetVal + byteCount > length)
+ {
+ // bad offset...
+ return;
+ }
+ valueOffset = offsetBase + offsetVal;
+ }
+ else
+ {
+ valueOffset = sectionOffset + 8;
+ }
+ this.Data = new byte[byteCount];
+ Array.Copy(section, valueOffset, this.Data, 0, byteCount);
+ this.IsValid = true;
+ }
+
+ public bool IsValid { get; private set; }
+
+ private short ReadShort(int offset)
+ {
+ return ExifIO.ReadShort(Data, offset, LittleEndian);
+ }
+
+ private ushort ReadUShort(int offset)
+ {
+ return ExifIO.ReadUShort(Data, offset, LittleEndian);
+ }
+
+ private int ReadInt(int offset)
+ {
+ return ExifIO.ReadInt(Data, offset, LittleEndian);
+ }
+
+ private uint ReadUInt(int offset)
+ {
+ return ExifIO.ReadUInt(Data, offset, LittleEndian);
+ }
+
+ private float ReadSingle(int offset)
+ {
+ return ExifIO.ReadSingle(Data, offset, LittleEndian);
+ }
+
+ private double ReadDouble(int offset)
+ {
+ return ExifIO.ReadDouble(Data, offset, LittleEndian);
+ }
+
+ public bool IsNumeric
+ {
+ get
+ {
+ switch (Format)
+ {
+ case ExifTagFormat.STRING:
+ case ExifTagFormat.UNDEFINED:
+ return false;
+ default:
+ return true;
+ }
+ }
+ }
+
+ public int GetInt(int componentIndex)
+ {
+ return (int)GetNumericValue(componentIndex);
+ }
+
+ public double GetNumericValue(int componentIndex)
+ {
+ switch (Format)
+ {
+ case ExifTagFormat.BYTE: return (double)this.Data[componentIndex];
+ case ExifTagFormat.USHORT: return (double)ReadUShort(componentIndex * 2);
+ case ExifTagFormat.ULONG: return (double)ReadUInt(componentIndex * 4);
+ case ExifTagFormat.URATIONAL: return (double)ReadUInt(componentIndex * 8) / (double)ReadUInt((componentIndex * 8) + 4);
+ case ExifTagFormat.SBYTE:
+ {
+ unchecked
+ {
+ return (double)(sbyte)this.Data[componentIndex];
+ }
+ }
+ case ExifTagFormat.SSHORT: return (double)ReadShort(componentIndex * 2);
+ case ExifTagFormat.SLONG: return (double)ReadInt(componentIndex * 4);
+ case ExifTagFormat.SRATIONAL: return (double)ReadInt(componentIndex * 8) / (double)ReadInt((componentIndex * 8) + 4);
+ case ExifTagFormat.SINGLE: return (double)ReadSingle(componentIndex * 4);
+ case ExifTagFormat.DOUBLE: return ReadDouble(componentIndex * 8);
+ default: return 0.0;
+ }
+ }
+
+ public string GetStringValue()
+ {
+ return GetStringValue(0);
+ }
+
+ public string GetStringValue(int componentIndex)
+ {
+ switch (Format)
+ {
+ case ExifTagFormat.STRING:
+ case ExifTagFormat.UNDEFINED:
+ return Encoding.UTF8.GetString(this.Data, 0, this.Data.Length).Trim(' ', '\t', '\r', '\n', '\0');
+ case ExifTagFormat.URATIONAL:
+ return ReadUInt(componentIndex * 8).ToString() + "/" + ReadUInt((componentIndex * 8) + 4).ToString();
+ case ExifTagFormat.SRATIONAL:
+ return ReadInt(componentIndex * 8).ToString() + "/" + ReadInt((componentIndex * 8) + 4).ToString();
+ default:
+ return GetNumericValue(componentIndex).ToString();
+ }
+ }
+
+ public virtual void Populate(JpegInfo info, ExifIFD ifd)
+ {
+ if (ifd == ExifIFD.Exif)
+ {
+ switch ((ExifId)this.Tag)
+ {
+ case ExifId.ImageWidth: info.Width = GetInt(0); break;
+ case ExifId.ImageHeight: info.Height = GetInt(0); break;
+ case ExifId.Orientation: info.Orientation = (ExifOrientation)GetInt(0); break;
+ case ExifId.XResolution: info.XResolution = GetNumericValue(0); break;
+ case ExifId.YResolution: info.YResolution = GetNumericValue(0); break;
+ case ExifId.ResolutionUnit: info.ResolutionUnit = (ExifUnit)GetInt(0); break;
+ case ExifId.DateTime: info.DateTime = GetStringValue(); break;
+ case ExifId.Description: info.Description = GetStringValue(); break;
+ case ExifId.Make: info.Make = GetStringValue(); break;
+ case ExifId.Model: info.Model = GetStringValue(); break;
+ case ExifId.Software: info.Software = GetStringValue(); break;
+ case ExifId.Artist: info.Artist = GetStringValue(); break;
+ case ExifId.ThumbnailOffset: info.ThumbnailOffset = GetInt(0); break;
+ case ExifId.ThumbnailLength: info.ThumbnailSize = GetInt(0); break;
+ case ExifId.Copyright: info.Copyright = GetStringValue(); break;
+ case ExifId.UserComment: info.UserComment = GetStringValue(); break;
+ case ExifId.ExposureTime: info.ExposureTime = GetNumericValue(0); break;
+ case ExifId.FNumber: info.FNumber = GetNumericValue(0); break;
+ case ExifId.FlashUsed: info.Flash = (ExifFlash)GetInt(0); break;
+ default: break;
+ }
+ }
+ else if (ifd == ExifIFD.Gps)
+ {
+ switch ((ExifGps)this.Tag)
+ {
+ case ExifGps.LatitudeRef:
+ {
+ if (GetStringValue() == "N") info.GpsLatitudeRef = ExifGpsLatitudeRef.North;
+ else if (GetStringValue() == "S") info.GpsLatitudeRef = ExifGpsLatitudeRef.South;
+ } break;
+ case ExifGps.LongitudeRef:
+ {
+ if (GetStringValue() == "E") info.GpsLongitudeRef = ExifGpsLongitudeRef.East;
+ else if (GetStringValue() == "W") info.GpsLongitudeRef = ExifGpsLongitudeRef.West;
+ } break;
+ case ExifGps.Latitude:
+ {
+ if (Components == 3)
+ {
+ info.GpsLatitude[0] = GetNumericValue(0);
+ info.GpsLatitude[1] = GetNumericValue(1);
+ info.GpsLatitude[2] = GetNumericValue(2);
+ }
+ } break;
+ case ExifGps.Longitude:
+ {
+ if (Components == 3)
+ {
+ info.GpsLongitude[0] = GetNumericValue(0);
+ info.GpsLongitude[1] = GetNumericValue(1);
+ info.GpsLongitude[2] = GetNumericValue(2);
+ }
+ } break;
+ }
+ }
+ }
+
+ public override string ToString()
+ {
+ StringBuilder sb = new StringBuilder(64);
+ sb.Append("0x");
+ sb.Append(this.Tag.ToString("X4"));
+ sb.Append("-");
+ sb.Append(((ExifId)this.Tag).ToString());
+ if (this.Components > 0)
+ {
+ sb.Append(": (");
+ sb.Append(GetStringValue(0));
+ if (Format != ExifTagFormat.UNDEFINED && Format != ExifTagFormat.STRING)
+ {
+ for (int i = 1; i < Components; ++i)
+ sb.Append(", " + GetStringValue(i));
+ }
+ sb.Append(")");
+ }
+ return sb.ToString();
+ }
+ }
+}
diff --git a/ExifLib/JpegInfo.cs b/ExifLib/JpegInfo.cs
new file mode 100755
index 0000000..6d640df
--- /dev/null
+++ b/ExifLib/JpegInfo.cs
@@ -0,0 +1,119 @@
+using System;
+
+namespace ExifLib
+{
+ public class JpegInfo
+ {
+ ///
+ /// The Jpeg file name (excluding path).
+ ///
+ public string FileName;
+ ///
+ /// The Jpeg file size, in bytes.
+ ///
+ public int FileSize;
+ ///
+ /// True if the provided Stream was detected to be a Jpeg image, False otherwise.
+ ///
+ public bool IsValid;
+
+ ///
+ /// Image dimensions, in pixels.
+ ///
+ public int Width, Height;
+ ///
+ /// True if the image data is expressed in 3 components (RGB), False otherwise.
+ ///
+ public bool IsColor;
+
+ ///
+ /// Orientation of the image.
+ ///
+ public ExifOrientation Orientation;
+ ///
+ /// The X and Y resolutions of the image, expressed in ResolutionUnit.
+ ///
+ public double XResolution, YResolution;
+ ///
+ /// Resolution unit of the image.
+ ///
+ public ExifUnit ResolutionUnit;
+
+ ///
+ /// Date at which the image was taken.
+ ///
+ public string DateTime;
+ ///
+ /// Description of the image.
+ ///
+ public string Description;
+ ///
+ /// Camera manufacturer.
+ ///
+ public string Make;
+ ///
+ /// Camera model.
+ ///
+ public string Model;
+ ///
+ /// Software used to create the image.
+ ///
+ public string Software;
+ ///
+ /// Image artist.
+ ///
+ public string Artist;
+ ///
+ /// Image copyright.
+ ///
+ public string Copyright;
+ ///
+ /// Image user comments.
+ ///
+ public string UserComment;
+ ///
+ /// Exposure time, in seconds.
+ ///
+ public double ExposureTime;
+ ///
+ /// F-number (F-stop) of the camera lens when the image was taken.
+ ///
+ public double FNumber;
+ ///
+ /// Flash settings of the camera when the image was taken.
+ ///
+ public ExifFlash Flash;
+
+ ///
+ /// GPS latitude reference (North, South).
+ ///
+ public ExifGpsLatitudeRef GpsLatitudeRef;
+ ///
+ /// GPS latitude (degrees, minutes, seconds).
+ ///
+ public double[] GpsLatitude = new double[3];
+ ///
+ /// GPS longitude reference (East, West).
+ ///
+ public ExifGpsLongitudeRef GpsLongitudeRef;
+ ///
+ /// GPS longitude (degrees, minutes, seconds).
+ ///
+ public double[] GpsLongitude = new double[3];
+
+ ///
+ /// Byte offset and size of the thumbnail data within the Exif section of the image file.
+ /// Used internally.
+ ///
+ public int ThumbnailOffset, ThumbnailSize;
+ ///
+ /// Thumbnail data found in the Exif section.
+ ///
+ public byte[] ThumbnailData;
+
+ ///
+ /// Time taken to load the image information.
+ ///
+ public TimeSpan LoadTime;
+ }
+}
diff --git a/ExifLib/Properties/AssemblyInfo.cs b/ExifLib/Properties/AssemblyInfo.cs
new file mode 100755
index 0000000..e2ab74a
--- /dev/null
+++ b/ExifLib/Properties/AssemblyInfo.cs
@@ -0,0 +1,37 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Resources;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("ExifLib")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ExifLib")]
+[assembly: AssemblyCopyright("Copyright © 2015")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("1e7f202b-8830-42f6-bcda-2a6c590a7e10")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: NeutralResourcesLanguageAttribute("en-US")]
diff --git a/FFmpegInterop/Source/FFmpegInteropMSS.cpp b/FFmpegInterop/Source/FFmpegInteropMSS.cpp
new file mode 100755
index 0000000..5ae3726
--- /dev/null
+++ b/FFmpegInterop/Source/FFmpegInteropMSS.cpp
@@ -0,0 +1,604 @@
+//*****************************************************************************
+//
+// Copyright 2015 Microsoft Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http ://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//*****************************************************************************
+
+#include "pch.h"
+#include "FFmpegInteropMSS.h"
+#include "MediaSampleProvider.h"
+#include "H264AVCSampleProvider.h"
+#include "H264SampleProvider.h"
+#include "UncompressedAudioSampleProvider.h"
+#include "UncompressedVideoSampleProvider.h"
+#include "shcore.h"
+
+extern "C"
+{
+#include
+}
+
+using namespace concurrency;
+using namespace FFmpegInterop;
+using namespace Platform;
+using namespace Windows::Storage::Streams;
+using namespace Windows::Media::MediaProperties;
+
+// Size of the buffer when reading a stream
+const int FILESTREAMBUFFERSZ = 16384;
+
+// Static functions passed to FFmpeg for stream interop
+static int FileStreamRead(void* ptr, uint8_t* buf, int bufSize);
+static int64_t FileStreamSeek(void* ptr, int64_t pos, int whence);
+
+// Initialize an FFmpegInteropObject
+FFmpegInteropMSS::FFmpegInteropMSS()
+ : avDict(nullptr)
+ , avIOCtx(nullptr)
+ , avFormatCtx(nullptr)
+ , avAudioCodecCtx(nullptr)
+ , avVideoCodecCtx(nullptr)
+ , audioStreamIndex(AVERROR_STREAM_NOT_FOUND)
+ , videoStreamIndex(AVERROR_STREAM_NOT_FOUND)
+ , fileStreamData(nullptr)
+ , fileStreamBuffer(nullptr)
+{
+ av_register_all();
+}
+
+FFmpegInteropMSS::~FFmpegInteropMSS()
+{
+ if (mss)
+ {
+ mss->Starting -= startingRequestedToken;
+ mss->SampleRequested -= sampleRequestedToken;
+ mss = nullptr;
+ }
+
+ // Clear our data
+ audioSampleProvider = nullptr;
+ videoSampleProvider = nullptr;
+
+ if (m_pReader != nullptr)
+ {
+ m_pReader->SetAudioStream(AVERROR_STREAM_NOT_FOUND, nullptr);
+ m_pReader->SetVideoStream(AVERROR_STREAM_NOT_FOUND, nullptr);
+ m_pReader = nullptr;
+ }
+
+ avcodec_close(avVideoCodecCtx);
+ avcodec_close(avAudioCodecCtx);
+ avformat_close_input(&avFormatCtx);
+ av_free(avIOCtx);
+ av_dict_free(&avDict);
+}
+
+FFmpegInteropMSS^ FFmpegInteropMSS::CreateFFmpegInteropMSSFromStream(IRandomAccessStream^ stream, bool forceAudioDecode, bool forceVideoDecode, PropertySet^ ffmpegOptions)
+{
+ auto interopMSS = ref new FFmpegInteropMSS();
+ if (FAILED(interopMSS->CreateMediaStreamSource(stream, forceAudioDecode, forceVideoDecode, ffmpegOptions)))
+ {
+ // We failed to initialize, clear the variable to return failure
+ interopMSS = nullptr;
+ }
+
+ return interopMSS;
+}
+
+
+FFmpegInteropMSS^ FFmpegInteropMSS::CreateFFmpegInteropMSSFromStream(IRandomAccessStream^ stream, bool forceAudioDecode, bool forceVideoDecode)
+{
+ return CreateFFmpegInteropMSSFromStream(stream, forceAudioDecode, forceVideoDecode, nullptr);
+}
+
+FFmpegInteropMSS^ FFmpegInteropMSS::CreateFFmpegInteropMSSFromUri(String^ uri, bool forceAudioDecode, bool forceVideoDecode, PropertySet^ ffmpegOptions)
+{
+ auto interopMSS = ref new FFmpegInteropMSS();
+ if (FAILED(interopMSS->CreateMediaStreamSource(uri, forceAudioDecode, forceVideoDecode, ffmpegOptions)))
+ {
+ // We failed to initialize, clear the variable to return failure
+ interopMSS = nullptr;
+ }
+
+ return interopMSS;
+}
+
+FFmpegInteropMSS^ FFmpegInteropMSS::CreateFFmpegInteropMSSFromUri(String^ uri, bool forceAudioDecode, bool forceVideoDecode)
+{
+ return CreateFFmpegInteropMSSFromUri(uri, forceAudioDecode, forceVideoDecode, nullptr);
+}
+
+MediaStreamSource^ FFmpegInteropMSS::GetMediaStreamSource()
+{
+ return mss;
+}
+
+HRESULT FFmpegInteropMSS::CreateMediaStreamSource(String^ uri, bool forceAudioDecode, bool forceVideoDecode, PropertySet^ ffmpegOptions)
+{
+ HRESULT hr = S_OK;
+ const char* charStr = nullptr;
+ if (!uri)
+ {
+ hr = E_INVALIDARG;
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ avFormatCtx = avformat_alloc_context();
+ if (avFormatCtx == nullptr)
+ {
+ hr = E_OUTOFMEMORY;
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ // Populate AVDictionary avDict based on PropertySet ffmpegOptions. List of options can be found in https://www.ffmpeg.org/ffmpeg-protocols.html
+ hr = ParseOptions(ffmpegOptions);
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ std::wstring uriW(uri->Begin());
+ std::string uriA(uriW.begin(), uriW.end());
+ charStr = uriA.c_str();
+
+ // Open media in the given URI using the specified options
+ if (avformat_open_input(&avFormatCtx, charStr, NULL, &avDict) < 0)
+ {
+ hr = E_FAIL; // Error opening file
+ }
+
+ // avDict is not NULL only when there is an issue with the given ffmpegOptions such as invalid key, value type etc. Iterate through it to see which one is causing the issue.
+ if (avDict != nullptr)
+ {
+ DebugMessage(L"Invalid FFmpeg option(s)");
+ av_dict_free(&avDict);
+ avDict = nullptr;
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ hr = InitFFmpegContext(forceAudioDecode, forceVideoDecode);
+ }
+
+ return hr;
+}
+
+HRESULT FFmpegInteropMSS::CreateMediaStreamSource(IRandomAccessStream^ stream, bool forceAudioDecode, bool forceVideoDecode, PropertySet^ ffmpegOptions)
+{
+ HRESULT hr = S_OK;
+ if (!stream)
+ {
+ hr = E_INVALIDARG;
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ // Convert asynchronous IRandomAccessStream to synchronous IStream. This API requires shcore.h and shcore.lib
+ hr = CreateStreamOverRandomAccessStream(reinterpret_cast(stream), IID_PPV_ARGS(&fileStreamData));
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ // Setup FFmpeg custom IO to access file as stream. This is necessary when accessing any file outside of app installation directory and appdata folder.
+ // Credit to Philipp Sch http://www.codeproject.com/Tips/489450/Creating-Custom-FFmpeg-IO-Context
+ fileStreamBuffer = (unsigned char*)av_malloc(FILESTREAMBUFFERSZ);
+ if (fileStreamBuffer == nullptr)
+ {
+ hr = E_OUTOFMEMORY;
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ avIOCtx = avio_alloc_context(fileStreamBuffer, FILESTREAMBUFFERSZ, 0, fileStreamData, FileStreamRead, 0, FileStreamSeek);
+ if (avIOCtx == nullptr)
+ {
+ hr = E_OUTOFMEMORY;
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ avFormatCtx = avformat_alloc_context();
+ if (avFormatCtx == nullptr)
+ {
+ hr = E_OUTOFMEMORY;
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ // Populate AVDictionary avDict based on PropertySet ffmpegOptions. List of options can be found in https://www.ffmpeg.org/ffmpeg-protocols.html
+ hr = ParseOptions(ffmpegOptions);
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ avFormatCtx->pb = avIOCtx;
+ avFormatCtx->flags |= AVFMT_FLAG_CUSTOM_IO;
+
+ // Open media file using custom IO setup above instead of using file name. Opening a file using file name will invoke fopen C API call that only have
+ // access within the app installation directory and appdata folder. Custom IO allows access to file selected using FilePicker dialog.
+ if (avformat_open_input(&avFormatCtx, "", NULL, &avDict) < 0)
+ {
+ hr = E_FAIL; // Error opening file
+ }
+
+ // avDict is not NULL only when there is an issue with the given ffmpegOptions such as invalid key, value type etc. Iterate through it to see which one is causing the issue.
+ if (avDict != nullptr)
+ {
+ DebugMessage(L"Invalid FFmpeg option(s)");
+ av_dict_free(&avDict);
+ avDict = nullptr;
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ hr = InitFFmpegContext(forceAudioDecode, forceVideoDecode);
+ }
+
+ return hr;
+}
+
+HRESULT FFmpegInteropMSS::InitFFmpegContext(bool forceAudioDecode, bool forceVideoDecode)
+{
+ HRESULT hr = S_OK;
+
+ if (SUCCEEDED(hr))
+ {
+ if (avformat_find_stream_info(avFormatCtx, NULL) < 0)
+ {
+ hr = E_FAIL; // Error finding info
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ m_pReader = ref new FFmpegReader(avFormatCtx);
+ if (m_pReader == nullptr)
+ {
+ hr = E_OUTOFMEMORY;
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ // Find the audio stream and its decoder
+ AVCodec* avAudioCodec = nullptr;
+ audioStreamIndex = av_find_best_stream(avFormatCtx, AVMEDIA_TYPE_AUDIO, -1, -1, &avAudioCodec, 0);
+ if (audioStreamIndex != AVERROR_STREAM_NOT_FOUND && avAudioCodec)
+ {
+ avAudioCodecCtx = avFormatCtx->streams[audioStreamIndex]->codec;
+ if (avcodec_open2(avAudioCodecCtx, avAudioCodec, NULL) < 0)
+ {
+ avAudioCodecCtx = nullptr;
+ hr = E_FAIL;
+ }
+ else
+ {
+ // Detect audio format and create audio stream descriptor accordingly
+ hr = CreateAudioStreamDescriptor(forceAudioDecode);
+ if (SUCCEEDED(hr))
+ {
+ hr = audioSampleProvider->AllocateResources();
+ if (SUCCEEDED(hr))
+ {
+ m_pReader->SetAudioStream(audioStreamIndex, audioSampleProvider);
+ }
+ }
+ }
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ // Find the video stream and its decoder
+ AVCodec* avVideoCodec = nullptr;
+ videoStreamIndex = av_find_best_stream(avFormatCtx, AVMEDIA_TYPE_VIDEO, -1, -1, &avVideoCodec, 0);
+ if (videoStreamIndex != AVERROR_STREAM_NOT_FOUND && avVideoCodec)
+ {
+ // FFmpeg identifies album/cover art from a music file as a video stream
+ // Avoid creating unnecessarily video stream from this album/cover art
+ if (avFormatCtx->streams[videoStreamIndex]->disposition == AV_DISPOSITION_ATTACHED_PIC)
+ {
+ videoStreamIndex = AVERROR_STREAM_NOT_FOUND;
+ avVideoCodec = nullptr;
+ }
+ else
+ {
+ avVideoCodecCtx = avFormatCtx->streams[videoStreamIndex]->codec;
+ if (avcodec_open2(avVideoCodecCtx, avVideoCodec, NULL) < 0)
+ {
+ avVideoCodecCtx = nullptr;
+ hr = E_FAIL; // Cannot open the video codec
+ }
+ else
+ {
+ // Detect video format and create video stream descriptor accordingly
+ hr = CreateVideoStreamDescriptor(forceVideoDecode);
+ if (SUCCEEDED(hr))
+ {
+ hr = videoSampleProvider->AllocateResources();
+ if (SUCCEEDED(hr))
+ {
+ m_pReader->SetVideoStream(videoStreamIndex, videoSampleProvider);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ // Convert media duration from AV_TIME_BASE to TimeSpan unit
+ mediaDuration = { LONGLONG(avFormatCtx->duration * 10000000 / double(AV_TIME_BASE)) };
+
+ if (audioStreamDescriptor)
+ {
+ if (videoStreamDescriptor)
+ {
+ mss = ref new MediaStreamSource(videoStreamDescriptor, audioStreamDescriptor);
+ }
+ else
+ {
+ mss = ref new MediaStreamSource(audioStreamDescriptor);
+ }
+ }
+ else if (videoStreamDescriptor)
+ {
+ mss = ref new MediaStreamSource(videoStreamDescriptor);
+ }
+ if (mss)
+ {
+ if (mediaDuration.Duration > 0)
+ {
+ mss->Duration = mediaDuration;
+ mss->CanSeek = true;
+ }
+ else
+ {
+ // Set buffer time to 0 for realtime streaming to reduce latency
+ mss->BufferTime = { 0 };
+ }
+
+ startingRequestedToken = mss->Starting += ref new TypedEventHandler(this, &FFmpegInteropMSS::OnStarting);
+ sampleRequestedToken = mss->SampleRequested += ref new TypedEventHandler(this, &FFmpegInteropMSS::OnSampleRequested);
+ }
+ else
+ {
+ hr = E_OUTOFMEMORY;
+ }
+ }
+
+ return hr;
+}
+
+HRESULT FFmpegInteropMSS::CreateAudioStreamDescriptor(bool forceAudioDecode)
+{
+ if (avAudioCodecCtx->codec_id == AV_CODEC_ID_AAC && !forceAudioDecode)
+ {
+ if (avAudioCodecCtx->extradata_size == 0)
+ {
+ audioStreamDescriptor = ref new AudioStreamDescriptor(AudioEncodingProperties::CreateAacAdts(avAudioCodecCtx->sample_rate, avAudioCodecCtx->channels, avAudioCodecCtx->bit_rate));
+ }
+ else
+ {
+ audioStreamDescriptor = ref new AudioStreamDescriptor(AudioEncodingProperties::CreateAac(avAudioCodecCtx->sample_rate, avAudioCodecCtx->channels, avAudioCodecCtx->bit_rate));
+ }
+ audioSampleProvider = ref new MediaSampleProvider(m_pReader, avFormatCtx, avAudioCodecCtx);
+ }
+ else if (avAudioCodecCtx->codec_id == AV_CODEC_ID_MP3 && !forceAudioDecode)
+ {
+ audioStreamDescriptor = ref new AudioStreamDescriptor(AudioEncodingProperties::CreateMp3(avAudioCodecCtx->sample_rate, avAudioCodecCtx->channels, avAudioCodecCtx->bit_rate));
+ audioSampleProvider = ref new MediaSampleProvider(m_pReader, avFormatCtx, avAudioCodecCtx);
+ }
+ else
+ {
+ // Set default 16 bits when bits per sample value is unknown (0)
+ unsigned int bitsPerSample = avAudioCodecCtx->bits_per_coded_sample ? avAudioCodecCtx->bits_per_coded_sample : 16;
+ audioStreamDescriptor = ref new AudioStreamDescriptor(AudioEncodingProperties::CreatePcm(avAudioCodecCtx->sample_rate, avAudioCodecCtx->channels, bitsPerSample));
+ audioSampleProvider = ref new UncompressedAudioSampleProvider(m_pReader, avFormatCtx, avAudioCodecCtx);
+ }
+
+ return (audioStreamDescriptor != nullptr && audioSampleProvider != nullptr) ? S_OK : E_OUTOFMEMORY;
+}
+
+HRESULT FFmpegInteropMSS::CreateVideoStreamDescriptor(bool forceVideoDecode)
+{
+ VideoEncodingProperties^ videoProperties;
+
+ if (avVideoCodecCtx->codec_id == AV_CODEC_ID_H264 && !forceVideoDecode)
+ {
+ videoProperties = VideoEncodingProperties::CreateH264();
+ videoProperties->ProfileId = avVideoCodecCtx->profile;
+ videoProperties->Height = avVideoCodecCtx->height;
+ videoProperties->Width = avVideoCodecCtx->width;
+
+ // Check for H264 bitstream flavor. H.264 AVC extradata starts with 1 while non AVC one starts with 0
+ if (avVideoCodecCtx->extradata != nullptr && avVideoCodecCtx->extradata_size > 0 && avVideoCodecCtx->extradata[0] == 1)
+ {
+ videoSampleProvider = ref new H264AVCSampleProvider(m_pReader, avFormatCtx, avVideoCodecCtx);
+ }
+ else
+ {
+ videoSampleProvider = ref new H264SampleProvider(m_pReader, avFormatCtx, avVideoCodecCtx);
+ }
+ }
+ else
+ {
+ videoProperties = VideoEncodingProperties::CreateUncompressed(MediaEncodingSubtypes::Nv12, avVideoCodecCtx->width, avVideoCodecCtx->height);
+ videoSampleProvider = ref new UncompressedVideoSampleProvider(m_pReader, avFormatCtx, avVideoCodecCtx);
+
+ if (avVideoCodecCtx->sample_aspect_ratio.num > 0 && avVideoCodecCtx->sample_aspect_ratio.den != 0)
+ {
+ videoProperties->PixelAspectRatio->Numerator = avVideoCodecCtx->sample_aspect_ratio.num;
+ videoProperties->PixelAspectRatio->Denominator = avVideoCodecCtx->sample_aspect_ratio.den;
+ }
+ }
+
+ // Detect the correct framerate
+ if (avVideoCodecCtx->framerate.num != 0 || avVideoCodecCtx->framerate.den != 1)
+ {
+ videoProperties->FrameRate->Numerator = avVideoCodecCtx->framerate.num;
+ videoProperties->FrameRate->Denominator = avVideoCodecCtx->framerate.den;
+ }
+ else if (avFormatCtx->streams[videoStreamIndex]->avg_frame_rate.num != 0 || avFormatCtx->streams[videoStreamIndex]->avg_frame_rate.den != 0)
+ {
+ videoProperties->FrameRate->Numerator = avFormatCtx->streams[videoStreamIndex]->avg_frame_rate.num;
+ videoProperties->FrameRate->Denominator = avFormatCtx->streams[videoStreamIndex]->avg_frame_rate.den;
+ }
+
+ videoProperties->Bitrate = avVideoCodecCtx->bit_rate;
+ videoStreamDescriptor = ref new VideoStreamDescriptor(videoProperties);
+
+ return (videoStreamDescriptor != nullptr && videoSampleProvider != nullptr) ? S_OK : E_OUTOFMEMORY;
+}
+
+HRESULT FFmpegInteropMSS::ParseOptions(PropertySet^ ffmpegOptions)
+{
+ HRESULT hr = S_OK;
+
+ // Convert FFmpeg options given in PropertySet to AVDictionary. List of options can be found in https://www.ffmpeg.org/ffmpeg-protocols.html
+ if (ffmpegOptions != nullptr)
+ {
+ auto options = ffmpegOptions->First();
+
+ while (options->HasCurrent)
+ {
+ String^ key = options->Current->Key;
+ std::wstring keyW(key->Begin());
+ std::string keyA(keyW.begin(), keyW.end());
+ const char* keyChar = keyA.c_str();
+
+ // Convert value from Object^ to const char*. avformat_open_input will internally convert value from const char* to the correct type
+ String^ value = options->Current->Value->ToString();
+ std::wstring valueW(value->Begin());
+ std::string valueA(valueW.begin(), valueW.end());
+ const char* valueChar = valueA.c_str();
+
+ // Add key and value pair entry
+ if (av_dict_set(&avDict, keyChar, valueChar, 0) < 0)
+ {
+ hr = E_INVALIDARG;
+ break;
+ }
+
+ options->MoveNext();
+ }
+ }
+
+ return hr;
+}
+
+void FFmpegInteropMSS::OnStarting(MediaStreamSource ^sender, MediaStreamSourceStartingEventArgs ^args)
+{
+ MediaStreamSourceStartingRequest^ request = args->Request;
+
+ // Perform seek operation when MediaStreamSource received seek event from MediaElement
+ if (request->StartPosition && request->StartPosition->Value.Duration <= mediaDuration.Duration)
+ {
+ // Select the first valid stream either from video or audio
+ int streamIndex = videoStreamIndex >= 0 ? videoStreamIndex : audioStreamIndex >= 0 ? audioStreamIndex : -1;
+
+ if (streamIndex >= 0)
+ {
+ // Convert TimeSpan unit to AV_TIME_BASE
+ int64_t seekTarget = static_cast(request->StartPosition->Value.Duration / (av_q2d(avFormatCtx->streams[streamIndex]->time_base) * 10000000));
+
+ if (av_seek_frame(avFormatCtx, streamIndex, seekTarget, 0) < 0)
+ {
+ DebugMessage(L" - ### Error while seeking\n");
+ }
+ else
+ {
+ // Add deferral
+
+ // Flush the AudioSampleProvider
+ if (audioSampleProvider != nullptr)
+ {
+ audioSampleProvider->Flush();
+ avcodec_flush_buffers(avAudioCodecCtx);
+ }
+
+ // Flush the VideoSampleProvider
+ if (videoSampleProvider != nullptr)
+ {
+ videoSampleProvider->Flush();
+ avcodec_flush_buffers(avVideoCodecCtx);
+ }
+ }
+ }
+
+ request->SetActualStartPosition(request->StartPosition->Value);
+ }
+}
+
+void FFmpegInteropMSS::OnSampleRequested(Windows::Media::Core::MediaStreamSource ^sender, MediaStreamSourceSampleRequestedEventArgs ^args)
+{
+ if (args->Request->StreamDescriptor == audioStreamDescriptor && audioSampleProvider != nullptr)
+ {
+ args->Request->Sample = audioSampleProvider->GetNextSample();
+ }
+ else if (args->Request->StreamDescriptor == videoStreamDescriptor && videoSampleProvider != nullptr)
+ {
+ args->Request->Sample = videoSampleProvider->GetNextSample();
+ }
+ else
+ {
+ args->Request->Sample = nullptr;
+ }
+}
+
+// Static function to read file stream and pass data to FFmpeg. Credit to Philipp Sch http://www.codeproject.com/Tips/489450/Creating-Custom-FFmpeg-IO-Context
+static int FileStreamRead(void* ptr, uint8_t* buf, int bufSize)
+{
+ IStream* pStream = reinterpret_cast(ptr);
+ ULONG bytesRead = 0;
+ HRESULT hr = pStream->Read(buf, bufSize, &bytesRead);
+
+ if (FAILED(hr))
+ {
+ return -1;
+ }
+
+ // If we succeed but don't have any bytes, assume end of file
+ if (bytesRead == 0)
+ {
+ return AVERROR_EOF; // Let FFmpeg know that we have reached eof
+ }
+
+ return bytesRead;
+}
+
+// Static function to seek in file stream. Credit to Philipp Sch http://www.codeproject.com/Tips/489450/Creating-Custom-FFmpeg-IO-Context
+static int64_t FileStreamSeek(void* ptr, int64_t pos, int whence)
+{
+ IStream* pStream = reinterpret_cast(ptr);
+ LARGE_INTEGER in;
+ in.QuadPart = pos;
+ ULARGE_INTEGER out = { 0 };
+
+ if (FAILED(pStream->Seek(in, whence, &out)))
+ {
+ return -1;
+ }
+
+ return out.QuadPart; // Return the new position:
+}
diff --git a/FFmpegInterop/Source/FFmpegInteropMSS.h b/FFmpegInterop/Source/FFmpegInteropMSS.h
new file mode 100755
index 0000000..133e059
--- /dev/null
+++ b/FFmpegInterop/Source/FFmpegInteropMSS.h
@@ -0,0 +1,88 @@
+//*****************************************************************************
+//
+// Copyright 2015 Microsoft Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http ://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//*****************************************************************************
+
+#pragma once
+#include
+#include "MediaSampleProvider.h"
+#include "FFmpegReader.h"
+
+using namespace Platform;
+using namespace Windows::Foundation;
+using namespace Windows::Foundation::Collections;
+using namespace Windows::Media::Core;
+
+extern "C"
+{
+#include
+}
+
+namespace FFmpegInterop
+{
+ public ref class FFmpegInteropMSS sealed
+ {
+ public:
+ static FFmpegInteropMSS^ CreateFFmpegInteropMSSFromStream(IRandomAccessStream^ stream, bool forceAudioDecode, bool forceVideoDecode, PropertySet^ ffmpegOptions);
+ static FFmpegInteropMSS^ CreateFFmpegInteropMSSFromStream(IRandomAccessStream^ stream, bool forceAudioDecode, bool forceVideoDecode);
+ static FFmpegInteropMSS^ CreateFFmpegInteropMSSFromUri(String^ uri, bool forceAudioDecode, bool forceVideoDecode, PropertySet^ ffmpegOptions);
+ static FFmpegInteropMSS^ CreateFFmpegInteropMSSFromUri(String^ uri, bool forceAudioDecode, bool forceVideoDecode);
+
+ // Contructor
+ MediaStreamSource^ GetMediaStreamSource();
+ virtual ~FFmpegInteropMSS();
+
+ internal:
+ int ReadPacket();
+
+ private:
+ FFmpegInteropMSS();
+
+ HRESULT CreateMediaStreamSource(IRandomAccessStream^ stream, bool forceAudioDecode, bool forceVideoDecode, PropertySet^ ffmpegOptions);
+ HRESULT CreateMediaStreamSource(String^ uri, bool forceAudioDecode, bool forceVideoDecode, PropertySet^ ffmpegOptions);
+ HRESULT InitFFmpegContext(bool forceAudioDecode, bool forceVideoDecode);
+ HRESULT CreateAudioStreamDescriptor(bool forceAudioDecode);
+ HRESULT CreateVideoStreamDescriptor(bool forceVideoDecode);
+ HRESULT ParseOptions(PropertySet^ ffmpegOptions);
+ void OnStarting(MediaStreamSource ^sender, MediaStreamSourceStartingEventArgs ^args);
+ void OnSampleRequested(MediaStreamSource ^sender, MediaStreamSourceSampleRequestedEventArgs ^args);
+
+ MediaStreamSource^ mss;
+ EventRegistrationToken startingRequestedToken;
+ EventRegistrationToken sampleRequestedToken;
+
+ internal:
+ AVDictionary* avDict;
+ AVIOContext* avIOCtx;
+ AVFormatContext* avFormatCtx;
+ AVCodecContext* avAudioCodecCtx;
+ AVCodecContext* avVideoCodecCtx;
+
+ private:
+ AudioStreamDescriptor^ audioStreamDescriptor;
+ VideoStreamDescriptor^ videoStreamDescriptor;
+ int audioStreamIndex;
+ int videoStreamIndex;
+
+ MediaSampleProvider^ audioSampleProvider;
+ MediaSampleProvider^ videoSampleProvider;
+
+ TimeSpan mediaDuration;
+ IStream* fileStreamData;
+ unsigned char* fileStreamBuffer;
+ FFmpegReader^ m_pReader;
+ };
+}
diff --git a/FFmpegInterop/Source/FFmpegReader.cpp b/FFmpegInterop/Source/FFmpegReader.cpp
new file mode 100755
index 0000000..2d3d28d
--- /dev/null
+++ b/FFmpegInterop/Source/FFmpegReader.cpp
@@ -0,0 +1,88 @@
+//*****************************************************************************
+//
+// Copyright 2015 Microsoft Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http ://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//*****************************************************************************
+
+#include "pch.h"
+#include "FFmpegReader.h"
+
+using namespace FFmpegInterop;
+
+FFmpegReader::FFmpegReader(AVFormatContext* avFormatCtx)
+ : m_pAvFormatCtx(avFormatCtx)
+ , m_audioStreamIndex(AVERROR_STREAM_NOT_FOUND)
+ , m_videoStreamIndex(AVERROR_STREAM_NOT_FOUND)
+{
+}
+
+FFmpegReader::~FFmpegReader()
+{
+}
+
+// Read the next packet from the stream and push it into the appropriate
+// sample provider
+int FFmpegReader::ReadPacket()
+{
+ int ret;
+ AVPacket avPacket;
+ av_init_packet(&avPacket);
+ avPacket.data = NULL;
+ avPacket.size = 0;
+
+ ret = av_read_frame(m_pAvFormatCtx, &avPacket);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ // Push the packet to the appropriate
+ if (avPacket.stream_index == m_audioStreamIndex && m_audioSampleProvider != nullptr)
+ {
+ m_audioSampleProvider->PushPacket(avPacket);
+ }
+ else if (avPacket.stream_index == m_videoStreamIndex && m_videoSampleProvider != nullptr)
+ {
+ m_videoSampleProvider->PushPacket(avPacket);
+ }
+ else
+ {
+ DebugMessage(L"Ignoring unused stream\n");
+ //av_free_packet(&avPacket);
+ }
+
+ return ret;
+}
+
+void FFmpegReader::SetAudioStream(int audioStreamIndex, MediaSampleProvider^ audioSampleProvider)
+{
+ m_audioStreamIndex = audioStreamIndex;
+ m_audioSampleProvider = audioSampleProvider;
+ if (audioSampleProvider != nullptr)
+ {
+ audioSampleProvider->SetCurrentStreamIndex(m_audioStreamIndex);
+ }
+}
+
+void FFmpegReader::SetVideoStream(int videoStreamIndex, MediaSampleProvider^ videoSampleProvider)
+{
+ m_videoStreamIndex = videoStreamIndex;
+ m_videoSampleProvider = videoSampleProvider;
+ if (videoSampleProvider != nullptr)
+ {
+ videoSampleProvider->SetCurrentStreamIndex(m_videoStreamIndex);
+ }
+}
+
diff --git a/FFmpegInterop/Source/FFmpegReader.h b/FFmpegInterop/Source/FFmpegReader.h
new file mode 100755
index 0000000..dfe98ae
--- /dev/null
+++ b/FFmpegInterop/Source/FFmpegReader.h
@@ -0,0 +1,44 @@
+//*****************************************************************************
+//
+// Copyright 2015 Microsoft Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http ://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//*****************************************************************************
+
+#pragma once
+
+#include "MediaSampleProvider.h"
+
+namespace FFmpegInterop
+{
+
+ ref class FFmpegReader
+ {
+ public:
+ virtual ~FFmpegReader();
+ int ReadPacket();
+ void SetAudioStream(int audioStreamIndex, MediaSampleProvider^ audioSampleProvider);
+ void SetVideoStream(int videoStreamIndex, MediaSampleProvider^ videoSampleProvider);
+
+ internal:
+ FFmpegReader(AVFormatContext* avFormatCtx);
+
+ private:
+ AVFormatContext* m_pAvFormatCtx;
+ MediaSampleProvider^ m_audioSampleProvider;
+ int m_audioStreamIndex;
+ MediaSampleProvider^ m_videoSampleProvider;
+ int m_videoStreamIndex;
+ };
+}
diff --git a/FFmpegInterop/Source/H264AVCSampleProvider.cpp b/FFmpegInterop/Source/H264AVCSampleProvider.cpp
new file mode 100755
index 0000000..d1e99b0
--- /dev/null
+++ b/FFmpegInterop/Source/H264AVCSampleProvider.cpp
@@ -0,0 +1,169 @@
+//*****************************************************************************
+//
+// Copyright 2015 Microsoft Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http ://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//*****************************************************************************
+
+#include "pch.h"
+#include "H264AVCSampleProvider.h"
+
+using namespace FFmpegInterop;
+
+H264AVCSampleProvider::H264AVCSampleProvider(
+ FFmpegReader^ reader,
+ AVFormatContext* avFormatCtx,
+ AVCodecContext* avCodecCtx)
+ : MediaSampleProvider(reader, avFormatCtx, avCodecCtx)
+{
+}
+
+H264AVCSampleProvider::~H264AVCSampleProvider()
+{
+}
+
+HRESULT H264AVCSampleProvider::WriteAVPacketToStream(DataWriter^ dataWriter, AVPacket* avPacket)
+{
+ HRESULT hr = S_OK;
+ // On a KeyFrame, write the SPS and PPS
+ if (avPacket->flags & AV_PKT_FLAG_KEY)
+ {
+ hr = GetSPSAndPPSBuffer(dataWriter);
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ // Convert the packet to NAL format
+ hr = WriteNALPacket(dataWriter, avPacket);
+ }
+
+ // We have a complete frame
+ return hr;
+}
+
+HRESULT H264AVCSampleProvider::GetSPSAndPPSBuffer(DataWriter^ dataWriter)
+{
+ HRESULT hr = S_OK;
+ int spsLength = 0;
+ int ppsLength = 0;
+
+ // Get the position of the SPS
+ if (m_pAvCodecCtx->extradata == nullptr && m_pAvCodecCtx->extradata_size < 8)
+ {
+ // The data isn't present
+ hr = E_FAIL;
+ }
+ if (SUCCEEDED(hr))
+ {
+ byte* spsPos = m_pAvCodecCtx->extradata + 8;
+ spsLength = spsPos[-1];
+
+ if (m_pAvCodecCtx->extradata_size < (8 + spsLength))
+ {
+ // We don't have a complete SPS
+ hr = E_FAIL;
+ }
+ else
+ {
+ auto vSPS = ref new Platform::Array(spsPos, spsLength);
+
+ // Write the NAL unit for the SPS
+ dataWriter->WriteByte(0);
+ dataWriter->WriteByte(0);
+ dataWriter->WriteByte(0);
+ dataWriter->WriteByte(1);
+
+ // Write the SPS
+ dataWriter->WriteBytes(vSPS);
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ if (m_pAvCodecCtx->extradata_size < (8 + spsLength + 3))
+ {
+ hr = E_FAIL;
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ byte* ppsPos = m_pAvCodecCtx->extradata + 8 + spsLength + 3;
+ ppsLength = ppsPos[-1];
+
+ if (m_pAvCodecCtx->extradata_size < (8 + spsLength + 3 + ppsLength))
+ {
+ hr = E_FAIL;
+ }
+ else
+ {
+ auto vPPS = ref new Platform::Array(ppsPos, ppsLength);
+
+ // Write the NAL unit for the PPS
+ dataWriter->WriteByte(0);
+ dataWriter->WriteByte(0);
+ dataWriter->WriteByte(0);
+ dataWriter->WriteByte(1);
+
+ // Write the PPS
+ dataWriter->WriteBytes(vPPS);
+ }
+ }
+ }
+
+ return hr;
+}
+
+// Write out an H.264 packet converting stream offsets to start-codes
+HRESULT H264AVCSampleProvider::WriteNALPacket(DataWriter^ dataWriter, AVPacket* avPacket)
+{
+ HRESULT hr = S_OK;
+ uint32 index = 0;
+ uint32 size = 0;
+ uint32 packetSize = (uint32)avPacket->size;
+
+ do
+ {
+ // Make sure we have enough data
+ if (packetSize < (index + 4))
+ {
+ hr = E_FAIL;
+ break;
+ }
+
+ // Grab the size of the blob
+ size = (avPacket->data[index] << 24) + (avPacket->data[index + 1] << 16) + (avPacket->data[index + 2] << 8) + avPacket->data[index + 3];
+
+ // Write the NAL unit to the stream
+ dataWriter->WriteByte(0);
+ dataWriter->WriteByte(0);
+ dataWriter->WriteByte(0);
+ dataWriter->WriteByte(1);
+ index += 4;
+
+ // Stop if index and size goes beyond packet size or overflow
+ if (packetSize < (index + size) || (UINT32_MAX - index) < size)
+ {
+ hr = E_FAIL;
+ break;
+ }
+
+ // Write the rest of the packet to the stream
+ auto vBuffer = ref new Platform::Array(&(avPacket->data[index]), size);
+ dataWriter->WriteBytes(vBuffer);
+ index += size;
+ } while (index < packetSize);
+
+ return hr;
+}
+
diff --git a/FFmpegInterop/Source/H264AVCSampleProvider.h b/FFmpegInterop/Source/H264AVCSampleProvider.h
new file mode 100755
index 0000000..a13e775
--- /dev/null
+++ b/FFmpegInterop/Source/H264AVCSampleProvider.h
@@ -0,0 +1,41 @@
+//*****************************************************************************
+//
+// Copyright 2015 Microsoft Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http ://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//*****************************************************************************
+
+#pragma once
+#include "MediaSampleProvider.h"
+
+namespace FFmpegInterop
+{
+ ref class H264AVCSampleProvider :
+ public MediaSampleProvider
+ {
+ public:
+ virtual ~H264AVCSampleProvider();
+
+ private:
+ HRESULT WriteNALPacket(DataWriter^ dataWriter, AVPacket* avPacket);
+ HRESULT GetSPSAndPPSBuffer(DataWriter^ dataWriter);
+
+ internal:
+ H264AVCSampleProvider(
+ FFmpegReader^ reader,
+ AVFormatContext* avFormatCtx,
+ AVCodecContext* avCodecCtx);
+ virtual HRESULT WriteAVPacketToStream(DataWriter^ writer, AVPacket* avPacket) override;
+ };
+}
diff --git a/FFmpegInterop/Source/H264SampleProvider.cpp b/FFmpegInterop/Source/H264SampleProvider.cpp
new file mode 100755
index 0000000..0136701
--- /dev/null
+++ b/FFmpegInterop/Source/H264SampleProvider.cpp
@@ -0,0 +1,72 @@
+//*****************************************************************************
+//
+// Copyright 2015 Microsoft Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http ://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//*****************************************************************************
+
+#include "pch.h"
+#include "H264SampleProvider.h"
+
+using namespace FFmpegInterop;
+
+H264SampleProvider::H264SampleProvider(
+ FFmpegReader^ reader,
+ AVFormatContext* avFormatCtx,
+ AVCodecContext* avCodecCtx)
+ : MediaSampleProvider(reader, avFormatCtx, avCodecCtx)
+{
+}
+
+H264SampleProvider::~H264SampleProvider()
+{
+}
+
+HRESULT H264SampleProvider::WriteAVPacketToStream(DataWriter^ dataWriter, AVPacket* avPacket)
+{
+ HRESULT hr = S_OK;
+ // On a KeyFrame, write the SPS and PPS
+ if (avPacket->flags & AV_PKT_FLAG_KEY)
+ {
+ hr = GetSPSAndPPSBuffer(dataWriter);
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ // Call base class method that simply write the packet to stream as is
+ hr = MediaSampleProvider::WriteAVPacketToStream(dataWriter, avPacket);
+ }
+
+ // We have a complete frame
+ return hr;
+}
+
+HRESULT H264SampleProvider::GetSPSAndPPSBuffer(DataWriter^ dataWriter)
+{
+ HRESULT hr = S_OK;
+
+ if (m_pAvCodecCtx->extradata == nullptr && m_pAvCodecCtx->extradata_size < 8)
+ {
+ // The data isn't present
+ hr = E_FAIL;
+ }
+ else
+ {
+ // Write both SPS and PPS sequence as is from extradata
+ auto vSPSPPS = ref new Platform::Array(m_pAvCodecCtx->extradata, m_pAvCodecCtx->extradata_size);
+ dataWriter->WriteBytes(vSPSPPS);
+ }
+
+ return hr;
+}
\ No newline at end of file
diff --git a/FFmpegInterop/Source/H264SampleProvider.h b/FFmpegInterop/Source/H264SampleProvider.h
new file mode 100755
index 0000000..82600c1
--- /dev/null
+++ b/FFmpegInterop/Source/H264SampleProvider.h
@@ -0,0 +1,40 @@
+//*****************************************************************************
+//
+// Copyright 2015 Microsoft Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http ://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//*****************************************************************************
+
+#pragma once
+#include "MediaSampleProvider.h"
+
+namespace FFmpegInterop
+{
+ ref class H264SampleProvider :
+ public MediaSampleProvider
+ {
+ public:
+ virtual ~H264SampleProvider();
+
+ private:
+ HRESULT GetSPSAndPPSBuffer(DataWriter^ dataWriter);
+
+ internal:
+ H264SampleProvider(
+ FFmpegReader^ reader,
+ AVFormatContext* avFormatCtx,
+ AVCodecContext* avCodecCtx);
+ virtual HRESULT WriteAVPacketToStream(DataWriter^ writer, AVPacket* avPacket) override;
+ };
+}
diff --git a/FFmpegInterop/Source/MediaSampleProvider.cpp b/FFmpegInterop/Source/MediaSampleProvider.cpp
new file mode 100755
index 0000000..2035e1d
--- /dev/null
+++ b/FFmpegInterop/Source/MediaSampleProvider.cpp
@@ -0,0 +1,164 @@
+//*****************************************************************************
+//
+// Copyright 2015 Microsoft Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http ://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//*****************************************************************************
+
+#include "pch.h"
+#include "MediaSampleProvider.h"
+#include "FFmpegInteropMSS.h"
+#include "FFmpegReader.h"
+
+using namespace FFmpegInterop;
+
+MediaSampleProvider::MediaSampleProvider(
+ FFmpegReader^ reader,
+ AVFormatContext* avFormatCtx,
+ AVCodecContext* avCodecCtx)
+ : m_pReader(reader)
+ , m_pAvFormatCtx(avFormatCtx)
+ , m_pAvCodecCtx(avCodecCtx)
+ , m_streamIndex(AVERROR_STREAM_NOT_FOUND)
+{
+}
+
+HRESULT MediaSampleProvider::AllocateResources()
+{
+ return S_OK;
+}
+
+MediaSampleProvider::~MediaSampleProvider()
+{
+}
+
+void MediaSampleProvider::SetCurrentStreamIndex(int streamIndex)
+{
+ if (m_pAvCodecCtx != nullptr && m_pAvFormatCtx->nb_streams > (unsigned int)streamIndex)
+ {
+ m_streamIndex = streamIndex;
+ }
+ else
+ {
+ m_streamIndex = AVERROR_STREAM_NOT_FOUND;
+ }
+}
+
+MediaStreamSample^ MediaSampleProvider::GetNextSample()
+{
+ DebugMessage(L"GetNextSample\n");
+
+ HRESULT hr = S_OK;
+
+ MediaStreamSample^ sample;
+ AVPacket avPacket;
+ av_init_packet(&avPacket);
+ avPacket.data = NULL;
+ avPacket.size = 0;
+ DataWriter^ dataWriter = ref new DataWriter();
+
+ bool frameComplete = false;
+ bool decodeSuccess = true;
+
+ while (SUCCEEDED(hr) && !frameComplete)
+ {
+ // Continue reading until there is an appropriate packet in the stream
+ while (m_packetQueue.empty())
+ {
+ if (m_pReader->ReadPacket() < 0)
+ {
+ DebugMessage(L"GetNextSample reaching EOF\n");
+ hr = E_FAIL;
+ break;
+ }
+ }
+
+ if (!m_packetQueue.empty())
+ {
+ // Pick the packets from the queue one at a time
+ avPacket = PopPacket();
+
+ // Decode the packet if necessary
+ hr = DecodeAVPacket(dataWriter, &avPacket);
+ frameComplete = (hr == S_OK);
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ // Write the packet out
+ hr = WriteAVPacketToStream(dataWriter, &avPacket);
+
+ Windows::Foundation::TimeSpan pts = { LONGLONG(av_q2d(m_pAvFormatCtx->streams[m_streamIndex]->time_base) * 10000000 * avPacket.pts) };
+ Windows::Foundation::TimeSpan dur = { LONGLONG(av_q2d(m_pAvFormatCtx->streams[m_streamIndex]->time_base) * 10000000 * avPacket.duration) };
+
+ sample = MediaStreamSample::CreateFromBuffer(dataWriter->DetachBuffer(), pts);
+ sample->Duration = dur;
+ }
+
+ //av_free_packet(&avPacket);
+
+ return sample;
+}
+
+HRESULT MediaSampleProvider::WriteAVPacketToStream(DataWriter^ dataWriter, AVPacket* avPacket)
+{
+ // This is the simplest form of transfer. Copy the packet directly to the stream
+ // This works for most compressed formats
+ auto aBuffer = ref new Platform::Array(avPacket->data, avPacket->size);
+ dataWriter->WriteBytes(aBuffer);
+ return S_OK;
+}
+
+HRESULT MediaSampleProvider::DecodeAVPacket(DataWriter^ dataWriter, AVPacket *avPacket)
+{
+ // For the simple case of compressed samples, each packet is a sample
+ return S_OK;
+}
+
+void MediaSampleProvider::PushPacket(AVPacket packet)
+{
+ DebugMessage(L" - PushPacket\n");
+
+ m_packetQueue.push(packet);
+}
+
+AVPacket MediaSampleProvider::PopPacket()
+{
+ DebugMessage(L" - PopPacket\n");
+
+ AVPacket avPacket;
+ av_init_packet(&avPacket);
+ avPacket.data = NULL;
+ avPacket.size = 0;
+
+ if (!m_packetQueue.empty())
+ {
+ avPacket = m_packetQueue.front();
+ m_packetQueue.pop();
+ }
+
+ return avPacket;
+}
+
+void MediaSampleProvider::Flush()
+{
+ /*while (!m_packetQueue.empty())
+ {
+ av_free_packet(&PopPacket());
+ }*/
+}
+
+
+
diff --git a/FFmpegInterop/Source/MediaSampleProvider.h b/FFmpegInterop/Source/MediaSampleProvider.h
new file mode 100755
index 0000000..5e16828
--- /dev/null
+++ b/FFmpegInterop/Source/MediaSampleProvider.h
@@ -0,0 +1,68 @@
+//*****************************************************************************
+//
+// Copyright 2015 Microsoft Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http ://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//*****************************************************************************
+
+#pragma once
+#include
+
+extern "C"
+{
+#include
+}
+
+using namespace Windows::Storage::Streams;
+using namespace Windows::Media::Core;
+
+namespace FFmpegInterop
+{
+ ref class FFmpegInteropMSS;
+ ref class FFmpegReader;
+
+ ref class MediaSampleProvider
+ {
+ public:
+ virtual ~MediaSampleProvider();
+ virtual MediaStreamSample^ GetNextSample();
+ virtual void Flush();
+ virtual void SetCurrentStreamIndex(int streamIndex);
+
+ internal:
+ void PushPacket(AVPacket packet);
+ AVPacket PopPacket();
+
+ private:
+ std::queue m_packetQueue;
+ int m_streamIndex;
+
+ internal:
+ // The FFmpeg context. Because they are complex types
+ // we declare them as internal so they don't get exposed
+ // externally
+ FFmpegReader^ m_pReader;
+ AVFormatContext* m_pAvFormatCtx;
+ AVCodecContext* m_pAvCodecCtx;
+
+ internal:
+ MediaSampleProvider(
+ FFmpegReader^ reader,
+ AVFormatContext* avFormatCtx,
+ AVCodecContext* avCodecCtx);
+ virtual HRESULT AllocateResources();
+ virtual HRESULT WriteAVPacketToStream(DataWriter^ writer, AVPacket* avPacket);
+ virtual HRESULT DecodeAVPacket(DataWriter^ dataWriter, AVPacket* avPacket);
+ };
+}
\ No newline at end of file
diff --git a/FFmpegInterop/Source/UncompressedAudioSampleProvider.cpp b/FFmpegInterop/Source/UncompressedAudioSampleProvider.cpp
new file mode 100755
index 0000000..ccedb48
--- /dev/null
+++ b/FFmpegInterop/Source/UncompressedAudioSampleProvider.cpp
@@ -0,0 +1,145 @@
+//*****************************************************************************
+//
+// Copyright 2015 Microsoft Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http ://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//*****************************************************************************
+
+#include "pch.h"
+#include "UncompressedAudioSampleProvider.h"
+
+using namespace FFmpegInterop;
+
+UncompressedAudioSampleProvider::UncompressedAudioSampleProvider(
+ FFmpegReader^ reader,
+ AVFormatContext* avFormatCtx,
+ AVCodecContext* avCodecCtx)
+ : MediaSampleProvider(reader, avFormatCtx, avCodecCtx)
+ , m_pAvFrame(nullptr)
+ , m_pSwrCtx(nullptr)
+{
+}
+
+HRESULT UncompressedAudioSampleProvider::AllocateResources()
+{
+ HRESULT hr = S_OK;
+ hr = MediaSampleProvider::AllocateResources();
+ if (SUCCEEDED(hr))
+ {
+ // Set default channel layout when the value is unknown (0)
+ int64 inChannelLayout = m_pAvCodecCtx->channel_layout ? m_pAvCodecCtx->channel_layout : av_get_default_channel_layout(m_pAvCodecCtx->channels);
+ int64 outChannelLayout = av_get_default_channel_layout(m_pAvCodecCtx->channels);
+
+ // Set up resampler to convert any PCM format (e.g. AV_SAMPLE_FMT_FLTP) to AV_SAMPLE_FMT_S16 PCM format that is expected by Media Element.
+ // Additional logic can be added to avoid resampling PCM data that is already in AV_SAMPLE_FMT_S16_PCM.
+ m_pSwrCtx = swr_alloc_set_opts(
+ NULL,
+ outChannelLayout,
+ AV_SAMPLE_FMT_S16,
+ m_pAvCodecCtx->sample_rate,
+ inChannelLayout,
+ m_pAvCodecCtx->sample_fmt,
+ m_pAvCodecCtx->sample_rate,
+ 0,
+ NULL);
+
+ if (!m_pSwrCtx)
+ {
+ hr = E_OUTOFMEMORY;
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ if (swr_init(m_pSwrCtx) < 0)
+ {
+ hr = E_FAIL;
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ m_pAvFrame = av_frame_alloc();
+ if (!m_pAvFrame)
+ {
+ hr = E_OUTOFMEMORY;
+ }
+ }
+
+ return hr;
+}
+
+UncompressedAudioSampleProvider::~UncompressedAudioSampleProvider()
+{
+ if (m_pAvFrame)
+ {
+ av_freep(m_pAvFrame);
+ }
+
+ // Free
+ swr_free(&m_pSwrCtx);
+}
+
+HRESULT UncompressedAudioSampleProvider::WriteAVPacketToStream(DataWriter^ dataWriter, AVPacket* avPacket)
+{
+ // Because each packet can contain multiple frames, we have already written the packet to the stream
+ // during the decode stage.
+ return S_OK;
+}
+
+HRESULT UncompressedAudioSampleProvider::DecodeAVPacket(DataWriter^ dataWriter, AVPacket* avPacket)
+{
+ HRESULT hr = S_OK;
+ int frameComplete = 0;
+ // Each audio packet may contain multiple frames which requires calling avcodec_decode_audio4 for each frame. Loop through the entire packet data
+ while (avPacket->size > 0)
+ {
+ frameComplete = 0;
+ int decodedBytes = avcodec_decode_audio4(m_pAvCodecCtx, m_pAvFrame, &frameComplete, avPacket);
+
+ if (decodedBytes < 0)
+ {
+ DebugMessage(L"Fail To Decode!\n");
+ hr = E_FAIL;
+ break; // Skip broken frame
+ }
+
+ if (SUCCEEDED(hr) && frameComplete)
+ {
+ // Resample uncompressed frame to AV_SAMPLE_FMT_S16 PCM format that is expected by Media Element
+ uint8_t *resampledData = nullptr;
+ unsigned int aBufferSize = av_samples_alloc(&resampledData, NULL, m_pAvFrame->channels, m_pAvFrame->nb_samples, AV_SAMPLE_FMT_S16, 0);
+ int resampledDataSize = swr_convert(m_pSwrCtx, &resampledData, aBufferSize, (const uint8_t **)m_pAvFrame->extended_data, m_pAvFrame->nb_samples);
+ auto aBuffer = ref new Platform::Array(resampledData, min(aBufferSize, (unsigned int)(resampledDataSize * m_pAvFrame->channels * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16))));
+ dataWriter->WriteBytes(aBuffer);
+ av_freep(&resampledData);
+ av_frame_unref(m_pAvFrame);
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ // Advance to the next frame data that have not been decoded if any
+ avPacket->size -= decodedBytes;
+ avPacket->data += decodedBytes;
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ // We've completed the packet. Return S_FALSE to indicate an incomplete frame
+ hr = (frameComplete != 0) ? S_OK : S_FALSE;
+ }
+
+ return hr;
+}
diff --git a/FFmpegInterop/Source/UncompressedAudioSampleProvider.h b/FFmpegInterop/Source/UncompressedAudioSampleProvider.h
new file mode 100755
index 0000000..3619603
--- /dev/null
+++ b/FFmpegInterop/Source/UncompressedAudioSampleProvider.h
@@ -0,0 +1,48 @@
+//*****************************************************************************
+//
+// Copyright 2015 Microsoft Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http ://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//*****************************************************************************
+
+#pragma once
+#include "MediaSampleProvider.h"
+
+extern "C"
+{
+#include
+}
+
+namespace FFmpegInterop
+{
+ ref class UncompressedAudioSampleProvider: MediaSampleProvider
+ {
+ public:
+ virtual ~UncompressedAudioSampleProvider();
+
+ internal:
+ UncompressedAudioSampleProvider(
+ FFmpegReader^ reader,
+ AVFormatContext* avFormatCtx,
+ AVCodecContext* avCodecCtx);
+ virtual HRESULT WriteAVPacketToStream(DataWriter^ writer, AVPacket* avPacket) override;
+ virtual HRESULT DecodeAVPacket(DataWriter^ dataWriter, AVPacket* avPacket) override;
+ virtual HRESULT AllocateResources() override;
+
+ private:
+ AVFrame* m_pAvFrame;
+ SwrContext* m_pSwrCtx;
+ };
+}
+
diff --git a/FFmpegInterop/Source/UncompressedVideoSampleProvider.cpp b/FFmpegInterop/Source/UncompressedVideoSampleProvider.cpp
new file mode 100755
index 0000000..7634a60
--- /dev/null
+++ b/FFmpegInterop/Source/UncompressedVideoSampleProvider.cpp
@@ -0,0 +1,137 @@
+//*****************************************************************************
+//
+// Copyright 2015 Microsoft Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http ://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//*****************************************************************************
+
+#include "pch.h"
+#include "UncompressedVideoSampleProvider.h"
+
+extern "C"
+{
+#include
+}
+
+
+using namespace FFmpegInterop;
+
+UncompressedVideoSampleProvider::UncompressedVideoSampleProvider(
+ FFmpegReader^ reader,
+ AVFormatContext* avFormatCtx,
+ AVCodecContext* avCodecCtx)
+ : MediaSampleProvider(reader, avFormatCtx, avCodecCtx)
+ , m_pAvFrame(nullptr)
+ , m_pSwsCtx(nullptr)
+{
+ for (int i = 0; i < 4; i++)
+ {
+ m_rgVideoBufferLineSize[i] = 0;
+ m_rgVideoBufferData[i] = nullptr;
+ }
+}
+
+HRESULT UncompressedVideoSampleProvider::AllocateResources()
+{
+ HRESULT hr = S_OK;
+ hr = MediaSampleProvider::AllocateResources();
+ if (SUCCEEDED(hr))
+ {
+ // Setup software scaler to convert any decoder pixel format (e.g. YUV420P) to NV12 that is supported in Windows & Windows Phone MediaElement
+ m_pSwsCtx = sws_getContext(
+ m_pAvCodecCtx->width,
+ m_pAvCodecCtx->height,
+ m_pAvCodecCtx->pix_fmt,
+ m_pAvCodecCtx->width,
+ m_pAvCodecCtx->height,
+ AV_PIX_FMT_NV12,
+ SWS_BICUBIC,
+ NULL,
+ NULL,
+ NULL);
+
+ if (m_pSwsCtx == nullptr)
+ {
+ hr = E_OUTOFMEMORY;
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ m_pAvFrame = av_frame_alloc();
+ if (m_pAvFrame == nullptr)
+ {
+ hr = E_OUTOFMEMORY;
+ }
+ }
+
+ if (SUCCEEDED(hr))
+ {
+ if (av_image_alloc(m_rgVideoBufferData, m_rgVideoBufferLineSize, m_pAvCodecCtx->width, m_pAvCodecCtx->height, AV_PIX_FMT_NV12, 1) < 0)
+ {
+ hr = E_FAIL;
+ }
+ }
+
+ return hr;
+}
+
+UncompressedVideoSampleProvider::~UncompressedVideoSampleProvider()
+{
+ if (m_pAvFrame)
+ {
+ av_freep(m_pAvFrame);
+ }
+
+ if (m_rgVideoBufferData)
+ {
+ av_freep(m_rgVideoBufferData);
+ }
+}
+
+HRESULT UncompressedVideoSampleProvider::WriteAVPacketToStream(DataWriter^ dataWriter, AVPacket* avPacket)
+{
+ // Convert decoded video pixel format to NV12 using FFmpeg software scaler
+ if (sws_scale(m_pSwsCtx, (const uint8_t **)(m_pAvFrame->data), m_pAvFrame->linesize, 0, m_pAvCodecCtx->height, m_rgVideoBufferData, m_rgVideoBufferLineSize) < 0)
+ {
+ return E_FAIL;
+ }
+
+ auto YBuffer = ref new Platform::Array(m_rgVideoBufferData[0], m_rgVideoBufferLineSize[0] * m_pAvCodecCtx->height);
+ auto UVBuffer = ref new Platform::Array(m_rgVideoBufferData[1], m_rgVideoBufferLineSize[1] * m_pAvCodecCtx->height / 2);
+ dataWriter->WriteBytes(YBuffer);
+ dataWriter->WriteBytes(UVBuffer);
+ av_frame_unref(m_pAvFrame);
+
+ return S_OK;
+}
+
+HRESULT UncompressedVideoSampleProvider::DecodeAVPacket(DataWriter^ dataWriter, AVPacket* avPacket)
+{
+ int frameComplete = 0;
+ if (avcodec_decode_video2(m_pAvCodecCtx, m_pAvFrame, &frameComplete, avPacket) < 0)
+ {
+ DebugMessage(L"DecodeAVPacket Failed\n");
+ frameComplete = 1;
+ }
+ else
+ {
+ if (frameComplete)
+ {
+ avPacket->pts = av_frame_get_best_effort_timestamp(m_pAvFrame);
+ }
+ }
+
+ return frameComplete ? S_OK : S_FALSE;
+}
diff --git a/FFmpegInterop/Source/UncompressedVideoSampleProvider.h b/FFmpegInterop/Source/UncompressedVideoSampleProvider.h
new file mode 100755
index 0000000..2b621e9
--- /dev/null
+++ b/FFmpegInterop/Source/UncompressedVideoSampleProvider.h
@@ -0,0 +1,51 @@
+//*****************************************************************************
+//
+// Copyright 2015 Microsoft Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http ://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//*****************************************************************************
+
+#pragma once
+#include "MediaSampleProvider.h"
+
+extern "C"
+{
+#include
+}
+
+
+namespace FFmpegInterop
+{
+ ref class UncompressedVideoSampleProvider: MediaSampleProvider
+ {
+ public:
+ virtual ~UncompressedVideoSampleProvider();
+
+ internal:
+ UncompressedVideoSampleProvider(
+ FFmpegReader^ reader,
+ AVFormatContext* avFormatCtx,
+ AVCodecContext* avCodecCtx);
+ virtual HRESULT WriteAVPacketToStream(DataWriter^ writer, AVPacket* avPacket) override;
+ virtual HRESULT DecodeAVPacket(DataWriter^ dataWriter, AVPacket* avPacket) override;
+ virtual HRESULT AllocateResources() override;
+
+ private:
+ AVFrame* m_pAvFrame;
+ SwsContext* m_pSwsCtx;
+ int m_rgVideoBufferLineSize[4];
+ uint8_t* m_rgVideoBufferData[4];
+ };
+}
+
diff --git a/FFmpegInterop/Win8.1/FFmpegInterop.Shared/FFmpegGifDecoder.cpp b/FFmpegInterop/Win8.1/FFmpegInterop.Shared/FFmpegGifDecoder.cpp
new file mode 100755
index 0000000..d5af303
--- /dev/null
+++ b/FFmpegInterop/Win8.1/FFmpegInterop.Shared/FFmpegGifDecoder.cpp
@@ -0,0 +1,585 @@
+#include "pch.h"
+#include "FFmpegGifDecoder.h"
+#include
+#include
+#include
+
+#ifndef NOMINMAX
+#undef min
+#undef max
+#endif
+
+extern "C"
+{
+#include
+}
+using namespace FFmpegInterop;
+
+typedef struct VideoInfo {
+
+ ~VideoInfo() {
+ if (video_dec_ctx) {
+ avcodec_close(video_dec_ctx);
+ video_dec_ctx = nullptr;
+ }
+ if (fmt_ctx) {
+ avformat_close_input(&fmt_ctx);
+ fmt_ctx = nullptr;
+ }
+ if (frame) {
+ av_frame_free(&frame);
+ frame = nullptr;
+ }
+ if (src) {
+ delete[] src;
+ src = nullptr;
+ }
+ if (free_orig_pkt)
+ {
+ av_free_packet(&orig_pkt);
+ free_orig_pkt = false;
+ }
+ //av_packet_unref(&orig_pkt);
+
+ video_stream_idx = -1;
+ video_stream = nullptr;
+ }
+
+ AVFormatContext *fmt_ctx = nullptr;
+ char *src = nullptr;
+ int video_stream_idx = -1;
+ AVStream *video_stream = nullptr;
+ AVCodecContext *video_dec_ctx = nullptr;
+ AVFrame *frame = nullptr;
+ bool has_decoded_frames = false;
+ bool free_orig_pkt = false;
+ AVPacket pkt;
+ AVPacket orig_pkt;
+};
+
+void Log(Platform::String^ message, Platform::Object^ parameter1, Platform::Object^ parameter2){
+ auto para1String = parameter1->ToString();
+ auto para2String = parameter2->ToString();
+ auto msg = std::wstring(message->Data());
+ auto para1 = std::wstring(safe_cast(para1String)->Data());
+ auto para2 = std::wstring(safe_cast(para2String)->Data());
+
+ auto offset1 = msg.find(L"{0}");
+
+ auto formattedText = msg.replace(offset1, 3, para1);// .append(L"\r\n");
+
+ auto offset2 = formattedText.find(L"{1}");
+
+ formattedText = formattedText.replace(offset2, 3, para2).append(L"\r\n");
+
+ ::OutputDebugString(formattedText.c_str());
+}
+
+void Log(Platform::String^ message, Platform::Object^ parameter){
+ auto paraString = parameter->ToString();
+ auto msg = std::wstring(message->Data());
+ auto para = std::wstring(safe_cast(paraString)->Data());
+
+ auto offset = msg.find(L"{0}");
+
+ auto formattedText = msg.replace(offset, 3, para).append(L"\r\n");
+
+ ::OutputDebugString(formattedText.c_str());
+}
+
+int open_codec_context(int *stream_idx, AVFormatContext *fmt_ctx, enum AVMediaType type) {
+ int ret;
+ AVStream *st;
+ AVCodecContext *dec_ctx = NULL;
+ AVCodec *dec = NULL;
+ AVDictionary *opts = NULL;
+
+ ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0);
+ if (ret < 0) {
+ //LOGE("can't find %s stream in input file\n", av_get_media_type_string(type));
+ return ret;
+ }
+ else {
+ *stream_idx = ret;
+ st = fmt_ctx->streams[*stream_idx];
+
+ dec_ctx = st->codec;
+ dec = avcodec_find_decoder(dec_ctx->codec_id);
+ if (!dec) {
+ //LOGE("failed to find %s codec\n", av_get_media_type_string(type));
+ return ret;
+ }
+
+ av_dict_set(&opts, "refcounted_frames", "1", 0);
+ if ((ret = avcodec_open2(dec_ctx, dec, &opts)) < 0) {
+ //LOGE("failed to open %s codec\n", av_get_media_type_string(type));
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
+int decode_packet(VideoInfo *info, int *got_frame) {
+ try{
+
+ int ret = 0;
+ int decoded = info->pkt.size;
+
+ *got_frame = 0;
+ if (info->pkt.stream_index == info->video_stream_idx) {
+ ret = avcodec_decode_video2(info->video_dec_ctx, info->frame, got_frame, &info->pkt);
+ if (ret != 0) {
+ return ret;
+ }
+ }
+
+ return decoded;
+ }
+ catch (Platform::Exception^ e)
+ {
+
+ }
+
+ return -1;
+}
+
+static bool _once;
+
+int FFmpegGifDecoder::CreateDecoder(Platform::String^ src, Platform::WriteOnlyArray^ data)
+{
+ //if (!_once)
+ {
+ _once = true;
+ av_register_all();
+ }
+
+ VideoInfo *info = new VideoInfo();
+
+ Platform::String^ fooRT = src;
+ std::wstring fooW(fooRT->Begin());
+ std::string fooA(fooW.begin(), fooW.end());
+ const char* srcString = fooA.c_str();
+
+ int len = strlen(srcString);
+ info->src = new char[len + 1];
+ memcpy(info->src, srcString, len);
+ info->src[len] = '\0';
+ if (srcString != 0) {
+ //delete[] srcString;
+ //env->ReleaseStringUTFChars(src, srcString);
+ }
+
+ int ret;
+ if ((ret = avformat_open_input(&info->fmt_ctx, info->src, NULL, NULL)) < 0) {
+ //LOGE("can't open source file %s, %s", info->src, av_err2str(ret));
+ char* error = new char[256];
+ auto str = av_strerror(ret, error, 256);
+ delete info;
+ return 0;
+ }
+
+ if ((ret = avformat_find_stream_info(info->fmt_ctx, NULL)) < 0) {
+ //LOGE("can't find stream information %s, %s", info->src, av_err2str(ret));
+ delete info;
+ return 0;
+ }
+
+ if (open_codec_context(&info->video_stream_idx, info->fmt_ctx, AVMEDIA_TYPE_VIDEO) >= 0) {
+ info->video_stream = info->fmt_ctx->streams[info->video_stream_idx];
+ info->video_dec_ctx = info->video_stream->codec;
+ }
+
+ if (info->video_stream <= 0) {
+ //LOGE("can't find video stream in the input, aborting %s", info->src);
+ delete info;
+ return 0;
+ }
+
+ info->frame = av_frame_alloc();
+ if (info->frame == nullptr) {
+ //LOGE("can't allocate frame %s", info->src);
+ delete info;
+ return 0;
+ }
+
+ av_init_packet(&info->pkt);
+ info->pkt.data = NULL;
+ info->pkt.size = 0;
+ info->orig_pkt = info->pkt;
+
+ //jint *dataArr = env->GetIntArrayElements(data, 0);
+ if (data != nullptr && data->Length >= 2) {
+ data[0] = info->video_dec_ctx->width;
+ data[1] = info->video_dec_ctx->height;
+ //env->ReleaseIntArrayElements(data, dataArr, 0);
+ }
+
+ //LOGD("successfully opened file %s", info->src);
+
+ return (int)info;
+}
+
+void FFmpegGifDecoder::DestroyDecoder(int ptr)
+{
+ if (ptr == NULL) {
+ return;
+ }
+
+ VideoInfo *info = (VideoInfo *)ptr;
+ delete info;
+}
+
+#define USE_BRANCHLESS 0
+#if USE_BRANCHLESS
+static __inline int32 clamp0(int32 v) {
+ return ((-(v) >> 31) & (v));
+}
+
+static __inline int32 clamp255(int32 v) {
+ return (((255 - (v)) >> 31) | (v)) & 255;
+}
+
+static __inline uint32 Clamp(int32 val) {
+ int v = clamp0(val);
+ return (uint32)(clamp255(v));
+}
+
+static __inline uint32 Abs(int32 v) {
+ int m = v >> 31;
+ return (v + m) ^ m;
+}
+#else // USE_BRANCHLESS
+static __inline int32 clamp0(int32 v) {
+ return (v < 0) ? 0 : v;
+}
+
+static __inline int32 clamp255(int32 v) {
+ return (v > 255) ? 255 : v;
+}
+
+static __inline uint32 Clamp(int32 val) {
+ int v = clamp0(val);
+ return (uint32)(clamp255(v));
+}
+
+static __inline uint32 Abs(int32 v) {
+ return (v < 0) ? -v : v;
+}
+#endif // USE_BRANCHLESS
+
+#define YG 74 /* (int8)(1.164 * 64 + 0.5) */
+
+#define UB 127 /* min(63,(int8)(2.018 * 64)) */
+#define UG -25 /* (int8)(-0.391 * 64 - 0.5) */
+#define UR 0
+
+#define VB 0
+#define VG -52 /* (int8)(-0.813 * 64 - 0.5) */
+#define VR 102 /* (int8)(1.596 * 64 + 0.5) */
+
+// Bias
+#define BB UB * 128 + VB * 128
+#define BG UG * 128 + VG * 128
+#define BR UR * 128 + VR * 128
+
+static __inline void YuvPixel(uint8 y, uint8 u, uint8 v,
+ uint8* b, uint8* g, uint8* r) {
+ int32 y1 = ((int32)(y)-16) * YG;
+ *b = Clamp((int32)((u * UB + v * VB) - (BB)+y1) >> 6);
+ *g = Clamp((int32)((u * UG + v * VG) - (BG)+y1) >> 6);
+ *r = Clamp((int32)((u * UR + v * VR) - (BR)+y1) >> 6);
+}
+
+// Also used for 420
+void I422ToARGBRow_C(const uint8* src_y,
+ const uint8* src_u,
+ const uint8* src_v,
+ uint8* rgb_buf,
+ int width) {
+ int x;
+ for (x = 0; x < width - 1; x += 2) {
+ YuvPixel(src_y[0], src_u[0], src_v[0],
+ rgb_buf + 0, rgb_buf + 1, rgb_buf + 2);
+ rgb_buf[3] = 255;
+ YuvPixel(src_y[1], src_u[0], src_v[0],
+ rgb_buf + 4, rgb_buf + 5, rgb_buf + 6);
+ rgb_buf[7] = 255;
+ src_y += 2;
+ src_u += 1;
+ src_v += 1;
+ rgb_buf += 8; // Advance 2 pixels.
+ }
+ if (width & 1) {
+ YuvPixel(src_y[0], src_u[0], src_v[0],
+ rgb_buf + 0, rgb_buf + 1, rgb_buf + 2);
+ rgb_buf[3] = 255;
+ }
+}
+
+// Convert I420 to ARGB.
+// LIBYUV_API
+int I420ToARGB(const uint8* src_y, int src_stride_y,
+ const uint8* src_u, int src_stride_u,
+ const uint8* src_v, int src_stride_v,
+ uint8* dst_argb, int dst_stride_argb,
+ int width, int height) {
+ if (!src_y || !src_u || !src_v || !dst_argb ||
+ width <= 0 || height == 0) {
+ return -1;
+ }
+ // Negative height means invert the image.
+ if (height < 0) {
+ height = -height;
+ dst_argb = dst_argb + (height - 1) * dst_stride_argb;
+ dst_stride_argb = -dst_stride_argb;
+ }
+ void(*I422ToARGBRow)(const uint8* y_buf,
+ const uint8* u_buf,
+ const uint8* v_buf,
+ uint8* rgb_buf,
+ int width) = I422ToARGBRow_C;
+#if defined(HAS_I422TOARGBROW_SSSE3)
+ if (TestCpuFlag(kCpuHasSSSE3) && width >= 8) {
+ I422ToARGBRow = I422ToARGBRow_Any_SSSE3;
+ if (IS_ALIGNED(width, 8)) {
+ I422ToARGBRow = I422ToARGBRow_Unaligned_SSSE3;
+ if (IS_ALIGNED(dst_argb, 16) && IS_ALIGNED(dst_stride_argb, 16)) {
+ I422ToARGBRow = I422ToARGBRow_SSSE3;
+ }
+ }
+ }
+#endif
+#if defined(HAS_I422TOARGBROW_AVX2)
+ if (TestCpuFlag(kCpuHasAVX2) && width >= 16) {
+ I422ToARGBRow = I422ToARGBRow_Any_AVX2;
+ if (IS_ALIGNED(width, 16)) {
+ I422ToARGBRow = I422ToARGBRow_AVX2;
+ }
+ }
+#endif
+#if defined(HAS_I422TOARGBROW_NEON)
+ if (TestCpuFlag(kCpuHasNEON) && width >= 8) {
+ I422ToARGBRow = I422ToARGBRow_Any_NEON;
+ if (IS_ALIGNED(width, 8)) {
+ I422ToARGBRow = I422ToARGBRow_NEON;
+ }
+ }
+#endif
+#if defined(HAS_I422TOARGBROW_MIPS_DSPR2)
+ if (TestCpuFlag(kCpuHasMIPS_DSPR2) && IS_ALIGNED(width, 4) &&
+ IS_ALIGNED(src_y, 4) && IS_ALIGNED(src_stride_y, 4) &&
+ IS_ALIGNED(src_u, 2) && IS_ALIGNED(src_stride_u, 2) &&
+ IS_ALIGNED(src_v, 2) && IS_ALIGNED(src_stride_v, 2) &&
+ IS_ALIGNED(dst_argb, 4) && IS_ALIGNED(dst_stride_argb, 4)) {
+ I422ToARGBRow = I422ToARGBRow_MIPS_DSPR2;
+ }
+#endif
+
+ for (int y = 0; y < height; ++y) {
+ I422ToARGBRow(src_y, src_u, src_v, dst_argb, width);
+ dst_argb += dst_stride_argb;
+ src_y += src_stride_y;
+ if (y & 1) {
+ src_u += src_stride_u;
+ src_v += src_stride_v;
+ }
+ }
+ return 0;
+}
+
+
+// Use first 4 shuffler values to reorder ARGB channels.
+void ARGBShuffleRow_C(const uint8* src_argb, uint8* dst_argb,
+ const uint8* shuffler, int pix) {
+ int index0 = shuffler[0];
+ int index1 = shuffler[1];
+ int index2 = shuffler[2];
+ int index3 = shuffler[3];
+ // Shuffle a row of ARGB.
+ int x;
+ for (x = 0; x < pix; ++x) {
+ // To support in-place conversion.
+ uint8 b = src_argb[index0];
+ uint8 g = src_argb[index1];
+ uint8 r = src_argb[index2];
+ uint8 a = src_argb[index3];
+ dst_argb[0] = b;
+ dst_argb[1] = g;
+ dst_argb[2] = r;
+ dst_argb[3] = a;
+ src_argb += 4;
+ dst_argb += 4;
+ }
+}
+
+int ARGBShuffle(const uint8* src_bgra, int src_stride_bgra,
+ uint8* dst_argb, int dst_stride_argb,
+ const uint8* shuffler, int width, int height) {
+ int y;
+ void(*ARGBShuffleRow)(const uint8* src_bgra, uint8* dst_argb,
+ const uint8* shuffler, int pix) = ARGBShuffleRow_C;
+ if (!src_bgra || !dst_argb ||
+ width <= 0 || height == 0) {
+ return -1;
+ }
+ // Negative height means invert the image.
+ if (height < 0) {
+ height = -height;
+ src_bgra = src_bgra + (height - 1) * src_stride_bgra;
+ src_stride_bgra = -src_stride_bgra;
+ }
+ // Coalesce rows.
+ if (src_stride_bgra == width * 4 &&
+ dst_stride_argb == width * 4) {
+ width *= height;
+ height = 1;
+ src_stride_bgra = dst_stride_argb = 0;
+ }
+
+ for (y = 0; y < height; ++y) {
+ ARGBShuffleRow(src_bgra, dst_argb, shuffler, width);
+ src_bgra += src_stride_bgra;
+ dst_argb += dst_stride_argb;
+ }
+ return 0;
+}
+
+
+// Shuffle table for converting ABGR to ARGB.
+static uint8 kShuffleMaskABGRToARGB[16] = {
+ 2u, 1u, 0u, 3u, 6u, 5u, 4u, 7u, 10u, 9u, 8u, 11u, 14u, 13u, 12u, 15u
+};
+
+// Convert ABGR to ARGB.
+int ABGRToARGB(const uint8* src_abgr, int src_stride_abgr,
+uint8* dst_argb, int dst_stride_argb,
+int width, int height) {
+ return ARGBShuffle(src_abgr, src_stride_abgr,
+ dst_argb, dst_stride_argb,
+ (const uint8*)(&kShuffleMaskABGRToARGB),
+ width, height);
+}
+
+Platform::Array^ FFmpegGifDecoder::GetVideoFrame(int ptr, Platform::WriteOnlyArray^ data) {
+ auto emptyArray = ref new Platform::Array(0);
+ unsigned int start = clock();
+
+ //Log("start={0}", start);
+ if (ptr == NULL) {
+ return emptyArray;
+ }
+ VideoInfo *info = (VideoInfo *)ptr;
+ int ret = 0;
+ int got_frame = 0;
+
+ while (true) {
+ if (info->pkt.size == 0) {
+ ret = av_read_frame(info->fmt_ctx, &info->pkt);
+ //LOGD("got packet with size %d", info->pkt.size);
+ if (ret >= 0) {
+ info->orig_pkt = info->pkt;
+ info->free_orig_pkt = true;
+ }
+ }
+
+ if (info->pkt.size > 0) {
+ ret = decode_packet(info, &got_frame);
+ if (ret < 0) {
+ if (info->has_decoded_frames) {
+ ret = 0;
+ }
+ info->pkt.size = 0;
+ }
+ else {
+ //LOGD("read size %d from packet", ret);
+ info->pkt.data += ret;
+ info->pkt.size -= ret;
+ }
+
+ if (info->pkt.size == 0) {
+ if (info->free_orig_pkt){
+ info->free_orig_pkt = false;
+ av_free_packet(&info->orig_pkt);
+ }
+ //av_packet_unref(&info->orig_pkt);
+ }
+ }
+ else {
+ info->pkt.data = NULL;
+ info->pkt.size = 0;
+ ret = decode_packet(info, &got_frame);
+ if (ret < 0) {
+ //LOGE("can't decode packet flushed %s", info->src);
+ return emptyArray;
+ }
+ if (got_frame == 0) {
+ if (info->has_decoded_frames) {
+ //LOGD("file end reached %s", info->src);
+ if ((ret = avformat_seek_file(info->fmt_ctx, -1, std::numeric_limits::min(), 0, std::numeric_limits::max(), 0)) < 0) {
+ //LOGE("can't seek to begin of file %s, %s", info->src, av_err2str(ret));
+ return emptyArray;
+ }
+ else {
+ avcodec_flush_buffers(info->video_dec_ctx);
+ }
+ }
+ }
+ }
+ if (ret < 0) {
+ return emptyArray;
+ }
+
+ if (got_frame) {
+
+ auto prevStop = start;
+ auto stop = (clock() - start);
+ Log("elapsed1={0} {1}", (double)stop, (double)(stop - prevStop));
+
+ //LOGD("decoded frame with w = %d, h = %d, format = %d", info->frame->width, info->frame->height, info->frame->format);
+ auto pixelsLength = info->frame->width * info->frame->height * 4;
+ auto pixels = ref new Platform::Array(pixelsLength);
+
+ if (info->frame->format == AV_PIX_FMT_YUV420P || info->frame->format == AV_PIX_FMT_BGRA) {
+ //jint *dataArr = env->GetIntArrayElements(data, 0);
+ if (data != nullptr && data->Length >= 3) {
+ data[2] = (int)(1000 * info->frame->pkt_pts * av_q2d(info->video_stream->time_base));
+ //env->ReleaseIntArrayElements(data, dataArr, 0);
+ }
+
+ if (info->frame->format == AV_PIX_FMT_YUV420P) {
+ I420ToARGB(info->frame->data[0], info->frame->linesize[0], info->frame->data[2], info->frame->linesize[2], info->frame->data[1], info->frame->linesize[1], pixels->Data, info->frame->width * 4, info->frame->width, info->frame->height);
+ }
+ else if (info->frame->format == AV_PIX_FMT_BGRA) {
+ ABGRToARGB(info->frame->data[0], info->frame->linesize[0], pixels->Data, info->frame->width * 4, info->frame->width, info->frame->height);
+ }
+ }
+ prevStop = stop;
+ stop = (clock() - start);
+ Log("elapsed2={0} {1}", (double)stop, (double)(stop - prevStop));
+ info->has_decoded_frames = true;
+ av_frame_unref(info->frame);
+
+ //prevStop = stop;
+ //stop = (clock() - start);
+ //Log("elapsed3={0} {1}", (double)stop, (double)(stop - prevStop));
+ //auto returnBitmap = ref new Platform::Array(pixelsLength / 4);
+ //for (int j = 0; j < pixelsLength / 4; j++){
+ // returnBitmap[j] =
+ // (pixels[j * 4 + 3] << 24) + //b
+ // (pixels[j * 4 + 2] << 0) + //g
+ // (pixels[j * 4 + 1] << 8) + //r
+ // (pixels[j * 4] << 16); //a
+ // //returnBitmap[i] = pixels[i];
+ //}
+
+ //delete[] pixels;
+
+ prevStop = stop;
+ stop = (clock() - start);// / (double)CLOCKS_PER_SEC;
+ Log("elapsed4={0} {1}", (double)stop, (double)(stop - prevStop));
+ return pixels;
+ }
+ }
+ return emptyArray;
+}
\ No newline at end of file
diff --git a/FFmpegInterop/Win8.1/FFmpegInterop.Shared/FFmpegGifDecoder.h b/FFmpegInterop/Win8.1/FFmpegInterop.Shared/FFmpegGifDecoder.h
new file mode 100755
index 0000000..98a6991
--- /dev/null
+++ b/FFmpegInterop/Win8.1/FFmpegInterop.Shared/FFmpegGifDecoder.h
@@ -0,0 +1,13 @@
+#pragma once
+
+namespace FFmpegInterop
+{
+ public ref class FFmpegGifDecoder sealed
+ {
+ public:
+ static int FFmpegGifDecoder::CreateDecoder(Platform::String^ src, Platform::WriteOnlyArray^ data);
+ static void FFmpegGifDecoder::DestroyDecoder(int ptr);
+ static Platform::Array^ FFmpegGifDecoder::GetVideoFrame(int ptr, Platform::WriteOnlyArray