public static async Task<bool> Export(Deck deck)
		{
			if(deck == null)
				return false;
			var currentClipboard = "";
			var altScreenCapture = Config.Instance.AlternativeScreenCapture;
			try
			{
				Log.Info("Exporting " + deck.GetDeckInfo());
				if(Config.Instance.ExportPasteClipboard && Clipboard.ContainsText())
					currentClipboard = Clipboard.GetText();

				var info = new ExportingInfo();
				LogDebugInfo(info);

				var inForeground = await ExportingHelper.EnsureHearthstoneInForeground(info.HsHandle);
				if(!inForeground)
					return false;
				Log.Info($"Waiting for {Config.Instance.ExportStartDelay} seconds before starting the export process");
				await Task.Delay(Config.Instance.ExportStartDelay * 1000);
				if(!altScreenCapture)
					Core.Overlay.ForceHide(true);

				await ClearDeck(info);
				await SetDeckName(deck, info);
				await ClearFilters(info);
				var lostFocus = await CreateDeck(deck, info);
				if(lostFocus)
					return false;
				await ClearSearchBox(info.HsHandle, info.SearchBoxPos);

				if(Config.Instance.ExportPasteClipboard)
					Clipboard.Clear();
				Log.Info("Success exporting deck.");
				return true;
			}
			catch(Exception e)
			{
				Log.Error("Error exporting deck: " + e);
				return false;
			}
			finally
			{
				if(!altScreenCapture)
					Core.Overlay.ForceHide(false);
				try
				{
					if(Config.Instance.ExportPasteClipboard && currentClipboard != "")
						Clipboard.SetText(currentClipboard);
				}
				catch(Exception ex)
				{
					Log.Error("Could not restore clipboard content after export: " + ex);
				}
			}
		}
		public static async Task<bool> Export(Deck deck, Func<Task<bool>> onInterrupt)
		{
			if(deck == null)
				return false;
			var currentClipboard = "";
			try
			{
				Log.Info("Exporting " + deck.GetDeckInfo());
				if(Config.Instance.ExportPasteClipboard && Clipboard.ContainsText())
					currentClipboard = Clipboard.GetText();
				var info = new ExportingInfo();
				LogDebugInfo(info);
				info = await ExportingHelper.EnsureHearthstoneInForeground(info);
				if(info == null)
					return false;
				LogDebugInfo(info);
				Log.Info($"Waiting for {Config.Instance.ExportStartDelay} seconds before starting the export process");
				await Task.Delay(Config.Instance.ExportStartDelay*1000);
				var exporter = new ExportingActions(info, deck, onInterrupt);
				await exporter.ClearDeck();
				await exporter.SetDeckName();
				await exporter.ClearFilters();
				await exporter.CreateDeck();
				await exporter.ClearSearchBox();
				if(Config.Instance.ExportPasteClipboard)
					Clipboard.Clear();
				Log.Info("Success exporting deck.");
				return true;
			}
			catch(ExportingInterruptedException e)
			{
				Log.Warn(e.Message);
				return false;
			}
			catch(Exception e)
			{
				Log.Error("Error exporting deck: " + e);
				return false;
			}
			finally
			{
				try
				{
					if(Config.Instance.ExportPasteClipboard && currentClipboard != "")
						Clipboard.SetText(currentClipboard);
				}
				catch(Exception ex)
				{
					Log.Error("Could not restore clipboard content after export: " + ex);
				}
			}
		}
		public static async Task Export(Deck deck)
		{
			if(deck == null)
				return;
			var currentClipboard = "";
			try
			{
				Logger.WriteLine("Exporting " + deck.GetDeckInfo(), "DeckExporter");
				if(Config.Instance.ExportPasteClipboard && Clipboard.ContainsText())
					currentClipboard = Clipboard.GetText();

				var info = new ExportingInfo();
				LogDebugInfo(info);

				var inForeground = await ExportingHelper.EnsureHearthstoneInForeground(info.HsHandle);
				if(!inForeground)
					return;
				Logger.WriteLine($"Waiting for {Config.Instance.ExportStartDelay} seconds before starting the export process", "DeckExporter");
				await Task.Delay(Config.Instance.ExportStartDelay * 1000);
				Core.Overlay.ForceHide(true);

				await ClearDeck(info);
				await SetDeckName(deck, info);
				await ClearFilters(info);
				var lostFocus = await CreateDeck(deck, info);
				if(lostFocus)
					return;
				await ClearSearchBox(info.HsHandle, info.SearchBoxPos);

				if(Config.Instance.ExportPasteClipboard)
					Clipboard.Clear();
				Logger.WriteLine("Success exporting deck.", "DeckExporter");
			}
			catch(Exception e)
			{
				Logger.WriteLine("Error exporting deck: " + e, "DeckExporter");
			}
			finally
			{
				Core.Overlay.ForceHide(false);
				if(Config.Instance.ExportPasteClipboard && currentClipboard != "")
					Clipboard.SetText(currentClipboard);
			}
		}
		public static async Task Export(Deck deck)
		{
			if(deck == null)
				return;
			string Current_Clipboard = "";

			try
			{
				if(Config.Instance.ExportPasteClipboard && Clipboard.ContainsText())
					Current_Clipboard = Clipboard.GetText();
				Logger.WriteLine(string.Format("Exporting " + deck.GetDeckInfo()), "DeckExporter");
				var hsHandle = User32.GetHearthstoneWindow();

				if(!User32.IsHearthstoneInForeground())
				{
					//restore window and bring to foreground
					User32.ShowWindow(hsHandle, User32.SwRestore);
					User32.SetForegroundWindow(hsHandle);
					//wait it to actually be in foreground, else the rect might be wrong
					await Task.Delay(500);
				}
				if(!User32.IsHearthstoneInForeground())
				{
					MessageBox.Show("Can't find Hearthstone window.");
					Logger.WriteLine("Can't find Hearthstone window.", "DeckExporter");
					return;
				}

				Logger.WriteLine("Waiting for " + Config.Instance.ExportStartDelay + " seconds before starting the export process", "DeckExporter");
				await Task.Delay(Config.Instance.ExportStartDelay * 1000);

				var hsRect = User32.GetHearthstoneRect(false);
				var ratio = (4.0 / 3.0) / ((double)hsRect.Width / hsRect.Height);

				var searchBoxPos = new Point((int)(GetXPos(Config.Instance.ExportSearchBoxX, hsRect.Width, ratio)),
				                             (int)(Config.Instance.ExportSearchBoxY * hsRect.Height));
				var cardPosX = GetXPos(Config.Instance.ExportCard1X, hsRect.Width, ratio);
				var card2PosX = GetXPos(Config.Instance.ExportCard2X, hsRect.Width, ratio);
				var cardPosY = Config.Instance.ExportCardsY * hsRect.Height;


				Helper.MainWindow.Overlay.ForceHidden = true;
				Helper.MainWindow.Overlay.UpdatePosition();

				if(Config.Instance.AutoClearDeck)
					await ClearDeck(hsRect.Width, hsRect.Height, hsHandle, ratio);

				if(Config.Instance.ExportSetDeckName && !deck.TagList.ToLower().Contains("brawl"))
					await SetDeckName(deck.Name, ratio, hsRect.Width, hsRect.Height, hsHandle);

				await ClickAllCrystal(ratio, hsRect.Width, hsRect.Height, hsHandle);

				Logger.WriteLine("Creating deck...", "DeckExporter");
				deck.MissingCards.Clear();
				foreach(var card in deck.Cards)
				{
					var missingCardsCount =
						await AddCardToDeck(card, searchBoxPos, cardPosX, card2PosX, cardPosY, hsRect.Height, hsRect.Width, hsHandle);
					if(missingCardsCount < 0)
						return;
					if(missingCardsCount > 0)
					{
						var missingCard = (Card)card.Clone();
						missingCard.Count = missingCardsCount;
						deck.MissingCards.Add(missingCard);
					}
				}

				if(deck.MissingCards.Any())
					DeckList.Save();

				// Clear search field now all cards have been entered

				await ClickOnPoint(hsHandle, searchBoxPos);
				SendKeys.SendWait("{DELETE}");
				SendKeys.SendWait("{ENTER}");

				if(Config.Instance.ExportPasteClipboard)
					Clipboard.Clear();

				Logger.WriteLine("Done creating deck.", "DeckExporter");
			}
			catch(Exception e)
			{
				Logger.WriteLine("Error exporting deck: " + e, "DeckExporter");
			}
			finally
			{
				Helper.MainWindow.Overlay.ForceHidden = false;
				Helper.MainWindow.Overlay.UpdatePosition();
				if(Config.Instance.ExportPasteClipboard && Current_Clipboard != "")
					Clipboard.SetText(Current_Clipboard);
			}
		}