[
  {
    "path": ".gitattributes",
    "content": "###############################################################################\n# Set default behavior to automatically normalize line endings.\n###############################################################################\n* text=auto\n\n###############################################################################\n# Set default behavior for command prompt diff.\n#\n# This is need for earlier builds of msysgit that does not have it on by\n# default for csharp files.\n# Note: This is only used by command line\n###############################################################################\n#*.cs     diff=csharp\n\n###############################################################################\n# Set the merge driver for project and solution files\n#\n# Merging from the command prompt will add diff markers to the files if there\n# are conflicts (Merging from VS is not affected by the settings below, in VS\n# the diff markers are never inserted). Diff markers may cause the following \n# file extensions to fail to load in VS. An alternative would be to treat\n# these files as binary and thus will always conflict and require user\n# intervention with every merge. To do so, just uncomment the entries below\n###############################################################################\n#*.sln       merge=binary\n#*.csproj    merge=binary\n#*.vbproj    merge=binary\n#*.vcxproj   merge=binary\n#*.vcproj    merge=binary\n#*.dbproj    merge=binary\n#*.fsproj    merge=binary\n#*.lsproj    merge=binary\n#*.wixproj   merge=binary\n#*.modelproj merge=binary\n#*.sqlproj   merge=binary\n#*.wwaproj   merge=binary\n\n###############################################################################\n# behavior for image files\n#\n# image files are treated as binary by default.\n###############################################################################\n#*.jpg   binary\n#*.png   binary\n#*.gif   binary\n\n###############################################################################\n# diff behavior for common document formats\n# \n# Convert binary document formats to text before diffing them. This feature\n# is only available from the command line. Turn it on by uncommenting the \n# entries below.\n###############################################################################\n#*.doc   diff=astextplain\n#*.DOC   diff=astextplain\n#*.docx  diff=astextplain\n#*.DOCX  diff=astextplain\n#*.dot   diff=astextplain\n#*.DOT   diff=astextplain\n#*.pdf   diff=astextplain\n#*.PDF   diff=astextplain\n#*.rtf   diff=astextplain\n#*.RTF   diff=astextplain\n"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# DNX\nproject.lock.json\nartifacts/\n\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# TODO: Comment the next line if you want to checkin your web deploy settings\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/packages/*\n# except build/, which is used as an MSBuild target.\n!**/packages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/packages/repositories.config\n# NuGet v3's project.json files produces more ignoreable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.pfx\n*.publishsettings\nnode_modules/\norleans.codegen.cs\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\n*.mdf\n*.ldf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n\n# Misc\n\npackage-lock.json\n"
  },
  {
    "path": "LICENSE",
    "content": "    MIT License\r\n\r\n    Copyright (c) Microsoft Corporation. All rights reserved.\r\n\r\n    Permission is hereby granted, free of charge, to any person obtaining a copy\r\n    of this software and associated documentation files (the \"Software\"), to deal\r\n    in the Software without restriction, including without limitation the rights\r\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n    copies of the Software, and to permit persons to whom the Software is\r\n    furnished to do so, subject to the following conditions:\r\n\r\n    The above copyright notice and this permission notice shall be included in all\r\n    copies or substantial portions of the Software.\r\n\r\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n    SOFTWARE\r\n"
  },
  {
    "path": "README.md",
    "content": "# Bot Framework Samples\r\nThis repo contains samples that are specifically used in the blog posts. You can find additional [SDK V4](https://github.com/Microsoft/BotBuilder-Samples/tree/master/samples) and [SDK V3](https://github.com/Microsoft/BotBuilder-Samples/tree/v3-sdk-samples) in the BotBuilder-Samples repo.\r\n\r\n## Contributing\r\n\r\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\r\n"
  },
  {
    "path": "SDKV4-Samples/.gitattributes",
    "content": "###############################################################################\n# Set default behavior to automatically normalize line endings.\n###############################################################################\n* text=auto\n\n###############################################################################\n# Set default behavior for command prompt diff.\n#\n# This is need for earlier builds of msysgit that does not have it on by\n# default for csharp files.\n# Note: This is only used by command line\n###############################################################################\n#*.cs     diff=csharp\n\n###############################################################################\n# Set the merge driver for project and solution files\n#\n# Merging from the command prompt will add diff markers to the files if there\n# are conflicts (Merging from VS is not affected by the settings below, in VS\n# the diff markers are never inserted). Diff markers may cause the following \n# file extensions to fail to load in VS. An alternative would be to treat\n# these files as binary and thus will always conflict and require user\n# intervention with every merge. To do so, just uncomment the entries below\n###############################################################################\n#*.sln       merge=binary\n#*.csproj    merge=binary\n#*.vbproj    merge=binary\n#*.vcxproj   merge=binary\n#*.vcproj    merge=binary\n#*.dbproj    merge=binary\n#*.fsproj    merge=binary\n#*.lsproj    merge=binary\n#*.wixproj   merge=binary\n#*.modelproj merge=binary\n#*.sqlproj   merge=binary\n#*.wwaproj   merge=binary\n\n###############################################################################\n# behavior for image files\n#\n# image files are treated as binary by default.\n###############################################################################\n#*.jpg   binary\n#*.png   binary\n#*.gif   binary\n\n###############################################################################\n# diff behavior for common document formats\n# \n# Convert binary document formats to text before diffing them. This feature\n# is only available from the command line. Turn it on by uncommenting the \n# entries below.\n###############################################################################\n#*.doc   diff=astextplain\n#*.DOC   diff=astextplain\n#*.docx  diff=astextplain\n#*.DOCX  diff=astextplain\n#*.dot   diff=astextplain\n#*.DOT   diff=astextplain\n#*.pdf   diff=astextplain\n#*.PDF   diff=astextplain\n#*.rtf   diff=astextplain\n#*.RTF   diff=astextplain\n"
  },
  {
    "path": "SDKV4-Samples/.gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# DNX\nproject.lock.json\nartifacts/\n\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# TODO: Comment the next line if you want to checkin your web deploy settings\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/packages/*\n# except build/, which is used as an MSBuild target.\n!**/packages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/packages/repositories.config\n# NuGet v3's project.json files produces more ignoreable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.pfx\n*.publishsettings\nnode_modules/\norleans.codegen.cs\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\n*.mdf\n*.ldf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n"
  },
  {
    "path": "SDKV4-Samples/LICENSE",
    "content": "    MIT License\n\n    Copyright (c) Microsoft Corporation. All rights reserved.\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE\n"
  },
  {
    "path": "SDKV4-Samples/README.md",
    "content": "# Bot Framework Samples\n\nThis branch is for Bot Builder SDK V4 samples used in the documentation. \n\n## Contributing\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n"
  },
  {
    "path": "SDKV4-Samples/_config.yml",
    "content": "theme: jekyll-theme-cayman"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/ComplexDialogBot/BotBuilder.ruleset",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RuleSet Name=\"Microsoft Managed Recommended Rules\" Description=\"These rules focus on the most critical problems in your code, including potential security holes, application crashes, and other important logic and design errors. It is recommended to include this rule set in any custom rule set you create for your projects.\" ToolsVersion=\"10.0\">\n  <Localization ResourceAssembly=\"Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.dll\" ResourceBaseName=\"Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.Localized\">\n    <Name Resource=\"MinimumRecommendedRules_Name\" />\n    <Description Resource=\"MinimumRecommendedRules_Description\" />\n  </Localization>\n  <Rules AnalyzerId=\"StyleCop.Analyzers\" RuleNamespace=\"StyleCop.Analyzers\">\n    <Rule Id=\"SA1011\" Action=\"None\" />\n    <Rule Id=\"SA1200\" Action=\"None\" />\n    <Rule Id=\"SA1101\" Action=\"None\" />\n    <Rule Id=\"SA1129\" Action=\"None\" />\n    <Rule Id=\"SA1305\" Action=\"Warning\" />\n    <Rule Id=\"SA1309\" Action=\"None\" />\n    <Rule Id=\"SA1412\" Action=\"Warning\" />\n    <Rule Id=\"SA1600\" Action=\"None\" />\n    <Rule Id=\"SA1609\" Action=\"Warning\" />\n    <Rule Id=\"SA1633\" Action=\"None\" />\n  </Rules>\n  <Rules AnalyzerId=\"AsyncUsageAnalyzers\" RuleNamespace=\"AsyncUsageAnalyzers\">\n    <Rule Id=\"AvoidAsyncVoid\" Action=\"Warning\" />\n  </Rules>\n</RuleSet>"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/ComplexDialogBot/ComplexDialogBot.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nnamespace Microsoft.BotBuilderSamples\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Microsoft.Bot.Builder;\n    using Microsoft.Bot.Builder.Dialogs;\n    using Microsoft.Bot.Builder.Dialogs.Choices;\n    using Microsoft.Bot.Schema;\n\n    /// <summary>\n    /// Represents a bot that processes incoming activities.\n    /// For each user interaction, an instance of this class is created and the OnTurnAsync method is called.\n    /// This is a Transient lifetime service.  Transient lifetime services are created\n    /// each time they're requested. For each Activity received, a new instance of this\n    /// class is created. Objects that are expensive to construct, or have a lifetime\n    /// beyond the single turn, should be carefully managed.\n    /// For example, the <see cref=\"MemoryStorage\"/> object and associated\n    /// <see cref=\"IStatePropertyAccessor{T}\"/> object are created with a singleton lifetime.\n    /// </summary>\n    /// <seealso cref=\"https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.1\"/>\n    public class ComplexDialogBot : IBot\n    {\n        private const string WelcomeText =\n            \"Welcome to ComplexDialogBot. This bot provides a complex conversation, with multiple dialogs. \" +\n            \"Type anything to get started.\";\n\n        // Define the dialog and prompt names for the bot.\n        private const string TopLevelDialog = \"dialog-topLevel\";\n        private const string ReviewSelectionDialog = \"dialog-reviewSeleciton\";\n        private const string NamePrompt = \"prompt-name\";\n        private const string AgePrompt = \"prompt-age\";\n        private const string SelectionPrompt = \"prompt-companySlection\";\n\n        // Define a \"done\" response for the company selection prompt.\n        private const string DoneOption = \"done\";\n\n        // Define value names for values tracked inside the dialogs.\n        private const string UserInfo = \"value-userInfo\";\n        private const string CompaniesSelected = \"value-companiesSelected\";\n\n        // Define the company choices for the company selection prompt.\n        private readonly string[] _companyOptions = new string[]\n        {\n            \"Adatum Corporation\", \"Contoso Suites\", \"Graphic Design Institute\", \"Wide World Importers\",\n        };\n\n        private readonly ComplexDialogBotAccessors _accessors;\n\n        /// <summary>\n        /// The <see cref=\"DialogSet\"/> that contains all the Dialogs that can be used at runtime.\n        /// </summary>\n        private readonly DialogSet _dialogs;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ComplexDialogBot\"/> class.\n        /// </summary>\n        /// <param name=\"accessors\">A class containing <see cref=\"IStatePropertyAccessor{T}\"/> used to manage state.</param>\n        public ComplexDialogBot(ComplexDialogBotAccessors accessors)\n        {\n            _accessors = accessors ?? throw new ArgumentNullException(nameof(accessors));\n\n            // Create a dialog set for the bot. It requires a DialogState accessor, with which\n            // to retrieve the dialog state from the turn context.\n            _dialogs = new DialogSet(accessors.DialogStateAccessor);\n\n            // Add the prompts we need to the dialog set.\n            _dialogs\n                .Add(new TextPrompt(NamePrompt))\n                .Add(new NumberPrompt<int>(AgePrompt))\n                .Add(new ChoicePrompt(SelectionPrompt));\n\n            // Add the dialogs we need to the dialog set.\n            _dialogs.Add(new WaterfallDialog(TopLevelDialog)\n                .AddStep(NameStepAsync)\n                .AddStep(AgeStepAsync)\n                .AddStep(StartSelectionStepAsync)\n                .AddStep(AcknowledgementStepAsync));\n            _dialogs.Add(new WaterfallDialog(ReviewSelectionDialog)\n                .AddStep(SelectionStepAsync)\n                .AddStep(LoopStepAsync));\n        }\n\n        /// <summary>\n        /// Every conversation turn for our EchoBot will call this method.\n        /// </summary>\n        /// <param name=\"turnContext\">A <see cref=\"ITurnContext\"/> containing all the data needed\n        /// for processing this conversation turn. </param>\n        /// <param name=\"cancellationToken\">(Optional) A <see cref=\"CancellationToken\"/> that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A <see cref=\"Task\"/> that represents the work queued to execute.</returns>\n        /// <seealso cref=\"BotStateSet\"/>\n        /// <seealso cref=\"ConversationState\"/>\n        /// <seealso cref=\"IMiddleware\"/>\n        public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))\n        {\n            if (turnContext == null)\n            {\n                throw new ArgumentNullException(nameof(turnContext));\n            }\n\n            // Handle Message activity type, which is the main activity type for shown within a conversational interface\n            // Message activities may contain text, speech, interactive cards, and binary or unknown attachments.\n            // see https://aka.ms/about-bot-activity-message to learn more about the message and other activity types\n            if (turnContext.Activity.Type == ActivityTypes.Message)\n            {\n                // Run the DialogSet - let the framework identify the current state of the dialog from\n                // the dialog stack and figure out what (if any) is the active dialog.\n                DialogContext dialogContext = await _dialogs.CreateContextAsync(turnContext, cancellationToken);\n                DialogTurnResult results = await dialogContext.ContinueDialogAsync(cancellationToken);\n                switch (results.Status)\n                {\n                    case DialogTurnStatus.Cancelled:\n                    case DialogTurnStatus.Empty:\n                        // If there is no active dialog, we should clear the user info and start a new dialog.\n                        await _accessors.UserProfileAccessor.SetAsync(turnContext, new UserProfile(), cancellationToken);\n                        await _accessors.UserState.SaveChangesAsync(turnContext, false, cancellationToken);\n                        await dialogContext.BeginDialogAsync(TopLevelDialog, null, cancellationToken);\n                        break;\n                    case DialogTurnStatus.Complete:\n                        // If we just finished the dialog, capture and display the results.\n                        UserProfile userInfo = results.Result as UserProfile;\n                        string status = \"You are signed up to review \"\n                            + (userInfo.CompaniesToReview.Count is 0 ? \"no companies\" : string.Join(\" and \", userInfo.CompaniesToReview))\n                            + \".\";\n                        await turnContext.SendActivityAsync(status);\n                        await _accessors.UserProfileAccessor.SetAsync(turnContext, userInfo, cancellationToken);\n                        await _accessors.UserState.SaveChangesAsync(turnContext, false, cancellationToken);\n                        break;\n                    case DialogTurnStatus.Waiting:\n                        // If there is an active dialog, we don't need to do anything here.\n                        break;\n                }\n\n                await _accessors.ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);\n            }\n\n            // Processes ConversationUpdate Activities to welcome the user.\n            else if (turnContext.Activity.Type == ActivityTypes.ConversationUpdate)\n            {\n                if (turnContext.Activity.MembersAdded != null)\n                {\n                    await SendWelcomeMessageAsync(turnContext, cancellationToken);\n                }\n            }\n            else\n            {\n                await turnContext.SendActivityAsync($\"{turnContext.Activity.Type} event detected\", cancellationToken: cancellationToken);\n            }\n        }\n\n        /// <summary>\n        /// Sends a welcome message to the user.\n        /// </summary>\n        /// <param name=\"turnContext\">A <see cref=\"ITurnContext\"/> containing all the data needed\n        /// for processing this conversation turn. </param>\n        /// <param name=\"cancellationToken\">(Optional) A <see cref=\"CancellationToken\"/> that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A <see cref=\"Task\"/> that represents the work queued to execute.</returns>\n        private static async Task SendWelcomeMessageAsync(ITurnContext turnContext, CancellationToken cancellationToken)\n        {\n            foreach (ChannelAccount member in turnContext.Activity.MembersAdded)\n            {\n                if (member.Id != turnContext.Activity.Recipient.Id)\n                {\n                    Activity reply = turnContext.Activity.CreateReply();\n                    reply.Text = WelcomeText;\n                    await turnContext.SendActivityAsync(reply, cancellationToken);\n                }\n            }\n        }\n\n        /// <summary>The first step of the top-level dialog.</summary>\n        /// <param name=\"stepContext\">The waterfall step context for the current turn.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>If the task is successful, the result contains a <see cref=\"DialogTurnResult\"/> to\n        /// communicate some flow control back to the containing WaterfallDialog.</remarks>\n        private static async Task<DialogTurnResult> NameStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)\n        {\n            // Create an object in which to collect the user's information within the dialog.\n            stepContext.Values[UserInfo] = new UserProfile();\n\n            // Ask the user to enter their name.\n            return await stepContext.PromptAsync(\n                NamePrompt,\n                new PromptOptions { Prompt = MessageFactory.Text(\"Please enter your name.\") },\n                cancellationToken);\n        }\n\n        /// <summary>The second step of the top-level dialog.</summary>\n        /// <param name=\"stepContext\">The waterfall step context for the current turn.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>If the task is successful, the result contains a <see cref=\"DialogTurnResult\"/> to\n        /// communicate some flow control back to the containing WaterfallDialog.</remarks>\n        private async Task<DialogTurnResult> AgeStepAsync(\n            WaterfallStepContext stepContext,\n            CancellationToken cancellationToken)\n        {\n            // Set the user's name to what they entered in response to the name prompt.\n            ((UserProfile)stepContext.Values[UserInfo]).Name = (string)stepContext.Result;\n\n            // Ask the user to enter their age.\n            return await stepContext.PromptAsync(\n                AgePrompt,\n                new PromptOptions { Prompt = MessageFactory.Text(\"Please enter your age.\") },\n                cancellationToken);\n        }\n\n        /// <summary>The third step of the top-level dialog.</summary>\n        /// <param name=\"stepContext\">The waterfall step context for the current turn.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>If the task is successful, the result contains a <see cref=\"DialogTurnResult\"/> to\n        /// communicate some flow control back to the containing WaterfallDialog.</remarks>\n        private async Task<DialogTurnResult> StartSelectionStepAsync(\n            WaterfallStepContext stepContext,\n            CancellationToken cancellationToken)\n        {\n            // Set the user's age to what they entered in response to the age prompt.\n            int age = (int)stepContext.Result;\n            ((UserProfile)stepContext.Values[UserInfo]).Age = age;\n\n            if (age < 25)\n            {\n                // If they are too young, skip the review selection dialog, and pass an empty list to the next step.\n                await stepContext.Context.SendActivityAsync(\n                    MessageFactory.Text(\"You must be 25 or older to participate.\"),\n                    cancellationToken);\n                return await stepContext.NextAsync(new List<string>(), cancellationToken);\n            }\n            else\n            {\n                // Otherwise, start the review selection dialog.\n                return await stepContext.BeginDialogAsync(ReviewSelectionDialog, null, cancellationToken);\n            }\n        }\n\n        /// <summary>The final step of the top-level dialog.</summary>\n        /// <param name=\"stepContext\">The waterfall step context for the current turn.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>If the task is successful, the result contains a <see cref=\"DialogTurnResult\"/> to\n        /// communicate some flow control back to the containing WaterfallDialog.</remarks>\n        private async Task<DialogTurnResult> AcknowledgementStepAsync(\n            WaterfallStepContext stepContext,\n            CancellationToken cancellationToken)\n        {\n            // Set the user's company selection to what they entered in the review-selection dialog.\n            List<string> list = stepContext.Result as List<string>;\n            ((UserProfile)stepContext.Values[UserInfo]).CompaniesToReview = list ?? new List<string>();\n\n            // Thank them for participating.\n            await stepContext.Context.SendActivityAsync(\n                MessageFactory.Text($\"Thanks for participating, {((UserProfile)stepContext.Values[UserInfo]).Name}.\"),\n                cancellationToken);\n\n            // Exit the dialog, returning the collected user information.\n            return await stepContext.EndDialogAsync(stepContext.Values[UserInfo], cancellationToken);\n        }\n\n        /// <summary>The first step of the review-selection dialog.</summary>\n        /// <param name=\"stepContext\">The waterfall step context for the current turn.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>If the task is successful, the result contains a <see cref=\"DialogTurnResult\"/> to\n        /// communicate some flow control back to the containing WaterfallDialog.</remarks>\n        private async Task<DialogTurnResult> SelectionStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)\n        {\n            // Continue using the same selection list, if any, from the previous iteration of this dialog.\n            List<string> list = stepContext.Options as List<string> ?? new List<string>();\n            stepContext.Values[CompaniesSelected] = list;\n\n            // Create a prompt message.\n            string message;\n            if (list.Count is 0)\n            {\n                message = $\"Please choose a company to review, or `{DoneOption}` to finish.\";\n            }\n            else\n            {\n                message = $\"You have selected **{list[0]}**. You can review an additional company, \" +\n                    $\"or choose `{DoneOption}` to finish.\";\n            }\n\n            // Create the list of options to choose from.\n            List<string> options = _companyOptions.ToList();\n            options.Add(DoneOption);\n            if (list.Count > 0)\n            {\n                options.Remove(list[0]);\n            }\n\n            // Prompt the user for a choice.\n            return await stepContext.PromptAsync(\n                SelectionPrompt,\n                new PromptOptions\n                {\n                    Prompt = MessageFactory.Text(message),\n                    RetryPrompt = MessageFactory.Text(\"Please choose an option from the list.\"),\n                    Choices = ChoiceFactory.ToChoices(options),\n                },\n                cancellationToken);\n        }\n\n        /// <summary>The final step of the review-selection dialog.</summary>\n        /// <param name=\"stepContext\">The waterfall step context for the current turn.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>If the task is successful, the result contains a <see cref=\"DialogTurnResult\"/> to\n        /// communicate some flow control back to the containing WaterfallDialog.</remarks>\n        private async Task<DialogTurnResult> LoopStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)\n        {\n            // Retrieve their selection list, the choice they made, and whether they chose to finish.\n            List<string> list = stepContext.Values[CompaniesSelected] as List<string>;\n            FoundChoice choice = (FoundChoice)stepContext.Result;\n            bool done = choice.Value == DoneOption;\n\n            if (!done)\n            {\n                // If they chose a company, add it to the list.\n                list.Add(choice.Value);\n            }\n\n            if (done || list.Count is 2)\n            {\n                // If they're done, exit and return their list.\n                return await stepContext.EndDialogAsync(list, cancellationToken);\n            }\n            else\n            {\n                // Otherwise, repeat this dialog, passing in the list from this iteration.\n                return await stepContext.ReplaceDialogAsync(ReviewSelectionDialog, list, cancellationToken);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/ComplexDialogBot/ComplexDialogBot.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n    <CodeAnalysisRuleSet>BotBuilder.ruleset</CodeAnalysisRuleSet>\n  </PropertyGroup>\n\n <ItemGroup>\n    <None Update=\"*.bot\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n    \n  <ItemGroup>\n    <PackageReference Include=\"AsyncUsageAnalyzers\" Version=\"1.0.0-alpha003\" PrivateAssets=\"all\" />\n    <PackageReference Include=\"Microsoft.AspNetCore.All\" Version=\"2.0.8\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder\" Version=\"4.1.5\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder.Dialogs\" Version=\"4.1.5\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder.Integration.AspNet.Core\" Version=\"4.1.5\" />\n    <PackageReference Include=\"Microsoft.Bot.Configuration\" Version=\"4.1.5\" />\n    <PackageReference Include=\"StyleCop.Analyzers\" Version=\"1.1.0-beta008\" PrivateAssets=\"all\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/ComplexDialogBot/ComplexDialogBotAccessors.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.Dialogs;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    /// <summary>\n    /// This class is created as a Singleton and passed into the IBot-derived constructor.\n    ///  - See <see cref=\"ComplexDialogBot\"/> constructor for how that is injected.\n    ///  - See the Startup.cs file for more details on creating the Singleton that gets\n    ///    injected into the constructor.\n    /// </summary>\n    public class ComplexDialogBotAccessors\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"ComplexDialogBotAccessors\"/> class.\n        /// Contains the <see cref=\"ConversationState\"/> and associated <see cref=\"IStatePropertyAccessor{T}\"/>.\n        /// </summary>\n        /// <param name=\"conversationState\">The state object that stores the dialog state.</param>\n        /// <param name=\"userState\">The state object that stores the user state.</param>\n        public ComplexDialogBotAccessors(ConversationState conversationState, UserState userState)\n        {\n            ConversationState = conversationState ?? throw new ArgumentNullException(nameof(conversationState));\n            UserState = userState ?? throw new ArgumentNullException(nameof(userState));\n        }\n\n        /// <summary>\n        /// Gets or sets the <see cref=\"IStatePropertyAccessor{T}\"/> for ConversationDialogState.\n        /// </summary>\n        /// <value>\n        /// The accessor stores the dialog state for the conversation.\n        /// </value>\n        public IStatePropertyAccessor<DialogState> DialogStateAccessor { get; set; }\n\n        /// <summary>\n        /// Gets or sets the <see cref=\"IStatePropertyAccessor{T}\"/> for CounterState.\n        /// </summary>\n        /// <value>\n        /// The accessor stores user data.\n        /// </value>\n        public IStatePropertyAccessor<UserProfile> UserProfileAccessor { get; set; }\n\n        /// <summary>\n        /// Gets the <see cref=\"ConversationState\"/> object for the conversation.\n        /// </summary>\n        /// <value>The <see cref=\"ConversationState\"/> object.</value>\n        public ConversationState ConversationState { get; }\n\n        /// <summary>\n        /// Gets the <see cref=\"UserState\"/> object for the conversation.\n        /// </summary>\n        /// <value>The <see cref=\"UserState\"/> object.</value>\n        public UserState UserState { get; }\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/ComplexDialogBot/DeploymentScripts/MsbotClone/bot.recipe",
    "content": "{\n    \"version\": \"1.0\",\n    \"resources\": [\n        {\n            \"type\": \"endpoint\",\n            \"id\": \"24\",\n            \"name\": \"Sample\",\n            \"url\": \"http://localhost:3978/api/messages\"\n        },\n        {\n            \"type\": \"endpoint\",\n            \"id\": \"2\",\n            \"name\": \"production\",\n            \"url\": \"https://your-bot-url.azurewebsites.net/api/messages\"\n        },\n        {\n            \"type\": \"abs\",\n            \"id\": \"3\",\n            \"name\": \"complex-dialog-Bot\"\n        },\n        {\n            \"type\": \"appInsights\",\n            \"id\": \"4\",\n            \"name\": \"complex-dialog-Insights\"\n        },\n        {\n            \"type\": \"blob\",\n            \"id\": \"5\",\n            \"name\": \"complex-dialog-Blob\",\n            \"container\": \"botstatestore\"\n        }\n    ]\n}"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/ComplexDialogBot/Program.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing Microsoft.AspNetCore;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Logging;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            BuildWebHost(args).Run();\n        }\n\n        public static IWebHost BuildWebHost(string[] args) =>\n            WebHost.CreateDefaultBuilder(args)\n                .ConfigureLogging((hostingContext, logging) =>\n                {\n                    // Add Azure Logging\n                    logging.AddAzureWebAppDiagnostics();\n\n                    // Logging Options.\n                    // There are other logging options available:\n                    // https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1\n                    // logging.AddDebug();\n                    // logging.AddConsole();\n                })\n\n                // Logging Options.\n                // Consider using Application Insights for your logging and metrics needs.\n                // https://azure.microsoft.com/en-us/services/application-insights/\n                // .UseApplicationInsights()\n                .UseStartup<Startup>()\n                .Build();\n    }\n}"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/ComplexDialogBot/Properties/launchSettings.json",
    "content": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:3978/\",\n      \"sslPort\": 0\n    }\n  },\n  \"profiles\": {\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"_5.MultiTurn_Prompts_Bot\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      },\n      \"applicationUrl\": \"http://localhost:3978/\"\n    }\n  }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/ComplexDialogBot/README.md",
    "content": "This sample creates a complex conversation with dialogs and ASP.Net Core 2.\n\n# To try this sample\n- Clone the samples repository\n```bash\ngit clone https://github.com/Microsoft/BotFramework-Samples.git\n```\n- [Optional] Update the `appsettings.json` file under `BotFramework-Samples/SDKV4-Samples/dotnet_core/ComplexDialogBot/` with your botFileSecret.\nFor Azure Bot Service bots, you can find the botFileSecret under application settings.\n\n# Running Locally\n## Visual Studio\n- Navigate to the samples folder (`BotFramework-Samples/SDKV4-Samples/dotnet_core/ComplexDialogBot/`) and open ComplexDialogBot.csproj in Visual Studio.\n- Run the project (press `F5` key).\n\n## .NET Core CLI\n- Install the [.NET Core CLI tools](https://docs.microsoft.com/dotnet/core/tools/?tabs=netcore2x).\n- Using the command line, navigate to `BotFramework-Samples/SDKV4-Samples/dotnet_core/ComplexDialogBot/` folder.\n- Type `dotnet run`.\n\n## Testing the bot using Bot Framework Emulator\n[Microsoft Bot Framework Emulator](https://github.com/microsoft/botframework-emulator) is a desktop application that allows bot\ndevelopers to test and debug their bots on localhost or running remotely through a tunnel.\n- Install the Bot Framework emulator from [here](https://aka.ms/botframeworkemulator).\n\n## Connect to bot using Bot Framework Emulator **V4**\n- Launch the Bot Framework Emulator.\n- File -> Open bot and navigate to `BotFramework-Samples/SDKV4-Samples/dotnet_core/ComplexDialogBot` folder.\n- Select `complex-dialog.bot` file.\n\n# Further reading\n- [Azure Bot Service](https://docs.microsoft.com/azure/bot-service/bot-service-overview-introduction?view=azure-bot-service-4.0)\n- [Bot Storage](https://docs.microsoft.com/azure/bot-service/dotnet/bot-builder-dotnet-state?view=azure-bot-service-3.0&viewFallbackFrom=azure-bot-service-4.0)\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/ComplexDialogBot/Startup.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nnamespace Microsoft.BotBuilderSamples\n{\n    using System;\n    using System.Linq;\n    using Microsoft.AspNetCore.Builder;\n    using Microsoft.AspNetCore.Hosting;\n    using Microsoft.Bot.Builder;\n    using Microsoft.Bot.Builder.Dialogs;\n    using Microsoft.Bot.Builder.Integration.AspNet.Core;\n    using Microsoft.Bot.Configuration;\n    using Microsoft.Bot.Connector.Authentication;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.DependencyInjection;\n    using Microsoft.Extensions.Logging;\n\n    /// <summary>\n    /// The Startup class configures services and the app's request pipeline.\n    /// </summary>\n    public class Startup\n    {\n        private ILoggerFactory _loggerFactory;\n        private bool _isProduction = false;\n\n        public Startup(IHostingEnvironment env)\n        {\n            _isProduction = env.IsProduction();\n\n            var builder = new ConfigurationBuilder()\n                .SetBasePath(env.ContentRootPath)\n                .AddJsonFile(\"appsettings.json\", optional: true, reloadOnChange: true)\n                .AddJsonFile($\"appsettings.{env.EnvironmentName}.json\", optional: true)\n                .AddEnvironmentVariables();\n\n            Configuration = builder.Build();\n        }\n\n        /// <summary>\n        /// Gets the configuration that represents a set of key/value application configuration properties.\n        /// </summary>\n        /// <value>\n        /// The <see cref=\"IConfiguration\"/> that represents a set of key/value application configuration properties.\n        /// </value>\n        public IConfiguration Configuration { get; }\n\n        /// <summary>\n        /// This method gets called by the runtime. Use this method to add services to the container.\n        /// </summary>\n        /// <param name=\"services\">Specifies the contract for a <see cref=\"IServiceCollection\"/> of service descriptors.</param>\n        /// <seealso cref=\"IStatePropertyAccessor{T}\"/>\n        /// <seealso cref=\"https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/dependency-injection\"/>\n        /// <seealso cref=\"https://docs.microsoft.com/en-us/azure/bot-service/bot-service-manage-channels?view=azure-bot-service-4.0\"/>\n        public void ConfigureServices(IServiceCollection services)\n        {\n            services.AddBot<ComplexDialogBot>(options =>\n            {\n                var secretKey = Configuration.GetSection(\"botFileSecret\")?.Value;\n                var botFilePath = Configuration.GetSection(\"botFilePath\")?.Value;\n\n                // Loads .bot configuration file and adds a singleton that your Bot can access through dependency injection.\n                var botConfig = BotConfiguration.Load(botFilePath ?? @\".\\complex-dialog.bot\", secretKey);\n                services.AddSingleton(sp => botConfig ?? throw new InvalidOperationException($\"The .bot configuration file could not be loaded. ({botConfig})\"));\n\n                // Retrieve current endpoint.\n                var environment = _isProduction ? \"production\" : \"development\";\n                var service = botConfig.Services.FirstOrDefault(s => s.Type == \"endpoint\" && s.Name == environment);\n                if (!(service is EndpointService endpointService))\n                {\n                    throw new InvalidOperationException($\"The .bot file does not contain an endpoint with name '{environment}'.\");\n                }\n\n                options.CredentialProvider = new SimpleCredentialProvider(endpointService.AppId, endpointService.AppPassword);\n\n                // Creates a logger for the application to use.\n                ILogger logger = _loggerFactory.CreateLogger<ComplexDialogBot>();\n\n                // Catches any errors that occur during a conversation turn and logs them.\n                options.OnTurnError = async (context, exception) =>\n                {\n                    logger.LogError($\"Exception caught : {exception}\");\n                    await context.SendActivityAsync(\"Sorry, it looks like something went wrong.\");\n                };\n            });\n\n            // Create conversation and user state management objects, using memory storage.\n            IStorage dataStore = new MemoryStorage();\n            var conversationState = new ConversationState(dataStore);\n            var userState = new UserState(dataStore);\n\n            // Create and register state accessors.\n            // Accessors created here are passed into the IBot-derived class on every turn.\n            services.AddSingleton<ComplexDialogBotAccessors>(sp =>\n            {\n                // Create the custom state accessor.\n                // State accessors enable other components to read and write individual properties of state.\n                var accessors = new ComplexDialogBotAccessors(conversationState, userState)\n                {\n                    DialogStateAccessor = conversationState.CreateProperty<DialogState>(\"DialogState\"),\n                    UserProfileAccessor = userState.CreateProperty<UserProfile>(\"UserProfile\"),\n                };\n\n                return accessors;\n            });\n        }\n\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)\n        {\n            _loggerFactory = loggerFactory;\n\n            app.UseDefaultFiles()\n                .UseStaticFiles()\n                .UseBotFramework();\n        }\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/ComplexDialogBot/UserProfile.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nnamespace Microsoft.BotBuilderSamples\n{\n    using System.Collections.Generic;\n\n    /// <summary>Contains information about a user.</summary>\n    public class UserProfile\n    {\n        /// <summary>Gets or sets the user's name.</summary>\n        /// <value>The user's name.</value>\n        public string Name { get; set; }\n\n        /// <summary>Gets or sets the user's age.</summary>\n        /// <value>The user's age.</value>\n        public int Age { get; set; }\n\n        /// <summary>Gets or sets the list of companies the user wants to review.</summary>\n        /// <value>The list of companies the user wants to review.</value>\n        public List<string> CompaniesToReview { get; set; } = new List<string>();\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/ComplexDialogBot/appsettings.json",
    "content": "﻿{\n  \"botFilePath\": \"complex-dialog.bot\",\n  \"botFileSecret\": \"\"\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/ComplexDialogBot/complex-dialog.bot",
    "content": "{\n    \"name\": \"complex-dialog-bot\",\n    \"services\": [\n        {\n            \"type\": \"endpoint\",\n            \"name\": \"development\",\n            \"endpoint\": \"http://localhost:3978/api/messages\",\n            \"appId\": \"\",\n            \"appPassword\": \"\",\n            \"id\": \"24\"\n        }\n    ],\n    \"padlock\": \"\",\n    \"version\": \"2.0\"\n}"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/ComplexDialogBot/wwwroot/default.htm",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>Complex dialog sample</title>\n    <style>\n        body {\n            margin: 0px;\n            padding: 0px;\n            font-family: Segoe UI;\n        }\n\n        html,\n        body {\n            height: 100%;\n        }\n\n        header {\n            background-image: url(\"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 4638.9 651.6' style='enable-background:new 0 0 4638.9 651.6;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%2355A0E0;%7D .st1%7Bfill:none;%7D .st2%7Bfill:%230058A8;%7D .st3%7Bfill:%23328BD8;%7D .st4%7Bfill:%23B6DCF1;%7D .st5%7Bopacity:0.2;fill:url(%23SVGID_1_);enable-background:new ;%7D%0A%3C/style%3E%3Crect y='1.1' class='st0' width='4640' height='646.3'/%3E%3Cpath class='st1' d='M3987.8,323.6L4310.3,1.1h-65.6l-460.1,460.1c-17.5,17.5-46.1,17.5-63.6,0L3260.9,1.1H0v646.3h3660.3 L3889,418.7c17.5-17.5,46.1-17.5,63.6,0l228.7,228.7h66.6l-260.2-260.2C3970.3,369.8,3970.3,341.1,3987.8,323.6z'/%3E%3Cpath class='st2' d='M3784.6,461.2L4244.7,1.1h-983.9l460.1,460.1C3738.4,478.7,3767.1,478.7,3784.6,461.2z'/%3E%3Cpath class='st3' d='M4640,1.1h-329.8l-322.5,322.5c-17.5,17.5-17.5,46.1,0,63.6l260.2,260.2H4640L4640,1.1L4640,1.1z'/%3E%3Cpath class='st4' d='M3889,418.8l-228.7,228.7h521.1l-228.7-228.7C3935.2,401.3,3906.5,401.3,3889,418.8z'/%3E%3ClinearGradient id='SVGID_1_' gradientUnits='userSpaceOnUse' x1='3713.7576' y1='438.1175' x2='3911.4084' y2='14.2535' gradientTransform='matrix(1 0 0 -1 0 641.3969)'%3E%3Cstop offset='0' style='stop-color:%23FFFFFF;stop-opacity:0.5'/%3E%3Cstop offset='1' style='stop-color:%23FFFFFF'/%3E%3C/linearGradient%3E%3Cpath class='st5' d='M3952.7,124.5c-17.5-17.5-46.1-17.5-63.6,0l-523,523h1109.6L3952.7,124.5z'/%3E%3C/svg%3E%0A\");\n            background-repeat: no-repeat;\n            background-size: 100%;\n            background-position: right;\n            background-color: #55A0E0;\n            width: 100%;\n            font-size: 44px;\n            height: 120px;\n            color: white;\n            padding: 30px 0 40px 0px;\n            display: inline-block;\n        }\n\n        .header-icon {\n            background-image: url(\"data:image/svg+xml;utf8,%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20150.2%20125%22%20style%3D%22enable-background%3Anew%200%200%20150.2%20125%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23FFFFFF%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.5%22%20class%3D%22st0%22%20width%3D%22149.7%22%20height%3D%22125%22/%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M59%2C102.9L21.8%2C66c-3.5-3.5-3.5-9.1%2C0-12.5l37-36.5l2.9%2C3l-37%2C36.4c-1.8%2C1.8-1.8%2C4.7%2C0%2C6.6l37.2%2C37L59%2C102.9z%22%0A%09%09/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M92.5%2C102.9l-3-3l37.2-37c0.9-0.9%2C1.4-2%2C1.4-3.3c0-1.2-0.5-2.4-1.4-3.3L89.5%2C20l2.9-3l37.2%2C36.4%0A%09%09c1.7%2C1.7%2C2.6%2C3.9%2C2.6%2C6.3s-0.9%2C4.6-2.6%2C6.3L92.5%2C102.9z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M90.1%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C98.1%2C64.7%2C94.4%2C68.4%2C90.1%2C68.4z%0A%09%09%20M90.1%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S91.9%2C56.5%2C90.1%2C56.5z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M61.4%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C69.5%2C64.7%2C65.8%2C68.4%2C61.4%2C68.4z%0A%09%09%20M61.4%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S63.3%2C56.5%2C61.4%2C56.5z%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A\");\n            background-repeat: no-repeat;\n            float: left;\n            height: 140px;\n            width: 140px;\n            display: inline-block;\n            vertical-align: middle;\n        }\n\n        .header-text {\n            padding-left: 1%;\n            color: #FFFFFF;\n            font-family: \"Segoe UI\";\n            font-size: 72px;\n            font-weight: 300;\n            letter-spacing: 0.35px;\n            line-height: 96px;\n            display: inline-block;\n            vertical-align: middle;\n        }\n\n        .header-inner-container {\n            min-width: 480px;\n            max-width: 1366px;\n            margin-left: auto;\n            margin-right: auto;\n            vertical-align: middle;\n        }\n\n            .header-inner-container::after {\n                content: \"\";\n                clear: both;\n                display: table;\n            }\n\n        .main-content-area {\n            padding-left: 30px;\n        }\n\n        .content-title {\n            color: #000000;\n            font-family: \"Segoe UI\";\n            font-size: 46px;\n            font-weight: 300;\n            line-height: 62px;\n        }\n\n        .main-text {\n            color: #808080;\n            font-size: 24px;\n            font-family: \"Segoe UI\";\n            font-size: 24px;\n            font-weight: 200;\n            line-height: 32px;\n        }\n\n        .main-text-p1 {\n            padding-top: 48px;\n            padding-bottom: 28px;\n        }\n\n        .endpoint {\n            height: 32px;\n            width: 571px;\n            color: #808080;\n            font-family: \"Segoe UI\";\n            font-size: 24px;\n            font-weight: 200;\n            line-height: 32px;\n            padding-top: 28px;\n        }\n\n        .how-to-build-section {\n            padding-top: 20px;\n            padding-left: 30px;\n        }\n\n            .how-to-build-section > h3 {\n                font-size: 16px;\n                font-weight: 600;\n                letter-spacing: 0.35px;\n                line-height: 22px;\n                margin: 0 0 24px 0;\n                text-transform: uppercase;\n            }\n\n        .step-container {\n            display: flex;\n            align-items: stretch;\n            position: relative;\n        }\n\n            .step-container dl {\n                border-left: 1px solid #A0A0A0;\n                display: block;\n                padding: 0 24px;\n                margin: 0;\n            }\n\n                .step-container dl > dt::before {\n                    background-color: white;\n                    border: 1px solid #A0A0A0;\n                    border-radius: 100%;\n                    content: '';\n                    left: 47px;\n                    height: 11px;\n                    position: absolute;\n                    width: 11px;\n                }\n\n                .step-container dl > .test-bullet::before {\n                    background-color: blue;\n                }\n\n                .step-container dl > dt {\n                    display: block;\n                    font-size: inherit;\n                    font-weight: bold;\n                    line-height: 20px;\n                }\n\n                .step-container dl > dd {\n                    font-size: inherit;\n                    line-height: 20px;\n                    margin-left: 0;\n                    padding-bottom: 32px;\n                }\n\n            .step-container:last-child dl {\n                border-left: 1px solid transparent;\n            }\n\n        .ctaLink {\n            background-color: transparent;\n            border: 1px solid transparent;\n            color: #006AB1;\n            cursor: pointer;\n            font-weight: 600;\n            padding: 0;\n            white-space: normal;\n        }\n\n            .ctaLink:focus {\n                outline: 1px solid #00bcf2;\n            }\n\n            .ctaLink:hover {\n                text-decoration: underline;\n            }\n\n        .step-icon {\n            display: flex;\n            height: 38px;\n            margin-right: 15px;\n            width: 38px;\n        }\n\n            .step-icon > div {\n                height: 30px;\n                width: 30px;\n                background-repeat: no-repeat;\n            }\n\n        .ms-logo-container {\n            min-width: 580px;\n            max-width: 980px;\n            margin-left: auto;\n            margin-right: auto;\n            left: 0;\n            right: 0;\n            transition: bottom 400ms;\n        }\n\n        .ms-logo {\n            float: right;\n            background-image: url(\"data:image/svg+xml;utf8,%0A%3Csvg%20version%3D%221.1%22%20id%3D%22MS-symbol%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20400%20120%22%20style%3D%22enable-background%3Anew%200%200%20400%20120%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23737474%3B%7D%0A%09.st2%7Bfill%3A%23D63F26%3B%7D%0A%09.st3%7Bfill%3A%23167D3E%3B%7D%0A%09.st4%7Bfill%3A%232E76BC%3B%7D%0A%09.st5%7Bfill%3A%23FDB813%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.6%22%20class%3D%22st0%22%20width%3D%22398.7%22%20height%3D%22119%22/%3E%0A%3Cpath%20class%3D%22st1%22%20d%3D%22M171.3%2C38.4v43.2h-7.5V47.7h-0.1l-13.4%2C33.9h-5l-13.7-33.9h-0.1v33.9h-6.9V38.4h10.8l12.4%2C32h0.2l13.1-32H171.3%0A%09z%20M177.6%2C41.7c0-1.2%2C0.4-2.2%2C1.3-3c0.9-0.8%2C1.9-1.2%2C3.1-1.2c1.3%2C0%2C2.4%2C0.4%2C3.2%2C1.3c0.8%2C0.8%2C1.3%2C1.8%2C1.3%2C3c0%2C1.2-0.4%2C2.2-1.3%2C3%0A%09c-0.9%2C0.8-1.9%2C1.2-3.2%2C1.2s-2.3-0.4-3.1-1.2C178%2C43.8%2C177.6%2C42.8%2C177.6%2C41.7z%20M185.7%2C50.6v31h-7.3v-31H185.7z%20M207.8%2C76.3%0A%09c1.1%2C0%2C2.3-0.3%2C3.6-0.8c1.3-0.5%2C2.5-1.2%2C3.6-2v6.8c-1.2%2C0.7-2.5%2C1.2-4%2C1.5c-1.5%2C0.3-3.1%2C0.5-4.9%2C0.5c-4.6%2C0-8.3-1.4-11.1-4.3%0A%09c-2.9-2.9-4.3-6.6-4.3-11c0-5%2C1.5-9.1%2C4.4-12.3c2.9-3.2%2C7-4.8%2C12.4-4.8c1.4%2C0%2C2.7%2C0.2%2C4.1%2C0.5c1.4%2C0.4%2C2.5%2C0.8%2C3.3%2C1.2v7%0A%09c-1.1-0.8-2.3-1.5-3.4-1.9c-1.2-0.5-2.4-0.7-3.6-0.7c-2.9%2C0-5.2%2C0.9-7%2C2.8c-1.8%2C1.9-2.7%2C4.4-2.7%2C7.6c0%2C3.1%2C0.8%2C5.6%2C2.5%2C7.3%0A%09C202.6%2C75.4%2C204.9%2C76.3%2C207.8%2C76.3z%20M235.7%2C50.1c0.6%2C0%2C1.1%2C0%2C1.6%2C0.1s0.9%2C0.2%2C1.2%2C0.3v7.4c-0.4-0.3-0.9-0.5-1.7-0.8%0A%09c-0.7-0.3-1.6-0.4-2.7-0.4c-1.8%2C0-3.3%2C0.8-4.5%2C2.3c-1.2%2C1.5-1.9%2C3.8-1.9%2C7v15.6h-7.3v-31h7.3v4.9h0.1c0.7-1.7%2C1.7-3%2C3-4%0A%09C232.2%2C50.6%2C233.8%2C50.1%2C235.7%2C50.1z%20M238.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3%0A%09c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5c-4.8%2C0-8.6-1.4-11.4-4.2C240.3%2C75.3%2C238.9%2C71.4%2C238.9%2C66.6z%0A%09%20M246.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5%0A%09c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7C247.2%2C60.5%2C246.5%2C63%2C246.5%2C66.3z%20M281.5%2C58.8c0%2C1%2C0.3%2C1.9%2C1%2C2.5%0A%09c0.7%2C0.6%2C2.1%2C1.3%2C4.4%2C2.2c2.9%2C1.2%2C5%2C2.5%2C6.1%2C3.9c1.2%2C1.5%2C1.8%2C3.2%2C1.8%2C5.3c0%2C2.9-1.1%2C5.3-3.4%2C7c-2.2%2C1.8-5.3%2C2.7-9.1%2C2.7%0A%09c-1.3%2C0-2.7-0.2-4.3-0.5c-1.6-0.3-2.9-0.7-4-1.2v-7.2c1.3%2C0.9%2C2.8%2C1.7%2C4.3%2C2.2c1.5%2C0.5%2C2.9%2C0.8%2C4.2%2C0.8c1.6%2C0%2C2.9-0.2%2C3.6-0.7%0A%09c0.8-0.5%2C1.2-1.2%2C1.2-2.3c0-1-0.4-1.9-1.2-2.5c-0.8-0.7-2.4-1.5-4.6-2.4c-2.7-1.1-4.6-2.4-5.7-3.8c-1.1-1.4-1.7-3.2-1.7-5.4%0A%09c0-2.8%2C1.1-5.1%2C3.3-6.9c2.2-1.8%2C5.1-2.7%2C8.6-2.7c1.1%2C0%2C2.3%2C0.1%2C3.6%2C0.4c1.3%2C0.2%2C2.5%2C0.6%2C3.4%2C0.9v6.9c-1-0.6-2.1-1.2-3.4-1.7%0A%09c-1.3-0.5-2.6-0.7-3.8-0.7c-1.4%2C0-2.5%2C0.3-3.2%2C0.8C281.9%2C57.1%2C281.5%2C57.8%2C281.5%2C58.8z%20M297.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2%0A%09c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5%0A%09c-4.8%2C0-8.6-1.4-11.4-4.2C299.4%2C75.3%2C297.9%2C71.4%2C297.9%2C66.6z%20M305.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6%0A%09c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7%0A%09C306.3%2C60.5%2C305.5%2C63%2C305.5%2C66.3z%20M353.9%2C56.6h-10.9v25h-7.4v-25h-5.2v-6h5.2v-4.3c0-3.3%2C1.1-5.9%2C3.2-8c2.1-2.1%2C4.8-3.1%2C8.1-3.1%0A%09c0.9%2C0%2C1.7%2C0%2C2.4%2C0.1c0.7%2C0.1%2C1.3%2C0.2%2C1.8%2C0.4V42c-0.2-0.1-0.7-0.3-1.3-0.5c-0.6-0.2-1.3-0.3-2.1-0.3c-1.5%2C0-2.7%2C0.5-3.5%2C1.4%0A%09s-1.2%2C2.4-1.2%2C4.2v3.7h10.9v-7l7.3-2.2v9.2h7.4v6h-7.4v14.5c0%2C1.9%2C0.3%2C3.3%2C1%2C4c0.7%2C0.8%2C1.8%2C1.2%2C3.3%2C1.2c0.4%2C0%2C0.9-0.1%2C1.5-0.3%0A%09c0.6-0.2%2C1.1-0.4%2C1.6-0.7v6c-0.5%2C0.3-1.2%2C0.5-2.3%2C0.7c-1.1%2C0.2-2.1%2C0.3-3.2%2C0.3c-3.1%2C0-5.4-0.8-6.9-2.5c-1.5-1.6-2.3-4.1-2.3-7.4%0A%09V56.6z%22/%3E%0A%3Cg%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2224%22%20class%3D%22st2%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2224%22%20class%3D%22st3%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2261.8%22%20class%3D%22st4%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2261.8%22%20class%3D%22st5%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A\");\n        }\n\n        .ms-logo-container > div {\n            min-height: 60px;\n            width: 150px;\n            background-repeat: no-repeat;\n        }\n\n        .row {\n            padding: 90px 0px 0 20px;\n            min-width: 480px;\n            max-width: 1366px;\n            margin-left: auto;\n            margin-right: auto;\n        }\n\n        .column {\n            float: left;\n            width: 45%;\n            padding-right: 20px;\n        }\n\n        .row:after {\n            content: \"\";\n            display: table;\n            clear: both;\n        }\n\n        a {\n            text-decoration: none;\n        }\n\n        .download-the-emulator {\n            height: 20px;\n            color: #0063B1;\n            font-size: 15px;\n            line-height: 20px;\n            padding-bottom: 70px;\n        }\n\n        .how-to-iframe {\n            max-width: 700px !important;\n            min-width: 650px !important;\n            height: 700px !important;\n        }\n\n        .remove-frame-height {\n            height: 10px;\n        }\n\n        @media only screen and (max-width: 1300px) {\n            .ms-logo {\n                padding-top: 30px;\n            }\n\n            .header-text {\n                font-size: 40x;\n            }\n\n            .column {\n                float: none;\n                padding-top: 30px;\n                width: 100%;\n            }\n\n            .ms-logo-container {\n                padding-top: 30px;\n                min-width: 480px;\n                max-width: 650px;\n                margin-left: auto;\n                margin-right: auto;\n            }\n\n            .row {\n                padding: 20px 0px 0 20px;\n                min-width: 480px;\n                max-width: 650px;\n                margin-left: auto;\n                margin-right: auto;\n            }\n        }\n\n        @media only screen and (max-width: 1370px) {\n            header {\n                background-color: #55A0E0;\n                background-size: auto 200px;\n            }\n        }\n\n        @media only screen and (max-width: 1230px) {\n            header {\n                background-color: #55A0E0;\n                background-size: auto 200px;\n            }\n\n            .header-text {\n                font-size: 44px;\n            }\n\n            .header-icon {\n                height: 120px;\n                width: 120px;\n            }\n        }\n\n        @media only screen and (max-width: 1000px) {\n            header {\n                background-color: #55A0E0;\n                background-image: none;\n            }\n        }\n\n        @media only screen and (max-width: 632px) {\n            .header-text {\n                font-size: 32px;\n            }\n\n            .row {\n                padding: 10px 0px 0 10px;\n                max-width: 490px !important;\n                min-width: 410px !important;\n            }\n\n            .endpoint {\n                font-size: 25px;\n            }\n\n            .main-text {\n                font-size: 20px;\n            }\n\n            .step-container dl > dd {\n                font-size: 14px;\n            }\n\n            .column {\n                padding-right: 5px;\n            }\n\n            .header-icon {\n                height: 110px;\n                width: 110px;\n            }\n\n            .how-to-iframe {\n                max-width: 480px !important;\n                min-width: 400px !important;\n                height: 650px !important;\n                overflow: hidden;\n            }\n        }\n\n        .remove-frame-height {\n            max-height: 10px;\n        }\n    </style>\n    <script>\n        document.addEventListener('DOMContentLoaded', function () {\n            loadFrame();\n        });\n        var loadFrame = function () {\n            var iframe = document.createElement('iframe');\n            iframe.setAttribute(\"id\", \"iframe\");\n            var offLineHTMLContent = \"\";\n            var frameElement = document.getElementById(\"how-to-iframe\");\n            if (window.navigator.onLine) {\n                iframe.src = 'https://docs.botframework.com/static/abs/pages/f5.htm';\n                iframe.setAttribute(\"scrolling\", \"no\");\n                iframe.setAttribute(\"frameborder\", \"0\");\n                iframe.setAttribute(\"width\", \"100%\");\n                iframe.setAttribute(\"height\", \"100%\");\n                var frameDiv = document.getElementById(\"how-to-iframe\");\n                frameDiv.appendChild(iframe);\n            } else {\n                frameElement.classList.add(\"remove-frame-height\");\n            }\n        };\n    </script>\n</head>\n\n<body>\n    <header class=\"header\">\n        <div class=\"header-inner-container\">\n            <div class=\"header-icon\" style=\"display: inline-block\"></div>\n            <div class=\"header-text\" style=\"display: inline-block\">Complex Dialog Bot</div>\n        </div>\n    </header>\n    <div class=\"row\">\n        <div class=\"column\" class=\"main-content-area\">\n            <div class=\"content-title\">Your bot is ready!</div>\n            <div class=\"main-text main-text-p1\">\n                You can test your bot in the Bot Framework Emulator<br />\n                by opening the .bot file in the project folder.\n            </div>\n            <div class=\"main-text download-the-emulator\">\n                <a class=\"ctaLink\" href=\"https://aka.ms/bot-framework-F5-download-emulator\"\n                   target=\"_blank\">Download the Emulator</a>\n            </div>\n            <div class=\"main-text\">\n                Visit <a class=\"ctaLink\" href=\"https://aka.ms/bot-framework-F5-abs-home\" target=\"_blank\">\n                    Azure\n                    Bot Service\n                </a> to register your bot and add it to<br />\n                various channels. The bot's endpoint URL typically looks\n                like this:\n            </div>\n            <div class=\"endpoint\">https://<i>your_bots_hostname</i>/api/messages</div>\n        </div>\n        <div class=\"column how-to-iframe\" id=\"how-to-iframe\"></div>\n    </div>\n    </div>\n    <div class=\"ms-logo-container\">\n        <div class=\"ms-logo\"></div>\n    </div>\n</body>\n\n</html>\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogInterruptionsBot/BotBuilder.ruleset",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RuleSet Name=\"Microsoft Managed Recommended Rules\" Description=\"These rules focus on the most critical problems in your code, including potential security holes, application crashes, and other important logic and design errors. It is recommended to include this rule set in any custom rule set you create for your projects.\" ToolsVersion=\"10.0\">\n  <Localization ResourceAssembly=\"Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.dll\" ResourceBaseName=\"Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.Localized\">\n    <Name Resource=\"MinimumRecommendedRules_Name\" />\n    <Description Resource=\"MinimumRecommendedRules_Description\" />\n  </Localization>\n  <Rules AnalyzerId=\"StyleCop.Analyzers\" RuleNamespace=\"StyleCop.Analyzers\">\n    <Rule Id=\"SA1011\" Action=\"None\" />\n    <Rule Id=\"SA1200\" Action=\"None\" />\n    <Rule Id=\"SA1101\" Action=\"None\" />\n    <Rule Id=\"SA1129\" Action=\"None\" />\n    <Rule Id=\"SA1305\" Action=\"Warning\" />\n    <Rule Id=\"SA1309\" Action=\"None\" />\n    <Rule Id=\"SA1412\" Action=\"Warning\" />\n    <Rule Id=\"SA1600\" Action=\"None\" />\n    <Rule Id=\"SA1609\" Action=\"Warning\" />\n    <Rule Id=\"SA1633\" Action=\"None\" />\n  </Rules>\n  <Rules AnalyzerId=\"AsyncUsageAnalyzers\" RuleNamespace=\"AsyncUsageAnalyzers\">\n    <Rule Id=\"AvoidAsyncVoid\" Action=\"Warning\" />\n  </Rules>\n</RuleSet>"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogInterruptionsBot/DeploymentScripts/MsbotClone/bot.recipe",
    "content": "{\n    \"version\": \"1.0\",\n    \"resources\": [\n        {\n            \"type\": \"endpoint\",\n            \"id\": \"24\",\n            \"name\": \"Sample\",\n            \"url\": \"http://localhost:3978/api/messages\"\n        },\n        {\n            \"type\": \"endpoint\",\n            \"id\": \"2\",\n            \"name\": \"production\",\n            \"url\": \"https://your-bot-url.azurewebsites.net/api/messages\"\n        },\n        {\n            \"type\": \"abs\",\n            \"id\": \"3\",\n            \"name\": \"complex-dialog-Bot\"\n        },\n        {\n            \"type\": \"appInsights\",\n            \"id\": \"4\",\n            \"name\": \"complex-dialog-Insights\"\n        },\n        {\n            \"type\": \"blob\",\n            \"id\": \"5\",\n            \"name\": \"complex-dialog-Blob\",\n            \"container\": \"botstatestore\"\n        }\n    ]\n}"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogInterruptionsBot/DialogInterruptionsBot.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nnamespace Microsoft.BotBuilderSamples\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Threading;\n    using System.Threading.Tasks;\n    using Microsoft.Bot.Builder;\n    using Microsoft.Bot.Builder.Dialogs;\n    using Microsoft.Bot.Builder.Dialogs.Choices;\n    using Microsoft.Bot.Schema;\n\n    /// <summary>\n    /// Represents a bot that processes incoming activities.\n    /// For each user interaction, an instance of this class is created and the OnTurnAsync method is called.\n    /// This is a Transient lifetime service.  Transient lifetime services are created\n    /// each time they're requested. For each Activity received, a new instance of this\n    /// class is created. Objects that are expensive to construct, or have a lifetime\n    /// beyond the single turn, should be carefully managed.\n    /// For example, the <see cref=\"MemoryStorage\"/> object and associated\n    /// <see cref=\"IStatePropertyAccessor{T}\"/> object are created with a singleton lifetime.\n    /// </summary>\n    /// <seealso cref=\"https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.1\"/>\n    public class DialogInterruptionsBot : IBot\n    {\n        // Define the company choices for the company selection prompt.\n        private static class Companies\n        {\n            public const string Adatum = \"Adatum Corporation\";\n            public const string Contoso = \"Contoso Suites\";\n            public const string Gdi = \"Graphic Design Institute\";\n            public const string Wwi = \"Wide World Importers\";\n\n            public static readonly IReadOnlyDictionary<string, string> Options\n                = new Dictionary<string, string>\n                    {\n                        { Adatum, \"A market research company\" },\n                        { Contoso, \"A chain of hotels and inns\" },\n                        { Gdi, \"A school for graphic design\" },\n                        { Wwi, \"An importer of consumer goods\" },\n                    };\n\n            public static string MoreInfo { get; } =\n                string.Join(\"\\r\\r\", Options.Select(e => $\"**{e.Key}**--{e.Value}\"));\n        }\n\n        // Define interruptions for the conversation.\n        private static class Interruptions\n        {\n            // \"Global\" interruptions.\n            public const string Wait = \"wait\";\n            public const string Continue = \"continue\";\n            public const string Cancel = \"cancel\";\n\n            // \"Local\" interruptions (to the review selection process).\n            public const string Finish = \"finish\";\n            public const string MoreInfo = \"more info\";\n            public const string Help = \"help\";\n\n            public static readonly string[] LocalOptions = new string[]\n            {\n                Finish, MoreInfo, Help,\n            };\n\n            public static readonly IReadOnlyDictionary<string, string> Options\n                = new Dictionary<string, string>\n                    {\n                        { Cancel, \"Cancel the review sign-up process.\" },\n                        { Continue, \"Continues the conversation on hold, if any.\" },\n                        { Finish, \"Complete the review sign-up process with the currently selected companies.\" },\n                        { Help, \"List the available commands.\" },\n                        { MoreInfo, \"Display information about the companies.\" },\n                        { Wait, \"Puts the current conversation on hold.\" },\n                    };\n\n            /// <summary>Describes the available commands.</summary>\n            public static string HelpText { get; } =\n                string.Join(\"\\r\\r\", Options.Select(e => $\"**{e.Key}**--{e.Value}\"));\n        }\n\n        private const string WelcomeText =\n            \"Welcome to DialogInterruptionsBot.\" +\n            \" This bot provides a complex conversation, supporting various kinds of interruptions.\" +\n            \" Type anything to get started.\";\n\n        private static string GlobalHelpText { get; } =\n            \"This bot helps you sign up to review companies.\" +\n            $\" To pause the conversation at any time, enter `{Interruptions.Wait}`.\" +\n            $\" To resume the conversation, enter `{Interruptions.Continue}`.\";\n\n        private const string CancellationText =\n            \"We have cancelled your sign up. Thankyou.\";\n\n        private static string OnHoldText { get; } =\n            \"The conversation is on hold.\" +\n            $\" Enter `{Interruptions.Continue}` to continue the conversation where you left off.\";\n\n        // Define the dialog and prompt names for the bot.\n        private const string TopLevelDialog = \"dialog-topLevel\";\n        private const string ReviewSelectionDialog = \"dialog-reviewSeleciton\";\n        private const string OnHoldDialog = \"dialog-onHold\";\n        private const string NamePrompt = \"prompt-name\";\n        private const string AgePrompt = \"prompt-age\";\n        private const string SelectionPrompt = \"prompt-companySlection\";\n\n        // Define value names for values tracked inside the dialogs.\n        private const string UserInfo = \"value-userInfo\";\n        private const string CompaniesSelected = \"value-companiesSelected\";\n\n        /// <summary>\n        /// Contains the state property accessors and state management objects for the bot.\n        /// </summary>\n        private readonly DialogInterruptionsBotAccessors _accessors;\n\n        /// <summary>\n        /// The <see cref=\"DialogSet\"/> that contains all the Dialogs that can be used at runtime.\n        /// </summary>\n        private readonly DialogSet _dialogs;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"DialogInterruptionsBot\"/> class.\n        /// </summary>\n        /// <param name=\"accessors\">A class containing <see cref=\"IStatePropertyAccessor{T}\"/> used to manage state.</param>\n        public DialogInterruptionsBot(DialogInterruptionsBotAccessors accessors)\n        {\n            _accessors = accessors ?? throw new ArgumentNullException(nameof(accessors));\n\n            // Create a dialog set for the bot. It requires a DialogState accessor, with which\n            // to retrieve the dialog state from the turn context.\n            _dialogs = new DialogSet(accessors.DialogStateAccessor);\n\n            // Add the prompts we need to the dialog set.\n            _dialogs\n                .Add(new TextPrompt(NamePrompt))\n                .Add(new NumberPrompt<int>(AgePrompt))\n                .Add(new ChoicePrompt(SelectionPrompt) { Style = ListStyle.List });\n\n            // Add the dialogs we need to the dialog set.\n            _dialogs.Add(new WaterfallDialog(TopLevelDialog)\n                .AddStep(NameStepAsync)\n                .AddStep(AgeStepAsync)\n                .AddStep(StartSelectionStepAsync)\n                .AddStep(AcknowledgementStepAsync));\n\n            _dialogs.Add(new WaterfallDialog(ReviewSelectionDialog)\n                .AddStep(SelectionStepAsync)\n                .AddStep(LoopStepAsync));\n\n            _dialogs.Add(new WaterfallDialog(OnHoldDialog)\n                .AddStep(OnHoldStepAsync)\n                .AddStep(ContinueToHoldStepAsync));\n        }\n\n        /// <summary>\n        /// Every conversation turn for our EchoBot will call this method.\n        /// </summary>\n        /// <param name=\"turnContext\">A <see cref=\"ITurnContext\"/> containing all the data needed\n        /// for processing this conversation turn. </param>\n        /// <param name=\"cancellationToken\">(Optional) A <see cref=\"CancellationToken\"/> that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A <see cref=\"Task\"/> that represents the work queued to execute.</returns>\n        /// <seealso cref=\"BotStateSet\"/>\n        /// <seealso cref=\"ConversationState\"/>\n        /// <seealso cref=\"IMiddleware\"/>\n        public async Task OnTurnAsync(\n            ITurnContext turnContext,\n            CancellationToken cancellationToken = default(CancellationToken))\n        {\n            if (turnContext == null)\n            {\n                throw new ArgumentNullException(nameof(turnContext));\n            }\n\n            // Handle Message activity type, which is the main activity type for shown within a conversational interface\n            // Message activities may contain text, speech, interactive cards, and binary or unknown attachments.\n            // see https://aka.ms/about-bot-activity-message to learn more about the message and other activity types\n            if (turnContext.Activity.Type == ActivityTypes.Message)\n            {\n                string input = turnContext.Activity.Text?.Trim();\n\n                // Handle any \"global\" interruptions before continuing.\n\n                // On a request for help, display global help.\n                if (string.Equals(input, Interruptions.Help, StringComparison.InvariantCultureIgnoreCase))\n                {\n                    await turnContext.SendActivityAsync(GlobalHelpText, cancellationToken: cancellationToken);\n                    return;\n                }\n\n                DialogContext dialogContext = await _dialogs.CreateContextAsync(turnContext, cancellationToken);\n\n                // If we're not currently on hold, check whether the user wants to go on hold.\n                if (dialogContext.ActiveDialog?.Id != OnHoldDialog)\n                {\n                    if (string.Equals(input, Interruptions.Wait, StringComparison.InvariantCultureIgnoreCase))\n                    {\n                        // Transition onto hold.\n                        await dialogContext.BeginDialogAsync(OnHoldDialog, null, cancellationToken);\n                        await _accessors.ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);\n                        return;\n                    }\n                }\n\n                // On a request to cancel, clear the dialog stack completely.\n                if (string.Equals(input, Interruptions.Cancel, StringComparison.InvariantCultureIgnoreCase))\n                {\n                    await dialogContext.CancelAllDialogsAsync(cancellationToken);\n                    await turnContext.SendActivityAsync(CancellationText, cancellationToken: cancellationToken);\n                    await _accessors.ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);\n                    return;\n                }\n\n                // Run the DialogSet - let the framework identify the current state of the dialog from\n                // the dialog stack and figure out what (if any) is the active dialog.\n                DialogTurnResult results = await dialogContext.ContinueDialogAsync(cancellationToken);\n                switch (results.Status)\n                {\n                    case DialogTurnStatus.Cancelled:\n                    case DialogTurnStatus.Empty:\n                        // If there is no active dialog, we should clear the user info and start a new dialog.\n                        await _accessors.UserProfileAccessor.SetAsync(turnContext, new UserProfile(), cancellationToken);\n                        await _accessors.UserState.SaveChangesAsync(turnContext, false, cancellationToken);\n                        await dialogContext.BeginDialogAsync(TopLevelDialog, null, cancellationToken);\n                        break;\n                    case DialogTurnStatus.Complete:\n                        // If we just finished the dialog, capture and display the results.\n                        UserProfile userInfo = results.Result as UserProfile;\n                        string status = \"You are signed up to review \"\n                            + (userInfo.CompaniesToReview.Count is 0 ? \"no companies\" : string.Join(\" and \", userInfo.CompaniesToReview))\n                            + \".\";\n                        await turnContext.SendActivityAsync(status);\n                        await _accessors.UserProfileAccessor.SetAsync(turnContext, userInfo, cancellationToken);\n                        await _accessors.UserState.SaveChangesAsync(turnContext, false, cancellationToken);\n                        break;\n                    case DialogTurnStatus.Waiting:\n                        // If there is an active dialog, we don't need to do anything here.\n                        break;\n                }\n\n                await _accessors.ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);\n            }\n\n            // Processes ConversationUpdate Activities to welcome the user.\n            else if (turnContext.Activity.Type == ActivityTypes.ConversationUpdate)\n            {\n                if (turnContext.Activity.MembersAdded != null)\n                {\n                    await SendWelcomeMessageAsync(turnContext, cancellationToken);\n                }\n            }\n            else\n            {\n                // Otherwise, note what type of unexpected activity we just received.\n                await turnContext.SendActivityAsync(\n                    $\"{turnContext.Activity.Type} event detected\",\n                    cancellationToken: cancellationToken);\n            }\n        }\n\n        /// <summary>\n        /// Sends a welcome message to the user.\n        /// </summary>\n        /// <param name=\"turnContext\">A <see cref=\"ITurnContext\"/> containing all the data needed\n        /// for processing this conversation turn. </param>\n        /// <param name=\"cancellationToken\">(Optional) A <see cref=\"CancellationToken\"/> that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A <see cref=\"Task\"/> that represents the work queued to execute.</returns>\n        private static async Task SendWelcomeMessageAsync(\n            ITurnContext turnContext,\n            CancellationToken cancellationToken)\n        {\n            foreach (ChannelAccount member in turnContext.Activity.MembersAdded)\n            {\n                if (member.Id != turnContext.Activity.Recipient.Id)\n                {\n                    Activity reply = turnContext.Activity.CreateReply();\n                    reply.Text = WelcomeText;\n                    await turnContext.SendActivityAsync(reply, cancellationToken);\n                }\n            }\n        }\n\n        /// <summary>The first step of the top-level dialog.</summary>\n        /// <param name=\"stepContext\">The waterfall step context for the current turn.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>If the task is successful, the result contains a <see cref=\"DialogTurnResult\"/> to\n        /// communicate some flow control back to the containing WaterfallDialog.</remarks>\n        private static async Task<DialogTurnResult> NameStepAsync(\n            WaterfallStepContext stepContext,\n            CancellationToken cancellationToken)\n        {\n            // Create an object in which to collect the user's information within the dialog.\n            stepContext.Values[UserInfo] = new UserProfile();\n\n            Activity prompt = MessageFactory.Text(\"Please enter your name.\");\n\n            // Ask the user to enter their name.\n            return await stepContext.PromptAsync(\n                NamePrompt,\n                new PromptOptions { Prompt = prompt, RetryPrompt = prompt },\n                cancellationToken);\n        }\n\n        /// <summary>The second step of the top-level dialog.</summary>\n        /// <param name=\"stepContext\">The waterfall step context for the current turn.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>If the task is successful, the result contains a <see cref=\"DialogTurnResult\"/> to\n        /// communicate some flow control back to the containing WaterfallDialog.</remarks>\n        private static async Task<DialogTurnResult> AgeStepAsync(\n            WaterfallStepContext stepContext,\n            CancellationToken cancellationToken)\n        {\n            // Set the user's name to what they entered in response to the name prompt.\n            ((UserProfile)stepContext.Values[UserInfo]).Name = (string)stepContext.Result;\n\n            Activity prompt = MessageFactory.Text(\"Please enter your age.\");\n\n            // Ask the user to enter their age.\n            return await stepContext.PromptAsync(\n                AgePrompt,\n                new PromptOptions { Prompt = prompt, RetryPrompt = prompt },\n                cancellationToken);\n        }\n\n        /// <summary>The third step of the top-level dialog.</summary>\n        /// <param name=\"stepContext\">The waterfall step context for the current turn.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>If the task is successful, the result contains a <see cref=\"DialogTurnResult\"/> to\n        /// communicate some flow control back to the containing WaterfallDialog.</remarks>\n        private static async Task<DialogTurnResult> StartSelectionStepAsync(\n            WaterfallStepContext stepContext,\n            CancellationToken cancellationToken)\n        {\n            // Set the user's age to what they entered in response to the age prompt.\n            int age = (int)stepContext.Result;\n            ((UserProfile)stepContext.Values[UserInfo]).Age = age;\n\n            if (age < 25)\n            {\n                // If they are too young, skip the review selection dialog, and pass an empty list to the next step.\n                await stepContext.Context.SendActivityAsync(\n                    MessageFactory.Text(\"You must be 25 or older to participate.\"),\n                    cancellationToken);\n                return await stepContext.NextAsync(new List<string>(), cancellationToken);\n            }\n            else\n            {\n                // Otherwise, start the review selection dialog.\n                return await stepContext.BeginDialogAsync(ReviewSelectionDialog, null, cancellationToken);\n            }\n        }\n\n        /// <summary>The final step of the top-level dialog.</summary>\n        /// <param name=\"stepContext\">The waterfall step context for the current turn.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>If the task is successful, the result contains a <see cref=\"DialogTurnResult\"/> to\n        /// communicate some flow control back to the containing WaterfallDialog.</remarks>\n        private static async Task<DialogTurnResult> AcknowledgementStepAsync(\n            WaterfallStepContext stepContext,\n            CancellationToken cancellationToken)\n        {\n            // Set the user's company selection to what they entered in the review-selection dialog.\n            List<string> list = stepContext.Result as List<string>;\n            var profile = (UserProfile)stepContext.Values[UserInfo];\n            profile.CompaniesToReview = list ?? new List<string>();\n\n            // Thank them for participating.\n            await stepContext.Context.SendActivityAsync(\n                MessageFactory.Text($\"Thanks for participating, {profile.Name}.\"),\n                cancellationToken);\n\n            // Exit the dialog, returning the collected user information.\n            return await stepContext.EndDialogAsync(stepContext.Values[UserInfo], cancellationToken);\n        }\n\n        /// <summary>The first step of the review-selection dialog.</summary>\n        /// <param name=\"stepContext\">The waterfall step context for the current turn.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>If the task is successful, the result contains a <see cref=\"DialogTurnResult\"/> to\n        /// communicate some flow control back to the containing WaterfallDialog.</remarks>\n        private static async Task<DialogTurnResult> SelectionStepAsync(\n            WaterfallStepContext stepContext,\n            CancellationToken cancellationToken)\n        {\n            // Continue using the same selection list, if any, from the previous iteration of this dialog.\n            List<string> list = stepContext.Options as List<string> ?? new List<string>();\n            stepContext.Values[CompaniesSelected] = list;\n\n            // Create a prompt message.\n            string message;\n            if (list.Count is 0)\n            {\n                message = $\"Please choose a company to review:\";\n            }\n            else\n            {\n                message = $\"You have selected **{list[0]}**. You can review an additional company:\";\n            }\n\n            // Create the list of options to choose from.\n            List<string> options = Companies.Options.Keys.ToList();\n            options.AddRange(Interruptions.LocalOptions);\n            if (list.Count > 0)\n            {\n                options.Remove(list[0]);\n            }\n\n            // Prompt the user for a choice.\n            return await stepContext.PromptAsync(\n                SelectionPrompt,\n                new PromptOptions\n                {\n                    Prompt = MessageFactory.Text(message),\n                    RetryPrompt = MessageFactory.Text(\"Please choose an option from the list.\"),\n                    Choices = ChoiceFactory.ToChoices(options),\n                },\n                cancellationToken);\n        }\n\n        /// <summary>The final step of the review-selection dialog.</summary>\n        /// <param name=\"stepContext\">The waterfall step context for the current turn.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>If the task is successful, the result contains a <see cref=\"DialogTurnResult\"/> to\n        /// communicate some flow control back to the containing WaterfallDialog.</remarks>\n        private static async Task<DialogTurnResult> LoopStepAsync(\n            WaterfallStepContext stepContext,\n            CancellationToken cancellationToken)\n        {\n            // Retrieve their selection list and the choice they juat made.\n            List<string> list = stepContext.Values[CompaniesSelected] as List<string>;\n            FoundChoice choice = (FoundChoice)stepContext.Result;\n\n            // Handle any local, expected interruptions appropriately.\n            switch (choice.Value)\n            {\n                case Interruptions.Finish:\n                    // Exit and return their current selection list.\n                    return await stepContext.EndDialogAsync(list, cancellationToken);\n                case Interruptions.Cancel:\n                    // Exit and return null.\n                    return await stepContext.EndDialogAsync(null, cancellationToken);\n                case Interruptions.Help:\n                    // Dispaly the help options.\n                    await stepContext.Context.SendActivityAsync(\n                        Interruptions.HelpText,\n                        cancellationToken: cancellationToken);\n                    break;\n                case Interruptions.MoreInfo:\n                    // Display more information about the companies.\n                    await stepContext.Context.SendActivityAsync(\n                        Companies.MoreInfo,\n                        cancellationToken: cancellationToken);\n                    break;\n                default:\n                    // If they chose a company, add it to the list.\n                    list.Add(choice.Value);\n                    break;\n            }\n\n            if (list.Count is 2)\n            {\n                // If they've selected 2 companies to review, exit and return their list.\n                return await stepContext.EndDialogAsync(list, cancellationToken);\n            }\n            else\n            {\n                // Otherwise, repeat this dialog, passing in the list from this iteration.\n                return await stepContext.ReplaceDialogAsync(ReviewSelectionDialog, list, cancellationToken);\n            }\n        }\n\n        /// <summary>The first step of the on-hold dialog.</summary>\n        /// <param name=\"stepContext\">The waterfall step context for the current turn.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>If the task is successful, the result contains a <see cref=\"DialogTurnResult\"/> to\n        /// communicate some flow control back to the containing WaterfallDialog.</remarks>\n        private static async Task<DialogTurnResult> OnHoldStepAsync(\n            WaterfallStepContext stepContext,\n            CancellationToken cancellationToken)\n        {\n            string input = stepContext.Context.Activity.Text?.Trim();\n            if (string.Equals(input, Interruptions.Continue, StringComparison.InvariantCultureIgnoreCase))\n            {\n                // Exit and return to the last active dialog state.\n                return await stepContext.EndDialogAsync(null, cancellationToken);\n            }\n            else\n            {\n                // Send a status message and let the dialog contnue on the next turn.\n                await stepContext.Context.SendActivityAsync(OnHoldText, cancellationToken: cancellationToken);\n                return Dialog.EndOfTurn;\n            }\n        }\n\n        /// <summary>The last step of the on-hold dialog.</summary>\n        /// <param name=\"stepContext\">The waterfall step context for the current turn.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>If the task is successful, the result contains a <see cref=\"DialogTurnResult\"/> to\n        /// communicate some flow control back to the containing WaterfallDialog.</remarks>\n        private static async Task<DialogTurnResult> ContinueToHoldStepAsync(\n            WaterfallStepContext stepContext,\n            CancellationToken cancellationToken)\n        {\n            // Restart the on-hold dialog.\n            return await stepContext.ReplaceDialogAsync(OnHoldDialog, null, cancellationToken);\n        }\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogInterruptionsBot/DialogInterruptionsBot.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n    <CodeAnalysisRuleSet>BotBuilder.ruleset</CodeAnalysisRuleSet>\n    <RootNamespace>Microsoft.BotBuilderSamples</RootNamespace>\n  </PropertyGroup>\n\n <ItemGroup>\n    <None Update=\"*.bot\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n    \n  <ItemGroup>\n    <PackageReference Include=\"AsyncUsageAnalyzers\" Version=\"1.0.0-alpha003\" PrivateAssets=\"all\" />\n    <PackageReference Include=\"Microsoft.AspNetCore.All\" Version=\"2.0.8\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder\" Version=\"4.1.5\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder.Dialogs\" Version=\"4.1.5\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder.Integration.AspNet.Core\" Version=\"4.1.5\" />\n    <PackageReference Include=\"Microsoft.Bot.Configuration\" Version=\"4.1.5\" />\n    <PackageReference Include=\"StyleCop.Analyzers\" Version=\"1.1.0-beta008\" PrivateAssets=\"all\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogInterruptionsBot/DialogInterruptionsBotAccessors.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nnamespace Microsoft.BotBuilderSamples\n{\n    using System;\n    using Microsoft.Bot.Builder;\n    using Microsoft.Bot.Builder.Dialogs;\n\n    /// <summary>\n    /// This class is created as a Singleton and passed into the IBot-derived constructor.\n    ///  - See <see cref=\"DialogInterruptionsBot\"/> constructor for how that is injected.\n    ///  - See the Startup.cs file for more details on creating the Singleton that gets\n    ///    injected into the constructor.\n    /// </summary>\n    public class DialogInterruptionsBotAccessors\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"DialogInterruptionsBotAccessors\"/> class.\n        /// Contains the <see cref=\"ConversationState\"/> and associated <see cref=\"IStatePropertyAccessor{T}\"/>.\n        /// </summary>\n        /// <param name=\"conversationState\">The state object that stores the dialog state.</param>\n        /// <param name=\"userState\">The state object that stores the user state.</param>\n        public DialogInterruptionsBotAccessors(ConversationState conversationState, UserState userState)\n        {\n            ConversationState = conversationState ?? throw new ArgumentNullException(nameof(conversationState));\n            UserState = userState ?? throw new ArgumentNullException(nameof(userState));\n        }\n\n        /// <summary>\n        /// Gets or sets the <see cref=\"IStatePropertyAccessor{T}\"/> for ConversationDialogState.\n        /// </summary>\n        /// <value>\n        /// The accessor stores the dialog state for the conversation.\n        /// </value>\n        public IStatePropertyAccessor<DialogState> DialogStateAccessor { get; set; }\n\n        /// <summary>\n        /// Gets or sets the <see cref=\"IStatePropertyAccessor{T}\"/> for CounterState.\n        /// </summary>\n        /// <value>\n        /// The accessor stores user data.\n        /// </value>\n        public IStatePropertyAccessor<UserProfile> UserProfileAccessor { get; set; }\n\n        /// <summary>\n        /// Gets the <see cref=\"ConversationState\"/> object for the conversation.\n        /// </summary>\n        /// <value>The <see cref=\"ConversationState\"/> object.</value>\n        public ConversationState ConversationState { get; }\n\n        /// <summary>\n        /// Gets the <see cref=\"UserState\"/> object for the conversation.\n        /// </summary>\n        /// <value>The <see cref=\"UserState\"/> object.</value>\n        public UserState UserState { get; }\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogInterruptionsBot/Program.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing Microsoft.AspNetCore;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Logging;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            BuildWebHost(args).Run();\n        }\n\n        public static IWebHost BuildWebHost(string[] args) =>\n            WebHost.CreateDefaultBuilder(args)\n                .ConfigureLogging((hostingContext, logging) =>\n                {\n                    // Add Azure Logging\n                    logging.AddAzureWebAppDiagnostics();\n\n                    // Logging Options.\n                    // There are other logging options available:\n                    // https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1\n                    // logging.AddDebug();\n                    // logging.AddConsole();\n                })\n\n                // Logging Options.\n                // Consider using Application Insights for your logging and metrics needs.\n                // https://azure.microsoft.com/en-us/services/application-insights/\n                // .UseApplicationInsights()\n                .UseStartup<Startup>()\n                .Build();\n    }\n}"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogInterruptionsBot/Properties/launchSettings.json",
    "content": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:3978/\",\n      \"sslPort\": 0\n    }\n  },\n  \"profiles\": {\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"DialogInterruptions_Sample\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      },\n      \"applicationUrl\": \"http://localhost:3978/\"\n    }\n  }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogInterruptionsBot/README.md",
    "content": "This sample creates a dialog-based conversation that can be interrupted in various ways in ASP.Net Core 2.\n\n# To try this sample\n- Clone the samples repository\n```bash\ngit clone https://github.com/Microsoft/BotFramework-Samples.git\n```\n- [Optional] Update the `appsettings.json` file under `BotFramework-Samples/SDKV4-Samples/dotnet_core/DialogInterruptionsBot/` with your botFileSecret.\nFor Azure Bot Service bots, you can find the botFileSecret under application settings.\n\n# Running Locally\n## Visual Studio\n- Navigate to the samples folder (`BotFramework-Samples/SDKV4-Samples/dotnet_core/DialogInterruptionsBot/`) and open DialogInterruptionsBot.csproj in Visual Studio.\n- Run the project (press `F5` key).\n\n## .NET Core CLI\n- Install the [.NET Core CLI tools](https://docs.microsoft.com/dotnet/core/tools/?tabs=netcore2x).\n- Using the command line, navigate to `BotFramework-Samples/SDKV4-Samples/dotnet_core/DialogInterruptionsBot/` folder.\n- Type `dotnet run`.\n\n## Testing the bot using Bot Framework Emulator\n[Microsoft Bot Framework Emulator](https://github.com/microsoft/botframework-emulator) is a desktop application that allows bot\ndevelopers to test and debug their bots on localhost or running remotely through a tunnel.\n- Install the Bot Framework emulator from [here](https://aka.ms/botframeworkemulator).\n\n## Connect to bot using Bot Framework Emulator **V4**\n- Launch the Bot Framework Emulator.\n- File -> Open bot and navigate to `BotFramework-Samples/SDKV4-Samples/dotnet_core/DialogInterruptionsBot` folder.\n- Select `complex-dialog.bot` file.\n\n# Further reading\n- [Azure Bot Service](https://docs.microsoft.com/azure/bot-service/bot-service-overview-introduction?view=azure-bot-service-4.0)\n- [Bot Storage](https://docs.microsoft.com/azure/bot-service/dotnet/bot-builder-dotnet-state?view=azure-bot-service-3.0&viewFallbackFrom=azure-bot-service-4.0)\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogInterruptionsBot/Startup.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nnamespace Microsoft.BotBuilderSamples\n{\n    using System;\n    using System.Linq;\n    using Microsoft.AspNetCore.Builder;\n    using Microsoft.AspNetCore.Hosting;\n    using Microsoft.Bot.Builder;\n    using Microsoft.Bot.Builder.Dialogs;\n    using Microsoft.Bot.Builder.Integration.AspNet.Core;\n    using Microsoft.Bot.Configuration;\n    using Microsoft.Bot.Connector.Authentication;\n    using Microsoft.Extensions.Configuration;\n    using Microsoft.Extensions.DependencyInjection;\n    using Microsoft.Extensions.Logging;\n\n    /// <summary>\n    /// The Startup class configures services and the app's request pipeline.\n    /// </summary>\n    public class Startup\n    {\n        private ILoggerFactory _loggerFactory;\n        private bool _isProduction = false;\n\n        public Startup(IHostingEnvironment env)\n        {\n            _isProduction = env.IsProduction();\n\n            var builder = new ConfigurationBuilder()\n                .SetBasePath(env.ContentRootPath)\n                .AddJsonFile(\"appsettings.json\", optional: true, reloadOnChange: true)\n                .AddJsonFile($\"appsettings.{env.EnvironmentName}.json\", optional: true)\n                .AddEnvironmentVariables();\n\n            Configuration = builder.Build();\n        }\n\n        /// <summary>\n        /// Gets the configuration that represents a set of key/value application configuration properties.\n        /// </summary>\n        /// <value>\n        /// The <see cref=\"IConfiguration\"/> that represents a set of key/value application configuration properties.\n        /// </value>\n        public IConfiguration Configuration { get; }\n\n        /// <summary>\n        /// This method gets called by the runtime. Use this method to add services to the container.\n        /// </summary>\n        /// <param name=\"services\">Specifies the contract for a <see cref=\"IServiceCollection\"/> of service descriptors.</param>\n        /// <seealso cref=\"IStatePropertyAccessor{T}\"/>\n        /// <seealso cref=\"https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/dependency-injection\"/>\n        /// <seealso cref=\"https://docs.microsoft.com/en-us/azure/bot-service/bot-service-manage-channels?view=azure-bot-service-4.0\"/>\n        public void ConfigureServices(IServiceCollection services)\n        {\n            services.AddBot<DialogInterruptionsBot>(options =>\n            {\n                var secretKey = Configuration.GetSection(\"botFileSecret\")?.Value;\n                var botFilePath = Configuration.GetSection(\"botFilePath\")?.Value;\n\n                // Loads .bot configuration file and adds a singleton that your Bot can access through dependency injection.\n                var botConfig = BotConfiguration.Load(botFilePath ?? @\".\\complex-dialog.bot\", secretKey);\n                services.AddSingleton(sp => botConfig ?? throw new InvalidOperationException($\"The .bot configuration file could not be loaded. ({botConfig})\"));\n\n                // Retrieve current endpoint.\n                var environment = _isProduction ? \"production\" : \"development\";\n                var service = botConfig.Services.FirstOrDefault(s => s.Type == \"endpoint\" && s.Name == environment);\n                if (!(service is EndpointService endpointService))\n                {\n                    throw new InvalidOperationException($\"The .bot file does not contain an endpoint with name '{environment}'.\");\n                }\n\n                options.CredentialProvider = new SimpleCredentialProvider(endpointService.AppId, endpointService.AppPassword);\n\n                // Creates a logger for the application to use.\n                ILogger logger = _loggerFactory.CreateLogger<DialogInterruptionsBot>();\n\n                // Catches any errors that occur during a conversation turn and logs them.\n                options.OnTurnError = async (context, exception) =>\n                {\n                    logger.LogError($\"Exception caught : {exception}\");\n                    await context.SendActivityAsync(\"Sorry, it looks like something went wrong.\");\n                };\n            });\n\n            // Create conversation and user state management objects, using memory storage.\n            IStorage dataStore = new MemoryStorage();\n            var conversationState = new ConversationState(dataStore);\n            var userState = new UserState(dataStore);\n\n            // Create and register state accessors.\n            // Accessors created here are passed into the IBot-derived class on every turn.\n            services.AddSingleton<DialogInterruptionsBotAccessors>(sp =>\n            {\n                // Create the custom state accessor.\n                // State accessors enable other components to read and write individual properties of state.\n                var accessors = new DialogInterruptionsBotAccessors(conversationState, userState)\n                {\n                    DialogStateAccessor = conversationState.CreateProperty<DialogState>(\"DialogState\"),\n                    UserProfileAccessor = userState.CreateProperty<UserProfile>(\"UserProfile\"),\n                };\n\n                return accessors;\n            });\n        }\n\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)\n        {\n            _loggerFactory = loggerFactory;\n\n            app.UseDefaultFiles()\n                .UseStaticFiles()\n                .UseBotFramework();\n        }\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogInterruptionsBot/UserProfile.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nnamespace Microsoft.BotBuilderSamples\n{\n    using System.Collections.Generic;\n\n    /// <summary>Contains information about a user.</summary>\n    public class UserProfile\n    {\n        /// <summary>Gets or sets the user's name.</summary>\n        /// <value>The user's name.</value>\n        public string Name { get; set; }\n\n        /// <summary>Gets or sets the user's age.</summary>\n        /// <value>The user's age.</value>\n        public int Age { get; set; }\n\n        /// <summary>Gets or sets the list of companies the user wants to review.</summary>\n        /// <value>The list of companies the user wants to review.</value>\n        public List<string> CompaniesToReview { get; set; } = new List<string>();\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogInterruptionsBot/appsettings.json",
    "content": "﻿{\n    \"botFilePath\": \"dialog-interruptions.bot\",\n    \"botFileSecret\": \"\"\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogInterruptionsBot/dialog-interruptions.bot",
    "content": "{\n    \"name\": \"dialog-interruptions-bot\",\n    \"services\": [\n        {\n            \"type\": \"endpoint\",\n            \"name\": \"development\",\n            \"endpoint\": \"http://localhost:3978/api/messages\",\n            \"appId\": \"\",\n            \"appPassword\": \"\",\n            \"id\": \"24\"\n        }\n    ],\n    \"padlock\": \"\",\n    \"version\": \"2.0\"\n}"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogInterruptionsBot/wwwroot/default.htm",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>Dialog with interruptions sample</title>\n    <style>\n        body {\n            margin: 0px;\n            padding: 0px;\n            font-family: Segoe UI;\n        }\n\n        html,\n        body {\n            height: 100%;\n        }\n\n        header {\n            background-image: url(\"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 4638.9 651.6' style='enable-background:new 0 0 4638.9 651.6;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%2355A0E0;%7D .st1%7Bfill:none;%7D .st2%7Bfill:%230058A8;%7D .st3%7Bfill:%23328BD8;%7D .st4%7Bfill:%23B6DCF1;%7D .st5%7Bopacity:0.2;fill:url(%23SVGID_1_);enable-background:new ;%7D%0A%3C/style%3E%3Crect y='1.1' class='st0' width='4640' height='646.3'/%3E%3Cpath class='st1' d='M3987.8,323.6L4310.3,1.1h-65.6l-460.1,460.1c-17.5,17.5-46.1,17.5-63.6,0L3260.9,1.1H0v646.3h3660.3 L3889,418.7c17.5-17.5,46.1-17.5,63.6,0l228.7,228.7h66.6l-260.2-260.2C3970.3,369.8,3970.3,341.1,3987.8,323.6z'/%3E%3Cpath class='st2' d='M3784.6,461.2L4244.7,1.1h-983.9l460.1,460.1C3738.4,478.7,3767.1,478.7,3784.6,461.2z'/%3E%3Cpath class='st3' d='M4640,1.1h-329.8l-322.5,322.5c-17.5,17.5-17.5,46.1,0,63.6l260.2,260.2H4640L4640,1.1L4640,1.1z'/%3E%3Cpath class='st4' d='M3889,418.8l-228.7,228.7h521.1l-228.7-228.7C3935.2,401.3,3906.5,401.3,3889,418.8z'/%3E%3ClinearGradient id='SVGID_1_' gradientUnits='userSpaceOnUse' x1='3713.7576' y1='438.1175' x2='3911.4084' y2='14.2535' gradientTransform='matrix(1 0 0 -1 0 641.3969)'%3E%3Cstop offset='0' style='stop-color:%23FFFFFF;stop-opacity:0.5'/%3E%3Cstop offset='1' style='stop-color:%23FFFFFF'/%3E%3C/linearGradient%3E%3Cpath class='st5' d='M3952.7,124.5c-17.5-17.5-46.1-17.5-63.6,0l-523,523h1109.6L3952.7,124.5z'/%3E%3C/svg%3E%0A\");\n            background-repeat: no-repeat;\n            background-size: 100%;\n            background-position: right;\n            background-color: #55A0E0;\n            width: 100%;\n            font-size: 44px;\n            height: 120px;\n            color: white;\n            padding: 30px 0 40px 0px;\n            display: inline-block;\n        }\n\n        .header-icon {\n            background-image: url(\"data:image/svg+xml;utf8,%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20150.2%20125%22%20style%3D%22enable-background%3Anew%200%200%20150.2%20125%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23FFFFFF%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.5%22%20class%3D%22st0%22%20width%3D%22149.7%22%20height%3D%22125%22/%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M59%2C102.9L21.8%2C66c-3.5-3.5-3.5-9.1%2C0-12.5l37-36.5l2.9%2C3l-37%2C36.4c-1.8%2C1.8-1.8%2C4.7%2C0%2C6.6l37.2%2C37L59%2C102.9z%22%0A%09%09/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M92.5%2C102.9l-3-3l37.2-37c0.9-0.9%2C1.4-2%2C1.4-3.3c0-1.2-0.5-2.4-1.4-3.3L89.5%2C20l2.9-3l37.2%2C36.4%0A%09%09c1.7%2C1.7%2C2.6%2C3.9%2C2.6%2C6.3s-0.9%2C4.6-2.6%2C6.3L92.5%2C102.9z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M90.1%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C98.1%2C64.7%2C94.4%2C68.4%2C90.1%2C68.4z%0A%09%09%20M90.1%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S91.9%2C56.5%2C90.1%2C56.5z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M61.4%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C69.5%2C64.7%2C65.8%2C68.4%2C61.4%2C68.4z%0A%09%09%20M61.4%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S63.3%2C56.5%2C61.4%2C56.5z%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A\");\n            background-repeat: no-repeat;\n            float: left;\n            height: 140px;\n            width: 140px;\n            display: inline-block;\n            vertical-align: middle;\n        }\n\n        .header-text {\n            padding-left: 1%;\n            color: #FFFFFF;\n            font-family: \"Segoe UI\";\n            font-size: 72px;\n            font-weight: 300;\n            letter-spacing: 0.35px;\n            line-height: 96px;\n            display: inline-block;\n            vertical-align: middle;\n        }\n\n        .header-inner-container {\n            min-width: 480px;\n            max-width: 1366px;\n            margin-left: auto;\n            margin-right: auto;\n            vertical-align: middle;\n        }\n\n            .header-inner-container::after {\n                content: \"\";\n                clear: both;\n                display: table;\n            }\n\n        .main-content-area {\n            padding-left: 30px;\n        }\n\n        .content-title {\n            color: #000000;\n            font-family: \"Segoe UI\";\n            font-size: 46px;\n            font-weight: 300;\n            line-height: 62px;\n        }\n\n        .main-text {\n            color: #808080;\n            font-size: 24px;\n            font-family: \"Segoe UI\";\n            font-size: 24px;\n            font-weight: 200;\n            line-height: 32px;\n        }\n\n        .main-text-p1 {\n            padding-top: 48px;\n            padding-bottom: 28px;\n        }\n\n        .endpoint {\n            height: 32px;\n            width: 571px;\n            color: #808080;\n            font-family: \"Segoe UI\";\n            font-size: 24px;\n            font-weight: 200;\n            line-height: 32px;\n            padding-top: 28px;\n        }\n\n        .how-to-build-section {\n            padding-top: 20px;\n            padding-left: 30px;\n        }\n\n            .how-to-build-section > h3 {\n                font-size: 16px;\n                font-weight: 600;\n                letter-spacing: 0.35px;\n                line-height: 22px;\n                margin: 0 0 24px 0;\n                text-transform: uppercase;\n            }\n\n        .step-container {\n            display: flex;\n            align-items: stretch;\n            position: relative;\n        }\n\n            .step-container dl {\n                border-left: 1px solid #A0A0A0;\n                display: block;\n                padding: 0 24px;\n                margin: 0;\n            }\n\n                .step-container dl > dt::before {\n                    background-color: white;\n                    border: 1px solid #A0A0A0;\n                    border-radius: 100%;\n                    content: '';\n                    left: 47px;\n                    height: 11px;\n                    position: absolute;\n                    width: 11px;\n                }\n\n                .step-container dl > .test-bullet::before {\n                    background-color: blue;\n                }\n\n                .step-container dl > dt {\n                    display: block;\n                    font-size: inherit;\n                    font-weight: bold;\n                    line-height: 20px;\n                }\n\n                .step-container dl > dd {\n                    font-size: inherit;\n                    line-height: 20px;\n                    margin-left: 0;\n                    padding-bottom: 32px;\n                }\n\n            .step-container:last-child dl {\n                border-left: 1px solid transparent;\n            }\n\n        .ctaLink {\n            background-color: transparent;\n            border: 1px solid transparent;\n            color: #006AB1;\n            cursor: pointer;\n            font-weight: 600;\n            padding: 0;\n            white-space: normal;\n        }\n\n            .ctaLink:focus {\n                outline: 1px solid #00bcf2;\n            }\n\n            .ctaLink:hover {\n                text-decoration: underline;\n            }\n\n        .step-icon {\n            display: flex;\n            height: 38px;\n            margin-right: 15px;\n            width: 38px;\n        }\n\n            .step-icon > div {\n                height: 30px;\n                width: 30px;\n                background-repeat: no-repeat;\n            }\n\n        .ms-logo-container {\n            min-width: 580px;\n            max-width: 980px;\n            margin-left: auto;\n            margin-right: auto;\n            left: 0;\n            right: 0;\n            transition: bottom 400ms;\n        }\n\n        .ms-logo {\n            float: right;\n            background-image: url(\"data:image/svg+xml;utf8,%0A%3Csvg%20version%3D%221.1%22%20id%3D%22MS-symbol%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20400%20120%22%20style%3D%22enable-background%3Anew%200%200%20400%20120%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23737474%3B%7D%0A%09.st2%7Bfill%3A%23D63F26%3B%7D%0A%09.st3%7Bfill%3A%23167D3E%3B%7D%0A%09.st4%7Bfill%3A%232E76BC%3B%7D%0A%09.st5%7Bfill%3A%23FDB813%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.6%22%20class%3D%22st0%22%20width%3D%22398.7%22%20height%3D%22119%22/%3E%0A%3Cpath%20class%3D%22st1%22%20d%3D%22M171.3%2C38.4v43.2h-7.5V47.7h-0.1l-13.4%2C33.9h-5l-13.7-33.9h-0.1v33.9h-6.9V38.4h10.8l12.4%2C32h0.2l13.1-32H171.3%0A%09z%20M177.6%2C41.7c0-1.2%2C0.4-2.2%2C1.3-3c0.9-0.8%2C1.9-1.2%2C3.1-1.2c1.3%2C0%2C2.4%2C0.4%2C3.2%2C1.3c0.8%2C0.8%2C1.3%2C1.8%2C1.3%2C3c0%2C1.2-0.4%2C2.2-1.3%2C3%0A%09c-0.9%2C0.8-1.9%2C1.2-3.2%2C1.2s-2.3-0.4-3.1-1.2C178%2C43.8%2C177.6%2C42.8%2C177.6%2C41.7z%20M185.7%2C50.6v31h-7.3v-31H185.7z%20M207.8%2C76.3%0A%09c1.1%2C0%2C2.3-0.3%2C3.6-0.8c1.3-0.5%2C2.5-1.2%2C3.6-2v6.8c-1.2%2C0.7-2.5%2C1.2-4%2C1.5c-1.5%2C0.3-3.1%2C0.5-4.9%2C0.5c-4.6%2C0-8.3-1.4-11.1-4.3%0A%09c-2.9-2.9-4.3-6.6-4.3-11c0-5%2C1.5-9.1%2C4.4-12.3c2.9-3.2%2C7-4.8%2C12.4-4.8c1.4%2C0%2C2.7%2C0.2%2C4.1%2C0.5c1.4%2C0.4%2C2.5%2C0.8%2C3.3%2C1.2v7%0A%09c-1.1-0.8-2.3-1.5-3.4-1.9c-1.2-0.5-2.4-0.7-3.6-0.7c-2.9%2C0-5.2%2C0.9-7%2C2.8c-1.8%2C1.9-2.7%2C4.4-2.7%2C7.6c0%2C3.1%2C0.8%2C5.6%2C2.5%2C7.3%0A%09C202.6%2C75.4%2C204.9%2C76.3%2C207.8%2C76.3z%20M235.7%2C50.1c0.6%2C0%2C1.1%2C0%2C1.6%2C0.1s0.9%2C0.2%2C1.2%2C0.3v7.4c-0.4-0.3-0.9-0.5-1.7-0.8%0A%09c-0.7-0.3-1.6-0.4-2.7-0.4c-1.8%2C0-3.3%2C0.8-4.5%2C2.3c-1.2%2C1.5-1.9%2C3.8-1.9%2C7v15.6h-7.3v-31h7.3v4.9h0.1c0.7-1.7%2C1.7-3%2C3-4%0A%09C232.2%2C50.6%2C233.8%2C50.1%2C235.7%2C50.1z%20M238.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3%0A%09c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5c-4.8%2C0-8.6-1.4-11.4-4.2C240.3%2C75.3%2C238.9%2C71.4%2C238.9%2C66.6z%0A%09%20M246.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5%0A%09c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7C247.2%2C60.5%2C246.5%2C63%2C246.5%2C66.3z%20M281.5%2C58.8c0%2C1%2C0.3%2C1.9%2C1%2C2.5%0A%09c0.7%2C0.6%2C2.1%2C1.3%2C4.4%2C2.2c2.9%2C1.2%2C5%2C2.5%2C6.1%2C3.9c1.2%2C1.5%2C1.8%2C3.2%2C1.8%2C5.3c0%2C2.9-1.1%2C5.3-3.4%2C7c-2.2%2C1.8-5.3%2C2.7-9.1%2C2.7%0A%09c-1.3%2C0-2.7-0.2-4.3-0.5c-1.6-0.3-2.9-0.7-4-1.2v-7.2c1.3%2C0.9%2C2.8%2C1.7%2C4.3%2C2.2c1.5%2C0.5%2C2.9%2C0.8%2C4.2%2C0.8c1.6%2C0%2C2.9-0.2%2C3.6-0.7%0A%09c0.8-0.5%2C1.2-1.2%2C1.2-2.3c0-1-0.4-1.9-1.2-2.5c-0.8-0.7-2.4-1.5-4.6-2.4c-2.7-1.1-4.6-2.4-5.7-3.8c-1.1-1.4-1.7-3.2-1.7-5.4%0A%09c0-2.8%2C1.1-5.1%2C3.3-6.9c2.2-1.8%2C5.1-2.7%2C8.6-2.7c1.1%2C0%2C2.3%2C0.1%2C3.6%2C0.4c1.3%2C0.2%2C2.5%2C0.6%2C3.4%2C0.9v6.9c-1-0.6-2.1-1.2-3.4-1.7%0A%09c-1.3-0.5-2.6-0.7-3.8-0.7c-1.4%2C0-2.5%2C0.3-3.2%2C0.8C281.9%2C57.1%2C281.5%2C57.8%2C281.5%2C58.8z%20M297.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2%0A%09c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5%0A%09c-4.8%2C0-8.6-1.4-11.4-4.2C299.4%2C75.3%2C297.9%2C71.4%2C297.9%2C66.6z%20M305.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6%0A%09c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7%0A%09C306.3%2C60.5%2C305.5%2C63%2C305.5%2C66.3z%20M353.9%2C56.6h-10.9v25h-7.4v-25h-5.2v-6h5.2v-4.3c0-3.3%2C1.1-5.9%2C3.2-8c2.1-2.1%2C4.8-3.1%2C8.1-3.1%0A%09c0.9%2C0%2C1.7%2C0%2C2.4%2C0.1c0.7%2C0.1%2C1.3%2C0.2%2C1.8%2C0.4V42c-0.2-0.1-0.7-0.3-1.3-0.5c-0.6-0.2-1.3-0.3-2.1-0.3c-1.5%2C0-2.7%2C0.5-3.5%2C1.4%0A%09s-1.2%2C2.4-1.2%2C4.2v3.7h10.9v-7l7.3-2.2v9.2h7.4v6h-7.4v14.5c0%2C1.9%2C0.3%2C3.3%2C1%2C4c0.7%2C0.8%2C1.8%2C1.2%2C3.3%2C1.2c0.4%2C0%2C0.9-0.1%2C1.5-0.3%0A%09c0.6-0.2%2C1.1-0.4%2C1.6-0.7v6c-0.5%2C0.3-1.2%2C0.5-2.3%2C0.7c-1.1%2C0.2-2.1%2C0.3-3.2%2C0.3c-3.1%2C0-5.4-0.8-6.9-2.5c-1.5-1.6-2.3-4.1-2.3-7.4%0A%09V56.6z%22/%3E%0A%3Cg%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2224%22%20class%3D%22st2%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2224%22%20class%3D%22st3%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2261.8%22%20class%3D%22st4%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2261.8%22%20class%3D%22st5%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A\");\n        }\n\n        .ms-logo-container > div {\n            min-height: 60px;\n            width: 150px;\n            background-repeat: no-repeat;\n        }\n\n        .row {\n            padding: 90px 0px 0 20px;\n            min-width: 480px;\n            max-width: 1366px;\n            margin-left: auto;\n            margin-right: auto;\n        }\n\n        .column {\n            float: left;\n            width: 45%;\n            padding-right: 20px;\n        }\n\n        .row:after {\n            content: \"\";\n            display: table;\n            clear: both;\n        }\n\n        a {\n            text-decoration: none;\n        }\n\n        .download-the-emulator {\n            height: 20px;\n            color: #0063B1;\n            font-size: 15px;\n            line-height: 20px;\n            padding-bottom: 70px;\n        }\n\n        .how-to-iframe {\n            max-width: 700px !important;\n            min-width: 650px !important;\n            height: 700px !important;\n        }\n\n        .remove-frame-height {\n            height: 10px;\n        }\n\n        @media only screen and (max-width: 1300px) {\n            .ms-logo {\n                padding-top: 30px;\n            }\n\n            .header-text {\n                font-size: 40x;\n            }\n\n            .column {\n                float: none;\n                padding-top: 30px;\n                width: 100%;\n            }\n\n            .ms-logo-container {\n                padding-top: 30px;\n                min-width: 480px;\n                max-width: 650px;\n                margin-left: auto;\n                margin-right: auto;\n            }\n\n            .row {\n                padding: 20px 0px 0 20px;\n                min-width: 480px;\n                max-width: 650px;\n                margin-left: auto;\n                margin-right: auto;\n            }\n        }\n\n        @media only screen and (max-width: 1370px) {\n            header {\n                background-color: #55A0E0;\n                background-size: auto 200px;\n            }\n        }\n\n        @media only screen and (max-width: 1230px) {\n            header {\n                background-color: #55A0E0;\n                background-size: auto 200px;\n            }\n\n            .header-text {\n                font-size: 44px;\n            }\n\n            .header-icon {\n                height: 120px;\n                width: 120px;\n            }\n        }\n\n        @media only screen and (max-width: 1000px) {\n            header {\n                background-color: #55A0E0;\n                background-image: none;\n            }\n        }\n\n        @media only screen and (max-width: 632px) {\n            .header-text {\n                font-size: 32px;\n            }\n\n            .row {\n                padding: 10px 0px 0 10px;\n                max-width: 490px !important;\n                min-width: 410px !important;\n            }\n\n            .endpoint {\n                font-size: 25px;\n            }\n\n            .main-text {\n                font-size: 20px;\n            }\n\n            .step-container dl > dd {\n                font-size: 14px;\n            }\n\n            .column {\n                padding-right: 5px;\n            }\n\n            .header-icon {\n                height: 110px;\n                width: 110px;\n            }\n\n            .how-to-iframe {\n                max-width: 480px !important;\n                min-width: 400px !important;\n                height: 650px !important;\n                overflow: hidden;\n            }\n        }\n\n        .remove-frame-height {\n            max-height: 10px;\n        }\n    </style>\n    <script>\n        document.addEventListener('DOMContentLoaded', function () {\n            loadFrame();\n        });\n        var loadFrame = function () {\n            var iframe = document.createElement('iframe');\n            iframe.setAttribute(\"id\", \"iframe\");\n            var offLineHTMLContent = \"\";\n            var frameElement = document.getElementById(\"how-to-iframe\");\n            if (window.navigator.onLine) {\n                iframe.src = 'https://docs.botframework.com/static/abs/pages/f5.htm';\n                iframe.setAttribute(\"scrolling\", \"no\");\n                iframe.setAttribute(\"frameborder\", \"0\");\n                iframe.setAttribute(\"width\", \"100%\");\n                iframe.setAttribute(\"height\", \"100%\");\n                var frameDiv = document.getElementById(\"how-to-iframe\");\n                frameDiv.appendChild(iframe);\n            } else {\n                frameElement.classList.add(\"remove-frame-height\");\n            }\n        };\n    </script>\n</head>\n\n<body>\n    <header class=\"header\">\n        <div class=\"header-inner-container\">\n            <div class=\"header-icon\" style=\"display: inline-block\"></div>\n            <div class=\"header-text\" style=\"display: inline-block\">Dialog with Interruptions Bot</div>\n        </div>\n    </header>\n    <div class=\"row\">\n        <div class=\"column\" class=\"main-content-area\">\n            <div class=\"content-title\">Your bot is ready!</div>\n            <div class=\"main-text main-text-p1\">\n                You can test your bot in the Bot Framework Emulator<br />\n                by opening the .bot file in the project folder.\n            </div>\n            <div class=\"main-text download-the-emulator\">\n                <a class=\"ctaLink\" href=\"https://aka.ms/bot-framework-F5-download-emulator\"\n                   target=\"_blank\">Download the Emulator</a>\n            </div>\n            <div class=\"main-text\">\n                Visit <a class=\"ctaLink\" href=\"https://aka.ms/bot-framework-F5-abs-home\" target=\"_blank\">\n                    Azure\n                    Bot Service\n                </a> to register your bot and add it to<br />\n                various channels. The bot's endpoint URL typically looks\n                like this:\n            </div>\n            <div class=\"endpoint\">https://<i>your_bots_hostname</i>/api/messages</div>\n        </div>\n        <div class=\"column how-to-iframe\" id=\"how-to-iframe\"></div>\n    </div>\n    </div>\n    <div class=\"ms-logo-container\">\n        <div class=\"ms-logo\"></div>\n    </div>\n</body>\n\n</html>\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogPromptBot/DeploymentScripts/MsbotClone/bot.recipe",
    "content": "{\n  \"version\": \"1.0\",\n  \"resources\": [\n    {\n      \"type\": \"endpoint\",\n      \"id\": \"1\",\n      \"name\": \"development\",\n      \"url\": \"http://localhost:3978/api/messages\"\n    },\n    {\n      \"type\": \"endpoint\",\n      \"id\": \"2\",\n      \"name\": \"production\",\n      \"url\": \"https://your-bot-url.azurewebsites.net/api/messages\"\n    },\n    {\n      \"type\": \"abs\",\n      \"id\": \"3\",\n      \"name\": \"DialogPromptBot-abs\"\n    },\n    {\n      \"type\": \"appInsights\",\n      \"id\": \"4\",\n      \"name\": \"DialogPromptBot-insights\"\n    },\n    {\n      \"type\": \"blob\",\n      \"id\": \"5\",\n      \"name\": \"DialogPromptBot-blob\",\n      \"container\": \"botstatestore\"\n    }\n  ]\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogPromptBot/DialogPromptBot.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Builder.Dialogs.Choices;\nusing Microsoft.Bot.Schema;\nusing Microsoft.Extensions.Logging;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    /// <summary>\n    /// Represents a bot that processes incoming activities.\n    /// For each user interaction, an instance of this class is created and the OnTurnAsync method\n    /// is called. This is a Transient lifetime service.  Transient lifetime services are created\n    /// each time they're requested. For each Activity received, a new instance of this class is\n    /// created. Objects that are expensive to construct, or have a lifetime beyond the single\n    /// turn, should be carefully managed. For example, the <see cref=\"MemoryStorage\"/> object and\n    /// associated <see cref=\"IStatePropertyAccessor{T}\"/> object are created with a singleton lifetime.\n    /// </summary>\n    public class DialogPromptBot : IBot\n    {\n        // Define identifiers for our dialogs and prompts.\n        private const string ReservationDialog = \"reservationDialog\";\n        private const string SizeRangePrompt = \"sizeRangePrompt\";\n        private const string LocationPrompt = \"locationPrompt\";\n        private const string ReservationDatePrompt = \"reservationDatePrompt\";\n\n        // Define keys for tracked values within the dialog.\n        private const string LocationKey = \"location\";\n        private const string PartySizeKey = \"partySize\";\n\n        private readonly DialogSet _dialogSet;\n        private readonly DialogPromptBotAccessors _accessors;\n        private readonly ILogger _logger;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"DialogPromptBot\"/> class.\n        /// </summary>\n        /// <param name=\"accessors\">A class containing <see cref=\"IStatePropertyAccessor{T}\"/> used\n        /// to manage state.</param>\n        /// <param name=\"loggerFactory\">A <see cref=\"ILoggerFactory\"/> that is hooked to the Azure\n        /// App Service provider.</param>\n        public DialogPromptBot(DialogPromptBotAccessors accessors, ILoggerFactory loggerFactory)\n        {\n            if (loggerFactory == null)\n            {\n                throw new System.ArgumentNullException(nameof(loggerFactory));\n            }\n\n            _logger = loggerFactory.CreateLogger<DialogPromptBot>();\n            _logger.LogTrace(\"EchoBot turn start.\");\n            _accessors = accessors ?? throw new System.ArgumentNullException(nameof(accessors));\n\n            // Create the dialog set and add the prompts, including custom validation.\n            _dialogSet = new DialogSet(_accessors.DialogStateAccessor);\n\n            _dialogSet.Add(new NumberPrompt<int>(SizeRangePrompt, RangeValidatorAsync));\n            _dialogSet.Add(new ChoicePrompt(LocationPrompt));\n            _dialogSet.Add(new DateTimePrompt(ReservationDatePrompt, DateValidatorAsync));\n\n            // Define the steps of the waterfall dialog and add it to the set.\n            var steps = new WaterfallStep[]\n            {\n                PromptForPartySizeAsync,\n                PromptForLocationAsync,\n                PromptForReservationDateAsync,\n                AcknowledgeReservationAsync,\n            };\n\n            _dialogSet.Add(new WaterfallDialog(ReservationDialog, steps));\n        }\n\n        /// <summary>\n        /// Every conversation turn for our Echo Bot will call this method.\n        /// There are no dialogs used, since it's \"single turn\" processing, meaning a single\n        /// request and response.\n        /// </summary>\n        /// <param name=\"turnContext\">A <see cref=\"ITurnContext\"/> containing all the data needed\n        /// for processing this conversation turn. </param>\n        /// <param name=\"cancellationToken\">(Optional) A <see cref=\"CancellationToken\"/> that can\n        /// be used by other objects or threads to receive notice of cancellation.</param>\n        /// <returns>A <see cref=\"Task\"/> that represents the work queued to execute.</returns>\n        /// <seealso cref=\"BotStateSet\"/>\n        /// <seealso cref=\"ConversationState\"/>\n        /// <seealso cref=\"IMiddleware\"/>\n        public async Task OnTurnAsync(\n            ITurnContext turnContext,\n            CancellationToken cancellationToken = default(CancellationToken))\n        {\n            switch (turnContext.Activity.Type)\n            {\n                // On a message from the user:\n                case ActivityTypes.Message:\n\n                    // Get the current reservation info from state.\n                    var reservation = await _accessors.ReservationAccessor.GetAsync(\n                        turnContext,\n                        () => null,\n                        cancellationToken);\n\n                    // Generate a dialog context for our dialog set.\n                    var dc = await _dialogSet.CreateContextAsync(turnContext, cancellationToken);\n\n                    if (dc.ActiveDialog is null)\n                    {\n                        // If there is no active dialog, check whether we have a reservation yet.\n                        if (reservation is null)\n                        {\n                            // If not, start the dialog.\n                            await dc.BeginDialogAsync(ReservationDialog, null, cancellationToken);\n                        }\n                        else\n                        {\n                            // Otherwise, send a status message.\n                            await turnContext.SendActivityAsync(\n                                $\"We'll see you on {reservation.Date}.\",\n                                cancellationToken: cancellationToken);\n                        }\n                    }\n                    else\n                    {\n                        // Continue the dialog.\n                        var dialogTurnResult = await dc.ContinueDialogAsync(cancellationToken);\n\n                        // If the dialog completed this turn, record the reservation info.\n                        if (dialogTurnResult.Status is DialogTurnStatus.Complete)\n                        {\n                            reservation = (Reservation)dialogTurnResult.Result;\n                            await _accessors.ReservationAccessor.SetAsync(\n                                turnContext,\n                                reservation,\n                                cancellationToken);\n\n                            // Send a confirmation message to the user.\n                            await turnContext.SendActivityAsync(\n                                $\"Your party of {reservation.Size} is confirmed for \" +\n                                $\"{reservation.Date} in {reservation.Location}.\",\n                                cancellationToken: cancellationToken);\n                        }\n                    }\n\n                    // Save the updated dialog state into the conversation state.\n                    await _accessors.ConversationState.SaveChangesAsync(\n                        turnContext, false, cancellationToken);\n                    break;\n            }\n        }\n\n        /// <summary>First step of the main dialog: prompt for party size.</summary>\n        /// <param name=\"stepContext\">The context for the waterfall step.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>If the task is successful, the result contains information from this step.</remarks>\n        private async Task<DialogTurnResult> PromptForPartySizeAsync(\n            WaterfallStepContext stepContext,\n            CancellationToken cancellationToken = default(CancellationToken))\n        {\n            // Prompt for the party size. The result of the prompt is returned to the next step of the waterfall.\n            return await stepContext.PromptAsync(\n                SizeRangePrompt,\n                new PromptOptions\n                {\n                    Prompt = MessageFactory.Text(\"How many people is the reservation for?\"),\n                    RetryPrompt = MessageFactory.Text(\"How large is your party?\"),\n                    Validations = new Range { Min = 3, Max = 8 },\n                },\n                cancellationToken);\n        }\n\n        /// <summary>Second step of the main dialog: prompt for location.</summary>\n        /// <param name=\"stepContext\">The context for the waterfall step.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>If the task is successful, the result contains information from this step.</remarks>\n        private async Task<DialogTurnResult> PromptForLocationAsync(\n            WaterfallStepContext stepContext,\n            CancellationToken cancellationToken)\n        {\n            // Record the party size information in the current dialog state.\n            var size = (int)stepContext.Result;\n            stepContext.Values[PartySizeKey] = size;\n\n            // Prompt for the location.\n            return await stepContext.PromptAsync(\n                LocationPrompt,\n                new PromptOptions\n                {\n                    Prompt = MessageFactory.Text(\"Please choose a location.\"),\n                    RetryPrompt = MessageFactory.Text(\"Sorry, please choose a location from the list.\"),\n                    Choices = ChoiceFactory.ToChoices(new List<string> { \"Redmond\", \"Bellevue\", \"Seattle\" }),\n                },\n                cancellationToken);\n        }\n\n        /// <summary>Third step of the main dialog: prompt for the reservation date.</summary>\n        /// <param name=\"stepContext\">The context for the waterfall step.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>If the task is successful, the result contains information from this step.</remarks>\n        private async Task<DialogTurnResult> PromptForReservationDateAsync(\n            WaterfallStepContext stepContext,\n            CancellationToken cancellationToken = default(CancellationToken))\n        {\n            // Record the party size information in the current dialog state.\n            var location = (stepContext.Result as FoundChoice).Value;\n            stepContext.Values[LocationKey] = location;\n\n            // Prompt for the reservation date.\n            return await stepContext.PromptAsync(\n                ReservationDatePrompt,\n                new PromptOptions\n                {\n                    Prompt = MessageFactory.Text(\"Great. When will the reservation be for?\"),\n                    RetryPrompt = MessageFactory.Text(\"What time should we make your reservation for?\"),\n                },\n                cancellationToken);\n        }\n\n        /// <summary>Last step of the main dialog: return the collected reservation information.</summary>\n        /// <param name=\"stepContext\">The context for the waterfall step.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>If the task is successful, the result contains information from this step.</remarks>\n        private async Task<DialogTurnResult> AcknowledgeReservationAsync(\n            WaterfallStepContext stepContext,\n            CancellationToken cancellationToken = default(CancellationToken))\n        {\n            // Retrieve the reservation date.\n            var resolution = (stepContext.Result as IList<DateTimeResolution>).First();\n            var time = resolution.Value ?? resolution.Start;\n\n            // Send an acknowledgement to the user.\n            await stepContext.Context.SendActivityAsync(\n                \"Thank you. We will confirm your reservation shortly.\",\n                cancellationToken: cancellationToken);\n\n            // Return the collected information to the parent context.\n            var reservation = new Reservation\n            {\n                Date = time,\n                Size = (int)stepContext.Values[PartySizeKey],\n                Location = (string)stepContext.Values[LocationKey],\n            };\n            return await stepContext.EndDialogAsync(reservation, cancellationToken);\n        }\n\n        /// <summary>Validates whether the party size is appropriate to make a reservation.</summary>\n        /// <param name=\"promptContext\">The validation context.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>Reservations can be made for groups of 6 to 20 people.\n        /// If the task is successful, the result indicates whether the input was valid.</remarks>\n        private async Task<bool> RangeValidatorAsync(\n            PromptValidatorContext<int> promptContext,\n            CancellationToken cancellationToken)\n        {\n            // Check whether the input could be recognized as an integer.\n            if (!promptContext.Recognized.Succeeded)\n            {\n                await promptContext.Context.SendActivityAsync(\n                    \"I'm sorry, I do not understand. Please enter the number of people in your party.\",\n                    cancellationToken: cancellationToken);\n                return false;\n            }\n\n            // Check whether the party size is appropriate.\n            var size = promptContext.Recognized.Value;\n            var validRange = promptContext.Options.Validations as Range;\n            if (size < validRange.Min || size > validRange.Max)\n            {\n                await promptContext.Context.SendActivitiesAsync(\n                    new Activity[]\n                    {\n                        MessageFactory.Text($\"Sorry, we can only take reservations for parties \" +\n                            $\"of {validRange.Min} to {validRange.Max}.\"),\n                        promptContext.Options.RetryPrompt,\n                    },\n                    cancellationToken: cancellationToken);\n                return false;\n            }\n\n            return true;\n        }\n\n        /// <summary>Validates whether the reservation date is appropriate.</summary>\n        /// <param name=\"promptContext\">The validation context.</param>\n        /// <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        /// <remarks>Reservations must be made at least an hour in advance.\n        /// If the task is successful, the result indicates whether the input was valid.</remarks>\n        private async Task<bool> DateValidatorAsync(\n            PromptValidatorContext<IList<DateTimeResolution>> promptContext,\n            CancellationToken cancellationToken = default(CancellationToken))\n        {\n            // Check whether the input could be recognized as an integer.\n            if (!promptContext.Recognized.Succeeded)\n            {\n                await promptContext.Context.SendActivityAsync(\n                    \"I'm sorry, I do not understand. Please enter the date or time for your reservation.\",\n                    cancellationToken: cancellationToken);\n                return false;\n            }\n\n            // Check whether any of the recognized date-times are appropriate,\n            // and if so, return the first appropriate date-time.\n            var earliest = DateTime.Now.AddHours(1.0);\n            var value = promptContext.Recognized.Value.FirstOrDefault(v =>\n                DateTime.TryParse(v.Value ?? v.Start, out var time) && DateTime.Compare(earliest, time) <= 0);\n            if (value != null)\n            {\n                promptContext.Recognized.Value.Clear();\n                promptContext.Recognized.Value.Add(value);\n                return true;\n            }\n\n            await promptContext.Context.SendActivityAsync(\n                    \"I'm sorry, we can't take reservations earlier than an hour from now.\",\n                    cancellationToken: cancellationToken);\n            return false;\n        }\n\n        /// <summary>Describes an acceptable range of values.</summary>\n        public class Range\n        {\n            public int Min { get; set; }\n\n            public int Max { get; set; }\n        }\n\n        /// <summary>Holds a user's reservation information.</summary>\n        public class Reservation\n        {\n            public int Size { get; set; }\n\n            public string Location { get; set; }\n\n            public string Date { get; set; }\n        }\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogPromptBot/DialogPromptBot.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n    <CodeAnalysisRuleSet>DialogPromptBot.ruleset</CodeAnalysisRuleSet>\n    <DocumentationFile>$(OutputPath)$(AssemblyName).xml</DocumentationFile>\n    <NoWarn>$(NoWarn),1573,1591,1712</NoWarn>\n  </PropertyGroup>\n\n\n  <ItemGroup>\n    <Content Include=\"dialog-prompt.bot\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.AspNetCore\" Version=\"2.1.3\" />\n    <PackageReference Include=\"Microsoft.AspNetCore.All\" Version=\"2.0.7\" />\n    <PackageReference Include=\"AsyncUsageAnalyzers\" Version=\"1.0.0-alpha003\" PrivateAssets=\"all\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder\" Version=\"4.2.2\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder.Dialogs\" Version=\"4.2.2\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder.Integration.AspNet.Core\" Version=\"4.2.2\" />\n    <PackageReference Include=\"Microsoft.Bot.Configuration\" Version=\"4.2.2\" />\n    <PackageReference Include=\"Microsoft.Bot.Connector\" Version=\"4.2.2\" />\n    <PackageReference Include=\"Microsoft.Bot.Schema\" Version=\"4.2.2\" />\n    <PackageReference Include=\"Microsoft.Extensions.Logging.AzureAppServices\" Version=\"2.1.1\" />\n    <PackageReference Include=\"StyleCop.Analyzers\" Version=\"1.1.0-beta008\" PrivateAssets=\"all\" />\n  </ItemGroup>\n\n\n</Project>\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogPromptBot/DialogPromptBot.ruleset",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RuleSet Name=\"Microsoft Managed Recommended Rules\" Description=\"These rules focus on the most critical problems in your code, including potential security holes, application crashes, and other important logic and design errors. It is recommended to include this rule set in any custom rule set you create for your projects.\" ToolsVersion=\"10.0\">\n  <Localization ResourceAssembly=\"Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.dll\" ResourceBaseName=\"Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.Localized\">\n    <Name Resource=\"MinimumRecommendedRules_Name\" />\n    <Description Resource=\"MinimumRecommendedRules_Description\" />\n  </Localization>\n  <Rules AnalyzerId=\"StyleCop.Analyzers\" RuleNamespace=\"StyleCop.Analyzers\">\n    <Rule Id=\"SA1011\" Action=\"None\" />\n    <Rule Id=\"SA1200\" Action=\"None\" />\n    <Rule Id=\"SA1101\" Action=\"None\" />\n    <Rule Id=\"SA1129\" Action=\"None\" />\n    <Rule Id=\"SA1305\" Action=\"Warning\" />\n    <Rule Id=\"SA1309\" Action=\"None\" />\n    <Rule Id=\"SA1412\" Action=\"Warning\" />\n    <Rule Id=\"SA1600\" Action=\"None\" />\n    <Rule Id=\"SA1609\" Action=\"Warning\" />\n    <Rule Id=\"SA1633\" Action=\"None\" />\n  </Rules>\n  <Rules AnalyzerId=\"AsyncUsageAnalyzers\" RuleNamespace=\"AsyncUsageAnalyzers\">\n    <Rule Id=\"AvoidAsyncVoid\" Action=\"Warning\" />\n  </Rules>\n</RuleSet>"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogPromptBot/DialogPromptBot.xml",
    "content": "<?xml version=\"1.0\"?>\n<doc>\n    <assembly>\n        <name>DialogPromptBot</name>\n    </assembly>\n    <members>\n        <member name=\"T:Microsoft.BotBuilderSamples.DialogPromptBot\">\n            <summary>\n            Represents a bot that processes incoming activities.\n            For each user interaction, an instance of this class is created and the OnTurnAsync method\n            is called. This is a Transient lifetime service.  Transient lifetime services are created\n            each time they're requested. For each Activity received, a new instance of this class is\n            created. Objects that are expensive to construct, or have a lifetime beyond the single\n            turn, should be carefully managed. For example, the <see cref=\"T:Microsoft.Bot.Builder.MemoryStorage\"/> object and\n            associated <see cref=\"T:Microsoft.Bot.Builder.IStatePropertyAccessor`1\"/> object are created with a singleton lifetime.\n            </summary>\n        </member>\n        <member name=\"M:Microsoft.BotBuilderSamples.DialogPromptBot.#ctor(Microsoft.BotBuilderSamples.DialogPromptBotAccessors,Microsoft.Extensions.Logging.ILoggerFactory)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Microsoft.BotBuilderSamples.DialogPromptBot\"/> class.\n            </summary>\n            <param name=\"accessors\">A class containing <see cref=\"T:Microsoft.Bot.Builder.IStatePropertyAccessor`1\"/> used\n            to manage state.</param>\n            <param name=\"loggerFactory\">A <see cref=\"T:Microsoft.Extensions.Logging.ILoggerFactory\"/> that is hooked to the Azure\n            App Service provider.</param>\n        </member>\n        <member name=\"M:Microsoft.BotBuilderSamples.DialogPromptBot.OnTurnAsync(Microsoft.Bot.Builder.ITurnContext,System.Threading.CancellationToken)\">\n            <summary>\n            Every conversation turn for our Echo Bot will call this method.\n            There are no dialogs used, since it's \"single turn\" processing, meaning a single\n            request and response.\n            </summary>\n            <param name=\"turnContext\">A <see cref=\"T:Microsoft.Bot.Builder.ITurnContext\"/> containing all the data needed\n            for processing this conversation turn. </param>\n            <param name=\"cancellationToken\">(Optional) A <see cref=\"T:System.Threading.CancellationToken\"/> that can\n            be used by other objects or threads to receive notice of cancellation.</param>\n            <returns>A <see cref=\"T:System.Threading.Tasks.Task\"/> that represents the work queued to execute.</returns>\n            <seealso cref=\"T:Microsoft.Bot.Builder.BotStateSet\"/>\n            <seealso cref=\"T:Microsoft.Bot.Builder.ConversationState\"/>\n            <seealso cref=\"T:Microsoft.Bot.Builder.IMiddleware\"/>\n        </member>\n        <member name=\"M:Microsoft.BotBuilderSamples.DialogPromptBot.PromptForPartySizeAsync(Microsoft.Bot.Builder.Dialogs.WaterfallStepContext,System.Threading.CancellationToken)\">\n            <summary>First step of the main dialog: prompt for party size.</summary>\n            <param name=\"stepContext\">The context for the waterfall step.</param>\n            <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n            or threads to receive notice of cancellation.</param>\n            <returns>A task that represents the work queued to execute.</returns>\n            <remarks>If the task is successful, the result contains information from this step.</remarks>\n        </member>\n        <member name=\"M:Microsoft.BotBuilderSamples.DialogPromptBot.PromptForLocationAsync(Microsoft.Bot.Builder.Dialogs.WaterfallStepContext,System.Threading.CancellationToken)\">\n            <summary>Second step of the main dialog: prompt for location.</summary>\n            <param name=\"stepContext\">The context for the waterfall step.</param>\n            <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n            or threads to receive notice of cancellation.</param>\n            <returns>A task that represents the work queued to execute.</returns>\n            <remarks>If the task is successful, the result contains information from this step.</remarks>\n        </member>\n        <member name=\"M:Microsoft.BotBuilderSamples.DialogPromptBot.PromptForReservationDateAsync(Microsoft.Bot.Builder.Dialogs.WaterfallStepContext,System.Threading.CancellationToken)\">\n            <summary>Third step of the main dialog: prompt for the reservation date.</summary>\n            <param name=\"stepContext\">The context for the waterfall step.</param>\n            <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n            or threads to receive notice of cancellation.</param>\n            <returns>A task that represents the work queued to execute.</returns>\n            <remarks>If the task is successful, the result contains information from this step.</remarks>\n        </member>\n        <member name=\"M:Microsoft.BotBuilderSamples.DialogPromptBot.AcknowledgeReservationAsync(Microsoft.Bot.Builder.Dialogs.WaterfallStepContext,System.Threading.CancellationToken)\">\n            <summary>Last step of the main dialog: return the collected reservation information.</summary>\n            <param name=\"stepContext\">The context for the waterfall step.</param>\n            <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n            or threads to receive notice of cancellation.</param>\n            <returns>A task that represents the work queued to execute.</returns>\n            <remarks>If the task is successful, the result contains information from this step.</remarks>\n        </member>\n        <member name=\"M:Microsoft.BotBuilderSamples.DialogPromptBot.RangeValidatorAsync(Microsoft.Bot.Builder.Dialogs.PromptValidatorContext{System.Int32},System.Threading.CancellationToken)\">\n            <summary>Validates whether the party size is appropriate to make a reservation.</summary>\n            <param name=\"promptContext\">The validation context.</param>\n            <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n            or threads to receive notice of cancellation.</param>\n            <returns>A task that represents the work queued to execute.</returns>\n            <remarks>Reservations can be made for groups of 6 to 20 people.\n            If the task is successful, the result indicates whether the input was valid.</remarks>\n        </member>\n        <member name=\"M:Microsoft.BotBuilderSamples.DialogPromptBot.DateValidatorAsync(Microsoft.Bot.Builder.Dialogs.PromptValidatorContext{System.Collections.Generic.IList{Microsoft.Bot.Builder.Dialogs.DateTimeResolution}},System.Threading.CancellationToken)\">\n            <summary>Validates whether the reservation date is appropriate.</summary>\n            <param name=\"promptContext\">The validation context.</param>\n            <param name=\"cancellationToken\">A cancellation token that can be used by other objects\n            or threads to receive notice of cancellation.</param>\n            <returns>A task that represents the work queued to execute.</returns>\n            <remarks>Reservations must be made at least an hour in advance.\n            If the task is successful, the result indicates whether the input was valid.</remarks>\n        </member>\n        <member name=\"T:Microsoft.BotBuilderSamples.DialogPromptBot.Range\">\n            <summary>Describes an acceptable range of values.</summary>\n        </member>\n        <member name=\"T:Microsoft.BotBuilderSamples.DialogPromptBot.Reservation\">\n            <summary>Holds a user's reservation information.</summary>\n        </member>\n        <member name=\"T:Microsoft.BotBuilderSamples.DialogPromptBotAccessors\">\n            <summary>\n            This class is created as a Singleton and passed into the IBot-derived constructor.\n             - See <see cref=\"T:Microsoft.BotBuilderSamples.DialogPromptBot\"/> constructor for how that is injected.\n             - See the Startup.cs file for more details on creating the Singleton that gets\n               injected into the constructor.\n            </summary>\n        </member>\n        <member name=\"M:Microsoft.BotBuilderSamples.DialogPromptBotAccessors.#ctor(Microsoft.Bot.Builder.ConversationState)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Microsoft.BotBuilderSamples.DialogPromptBotAccessors\"/> class.\n            Contains the <see cref=\"P:Microsoft.BotBuilderSamples.DialogPromptBotAccessors.ConversationState\"/> and associated <see cref=\"T:Microsoft.Bot.Builder.IStatePropertyAccessor`1\"/>.\n            </summary>\n            <param name=\"conversationState\">The state object that stores the counter.</param>\n        </member>\n        <member name=\"P:Microsoft.BotBuilderSamples.DialogPromptBotAccessors.DialogStateAccessor\">\n            <summary>\n            Gets or sets the <see cref=\"T:Microsoft.Bot.Builder.IStatePropertyAccessor`1\"/> for CounterState.\n            </summary>\n            <value>\n            The accessor stores the turn count for the conversation.\n            </value>\n        </member>\n        <member name=\"P:Microsoft.BotBuilderSamples.DialogPromptBotAccessors.ConversationState\">\n            <summary>\n            Gets the <see cref=\"P:Microsoft.BotBuilderSamples.DialogPromptBotAccessors.ConversationState\"/> object for the conversation.\n            </summary>\n            <value>The <see cref=\"P:Microsoft.BotBuilderSamples.DialogPromptBotAccessors.ConversationState\"/> object.</value>\n        </member>\n        <member name=\"T:Microsoft.BotBuilderSamples.Startup\">\n            <summary>\n            The Startup class configures services and the request pipeline.\n            </summary>\n        </member>\n        <member name=\"P:Microsoft.BotBuilderSamples.Startup.Configuration\">\n            <summary>\n            Gets the configuration that represents a set of key/value application configuration properties.\n            </summary>\n            <value>\n            The <see cref=\"T:Microsoft.Extensions.Configuration.IConfiguration\"/> that represents a set of key/value application configuration properties.\n            </value>\n        </member>\n        <member name=\"M:Microsoft.BotBuilderSamples.Startup.ConfigureServices(Microsoft.Extensions.DependencyInjection.IServiceCollection)\">\n            <summary>\n            This method gets called by the runtime. Use this method to add services to the container.\n            </summary>\n            <param name=\"services\">The <see cref=\"T:Microsoft.Extensions.DependencyInjection.IServiceCollection\"/> specifies the contract for a collection of service descriptors.</param>\n            <seealso cref=\"T:Microsoft.Bot.Builder.IStatePropertyAccessor`1\"/>\n        </member>\n    </members>\n</doc>\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogPromptBot/DialogPromptBotAccessors.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.Dialogs;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    /// <summary>\n    /// This class is created as a Singleton and passed into the IBot-derived constructor.\n    ///  - See <see cref=\"DialogPromptBot\"/> constructor for how that is injected.\n    ///  - See the Startup.cs file for more details on creating the Singleton that gets\n    ///    injected into the constructor.\n    /// </summary>\n    public class DialogPromptBotAccessors\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"DialogPromptBotAccessors\"/> class.\n        /// Contains the <see cref=\"ConversationState\"/> and associated <see cref=\"IStatePropertyAccessor{T}\"/>.\n        /// </summary>\n        /// <param name=\"conversationState\">The state object that stores the counter.</param>\n        public DialogPromptBotAccessors(ConversationState conversationState)\n        {\n            ConversationState = conversationState\n                ?? throw new ArgumentNullException(nameof(conversationState));\n        }\n\n        public static string DialogStateAccessorKey { get; }\n            = \"DialogPromptBotAccessors.DialogState\";\n\n        public static string ReservationAccessorKey { get; }\n            = \"DialogPromptBotAccessors.Reservation\";\n\n        /// <summary>\n        /// Gets or sets the <see cref=\"IStatePropertyAccessor{T}\"/> for CounterState.\n        /// </summary>\n        /// <value>\n        /// The accessor stores the turn count for the conversation.\n        /// </value>\n        public IStatePropertyAccessor<DialogState> DialogStateAccessor { get; set; }\n\n        public IStatePropertyAccessor<DialogPromptBot.Reservation> ReservationAccessor { get; set; }\n\n        /// <summary>\n        /// Gets the <see cref=\"ConversationState\"/> object for the conversation.\n        /// </summary>\n        /// <value>The <see cref=\"ConversationState\"/> object.</value>\n        public ConversationState ConversationState { get; }\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogPromptBot/Program.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing Microsoft.AspNetCore;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Logging;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            BuildWebHost(args).Run();\n        }\n\n        public static IWebHost BuildWebHost(string[] args) =>\n            WebHost.CreateDefaultBuilder(args)\n                .ConfigureLogging((hostingContext, logging) =>\n                {\n                    // Add Azure Logging\n                    logging.AddAzureWebAppDiagnostics();\n\n                    // Logging Options.\n                    // There are other logging options available:\n                    // https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1\n                    // logging.AddDebug();\n                    // logging.AddConsole();\n                })\n\n                // Logging Options.\n                // Consider using Application Insights for your logging and metrics needs.\n                // https://azure.microsoft.com/en-us/services/application-insights/\n                // .UseApplicationInsights()\n                .UseStartup<Startup>()\n                .Build();\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogPromptBot/Properties/launchSettings.json",
    "content": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:3978/\",\n      \"sslPort\": 0\n    }\n  },\n  \"profiles\": {\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"PromptsBot\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      },\n      \"applicationUrl\": \"http://localhost:3978/\"\n    }\n  }\n}"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogPromptBot/README.md",
    "content": "# Dialog Prompt Bot\n \nThis sample demonstrates how to use dialog prompts in your ASP.Net Core 2 bot to gather and validate user input.\n\n# To try this sample\n- Clone the samples repository\n```bash\ngit clone https://github.com/Microsoft/BotFramework-Samples.git\n```\n- [Optional] Update the `appsettings.json` file under `BotFramework-Samples\\dotnet_core\\DialogPromptBot` with your botFileSecret.  For Azure Bot Service bots, you can find the botFileSecret under application settings.\n# Prerequisites\n## Visual Studio\n- Navigate to the samples folder (`BotFramework-Samples\\SDKV4-Samples\\dotnet_core\\DialogPromptBot`) and open DialogPromptBot.csproj in Visual Studio.\n- Hit F5.\n\n## Visual Studio Code\n- Open `BotFramework-Samples\\SDKV4-Samples\\dotnet_core\\DialogPromptBot` sample folder.\n- Bring up a terminal, navigate to `BotFramework-Samples\\SDKV4-Samples\\dotnet_core\\DialogPromptBot` folder.\n- Type 'dotnet run'.\n\n## Testing the bot using Bot Framework Emulator\n[Microsoft Bot Framework Emulator](https://github.com/microsoft/botframework-emulator) is a desktop application that allows bot \ndevelopers to test and debug their bots on localhost or running remotely through a tunnel.\n- Install the Bot Framework emulator from [here](https://aka.ms/botframeworkemulator).\n\n## Connect to bot using Bot Framework Emulator **V4**\n- Launch the Bot Framework Emulator.\n- File -> Open bot and navigate to `BotFramework-Samples\\SDKV4-Samples\\dotnet_core\\DialogPromptBot` folder.\n- Select `dialog-prompt.bot` file.\n\n# Further reading\n- [Azure Bot Service Introduction](https://docs.microsoft.com/en-us/azure/bot-service/bot-service-overview-introduction?view=azure-bot-service-4.0)\n- [Bot State](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-storage-concept?view=azure-bot-service-4.0)\n- [Managing conversation and user state](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-v4-state?view=azure-bot-service-4.0&tabs=js)\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogPromptBot/Startup.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing System.Linq;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Builder.Integration;\nusing Microsoft.Bot.Builder.Integration.AspNet.Core;\nusing Microsoft.Bot.Configuration;\nusing Microsoft.Bot.Connector.Authentication;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Logging;\nusing Microsoft.Extensions.Options;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    /// <summary>\n    /// The Startup class configures services and the request pipeline.\n    /// </summary>\n    public class Startup\n    {\n        private ILoggerFactory _loggerFactory;\n        private readonly bool _isProduction = false;\n\n        public Startup(IHostingEnvironment env)\n        {\n            _isProduction = env.IsProduction();\n            var builder = new ConfigurationBuilder()\n                .SetBasePath(env.ContentRootPath)\n                .AddJsonFile(\"appsettings.json\", optional: true, reloadOnChange: true)\n                .AddJsonFile($\"appsettings.{env.EnvironmentName}.json\", optional: true)\n                .AddEnvironmentVariables();\n\n            Configuration = builder.Build();\n        }\n\n        /// <summary>\n        /// Gets the configuration that represents a set of key/value application configuration properties.\n        /// </summary>\n        /// <value>\n        /// The <see cref=\"IConfiguration\"/> that represents a set of key/value application configuration properties.\n        /// </value>\n        public IConfiguration Configuration { get; }\n\n        /// <summary>\n        /// This method gets called by the runtime. Use this method to add services to the container.\n        /// </summary>\n        /// <param name=\"services\">The <see cref=\"IServiceCollection\"/> specifies the contract for a collection of service descriptors.</param>\n        /// <seealso cref=\"IStatePropertyAccessor{T}\"/>\n        public void ConfigureServices(IServiceCollection services)\n        {\n            var secretKey = Configuration.GetSection(\"botFileSecret\")?.Value;\n            var botFilePath = Configuration.GetSection(\"botFilePath\")?.Value;\n\n            // Loads .bot configuration file and adds a singleton that your Bot can access through dependency injection.\n            var botConfig = BotConfiguration.Load(botFilePath ?? @\".\\dialog-prompt.bot\", secretKey);\n            services.AddSingleton(sp => botConfig\n                ?? throw new InvalidOperationException($\"The .bot config file could not be loaded. ({botConfig})\"));\n\n            // The Memory Storage used here is for local bot debugging only. When the bot\n            // is restarted, everything stored in memory will be gone.\n            IStorage dataStore = new MemoryStorage();\n\n            // Create Conversation State object.\n            // The Conversation State object is where we persist anything at the conversation-scope.\n            var conversationState = new ConversationState(dataStore);\n\n            // Create and register state accesssors.\n            // Acessors created here are passed into the IBot-derived class on every turn.\n            services.AddSingleton<DialogPromptBotAccessors>(sp =>\n            {\n                // Create the custom state accessor.\n                // State accessors enable other components to read and write individual properties of state.\n                var accessors = new DialogPromptBotAccessors(conversationState)\n                {\n                    DialogStateAccessor =\n                        conversationState.CreateProperty<DialogState>(\n                            DialogPromptBotAccessors.DialogStateAccessorKey),\n                    ReservationAccessor =\n                        conversationState.CreateProperty<DialogPromptBot.Reservation>(\n                            DialogPromptBotAccessors.ReservationAccessorKey),\n                };\n\n                return accessors;\n            });\n\n            services.AddBot<DialogPromptBot>(options =>\n            {\n                // Retrieve current endpoint.\n                var environment = _isProduction ? \"production\" : \"development\";\n                var service = botConfig.Services.Where(s => s.Type == \"endpoint\" && s.Name == environment).FirstOrDefault();\n                if (!(service is EndpointService endpointService))\n                {\n                    throw new InvalidOperationException($\"The .bot file does not contain an endpoint with name '{environment}'.\");\n                }\n\n                options.CredentialProvider = new SimpleCredentialProvider(endpointService.AppId, endpointService.AppPassword);\n\n                // Creates a logger for the application to use.\n                ILogger logger = _loggerFactory.CreateLogger<DialogPromptBot>();\n\n                // Catches any errors that occur during a conversation turn and logs them.\n                options.OnTurnError = async (context, exception) =>\n                {\n                    logger.LogError($\"Exception caught : {exception}\");\n                    await context.SendActivityAsync(\"Sorry, it looks like something went wrong.\");\n                };\n            });\n        }\n\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)\n        {\n            _loggerFactory = loggerFactory;\n\n            app.UseDefaultFiles()\n                .UseStaticFiles()\n                .UseBotFramework();\n        }\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogPromptBot/appsettings.json",
    "content": "{\n  \"botFilePath\": \"dialog-prompt.bot\",\n  \"botFileSecret\": \"\"\n}"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogPromptBot/dialog-prompt.bot",
    "content": "﻿{\n  \"name\": \"PromptsBot\",\n  \"services\": [\n    {\n      \"type\": \"endpoint\",\n      \"name\": \"development\",\n      \"endpoint\": \"http://localhost:3978/api/messages\",\n      \"appId\": \"\",\n      \"appPassword\": \"\",\n      \"id\": \"1\"\n    }\n  ],\n  \"padlock\": \"\",\n  \"version\": \"2.0\"\n}"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/DialogPromptBot/wwwroot/default.htm",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>Dialog Prompt Bot sample</title>\n    <style>\n        body {\n            margin: 0px;\n            padding: 0px;\n            font-family: Segoe UI;\n        }\n\n        html,\n        body {\n            height: 100%;\n        }\n\n        header {\n            background-image: url(\"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 4638.9 651.6' style='enable-background:new 0 0 4638.9 651.6;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%2355A0E0;%7D .st1%7Bfill:none;%7D .st2%7Bfill:%230058A8;%7D .st3%7Bfill:%23328BD8;%7D .st4%7Bfill:%23B6DCF1;%7D .st5%7Bopacity:0.2;fill:url(%23SVGID_1_);enable-background:new ;%7D%0A%3C/style%3E%3Crect y='1.1' class='st0' width='4640' height='646.3'/%3E%3Cpath class='st1' d='M3987.8,323.6L4310.3,1.1h-65.6l-460.1,460.1c-17.5,17.5-46.1,17.5-63.6,0L3260.9,1.1H0v646.3h3660.3 L3889,418.7c17.5-17.5,46.1-17.5,63.6,0l228.7,228.7h66.6l-260.2-260.2C3970.3,369.8,3970.3,341.1,3987.8,323.6z'/%3E%3Cpath class='st2' d='M3784.6,461.2L4244.7,1.1h-983.9l460.1,460.1C3738.4,478.7,3767.1,478.7,3784.6,461.2z'/%3E%3Cpath class='st3' d='M4640,1.1h-329.8l-322.5,322.5c-17.5,17.5-17.5,46.1,0,63.6l260.2,260.2H4640L4640,1.1L4640,1.1z'/%3E%3Cpath class='st4' d='M3889,418.8l-228.7,228.7h521.1l-228.7-228.7C3935.2,401.3,3906.5,401.3,3889,418.8z'/%3E%3ClinearGradient id='SVGID_1_' gradientUnits='userSpaceOnUse' x1='3713.7576' y1='438.1175' x2='3911.4084' y2='14.2535' gradientTransform='matrix(1 0 0 -1 0 641.3969)'%3E%3Cstop offset='0' style='stop-color:%23FFFFFF;stop-opacity:0.5'/%3E%3Cstop offset='1' style='stop-color:%23FFFFFF'/%3E%3C/linearGradient%3E%3Cpath class='st5' d='M3952.7,124.5c-17.5-17.5-46.1-17.5-63.6,0l-523,523h1109.6L3952.7,124.5z'/%3E%3C/svg%3E%0A\");\n            background-repeat: no-repeat;\n            background-size: 100%;\n            background-position: right;\n            background-color: #55A0E0;\n            width: 100%;\n            font-size: 44px;\n            height: 120px;\n            color: white;\n            padding: 30px 0 40px 0px;\n            display: inline-block;\n        }\n\n        .header-icon {\n            background-image: url(\"data:image/svg+xml;utf8,%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20150.2%20125%22%20style%3D%22enable-background%3Anew%200%200%20150.2%20125%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23FFFFFF%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.5%22%20class%3D%22st0%22%20width%3D%22149.7%22%20height%3D%22125%22/%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M59%2C102.9L21.8%2C66c-3.5-3.5-3.5-9.1%2C0-12.5l37-36.5l2.9%2C3l-37%2C36.4c-1.8%2C1.8-1.8%2C4.7%2C0%2C6.6l37.2%2C37L59%2C102.9z%22%0A%09%09/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M92.5%2C102.9l-3-3l37.2-37c0.9-0.9%2C1.4-2%2C1.4-3.3c0-1.2-0.5-2.4-1.4-3.3L89.5%2C20l2.9-3l37.2%2C36.4%0A%09%09c1.7%2C1.7%2C2.6%2C3.9%2C2.6%2C6.3s-0.9%2C4.6-2.6%2C6.3L92.5%2C102.9z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M90.1%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C98.1%2C64.7%2C94.4%2C68.4%2C90.1%2C68.4z%0A%09%09%20M90.1%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S91.9%2C56.5%2C90.1%2C56.5z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M61.4%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C69.5%2C64.7%2C65.8%2C68.4%2C61.4%2C68.4z%0A%09%09%20M61.4%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S63.3%2C56.5%2C61.4%2C56.5z%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A\");\n            background-repeat: no-repeat;\n            float: left;\n            height: 140px;\n            width: 140px;\n            display: inline-block;\n            vertical-align: middle;\n        }\n\n        .header-text {\n            padding-left: 1%;\n            color: #FFFFFF;\n            font-family: \"Segoe UI\";\n            font-size: 72px;\n            font-weight: 300;\n            letter-spacing: 0.35px;\n            line-height: 96px;\n            display: inline-block;\n            vertical-align: middle;\n        }\n\n        .header-inner-container {\n            min-width: 480px;\n            max-width: 1366px;\n            margin-left: auto;\n            margin-right: auto;\n            vertical-align: middle;\n        }\n\n        .header-inner-container::after {\n            content: \"\";\n            clear: both;\n            display: table;\n        }\n\n        .main-content-area {\n            padding-left: 30px;\n        }\n\n        .content-title {\n            color: #000000;\n            font-family: \"Segoe UI\";\n            font-size: 46px;\n            font-weight: 300;\n            line-height: 62px;\n        }\n\n        .main-text {\n            color: #808080;\n            font-size: 24px;\n            font-family: \"Segoe UI\";\n            font-size: 24px;\n            font-weight: 200;\n            line-height: 32px;\n        }\n\n        .main-text-p1{\n            padding-top: 48px;\n            padding-bottom: 28px;\n        }\n\n        .endpoint {\n           height: 32px;    \n           width: 571px;   \n           color: #808080; \n           font-family: \"Segoe UI\";    \n           font-size: 24px;    \n           font-weight: 200;   \n           line-height: 32px;\n           padding-top: 28px;\n        }\n\n        .how-to-build-section {\n            padding-top: 20px;\n            padding-left: 30px;\n        }\n\n        .how-to-build-section>h3 {\n            font-size: 16px;\n            font-weight: 600;\n            letter-spacing: 0.35px;\n            line-height: 22px;\n            margin: 0 0 24px 0;\n            text-transform: uppercase;\n        }\n\n        .step-container {\n            display: flex;\n            align-items: stretch;\n            position: relative;\n        }\n\n        .step-container dl {\n            border-left: 1px solid #A0A0A0;\n            display: block;\n            padding: 0 24px;\n            margin: 0;\n        }\n\n        .step-container dl>dt::before {\n            background-color: white;\n            border: 1px solid #A0A0A0;\n            border-radius: 100%;\n            content: '';\n            left: 47px;\n            height: 11px;\n            position: absolute;\n            width: 11px;\n        }\n\n        .step-container dl>.test-bullet::before {\n            background-color: blue;\n        }\n\n        .step-container dl>dt {\n            display: block;\n            font-size: inherit;\n            font-weight: bold;\n            line-height: 20px;\n        }\n\n        .step-container dl>dd {\n            font-size: inherit;\n            line-height: 20px;\n            margin-left: 0;\n            padding-bottom: 32px;\n        }\n\n        .step-container:last-child dl {\n            border-left: 1px solid transparent;\n        }\n\n        .ctaLink {\n            background-color: transparent;\n            border: 1px solid transparent;\n            color: #006AB1;\n            cursor: pointer;\n            font-weight: 600;\n            padding: 0;\n            white-space: normal;\n        }\n\n        .ctaLink:focus {\n            outline: 1px solid #00bcf2;\n        }\n\n        .ctaLink:hover {\n            text-decoration: underline;\n        }\n\n        .step-icon {\n            display: flex;\n            height: 38px;\n            margin-right: 15px;\n            width: 38px;\n        }\n\n        .step-icon>div {\n            height: 30px;\n            width: 30px;\n            background-repeat: no-repeat;\n        }\n\n        .ms-logo-container {\n            min-width: 580px;\n            max-width: 980px;\n            margin-left: auto;\n            margin-right: auto;\n            left: 0;\n            right: 0;\n            transition: bottom 400ms;\n        }\n\n        .ms-logo {\n            float: right;\n            background-image: url(\"data:image/svg+xml;utf8,%0A%3Csvg%20version%3D%221.1%22%20id%3D%22MS-symbol%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20400%20120%22%20style%3D%22enable-background%3Anew%200%200%20400%20120%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23737474%3B%7D%0A%09.st2%7Bfill%3A%23D63F26%3B%7D%0A%09.st3%7Bfill%3A%23167D3E%3B%7D%0A%09.st4%7Bfill%3A%232E76BC%3B%7D%0A%09.st5%7Bfill%3A%23FDB813%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.6%22%20class%3D%22st0%22%20width%3D%22398.7%22%20height%3D%22119%22/%3E%0A%3Cpath%20class%3D%22st1%22%20d%3D%22M171.3%2C38.4v43.2h-7.5V47.7h-0.1l-13.4%2C33.9h-5l-13.7-33.9h-0.1v33.9h-6.9V38.4h10.8l12.4%2C32h0.2l13.1-32H171.3%0A%09z%20M177.6%2C41.7c0-1.2%2C0.4-2.2%2C1.3-3c0.9-0.8%2C1.9-1.2%2C3.1-1.2c1.3%2C0%2C2.4%2C0.4%2C3.2%2C1.3c0.8%2C0.8%2C1.3%2C1.8%2C1.3%2C3c0%2C1.2-0.4%2C2.2-1.3%2C3%0A%09c-0.9%2C0.8-1.9%2C1.2-3.2%2C1.2s-2.3-0.4-3.1-1.2C178%2C43.8%2C177.6%2C42.8%2C177.6%2C41.7z%20M185.7%2C50.6v31h-7.3v-31H185.7z%20M207.8%2C76.3%0A%09c1.1%2C0%2C2.3-0.3%2C3.6-0.8c1.3-0.5%2C2.5-1.2%2C3.6-2v6.8c-1.2%2C0.7-2.5%2C1.2-4%2C1.5c-1.5%2C0.3-3.1%2C0.5-4.9%2C0.5c-4.6%2C0-8.3-1.4-11.1-4.3%0A%09c-2.9-2.9-4.3-6.6-4.3-11c0-5%2C1.5-9.1%2C4.4-12.3c2.9-3.2%2C7-4.8%2C12.4-4.8c1.4%2C0%2C2.7%2C0.2%2C4.1%2C0.5c1.4%2C0.4%2C2.5%2C0.8%2C3.3%2C1.2v7%0A%09c-1.1-0.8-2.3-1.5-3.4-1.9c-1.2-0.5-2.4-0.7-3.6-0.7c-2.9%2C0-5.2%2C0.9-7%2C2.8c-1.8%2C1.9-2.7%2C4.4-2.7%2C7.6c0%2C3.1%2C0.8%2C5.6%2C2.5%2C7.3%0A%09C202.6%2C75.4%2C204.9%2C76.3%2C207.8%2C76.3z%20M235.7%2C50.1c0.6%2C0%2C1.1%2C0%2C1.6%2C0.1s0.9%2C0.2%2C1.2%2C0.3v7.4c-0.4-0.3-0.9-0.5-1.7-0.8%0A%09c-0.7-0.3-1.6-0.4-2.7-0.4c-1.8%2C0-3.3%2C0.8-4.5%2C2.3c-1.2%2C1.5-1.9%2C3.8-1.9%2C7v15.6h-7.3v-31h7.3v4.9h0.1c0.7-1.7%2C1.7-3%2C3-4%0A%09C232.2%2C50.6%2C233.8%2C50.1%2C235.7%2C50.1z%20M238.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3%0A%09c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5c-4.8%2C0-8.6-1.4-11.4-4.2C240.3%2C75.3%2C238.9%2C71.4%2C238.9%2C66.6z%0A%09%20M246.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5%0A%09c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7C247.2%2C60.5%2C246.5%2C63%2C246.5%2C66.3z%20M281.5%2C58.8c0%2C1%2C0.3%2C1.9%2C1%2C2.5%0A%09c0.7%2C0.6%2C2.1%2C1.3%2C4.4%2C2.2c2.9%2C1.2%2C5%2C2.5%2C6.1%2C3.9c1.2%2C1.5%2C1.8%2C3.2%2C1.8%2C5.3c0%2C2.9-1.1%2C5.3-3.4%2C7c-2.2%2C1.8-5.3%2C2.7-9.1%2C2.7%0A%09c-1.3%2C0-2.7-0.2-4.3-0.5c-1.6-0.3-2.9-0.7-4-1.2v-7.2c1.3%2C0.9%2C2.8%2C1.7%2C4.3%2C2.2c1.5%2C0.5%2C2.9%2C0.8%2C4.2%2C0.8c1.6%2C0%2C2.9-0.2%2C3.6-0.7%0A%09c0.8-0.5%2C1.2-1.2%2C1.2-2.3c0-1-0.4-1.9-1.2-2.5c-0.8-0.7-2.4-1.5-4.6-2.4c-2.7-1.1-4.6-2.4-5.7-3.8c-1.1-1.4-1.7-3.2-1.7-5.4%0A%09c0-2.8%2C1.1-5.1%2C3.3-6.9c2.2-1.8%2C5.1-2.7%2C8.6-2.7c1.1%2C0%2C2.3%2C0.1%2C3.6%2C0.4c1.3%2C0.2%2C2.5%2C0.6%2C3.4%2C0.9v6.9c-1-0.6-2.1-1.2-3.4-1.7%0A%09c-1.3-0.5-2.6-0.7-3.8-0.7c-1.4%2C0-2.5%2C0.3-3.2%2C0.8C281.9%2C57.1%2C281.5%2C57.8%2C281.5%2C58.8z%20M297.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2%0A%09c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5%0A%09c-4.8%2C0-8.6-1.4-11.4-4.2C299.4%2C75.3%2C297.9%2C71.4%2C297.9%2C66.6z%20M305.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6%0A%09c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7%0A%09C306.3%2C60.5%2C305.5%2C63%2C305.5%2C66.3z%20M353.9%2C56.6h-10.9v25h-7.4v-25h-5.2v-6h5.2v-4.3c0-3.3%2C1.1-5.9%2C3.2-8c2.1-2.1%2C4.8-3.1%2C8.1-3.1%0A%09c0.9%2C0%2C1.7%2C0%2C2.4%2C0.1c0.7%2C0.1%2C1.3%2C0.2%2C1.8%2C0.4V42c-0.2-0.1-0.7-0.3-1.3-0.5c-0.6-0.2-1.3-0.3-2.1-0.3c-1.5%2C0-2.7%2C0.5-3.5%2C1.4%0A%09s-1.2%2C2.4-1.2%2C4.2v3.7h10.9v-7l7.3-2.2v9.2h7.4v6h-7.4v14.5c0%2C1.9%2C0.3%2C3.3%2C1%2C4c0.7%2C0.8%2C1.8%2C1.2%2C3.3%2C1.2c0.4%2C0%2C0.9-0.1%2C1.5-0.3%0A%09c0.6-0.2%2C1.1-0.4%2C1.6-0.7v6c-0.5%2C0.3-1.2%2C0.5-2.3%2C0.7c-1.1%2C0.2-2.1%2C0.3-3.2%2C0.3c-3.1%2C0-5.4-0.8-6.9-2.5c-1.5-1.6-2.3-4.1-2.3-7.4%0A%09V56.6z%22/%3E%0A%3Cg%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2224%22%20class%3D%22st2%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2224%22%20class%3D%22st3%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2261.8%22%20class%3D%22st4%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2261.8%22%20class%3D%22st5%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A\");\n        }\n\n        .ms-logo-container>div {\n            min-height: 60px;\n            width: 150px;\n            background-repeat: no-repeat;\n        }\n\n        .row {\n            padding: 90px 0px 0 20px;\n            min-width: 480px;\n            max-width: 1366px;\n            margin-left: auto;\n            margin-right: auto;\n        }\n\n        .column {\n            float: left;\n            width: 45%;\n            padding-right: 20px;\n        }\n\n        .row:after {\n            content: \"\";\n            display: table;\n            clear: both;\n        }\n\n        a {\n            text-decoration: none;\n        }\n\n        .download-the-emulator {\n            height: 20px;\n            color: #0063B1;\n            font-size: 15px;\n            line-height: 20px;\n            padding-bottom: 70px;\n        }\n\n        .how-to-iframe {\n            max-width: 700px !important;\n            min-width: 650px !important;\n            height: 700px !important;\n        }\n\n        .remove-frame-height {\n            height: 10px;\n        }\n\n        @media only screen and (max-width: 1300px) {\n            .ms-logo {\n                padding-top: 30px;\n            }\n\n            .header-text {\n                font-size: 40x;\n            }\n\n            .column {\n                float: none;\n                padding-top: 30px;\n                width: 100%;\n            }\n\n            .ms-logo-container {\n                padding-top: 30px;\n                min-width: 480px;\n                max-width: 650px;\n                margin-left: auto;\n                margin-right: auto;\n            }\n\n            .row {\n                padding: 20px 0px 0 20px;\n                min-width: 480px;\n                max-width: 650px;\n                margin-left: auto;\n                margin-right: auto;\n            }\n        }\n\n        @media only screen and (max-width: 1370px) {\n            header {\n                background-color: #55A0E0;\n                background-size: auto 200px;\n            }\n        }\n\n        @media only screen and (max-width: 1230px) {\n            header {\n                background-color: #55A0E0;\n                background-size: auto 200px;\n            }\n\n            .header-text {\n                font-size: 44px;\n            }\n\n            .header-icon {\n                height: 120px;\n                width: 120px;\n            }\n        }\n\n        @media only screen and (max-width: 1000px) {\n            header {\n                background-color: #55A0E0;\n                background-image: none;\n            }\n        }\n\n        @media only screen and (max-width: 632px) {\n            .header-text {\n                font-size: 32px;\n            }\n\n            .row {\n                padding: 10px 0px 0 10px;\n                max-width: 490px !important;\n                min-width: 410px !important;\n            }\n\n            .endpoint {\n                font-size: 25px;\n            }\n\n            .main-text {\n                font-size: 20px;\n            }\n\n            .step-container dl>dd {\n                font-size: 14px;\n            }\n\n            .column {\n                padding-right: 5px;\n            }\n\n            .header-icon {\n                height: 110px;\n                width: 110px;\n            }\n\n            .how-to-iframe {\n                max-width: 480px !important;\n                min-width: 400px !important;\n                height: 650px !important;\n                overflow: hidden;\n            }\n        }\n\n        .remove-frame-height {\n            max-height: 10px;\n        }\n    </style>\n    <script>\n        document.addEventListener('DOMContentLoaded', function () {\n            loadFrame();\n        });\n        var loadFrame = function () {\n            var iframe = document.createElement('iframe');\n            iframe.setAttribute(\"id\", \"iframe\");\n            var offLineHTMLContent = \"\";\n            var frameElement = document.getElementById(\"how-to-iframe\");\n            if (window.navigator.onLine) {\n                iframe.src = 'https://docs.botframework.com/static/abs/pages/f5.htm';\n                iframe.setAttribute(\"scrolling\", \"no\");\n                iframe.setAttribute(\"frameborder\", \"0\");\n                iframe.setAttribute(\"width\", \"100%\");\n                iframe.setAttribute(\"height\", \"100%\");\n                var frameDiv = document.getElementById(\"how-to-iframe\");\n                frameDiv.appendChild(iframe);\n            } else {\n                frameElement.classList.add(\"remove-frame-height\");\n            }\n        };      \n    </script>\n</head>\n\n<body>\n    <header class=\"header\">\n        <div class=\"header-inner-container\">\n            <div class=\"header-icon\" style=\"display: inline-block\"></div>\n            <div class=\"header-text\" style=\"display: inline-block\">Dialog Prompt Bot</div>\n        </div>\n    </header>\n    <div class=\"row\">\n        <div class=\"column\" class=\"main-content-area\">\n            <div class=\"content-title\">Your bot is ready!</div>\n            <div class=\"main-text main-text-p1\">You can test your bot in the Bot Framework Emulator<br />\n                by opening the .bot file in the project folder.</div>\n            <div class=\"main-text download-the-emulator\"><a class=\"ctaLink\" href=\"https://aka.ms/bot-framework-F5-download-emulator\"\n                    target=\"_blank\">Download the Emulator</a></div>\n            <div class=\"main-text\">Visit <a class=\"ctaLink\" href=\"https://aka.ms/bot-framework-F5-abs-home\" target=\"_blank\">Azure\n                    Bot Service</a> to register your bot and add it to<br />\n                various channels. The bot's endpoint URL typically looks\n                like this:</div>\n            <div class=\"endpoint\">https://<i>your_bots_hostname</i>/api/messages</div>\n        </div>\n        <div class=\"column how-to-iframe\" id=\"how-to-iframe\"></div>\n    </div>\n    </div>\n    <div class=\"ms-logo-container\">\n        <div class=\"ms-logo\"></div>\n    </div>\n</body>\n\n</html>\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/PromptUsersForInput/ConversationFlow.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    public class ConversationFlow\n{\n    // Identifies the last question asked.\n    public enum Question\n    {\n        Name,\n        Age,\n        Date,\n        None, // Our last action did not involve a question.\n    }\n\n    // The last question asked.\n    public Question LastQuestionAsked { get; set; } = Question.None;\n}\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/PromptUsersForInput/CustomPromptBot.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Schema;\nusing Microsoft.Extensions.Logging;\nusing Microsoft.Recognizers.Text;\nusing Microsoft.Recognizers.Text.DateTime;\nusing Microsoft.Recognizers.Text.Number;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    /// <summary>\n    /// Represents a bot that processes incoming activities.\n    /// For each user interaction, an instance of this class is created and the OnTurnAsync method is called.\n    /// This is a Transient lifetime service.  Transient lifetime services are created\n    /// each time they're requested. For each Activity received, a new instance of this\n    /// class is created. Objects that are expensive to construct, or have a lifetime\n    /// beyond the single turn, should be carefully managed.\n    /// For example, the <see cref=\"MemoryStorage\"/> object and associated\n    /// <see cref=\"IStatePropertyAccessor{T}\"/> object are created with a singleton lifetime.\n    /// </summary>\n    /// <seealso cref=\"https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.1\"/>\n    public class CustomPromptBot : IBot\n    {\n        private readonly CustomPromptBotAccessors _accessors;\n        private readonly ILogger _logger;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CustomPromptBot\"/> class.\n        /// </summary>\n        /// <param name=\"accessors\">A class containing <see cref=\"IStatePropertyAccessor{T}\"/> used to manage state.</param>\n        /// <param name=\"loggerFactory\">A <see cref=\"ILoggerFactory\"/> that is hooked to the Azure App Service provider.</param>\n        /// <remarks>Defines a bot for filling a user profile.</remarks>\n        /// <seealso cref=\"https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1#windows-eventlog-provider\"/>\n        public CustomPromptBot(CustomPromptBotAccessors accessors, ILoggerFactory loggerFactory)\n        {\n            if (loggerFactory == null)\n            {\n                throw new System.ArgumentNullException(nameof(loggerFactory));\n            }\n\n            _logger = loggerFactory.CreateLogger<CustomPromptBot>();\n            _logger.LogTrace(\"EchoBot turn start.\");\n            _accessors = accessors ?? throw new System.ArgumentNullException(nameof(accessors));\n        }\n\n        /// <summary>The turn handler for the bot.</summary>\n        /// <param name=\"turnContext\">A <see cref=\"ITurnContext\"/> containing all the data needed\n        /// for processing this conversation turn. </param>\n        /// <param name=\"cancellationToken\">(Optional) A <see cref=\"CancellationToken\"/> that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A <see cref=\"Task\"/> that represents the work queued to execute.</returns>\n        public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))\n        {\n            // Handle Message activity type, which is the main activity type for shown within a conversational interface\n            // Message activities may contain text, speech, interactive cards, and binary or unknown attachments.\n            // see https://aka.ms/about-bot-activity-message to learn more about the message and other activity types\n            if (turnContext.Activity.Type == ActivityTypes.Message)\n            {\n                // Get the state properties from the turn context.\n                ConversationFlow flow = await _accessors.ConversationFlowAccessor.GetAsync(turnContext, () => new ConversationFlow());\n                UserProfile profile = await _accessors.UserProfileAccessor.GetAsync(turnContext, () => new UserProfile());\n\n                await FillOutUserProfileAsync(flow, profile, turnContext);\n\n                // Update state and save changes.\n                await _accessors.ConversationFlowAccessor.SetAsync(turnContext, flow);\n                await _accessors.ConversationState.SaveChangesAsync(turnContext);\n\n                await _accessors.UserProfileAccessor.SetAsync(turnContext, profile);\n                await _accessors.UserState.SaveChangesAsync(turnContext);\n            }\n        }\n\n        /// <summary>\n        /// Manages the conversation flow for filling out the user's profile, including parsing and validation.\n        /// </summary>\n        /// <param name=\"flow\">The conversation flow state property.</param>\n        /// <param name=\"profile\">The user profile state property.</param>\n        /// <param name=\"turnContext\">The context object for the current turn.</param>\n        /// <returns>A task that represents the work queued to execute.</returns>\n        private static async Task FillOutUserProfileAsync(ConversationFlow flow, UserProfile profile, ITurnContext turnContext)\n        {\n            string input = turnContext.Activity.Text?.Trim();\n            string message;\n            switch (flow.LastQuestionAsked)\n            {\n                case ConversationFlow.Question.None:\n                    await turnContext.SendActivityAsync(\"Let's get started. What is your name?\");\n                    flow.LastQuestionAsked = ConversationFlow.Question.Name;\n                    break;\n                case ConversationFlow.Question.Name:\n                    if (ValidateName(input, out string name, out message))\n                    {\n                        profile.Name = name;\n                        await turnContext.SendActivityAsync($\"Hi {profile.Name}.\");\n                        await turnContext.SendActivityAsync(\"How old are you?\");\n                        flow.LastQuestionAsked = ConversationFlow.Question.Age;\n                        break;\n                    }\n                    else\n                    {\n                        await turnContext.SendActivityAsync(message ?? \"I'm sorry, I didn't understand that.\");\n                        break;\n                    }\n\n                case ConversationFlow.Question.Age:\n                    if (ValidateAge(input, out int age, out message))\n                    {\n                        profile.Age = age;\n                        await turnContext.SendActivityAsync($\"I have your age as {profile.Age}.\");\n                        await turnContext.SendActivityAsync(\"When is your flight?\");\n                        flow.LastQuestionAsked = ConversationFlow.Question.Date;\n                        break;\n                    }\n                    else\n                    {\n                        await turnContext.SendActivityAsync(message ?? \"I'm sorry, I didn't understand that.\");\n                        break;\n                    }\n\n                case ConversationFlow.Question.Date:\n                    if (ValidateDate(input, out string date, out message))\n                    {\n                        profile.Date = date;\n                        await turnContext.SendActivityAsync($\"Your cab ride to the airport is scheduled for {profile.Date}.\");\n                        await turnContext.SendActivityAsync($\"Thanks for completing the booking {profile.Name}.\");\n                        await turnContext.SendActivityAsync($\"Type anything to run the bot again.\");\n                        flow.LastQuestionAsked = ConversationFlow.Question.None;\n                        profile = new UserProfile();\n                        break;\n                    }\n                    else\n                    {\n                        await turnContext.SendActivityAsync(message ?? \"I'm sorry, I didn't understand that.\");\n                        break;\n                    }\n            }\n        }\n\n        /// <summary>\n        /// Validates name input.\n        /// </summary>\n        /// <param name=\"input\">The user's input.</param>\n        /// <param name=\"name\">When the method returns, contains the normalized name, if validation succeeded.</param>\n        /// <param name=\"message\">When the method returns, contains a message with which to reprompt, if validation failed.</param>\n        /// <returns>indicates whether validation succeeded.</returns>\n        private static bool ValidateName(string input, out string name, out string message)\n        {\n            name = null;\n            message = null;\n\n            if (string.IsNullOrWhiteSpace(input))\n            {\n                message = \"Please enter a name that contains at least one character.\";\n            }\n            else\n            {\n                name = input.Trim();\n            }\n\n            return message is null;\n        }\n\n        /// <summary>\n        /// Validates age input.\n        /// </summary>\n        /// <param name=\"input\">The user's input.</param>\n        /// <param name=\"age\">When the method returns, contains the normalized age, if validation succeeded.</param>\n        /// <param name=\"message\">When the method returns, contains a message with which to reprompt, if validation failed.</param>\n        /// <returns>indicates whether validation succeeded.</returns>\n        private static bool ValidateAge(string input, out int age, out string message)\n        {\n            age = 0;\n            message = null;\n\n            // Try to recognize the input as a number. This works for responses such as \"twelve\" as well as \"12\".\n            try\n            {\n                // Attempt to convert the Recognizer result to an integer. This works for \"a dozen\", \"twelve\", \"12\", and so on.\n                // The recognizer returns a list of potential recognition results, if any.\n                List<ModelResult> results = NumberRecognizer.RecognizeNumber(input, Culture.English);\n                foreach (ModelResult result in results)\n                {\n                    // The result resolution is a dictionary, where the \"value\" entry contains the processed string.\n                    if (result.Resolution.TryGetValue(\"value\", out object value))\n                    {\n                        age = Convert.ToInt32(value);\n                        if (age >= 18 && age <= 120)\n                        {\n                            return true;\n                        }\n                    }\n                }\n\n                message = \"Please enter an age between 18 and 120.\";\n            }\n            catch\n            {\n                message = \"I'm sorry, I could not interpret that as an age. Please enter an age between 18 and 120.\";\n            }\n\n            return message is null;\n        }\n\n        /// <summary>\n        /// Validates flight time input.\n        /// </summary>\n        /// <param name=\"input\">The user's input.</param>\n        /// <param name=\"date\">When the method returns, contains the normalized date, if validation succeeded.</param>\n        /// <param name=\"message\">When the method returns, contains a message with which to reprompt, if validation failed.</param>\n        /// <returns>indicates whether validation succeeded.</returns>\n        private static bool ValidateDate(string input, out string date, out string message)\n        {\n            date = null;\n            message = null;\n\n            // Try to recognize the input as a date-time. This works for responses such as \"11/14/2018\", \"9pm\", \"tomorrow\", \"Sunday at 5pm\", and so on.\n            // The recognizer returns a list of potential recognition results, if any.\n            try\n            {\n                List<ModelResult> results = DateTimeRecognizer.RecognizeDateTime(input, Culture.English);\n\n                // Check whether any of the recognized date-times are appropriate,\n                // and if so, return the first appropriate date-time. We're checking for a value at least an hour in the future.\n                DateTime earliest = DateTime.Now.AddHours(1.0);\n                foreach (ModelResult result in results)\n                {\n                    // The result resolution is a dictionary, where the \"values\" entry contains the processed input.\n                    List<Dictionary<string, string>> resolutions = result.Resolution[\"values\"] as List<Dictionary<string, string>>;\n                    foreach (Dictionary<string, string> resolution in resolutions)\n                    {\n                        // The processed input contains a \"value\" entry if it is a date-time value, or \"start\" and\n                        // \"end\" entries if it is a date-time range.\n                        if (resolution.TryGetValue(\"value\", out string dateString)\n                            || resolution.TryGetValue(\"start\", out dateString))\n                        {\n                            if (DateTime.TryParse(dateString, out DateTime candidate)\n                                && earliest < candidate)\n                            {\n                                date = candidate.ToShortDateString();\n                                return true;\n                            }\n                        }\n                    }\n                }\n\n                message = \"I'm sorry, please enter a date at least an hour out.\";\n            }\n            catch\n            {\n                message = \"I'm sorry, I could not interpret that as an appropriate date. Please enter a date at least an hour out.\";\n            }\n\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/PromptUsersForInput/CustomPromptBot.ruleset",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RuleSet Name=\"Microsoft Managed Recommended Rules\" Description=\"These rules focus on the most critical problems in your code, including potential security holes, application crashes, and other important logic and design errors. It is recommended to include this rule set in any custom rule set you create for your projects.\" ToolsVersion=\"10.0\">\n  <Localization ResourceAssembly=\"Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.dll\" ResourceBaseName=\"Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.Localized\">\n    <Name Resource=\"MinimumRecommendedRules_Name\" />\n    <Description Resource=\"MinimumRecommendedRules_Description\" />\n  </Localization>\n  <Rules AnalyzerId=\"StyleCop.Analyzers\" RuleNamespace=\"StyleCop.Analyzers\">\n    <Rule Id=\"SA1011\" Action=\"None\" />\n    <Rule Id=\"SA1200\" Action=\"None\" />\n    <Rule Id=\"SA1101\" Action=\"None\" />\n    <Rule Id=\"SA1129\" Action=\"None\" />\n    <Rule Id=\"SA1305\" Action=\"Warning\" />\n    <Rule Id=\"SA1309\" Action=\"None\" />\n    <Rule Id=\"SA1412\" Action=\"Warning\" />\n    <Rule Id=\"SA1600\" Action=\"None\" />\n    <Rule Id=\"SA1609\" Action=\"Warning\" />\n    <Rule Id=\"SA1633\" Action=\"None\" />\n  </Rules>\n  <Rules AnalyzerId=\"AsyncUsageAnalyzers\" RuleNamespace=\"AsyncUsageAnalyzers\">\n    <Rule Id=\"AvoidAsyncVoid\" Action=\"Warning\" />\n  </Rules>\n</RuleSet>"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/PromptUsersForInput/CustomPromptBotAccessors.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing Microsoft.Bot.Builder;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    /// <summary>\n    /// This class is created as a Singleton and passed into the IBot-derived constructor.\n    ///  - See <see cref=\"CustomPromptBotAccessors\"/> constructor for how that is injected.\n    ///  - See the Startup.cs file for more details on creating the Singleton that gets\n    ///    injected into the constructor.\n    /// </summary>\n    public class CustomPromptBotAccessors\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"CustomPromptBotAccessors\"/> class.\n        /// Contains the state management and associated accessor objects.\n        /// </summary>\n        /// <param name=\"conversationState\">The state object that stores the conversation state.</param>\n        /// <param name=\"userState\">The state object that stores the user state.</param>\n        public CustomPromptBotAccessors(ConversationState conversationState, UserState userState)\n        {\n            ConversationState = conversationState ?? throw new ArgumentNullException(nameof(conversationState));\n            UserState = userState ?? throw new ArgumentNullException(nameof(userState));\n        }\n\n        /// <summary>\n        /// Gets the accessor name for the conversation flow property.\n        /// </summary>\n        /// <value>The accessor name for the conversation flow property.</value>\n        /// <remarks>Accessors require a unique name.</remarks>\n        public static string ConversationFlowName { get; } = \"ConversationFlow\";\n\n        /// <summary>\n        /// Gets the accessor name for the user profile property accessor.\n        /// </summary>\n        /// <value>The accessor name for the user profile property accessor.</value>\n        /// <remarks>Accessors require a unique name.</remarks>\n        public static string UserProfileName { get; } = \"UserProfile\";\n\n        /// <summary>\n        /// Gets or sets the <see cref=\"IStatePropertyAccessor{T}\"/> for the conversation flow property.\n        /// </summary>\n        /// <value>\n        /// The accessor stores the turn count for the conversation.\n        /// </value>\n        public IStatePropertyAccessor<ConversationFlow> ConversationFlowAccessor { get; set; }\n\n        /// <summary>\n        /// Gets or sets the <see cref=\"IStatePropertyAccessor{T}\"/> for the user profile property.\n        /// </summary>\n        /// <value>\n        /// The accessor stores the turn count for the conversation.\n        /// </value>\n        public IStatePropertyAccessor<UserProfile> UserProfileAccessor { get; set; }\n\n        /// <summary>\n        /// Gets the <see cref=\"ConversationState\"/> object for the conversation.\n        /// </summary>\n        /// <value>The <see cref=\"ConversationState\"/> object.</value>\n        public ConversationState ConversationState { get; }\n\n        /// <summary>\n        /// Gets the <see cref=\"UserState\"/> object for the conversation.\n        /// </summary>\n        /// <value>The <see cref=\"UserState\"/> object.</value>\n        public UserState UserState { get; }\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/PromptUsersForInput/DeploymentScripts/MsbotClone/bot.recipe",
    "content": "{\n  \"version\": \"1.0\",\n  \"resources\": [\n    {\n      \"type\": \"endpoint\",\n      \"id\": \"1\",\n      \"name\": \"development\",\n      \"url\": \"http://localhost:3978/api/messages\"\n    },\n    {\n      \"type\": \"endpoint\",\n      \"id\": \"2\",\n      \"name\": \"production\",\n      \"url\": \"https://your-bot-url.azurewebsites.net/api/messages\"\n    },\n    {\n      \"type\": \"abs\",\n      \"id\": \"3\",\n      \"name\": \"CustomPromptBot-abs\"\n    },\n    {\n      \"type\": \"appInsights\",\n      \"id\": \"4\",\n      \"name\": \"CustomPromptBot-insights\"\n    },\n    {\n      \"type\": \"blob\",\n      \"id\": \"5\",\n      \"name\": \"CustomPromptBot-blob\",\n      \"container\": \"botstatestore\"\n    }\n  ]\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/PromptUsersForInput/Program.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing Microsoft.AspNetCore;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Logging;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            BuildWebHost(args).Run();\n        }\n\n        public static IWebHost BuildWebHost(string[] args) =>\n            WebHost.CreateDefaultBuilder(args)\n                .ConfigureLogging((hostingContext, logging) =>\n                {\n                    // Add Azure Logging\n                    logging.AddAzureWebAppDiagnostics();\n\n                    // Logging Options.\n                    // There are other logging options available:\n                    // https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1\n                    // logging.AddDebug();\n                    // logging.AddConsole();\n                })\n\n                // Logging Options.\n                // Consider using Application Insights for your logging and metrics needs.\n                // https://azure.microsoft.com/en-us/services/application-insights/\n                // .UseApplicationInsights()\n                .UseStartup<Startup>()\n                .Build();\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/PromptUsersForInput/PromptUsersForInput.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n    <CodeAnalysisRuleSet>CustomPromptBot.ruleset</CodeAnalysisRuleSet>\n  </PropertyGroup>\n\n\n  <ItemGroup>\n    <Content Include=\"custom-prompt.bot\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.AspNetCore\" Version=\"2.1.3\" />\n    <PackageReference Include=\"Microsoft.AspNetCore.All\" Version=\"2.0.7\" />\n    <PackageReference Include=\"AsyncUsageAnalyzers\" Version=\"1.0.0-alpha003\" PrivateAssets=\"all\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder\" Version=\"4.0.6\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder.Integration.AspNet.Core\" Version=\"4.0.6\" />\n    <PackageReference Include=\"Microsoft.Bot.Configuration\" Version=\"4.0.6\" />\n    <PackageReference Include=\"Microsoft.Bot.Connector\" Version=\"4.0.6\" />\n    <PackageReference Include=\"Microsoft.Bot.Schema\" Version=\"4.1.5\" />\n    <PackageReference Include=\"Microsoft.Extensions.Logging.AzureAppServices\" Version=\"2.1.1\" />\n    <PackageReference Include=\"Microsoft.Recognizers.Text.DateTime\" Version=\"1.1.3\" />\n    <PackageReference Include=\"StyleCop.Analyzers\" Version=\"1.1.0-beta008\" PrivateAssets=\"all\" />\n  </ItemGroup>\n\n\n</Project>\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/PromptUsersForInput/Properties/launchSettings.json",
    "content": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:3978/\",\n      \"sslPort\": 0\n    }\n  },\n  \"profiles\": {\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"Bot_Builder_Echo_Bot_V43\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      },\n      \"applicationUrl\": \"http://localhost:3978/\"\n    }\n  }\n}"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/PromptUsersForInput/README.md",
    "content": "﻿# Prompt users for input\n\nThis sample demonstrates how to create your own prompts with an ASP.Net Core 2 bot.\nThe bot maintains conversation state to track and direct the conversation and ask the user questions.\nThe bot maintains user state to track the user's answers.\n\n# To try this sample\n\n- Clone the samples repository\n\n```bash\ngit clone https://github.com/Microsoft/BotFramework-Samples.git\n```\n\n- [Optional] Update the `appsettings.json` file under `BotFramework-Samples\\SDKV4-Samples\\dotnet_core\\PromptUsersForInput\\` with your botFileSecret.\n\n# Prerequisites\n\n## Visual Studio\n\n- Navigate to the v4 C# samples folder (`BotFramework-Samples\\SDKV4-Samples\\dotnet_core\\PromptUsersForInput`) and open the PromptUsersForInput.csproj in Visual Studio.\n- Hit F5.\n\n## Visual Studio Code\n\n- Open the `BotFramework-Samples\\SDKV4-Samples\\dotnet_core\\PromptUsersForInput` folder.\n- Bring up a terminal, navigate to `BotFramework-Samples\\SDKV4-Samples\\dotnet_core\\PromptUsersForInput` folder.\n- Type 'dotnet run'.\n\n## Testing the bot using Bot Framework Emulator\n\n[Microsoft Bot Framework Emulator](https://github.com/microsoft/botframework-emulator) is a desktop application that allows bot developers to test and debug their bots on localhost or running remotely through a tunnel.\n\n- Install the Bot Framework emulator from [here](https://aka.ms/botframeworkemulator).\n\n## Connect to bot using Bot Framework Emulator **V4**\n\n- Launch the Bot Framework Emulator.\n\n- Select the **File** > **Open bot configuration** menu item and navigate to the `BotFramework-Samples\\SDKV4-Samples\\dotnet_core\\PromptUsersForInput` folder.\n- Select the `custom-prompt.bot` file.\n\n# Bot state\n\nA bot is inherently stateless. Once your bot is deployed, it may not run in the same process or on the same machine from one turn to the next.\nHowever, your bot may need to track the context of a conversation, so that it can manage its behavior and remember answers to previous questions.\n\nIn this example, the bot's state is used to a track number of messages.\n\n- We use the bot's turn handler and user and conversation state properties to manage the flow of the conversation and the collection of input.\n- We ask the user a series of questions; parse, validate, and normalize their answers; and then save their input.\n\nThis sample is intended to be run and tested locally and is not designed to be deployed to Azure.\n\n# Further reading\n\n- [Azure Bot Service Introduction](https://docs.microsoft.com/azure/bot-service/bot-service-overview-introduction)\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/PromptUsersForInput/Startup.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing System.Linq;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.Integration;\nusing Microsoft.Bot.Builder.Integration.AspNet.Core;\nusing Microsoft.Bot.Configuration;\nusing Microsoft.Bot.Connector.Authentication;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Logging;\nusing Microsoft.Extensions.Options;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    /// <summary>\n    /// The Startup class configures services and the request pipeline.\n    /// </summary>\n    public class Startup\n    {\n        private ILoggerFactory _loggerFactory;\n        private readonly bool _isProduction = false;\n\n        public Startup(IHostingEnvironment env)\n        {\n            _isProduction = env.IsProduction();\n            IConfigurationBuilder builder = new ConfigurationBuilder()\n                .SetBasePath(env.ContentRootPath)\n                .AddJsonFile(\"appsettings.json\", optional: true, reloadOnChange: true)\n                .AddJsonFile($\"appsettings.{env.EnvironmentName}.json\", optional: true)\n                .AddEnvironmentVariables();\n\n            Configuration = builder.Build();\n        }\n\n        /// <summary>\n        /// Gets the configuration that represents a set of key/value application configuration properties.\n        /// </summary>\n        /// <value>\n        /// The <see cref=\"IConfiguration\"/> that represents a set of key/value application configuration properties.\n        /// </value>\n        public IConfiguration Configuration { get; }\n\n        /// <summary>\n        /// This method gets called by the runtime. Use this method to add services to the container.\n        /// </summary>\n        /// <param name=\"services\">The <see cref=\"IServiceCollection\"/> specifies the contract for a collection of service descriptors.</param>\n        /// <seealso cref=\"IStatePropertyAccessor{T}\"/>\n        /// <seealso cref=\"https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/dependency-injection\"/>\n        /// <seealso cref=\"https://docs.microsoft.com/en-us/azure/bot-service/bot-service-manage-channels?view=azure-bot-service-4.0\"/>\n        public void ConfigureServices(IServiceCollection services)\n        {\n            services.AddBot<CustomPromptBot>(options =>\n            {\n                string secretKey = Configuration.GetSection(\"botFileSecret\")?.Value;\n                string botFilePath = Configuration.GetSection(\"botFilePath\")?.Value;\n\n                // Loads .bot configuration file and adds a singleton that your Bot can access through dependency injection.\n                BotConfiguration botConfig = BotConfiguration.Load(botFilePath ?? @\".\\custom-prompt.bot\", secretKey);\n                services.AddSingleton(sp => botConfig\n                    ?? throw new InvalidOperationException($\"The .bot config file could not be loaded. ({botConfig})\"));\n\n                // Retrieve current endpoint.\n                string environment = _isProduction ? \"production\" : \"development\";\n                ConnectedService service = botConfig.Services.Where(s => s.Type == \"endpoint\" && s.Name == environment).FirstOrDefault();\n                if (!(service is EndpointService endpointService))\n                {\n                    throw new InvalidOperationException($\"The .bot file does not contain an endpoint with name '{environment}'.\");\n                }\n\n                options.CredentialProvider = new SimpleCredentialProvider(endpointService.AppId, endpointService.AppPassword);\n\n                // Creates a logger for the application to use.\n                ILogger logger = _loggerFactory.CreateLogger<CustomPromptBot>();\n\n                // Catches any errors that occur during a conversation turn and logs them.\n                options.OnTurnError = async (context, exception) =>\n                {\n                    logger.LogError($\"Exception caught : {exception}\");\n                    await context.SendActivityAsync(\"Sorry, it looks like something went wrong.\");\n                };\n            });\n\n            // Create conversation and user state with in-memory storage provider.\n            IStorage storage = new MemoryStorage();\n            ConversationState conversationState = new ConversationState(storage);\n            UserState userState = new UserState(storage);\n\n            // Create and register state accessors.\n            // Accessors created here are passed into the IBot-derived class on every turn.\n            services.AddSingleton<CustomPromptBotAccessors>(sp =>\n            {\n                // Create the custom state accessor.\n                return new CustomPromptBotAccessors(conversationState, userState)\n                {\n                    ConversationFlowAccessor = conversationState.CreateProperty<ConversationFlow>(CustomPromptBotAccessors.ConversationFlowName),\n                    UserProfileAccessor = userState.CreateProperty<UserProfile>(CustomPromptBotAccessors.UserProfileName),\n                };\n            });\n        }\n\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)\n        {\n            _loggerFactory = loggerFactory;\n\n            app.UseDefaultFiles()\n                .UseStaticFiles()\n                .UseBotFramework();\n        }\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/PromptUsersForInput/UserProfile.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    public class UserProfile\n    {\n        public string Name { get; set; }\n\n        public int? Age { get; set; }\n\n        public string Date { get; set; }\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/PromptUsersForInput/appsettings.json",
    "content": "{\n  \"botFilePath\": \"custom-prompt.bot\",\n  \"botFileSecret\": \"\"\n}"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/PromptUsersForInput/custom-prompt.bot",
    "content": "﻿{\n  \"name\": \"CustomPromptBot\",\n  \"services\": [\n    {\n      \"type\": \"endpoint\",\n      \"name\": \"development\",\n      \"endpoint\": \"http://localhost:3978/api/messages\",\n      \"appId\": \"\",\n      \"appPassword\": \"\",\n      \"id\": \"1\"\n    }\n  ],\n  \"padlock\": \"\",\n  \"version\": \"2.0\"\n}"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/PromptUsersForInput/wwwroot/default.htm",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>Custom Prompt Bot sample</title>\n    <style>\n        body {\n            margin: 0px;\n            padding: 0px;\n            font-family: Segoe UI;\n        }\n\n        html,\n        body {\n            height: 100%;\n        }\n\n        header {\n            background-image: url(\"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 4638.9 651.6' style='enable-background:new 0 0 4638.9 651.6;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%2355A0E0;%7D .st1%7Bfill:none;%7D .st2%7Bfill:%230058A8;%7D .st3%7Bfill:%23328BD8;%7D .st4%7Bfill:%23B6DCF1;%7D .st5%7Bopacity:0.2;fill:url(%23SVGID_1_);enable-background:new ;%7D%0A%3C/style%3E%3Crect y='1.1' class='st0' width='4640' height='646.3'/%3E%3Cpath class='st1' d='M3987.8,323.6L4310.3,1.1h-65.6l-460.1,460.1c-17.5,17.5-46.1,17.5-63.6,0L3260.9,1.1H0v646.3h3660.3 L3889,418.7c17.5-17.5,46.1-17.5,63.6,0l228.7,228.7h66.6l-260.2-260.2C3970.3,369.8,3970.3,341.1,3987.8,323.6z'/%3E%3Cpath class='st2' d='M3784.6,461.2L4244.7,1.1h-983.9l460.1,460.1C3738.4,478.7,3767.1,478.7,3784.6,461.2z'/%3E%3Cpath class='st3' d='M4640,1.1h-329.8l-322.5,322.5c-17.5,17.5-17.5,46.1,0,63.6l260.2,260.2H4640L4640,1.1L4640,1.1z'/%3E%3Cpath class='st4' d='M3889,418.8l-228.7,228.7h521.1l-228.7-228.7C3935.2,401.3,3906.5,401.3,3889,418.8z'/%3E%3ClinearGradient id='SVGID_1_' gradientUnits='userSpaceOnUse' x1='3713.7576' y1='438.1175' x2='3911.4084' y2='14.2535' gradientTransform='matrix(1 0 0 -1 0 641.3969)'%3E%3Cstop offset='0' style='stop-color:%23FFFFFF;stop-opacity:0.5'/%3E%3Cstop offset='1' style='stop-color:%23FFFFFF'/%3E%3C/linearGradient%3E%3Cpath class='st5' d='M3952.7,124.5c-17.5-17.5-46.1-17.5-63.6,0l-523,523h1109.6L3952.7,124.5z'/%3E%3C/svg%3E%0A\");\n            background-repeat: no-repeat;\n            background-size: 100%;\n            background-position: right;\n            background-color: #55A0E0;\n            width: 100%;\n            font-size: 44px;\n            height: 120px;\n            color: white;\n            padding: 30px 0 40px 0px;\n            display: inline-block;\n        }\n\n        .header-icon {\n            background-image: url(\"data:image/svg+xml;utf8,%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20150.2%20125%22%20style%3D%22enable-background%3Anew%200%200%20150.2%20125%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23FFFFFF%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.5%22%20class%3D%22st0%22%20width%3D%22149.7%22%20height%3D%22125%22/%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M59%2C102.9L21.8%2C66c-3.5-3.5-3.5-9.1%2C0-12.5l37-36.5l2.9%2C3l-37%2C36.4c-1.8%2C1.8-1.8%2C4.7%2C0%2C6.6l37.2%2C37L59%2C102.9z%22%0A%09%09/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M92.5%2C102.9l-3-3l37.2-37c0.9-0.9%2C1.4-2%2C1.4-3.3c0-1.2-0.5-2.4-1.4-3.3L89.5%2C20l2.9-3l37.2%2C36.4%0A%09%09c1.7%2C1.7%2C2.6%2C3.9%2C2.6%2C6.3s-0.9%2C4.6-2.6%2C6.3L92.5%2C102.9z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M90.1%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C98.1%2C64.7%2C94.4%2C68.4%2C90.1%2C68.4z%0A%09%09%20M90.1%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S91.9%2C56.5%2C90.1%2C56.5z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M61.4%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C69.5%2C64.7%2C65.8%2C68.4%2C61.4%2C68.4z%0A%09%09%20M61.4%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S63.3%2C56.5%2C61.4%2C56.5z%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A\");\n            background-repeat: no-repeat;\n            float: left;\n            height: 140px;\n            width: 140px;\n            display: inline-block;\n            vertical-align: middle;\n        }\n\n        .header-text {\n            padding-left: 1%;\n            color: #FFFFFF;\n            font-family: \"Segoe UI\";\n            font-size: 72px;\n            font-weight: 300;\n            letter-spacing: 0.35px;\n            line-height: 96px;\n            display: inline-block;\n            vertical-align: middle;\n        }\n\n        .header-inner-container {\n            min-width: 480px;\n            max-width: 1366px;\n            margin-left: auto;\n            margin-right: auto;\n            vertical-align: middle;\n        }\n\n        .header-inner-container::after {\n            content: \"\";\n            clear: both;\n            display: table;\n        }\n\n        .main-content-area {\n            padding-left: 30px;\n        }\n\n        .content-title {\n            color: #000000;\n            font-family: \"Segoe UI\";\n            font-size: 46px;\n            font-weight: 300;\n            line-height: 62px;\n        }\n\n        .main-text {\n            color: #808080;\n            font-size: 24px;\n            font-family: \"Segoe UI\";\n            font-size: 24px;\n            font-weight: 200;\n            line-height: 32px;\n        }\n\n        .main-text-p1{\n            padding-top: 48px;\n            padding-bottom: 28px;\n        }\n\n        .endpoint {\n           height: 32px;    \n           width: 571px;   \n           color: #808080; \n           font-family: \"Segoe UI\";    \n           font-size: 24px;    \n           font-weight: 200;   \n           line-height: 32px;\n           padding-top: 28px;\n        }\n\n        .how-to-build-section {\n            padding-top: 20px;\n            padding-left: 30px;\n        }\n\n        .how-to-build-section>h3 {\n            font-size: 16px;\n            font-weight: 600;\n            letter-spacing: 0.35px;\n            line-height: 22px;\n            margin: 0 0 24px 0;\n            text-transform: uppercase;\n        }\n\n        .step-container {\n            display: flex;\n            align-items: stretch;\n            position: relative;\n        }\n\n        .step-container dl {\n            border-left: 1px solid #A0A0A0;\n            display: block;\n            padding: 0 24px;\n            margin: 0;\n        }\n\n        .step-container dl>dt::before {\n            background-color: white;\n            border: 1px solid #A0A0A0;\n            border-radius: 100%;\n            content: '';\n            left: 47px;\n            height: 11px;\n            position: absolute;\n            width: 11px;\n        }\n\n        .step-container dl>.test-bullet::before {\n            background-color: blue;\n        }\n\n        .step-container dl>dt {\n            display: block;\n            font-size: inherit;\n            font-weight: bold;\n            line-height: 20px;\n        }\n\n        .step-container dl>dd {\n            font-size: inherit;\n            line-height: 20px;\n            margin-left: 0;\n            padding-bottom: 32px;\n        }\n\n        .step-container:last-child dl {\n            border-left: 1px solid transparent;\n        }\n\n        .ctaLink {\n            background-color: transparent;\n            border: 1px solid transparent;\n            color: #006AB1;\n            cursor: pointer;\n            font-weight: 600;\n            padding: 0;\n            white-space: normal;\n        }\n\n        .ctaLink:focus {\n            outline: 1px solid #00bcf2;\n        }\n\n        .ctaLink:hover {\n            text-decoration: underline;\n        }\n\n        .step-icon {\n            display: flex;\n            height: 38px;\n            margin-right: 15px;\n            width: 38px;\n        }\n\n        .step-icon>div {\n            height: 30px;\n            width: 30px;\n            background-repeat: no-repeat;\n        }\n\n        .ms-logo-container {\n            min-width: 580px;\n            max-width: 980px;\n            margin-left: auto;\n            margin-right: auto;\n            left: 0;\n            right: 0;\n            transition: bottom 400ms;\n        }\n\n        .ms-logo {\n            float: right;\n            background-image: url(\"data:image/svg+xml;utf8,%0A%3Csvg%20version%3D%221.1%22%20id%3D%22MS-symbol%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20400%20120%22%20style%3D%22enable-background%3Anew%200%200%20400%20120%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23737474%3B%7D%0A%09.st2%7Bfill%3A%23D63F26%3B%7D%0A%09.st3%7Bfill%3A%23167D3E%3B%7D%0A%09.st4%7Bfill%3A%232E76BC%3B%7D%0A%09.st5%7Bfill%3A%23FDB813%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.6%22%20class%3D%22st0%22%20width%3D%22398.7%22%20height%3D%22119%22/%3E%0A%3Cpath%20class%3D%22st1%22%20d%3D%22M171.3%2C38.4v43.2h-7.5V47.7h-0.1l-13.4%2C33.9h-5l-13.7-33.9h-0.1v33.9h-6.9V38.4h10.8l12.4%2C32h0.2l13.1-32H171.3%0A%09z%20M177.6%2C41.7c0-1.2%2C0.4-2.2%2C1.3-3c0.9-0.8%2C1.9-1.2%2C3.1-1.2c1.3%2C0%2C2.4%2C0.4%2C3.2%2C1.3c0.8%2C0.8%2C1.3%2C1.8%2C1.3%2C3c0%2C1.2-0.4%2C2.2-1.3%2C3%0A%09c-0.9%2C0.8-1.9%2C1.2-3.2%2C1.2s-2.3-0.4-3.1-1.2C178%2C43.8%2C177.6%2C42.8%2C177.6%2C41.7z%20M185.7%2C50.6v31h-7.3v-31H185.7z%20M207.8%2C76.3%0A%09c1.1%2C0%2C2.3-0.3%2C3.6-0.8c1.3-0.5%2C2.5-1.2%2C3.6-2v6.8c-1.2%2C0.7-2.5%2C1.2-4%2C1.5c-1.5%2C0.3-3.1%2C0.5-4.9%2C0.5c-4.6%2C0-8.3-1.4-11.1-4.3%0A%09c-2.9-2.9-4.3-6.6-4.3-11c0-5%2C1.5-9.1%2C4.4-12.3c2.9-3.2%2C7-4.8%2C12.4-4.8c1.4%2C0%2C2.7%2C0.2%2C4.1%2C0.5c1.4%2C0.4%2C2.5%2C0.8%2C3.3%2C1.2v7%0A%09c-1.1-0.8-2.3-1.5-3.4-1.9c-1.2-0.5-2.4-0.7-3.6-0.7c-2.9%2C0-5.2%2C0.9-7%2C2.8c-1.8%2C1.9-2.7%2C4.4-2.7%2C7.6c0%2C3.1%2C0.8%2C5.6%2C2.5%2C7.3%0A%09C202.6%2C75.4%2C204.9%2C76.3%2C207.8%2C76.3z%20M235.7%2C50.1c0.6%2C0%2C1.1%2C0%2C1.6%2C0.1s0.9%2C0.2%2C1.2%2C0.3v7.4c-0.4-0.3-0.9-0.5-1.7-0.8%0A%09c-0.7-0.3-1.6-0.4-2.7-0.4c-1.8%2C0-3.3%2C0.8-4.5%2C2.3c-1.2%2C1.5-1.9%2C3.8-1.9%2C7v15.6h-7.3v-31h7.3v4.9h0.1c0.7-1.7%2C1.7-3%2C3-4%0A%09C232.2%2C50.6%2C233.8%2C50.1%2C235.7%2C50.1z%20M238.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3%0A%09c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5c-4.8%2C0-8.6-1.4-11.4-4.2C240.3%2C75.3%2C238.9%2C71.4%2C238.9%2C66.6z%0A%09%20M246.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5%0A%09c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7C247.2%2C60.5%2C246.5%2C63%2C246.5%2C66.3z%20M281.5%2C58.8c0%2C1%2C0.3%2C1.9%2C1%2C2.5%0A%09c0.7%2C0.6%2C2.1%2C1.3%2C4.4%2C2.2c2.9%2C1.2%2C5%2C2.5%2C6.1%2C3.9c1.2%2C1.5%2C1.8%2C3.2%2C1.8%2C5.3c0%2C2.9-1.1%2C5.3-3.4%2C7c-2.2%2C1.8-5.3%2C2.7-9.1%2C2.7%0A%09c-1.3%2C0-2.7-0.2-4.3-0.5c-1.6-0.3-2.9-0.7-4-1.2v-7.2c1.3%2C0.9%2C2.8%2C1.7%2C4.3%2C2.2c1.5%2C0.5%2C2.9%2C0.8%2C4.2%2C0.8c1.6%2C0%2C2.9-0.2%2C3.6-0.7%0A%09c0.8-0.5%2C1.2-1.2%2C1.2-2.3c0-1-0.4-1.9-1.2-2.5c-0.8-0.7-2.4-1.5-4.6-2.4c-2.7-1.1-4.6-2.4-5.7-3.8c-1.1-1.4-1.7-3.2-1.7-5.4%0A%09c0-2.8%2C1.1-5.1%2C3.3-6.9c2.2-1.8%2C5.1-2.7%2C8.6-2.7c1.1%2C0%2C2.3%2C0.1%2C3.6%2C0.4c1.3%2C0.2%2C2.5%2C0.6%2C3.4%2C0.9v6.9c-1-0.6-2.1-1.2-3.4-1.7%0A%09c-1.3-0.5-2.6-0.7-3.8-0.7c-1.4%2C0-2.5%2C0.3-3.2%2C0.8C281.9%2C57.1%2C281.5%2C57.8%2C281.5%2C58.8z%20M297.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2%0A%09c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5%0A%09c-4.8%2C0-8.6-1.4-11.4-4.2C299.4%2C75.3%2C297.9%2C71.4%2C297.9%2C66.6z%20M305.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6%0A%09c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7%0A%09C306.3%2C60.5%2C305.5%2C63%2C305.5%2C66.3z%20M353.9%2C56.6h-10.9v25h-7.4v-25h-5.2v-6h5.2v-4.3c0-3.3%2C1.1-5.9%2C3.2-8c2.1-2.1%2C4.8-3.1%2C8.1-3.1%0A%09c0.9%2C0%2C1.7%2C0%2C2.4%2C0.1c0.7%2C0.1%2C1.3%2C0.2%2C1.8%2C0.4V42c-0.2-0.1-0.7-0.3-1.3-0.5c-0.6-0.2-1.3-0.3-2.1-0.3c-1.5%2C0-2.7%2C0.5-3.5%2C1.4%0A%09s-1.2%2C2.4-1.2%2C4.2v3.7h10.9v-7l7.3-2.2v9.2h7.4v6h-7.4v14.5c0%2C1.9%2C0.3%2C3.3%2C1%2C4c0.7%2C0.8%2C1.8%2C1.2%2C3.3%2C1.2c0.4%2C0%2C0.9-0.1%2C1.5-0.3%0A%09c0.6-0.2%2C1.1-0.4%2C1.6-0.7v6c-0.5%2C0.3-1.2%2C0.5-2.3%2C0.7c-1.1%2C0.2-2.1%2C0.3-3.2%2C0.3c-3.1%2C0-5.4-0.8-6.9-2.5c-1.5-1.6-2.3-4.1-2.3-7.4%0A%09V56.6z%22/%3E%0A%3Cg%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2224%22%20class%3D%22st2%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2224%22%20class%3D%22st3%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2261.8%22%20class%3D%22st4%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2261.8%22%20class%3D%22st5%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A\");\n        }\n\n        .ms-logo-container>div {\n            min-height: 60px;\n            width: 150px;\n            background-repeat: no-repeat;\n        }\n\n        .row {\n            padding: 90px 0px 0 20px;\n            min-width: 480px;\n            max-width: 1366px;\n            margin-left: auto;\n            margin-right: auto;\n        }\n\n        .column {\n            float: left;\n            width: 45%;\n            padding-right: 20px;\n        }\n\n        .row:after {\n            content: \"\";\n            display: table;\n            clear: both;\n        }\n\n        a {\n            text-decoration: none;\n        }\n\n        .download-the-emulator {\n            height: 20px;\n            color: #0063B1;\n            font-size: 15px;\n            line-height: 20px;\n            padding-bottom: 70px;\n        }\n\n        .how-to-iframe {\n            max-width: 700px !important;\n            min-width: 650px !important;\n            height: 700px !important;\n        }\n\n        .remove-frame-height {\n            height: 10px;\n        }\n\n        @media only screen and (max-width: 1300px) {\n            .ms-logo {\n                padding-top: 30px;\n            }\n\n            .header-text {\n                font-size: 40x;\n            }\n\n            .column {\n                float: none;\n                padding-top: 30px;\n                width: 100%;\n            }\n\n            .ms-logo-container {\n                padding-top: 30px;\n                min-width: 480px;\n                max-width: 650px;\n                margin-left: auto;\n                margin-right: auto;\n            }\n\n            .row {\n                padding: 20px 0px 0 20px;\n                min-width: 480px;\n                max-width: 650px;\n                margin-left: auto;\n                margin-right: auto;\n            }\n        }\n\n        @media only screen and (max-width: 1370px) {\n            header {\n                background-color: #55A0E0;\n                background-size: auto 200px;\n            }\n        }\n\n        @media only screen and (max-width: 1230px) {\n            header {\n                background-color: #55A0E0;\n                background-size: auto 200px;\n            }\n\n            .header-text {\n                font-size: 44px;\n            }\n\n            .header-icon {\n                height: 120px;\n                width: 120px;\n            }\n        }\n\n        @media only screen and (max-width: 1000px) {\n            header {\n                background-color: #55A0E0;\n                background-image: none;\n            }\n        }\n\n        @media only screen and (max-width: 632px) {\n            .header-text {\n                font-size: 32px;\n            }\n\n            .row {\n                padding: 10px 0px 0 10px;\n                max-width: 490px !important;\n                min-width: 410px !important;\n            }\n\n            .endpoint {\n                font-size: 25px;\n            }\n\n            .main-text {\n                font-size: 20px;\n            }\n\n            .step-container dl>dd {\n                font-size: 14px;\n            }\n\n            .column {\n                padding-right: 5px;\n            }\n\n            .header-icon {\n                height: 110px;\n                width: 110px;\n            }\n\n            .how-to-iframe {\n                max-width: 480px !important;\n                min-width: 400px !important;\n                height: 650px !important;\n                overflow: hidden;\n            }\n        }\n\n        .remove-frame-height {\n            max-height: 10px;\n        }\n    </style>\n    <script>\n        document.addEventListener('DOMContentLoaded', function () {\n            loadFrame();\n        });\n        var loadFrame = function () {\n            var iframe = document.createElement('iframe');\n            iframe.setAttribute(\"id\", \"iframe\");\n            var offLineHTMLContent = \"\";\n            var frameElement = document.getElementById(\"how-to-iframe\");\n            if (window.navigator.onLine) {\n                iframe.src = 'https://docs.botframework.com/static/abs/pages/f5.htm';\n                iframe.setAttribute(\"scrolling\", \"no\");\n                iframe.setAttribute(\"frameborder\", \"0\");\n                iframe.setAttribute(\"width\", \"100%\");\n                iframe.setAttribute(\"height\", \"100%\");\n                var frameDiv = document.getElementById(\"how-to-iframe\");\n                frameDiv.appendChild(iframe);\n            } else {\n                frameElement.classList.add(\"remove-frame-height\");\n            }\n        };      \n    </script>\n</head>\n\n<body>\n    <header class=\"header\">\n        <div class=\"header-inner-container\">\n            <div class=\"header-icon\" style=\"display: inline-block\"></div>\n            <div class=\"header-text\" style=\"display: inline-block\">Custom Prompt Bot</div>\n        </div>\n    </header>\n    <div class=\"row\">\n        <div class=\"column\" class=\"main-content-area\">\n            <div class=\"content-title\">Your bot is ready!</div>\n            <div class=\"main-text main-text-p1\">You can test your bot in the Bot Framework Emulator<br />\n                by opening the .bot file in the project folder.</div>\n            <div class=\"main-text download-the-emulator\"><a class=\"ctaLink\" href=\"https://aka.ms/bot-framework-F5-download-emulator\"\n                    target=\"_blank\">Download the Emulator</a></div>\n            <div class=\"main-text\">Visit <a class=\"ctaLink\" href=\"https://aka.ms/bot-framework-F5-abs-home\" target=\"_blank\">Azure\n                    Bot Service</a> to register your bot and add it to<br />\n                various channels. The bot's endpoint URL typically looks\n                like this:</div>\n            <div class=\"endpoint\">https://<i>your_bots_hostname</i>/api/messages</div>\n        </div>\n        <div class=\"column how-to-iframe\" id=\"how-to-iframe\"></div>\n    </div>\n    </div>\n    <div class=\"ms-logo-container\">\n        <div class=\"ms-logo\"></div>\n    </div>\n</body>\n\n</html>\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/StateBot/ConversationData.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    // Defines a state property used to track conversation data.\n    public class ConversationData\n    {\n        // The time-stamp of the most recent incoming message.\n        public string Timestamp { get; set; }\n\n        // The ID of the user's channel.\n        public string ChannelId { get; set; }\n\n        // Track whether we have already asked the user's name\n        public bool PromptedUserForName { get; set; } = false;\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/StateBot/DeploymentScripts/MsbotClone/bot.recipe",
    "content": "{\n  \"version\": \"1.0\",\n  \"resources\": [\n    {\n      \"type\": \"endpoint\",\n      \"id\": \"1\",\n      \"name\": \"development\",\n      \"url\": \"http://localhost:3978/api/messages\"\n    },\n    {\n      \"type\": \"endpoint\",\n      \"id\": \"2\",\n      \"name\": \"production\",\n      \"url\": \"https://your-bot-url.azurewebsites.net/api/messages\"\n    },\n    {\n      \"type\": \"abs\",\n      \"id\": \"3\",\n      \"name\": \"StateBot-abs\"\n    },\n    {\n      \"type\": \"appInsights\",\n      \"id\": \"4\",\n      \"name\": \"StateBot-insights\"\n    },\n    {\n      \"type\": \"blob\",\n      \"id\": \"5\",\n      \"name\": \"StateBot-blob\",\n      \"container\": \"botstatestore\"\n    }\n  ]\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/StateBot/Program.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing Microsoft.AspNetCore;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Logging;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            BuildWebHost(args).Run();\n        }\n\n        public static IWebHost BuildWebHost(string[] args) =>\n            WebHost.CreateDefaultBuilder(args)\n                .ConfigureLogging((hostingContext, logging) =>\n                {\n                    // Add Azure Logging\n                    logging.AddAzureWebAppDiagnostics();\n\n                    // Logging Options.\n                    // There are other logging options available:\n                    // https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.1\n                    // logging.AddDebug();\n                    // logging.AddConsole();\n                })\n\n                // Logging Options.\n                // Consider using Application Insights for your logging and metrics needs.\n                // https://azure.microsoft.com/en-us/services/application-insights/\n                // .UseApplicationInsights()\n                .UseStartup<Startup>()\n                .Build();\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/StateBot/Properties/launchSettings.json",
    "content": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:3978/\",\n      \"sslPort\": 0\n    }\n  },\n  \"profiles\": {\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"StateBot\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      },\n      \"applicationUrl\": \"http://localhost:3978/\"\n    }\n  }\n}"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/StateBot/README.md",
    "content": "﻿# Save user and conversation data\n\nThis sample demonstrates how to save user and conversation data in an ASP.Net Core 2 bot.\nThe bot maintains conversation state to track and direct the conversation and ask the user questions.\nThe bot maintains user state to track the user's answers.\n\n# To try this sample\n\n- Clone the samples repository\n\n```bash\ngit clone https://github.com/Microsoft/BotFramework-Samples.git\n```\n\n- [Optional] Update the `appsettings.json` file under `BotFramework-Samples\\SDKV4-Samples\\dotnet_core\\BotState\\` with your botFileSecret.\n\n# Prerequisites\n\n## Visual Studio\n\n- Navigate to the v4 C# samples folder (`BotFramework-Samples\\SDKV4-Samples\\dotnet_core\\BotState`) and open the PromptUsersForInput.csproj in Visual Studio.\n- Hit F5.\n\n## Visual Studio Code\n\n- Open the `BotFramework-Samples\\SDKV4-Samples\\dotnet_core\\BotState` folder.\n- Bring up a terminal, navigate to `BotFramework-Samples\\SDKV4-Samples\\dotnet_core\\BotState` folder.\n- Type 'dotnet run'.\n\n## Testing the bot using Bot Framework Emulator\n\n[Microsoft Bot Framework Emulator](https://github.com/microsoft/botframework-emulator) is a desktop application that allows bot developers to test and debug their bots on localhost or running remotely through a tunnel.\n\n- Install the Bot Framework emulator from [here](https://aka.ms/botframeworkemulator).\n\n## Connect to bot using Bot Framework Emulator **V4**\n\n- Launch the Bot Framework Emulator.\n\n- Select the **File** > **Open bot configuration** menu item and navigate to the `BotFramework-Samples\\SDKV4-Samples\\dotnet_core\\BotState` folder.\n- Select the `state.bot` file.\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/StateBot/Startup.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing System.Linq;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.Integration;\nusing Microsoft.Bot.Builder.Integration.AspNet.Core;\nusing Microsoft.Bot.Configuration;\nusing Microsoft.Bot.Connector.Authentication;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Logging;\nusing Microsoft.Extensions.Options;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    /// <summary>\n    /// The Startup class configures services and the request pipeline.\n    /// </summary>\n    public class Startup\n    {\n        private readonly bool _isProduction = false;\n\n        private ILoggerFactory _loggerFactory;\n\n        public Startup(IHostingEnvironment env)\n        {\n            _isProduction = env.IsProduction();\n            IConfigurationBuilder builder = new ConfigurationBuilder()\n                .SetBasePath(env.ContentRootPath)\n                .AddJsonFile(\"appsettings.json\", optional: true, reloadOnChange: true)\n                .AddJsonFile($\"appsettings.{env.EnvironmentName}.json\", optional: true)\n                .AddEnvironmentVariables();\n\n            Configuration = builder.Build();\n        }\n\n        /// <summary>\n        /// Gets the configuration that represents a set of key/value application configuration properties.\n        /// </summary>\n        /// <value>\n        /// The <see cref=\"IConfiguration\"/> that represents a set of key/value application configuration properties.\n        /// </value>\n        public IConfiguration Configuration { get; }\n\n        /// <summary>\n        /// This method gets called by the runtime. Use this method to add services to the container.\n        /// </summary>\n        /// <param name=\"services\">The <see cref=\"IServiceCollection\"/> specifies the contract for a collection of service descriptors.</param>\n        /// <seealso cref=\"IStatePropertyAccessor{T}\"/>\n        /// <seealso cref=\"https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/dependency-injection\"/>\n        /// <seealso cref=\"https://docs.microsoft.com/en-us/azure/bot-service/bot-service-manage-channels?view=azure-bot-service-4.0\"/>\n        public void ConfigureServices(IServiceCollection services)\n        {\n            services.AddBot<StateBot>(options =>\n            {\n                string secretKey = Configuration.GetSection(\"botFileSecret\")?.Value;\n                string botFilePath = Configuration.GetSection(\"botFilePath\")?.Value;\n\n                // Loads .bot configuration file and adds a singleton that your Bot can access through dependency injection.\n                BotConfiguration botConfig = BotConfiguration.Load(botFilePath ?? @\".\\State.bot\", secretKey);\n                services.AddSingleton(sp => botConfig\n                    ?? throw new InvalidOperationException($\"The .bot config file could not be loaded. ({botConfig})\"));\n\n                // Retrieve current endpoint.\n                string environment = _isProduction ? \"production\" : \"development\";\n                ConnectedService service = botConfig.Services.Where(s => s.Type == \"endpoint\" && s.Name == environment).FirstOrDefault();\n                if (!(service is EndpointService endpointService))\n                {\n                    throw new InvalidOperationException($\"The .bot file does not contain an endpoint with name '{environment}'.\");\n                }\n\n                options.CredentialProvider = new SimpleCredentialProvider(endpointService.AppId, endpointService.AppPassword);\n\n                // Creates a logger for the application to use.\n                ILogger logger = _loggerFactory.CreateLogger<StateBot>();\n\n                // Catches any errors that occur during a conversation turn and logs them.\n                options.OnTurnError = async (context, exception) =>\n                {\n                    logger.LogError($\"Exception caught : {exception}\");\n                    await context.SendActivityAsync(\"Sorry, it looks like something went wrong.\");\n                };\n            });\n\n            // Create conversation and user state with in-memory storage provider.\n            IStorage storage = new MemoryStorage();\n            ConversationState conversationState = new ConversationState(storage);\n            UserState userState = new UserState(storage);\n\n            // Create and register state accessors.\n            // Accessors created here are passed into the IBot-derived class on every turn.\n            services.AddSingleton<StateBotAccessors>(sp =>\n            {\n                // Create the custom state accessor.\n                return new StateBotAccessors(conversationState, userState)\n                {\n                    ConversationDataAccessor = conversationState.CreateProperty<ConversationData>(StateBotAccessors.ConversationDataName),\n                    UserProfileAccessor = userState.CreateProperty<UserProfile>(StateBotAccessors.UserProfileName),\n                };\n            });\n        }\n\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)\n        {\n            _loggerFactory = loggerFactory;\n\n            app.UseDefaultFiles()\n                .UseStaticFiles()\n                .UseBotFramework();\n        }\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/StateBot/StateBot.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Schema;\nusing Microsoft.Extensions.Logging;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    /// <summary>\n    /// Represents a bot that processes incoming activities.\n    /// For each user interaction, an instance of this class is created and the OnTurnAsync method is called.\n    /// This is a Transient lifetime service.  Transient lifetime services are created\n    /// each time they're requested. For each Activity received, a new instance of this\n    /// class is created. Objects that are expensive to construct, or have a lifetime\n    /// beyond the single turn, should be carefully managed.\n    /// For example, the <see cref=\"MemoryStorage\"/> object and associated\n    /// <see cref=\"IStatePropertyAccessor{T}\"/> object are created with a singleton lifetime.\n    /// </summary>\n    public class StateBot : IBot\n    {\n        private readonly StateBotAccessors _accessors;\n        private readonly ILogger _logger;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"StateBot\"/> class.\n        /// </summary>\n        /// <param name=\"accessors\">A class containing <see cref=\"IStatePropertyAccessor{T}\"/> used to manage state.</param>\n        /// <param name=\"loggerFactory\">A <see cref=\"ILoggerFactory\"/> that is hooked to the Azure App Service provider.</param>\n        /// <remarks>Defines a bot for filling a user profile.</remarks>\n        public StateBot(StateBotAccessors accessors, ILoggerFactory loggerFactory)\n        {\n            if (loggerFactory == null)\n            {\n                throw new System.ArgumentNullException(nameof(loggerFactory));\n            }\n\n            _logger = loggerFactory.CreateLogger<StateBot>();\n            _logger.LogTrace(\"EchoBot turn start.\");\n            _accessors = accessors ?? throw new System.ArgumentNullException(nameof(accessors));\n        }\n\n        /// <summary>The turn handler for the bot.</summary>\n        /// <param name=\"turnContext\">A <see cref=\"ITurnContext\"/> containing all the data needed\n        /// for processing this conversation turn. </param>\n        /// <param name=\"cancellationToken\">(Optional) A <see cref=\"CancellationToken\"/> that can be used by other objects\n        /// or threads to receive notice of cancellation.</param>\n        /// <returns>A <see cref=\"Task\"/> that represents the work queued to execute.</returns>\npublic async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))\n{\n    if (turnContext.Activity.Type == ActivityTypes.Message)\n    {\n        // Get the state properties from the turn context.\n        UserProfile userProfile =\n            await _accessors.UserProfileAccessor.GetAsync(turnContext, () => new UserProfile());\n        ConversationData conversationData =\n            await _accessors.ConversationDataAccessor.GetAsync(turnContext, () => new ConversationData());\n\n        if (string.IsNullOrEmpty(userProfile.Name))\n        {\n            // First time around this is set to false, so we will prompt user for name.\n            if (conversationData.PromptedUserForName)\n            {\n                // Set the name to what the user provided.\n                userProfile.Name = turnContext.Activity.Text?.Trim();\n\n                // Acknowledge that we got their name.\n                await turnContext.SendActivityAsync($\"Thanks {userProfile.Name}.\");\n\n                // Reset the flag to allow the bot to go though the cycle again.\n                conversationData.PromptedUserForName = false;\n            }\n            else\n            {\n                // Prompt the user for their name.\n                await turnContext.SendActivityAsync($\"What is your name?\");\n\n                // Set the flag to true, so we don't prompt in the next turn.\n                conversationData.PromptedUserForName = true;\n            }\n\n            // Save user state and save changes.\n            await _accessors.UserProfileAccessor.SetAsync(turnContext, userProfile);\n            await _accessors.UserState.SaveChangesAsync(turnContext);\n        }\n        else\n        {\n            // Add message details to the conversation data.\n            conversationData.Timestamp = turnContext.Activity.Timestamp.ToString();\n            conversationData.ChannelId = turnContext.Activity.ChannelId.ToString();\n\n            // Display state data.\n            await turnContext.SendActivityAsync($\"{userProfile.Name} sent: {turnContext.Activity.Text}\");\n            await turnContext.SendActivityAsync($\"Message received at: {conversationData.Timestamp}\");\n            await turnContext.SendActivityAsync($\"Message received from: {conversationData.ChannelId}\");\n        }\n\n        // Update conversation state and save changes.\n        await _accessors.ConversationDataAccessor.SetAsync(turnContext, conversationData);\n        await _accessors.ConversationState.SaveChangesAsync(turnContext);\n    }\n}\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/StateBot/StateBot.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n    <CodeAnalysisRuleSet>StateBot.ruleset</CodeAnalysisRuleSet>\n    <DocumentationFile>$(OutputPath)$(AssemblyName).xml</DocumentationFile>\n    <NoWarn>$(NoWarn),1573,1591,1712</NoWarn>\n  </PropertyGroup>\n\n\n  <ItemGroup>\n    <Content Include=\"state.bot\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n\n\n   <ItemGroup>\n    <PackageReference Include=\"Microsoft.AspNetCore\" Version=\"2.1.3\" />\n    <PackageReference Include=\"Microsoft.AspNetCore.All\" Version=\"2.0.7\" />\n    <PackageReference Include=\"AsyncUsageAnalyzers\" Version=\"1.0.0-alpha003\" PrivateAssets=\"all\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder\" Version=\"4.0.6\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder.Integration.AspNet.Core\" Version=\"4.0.6\" />\n    <PackageReference Include=\"Microsoft.Bot.Configuration\" Version=\"4.0.6\" />\n    <PackageReference Include=\"Microsoft.Bot.Connector\" Version=\"4.0.6\" />\n    <PackageReference Include=\"Microsoft.Bot.Schema\" Version=\"4.1.5\" />\n    <PackageReference Include=\"Microsoft.Extensions.Logging.AzureAppServices\" Version=\"2.1.1\" />\n    <PackageReference Include=\"StyleCop.Analyzers\" Version=\"1.1.0-beta008\" PrivateAssets=\"all\" />\n  </ItemGroup>\n\n\n</Project>\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/StateBot/StateBot.ruleset",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RuleSet Name=\"Microsoft Managed Recommended Rules\" Description=\"These rules focus on the most critical problems in your code, including potential security holes, application crashes, and other important logic and design errors. It is recommended to include this rule set in any custom rule set you create for your projects.\" ToolsVersion=\"10.0\">\n  <Localization ResourceAssembly=\"Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.dll\" ResourceBaseName=\"Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.Localized\">\n    <Name Resource=\"MinimumRecommendedRules_Name\" />\n    <Description Resource=\"MinimumRecommendedRules_Description\" />\n  </Localization>\n  <Rules AnalyzerId=\"StyleCop.Analyzers\" RuleNamespace=\"StyleCop.Analyzers\">\n    <Rule Id=\"SA1011\" Action=\"None\" />\n    <Rule Id=\"SA1200\" Action=\"None\" />\n    <Rule Id=\"SA1101\" Action=\"None\" />\n    <Rule Id=\"SA1129\" Action=\"None\" />\n    <Rule Id=\"SA1305\" Action=\"Warning\" />\n    <Rule Id=\"SA1309\" Action=\"None\" />\n    <Rule Id=\"SA1412\" Action=\"Warning\" />\n    <Rule Id=\"SA1600\" Action=\"None\" />\n    <Rule Id=\"SA1609\" Action=\"Warning\" />\n    <Rule Id=\"SA1633\" Action=\"None\" />\n  </Rules>\n  <Rules AnalyzerId=\"AsyncUsageAnalyzers\" RuleNamespace=\"AsyncUsageAnalyzers\">\n    <Rule Id=\"AvoidAsyncVoid\" Action=\"Warning\" />\n  </Rules>\n</RuleSet>"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/StateBot/StateBot.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27428.2043\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"StateBot\", \"StateBot.csproj\", \"{70EECF7F-1978-4587-9E6D-6371EC3A727B}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{70EECF7F-1978-4587-9E6D-6371EC3A727B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{70EECF7F-1978-4587-9E6D-6371EC3A727B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{70EECF7F-1978-4587-9E6D-6371EC3A727B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{70EECF7F-1978-4587-9E6D-6371EC3A727B}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {D6A9E094-666B-42FD-A3C9-2929F55D978E}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/StateBot/StateBot.xml",
    "content": "<?xml version=\"1.0\"?>\n<doc>\n    <assembly>\n        <name>StateBot</name>\n    </assembly>\n    <members>\n        <member name=\"T:Microsoft.BotBuilderSamples.Startup\">\n            <summary>\n            The Startup class configures services and the request pipeline.\n            </summary>\n        </member>\n        <member name=\"P:Microsoft.BotBuilderSamples.Startup.Configuration\">\n            <summary>\n            Gets the configuration that represents a set of key/value application configuration properties.\n            </summary>\n            <value>\n            The <see cref=\"T:Microsoft.Extensions.Configuration.IConfiguration\"/> that represents a set of key/value application configuration properties.\n            </value>\n        </member>\n        <member name=\"M:Microsoft.BotBuilderSamples.Startup.ConfigureServices(Microsoft.Extensions.DependencyInjection.IServiceCollection)\">\n            <summary>\n            This method gets called by the runtime. Use this method to add services to the container.\n            </summary>\n            <param name=\"services\">The <see cref=\"T:Microsoft.Extensions.DependencyInjection.IServiceCollection\"/> specifies the contract for a collection of service descriptors.</param>\n            <seealso cref=\"T:Microsoft.Bot.Builder.IStatePropertyAccessor`1\"/>\n            <seealso cref=\"!:https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/dependency-injection\"/>\n            <seealso cref=\"!:https://docs.microsoft.com/en-us/azure/bot-service/bot-service-manage-channels?view=azure-bot-service-4.0\"/>\n        </member>\n        <member name=\"T:Microsoft.BotBuilderSamples.StateBot\">\n            <summary>\n            Represents a bot that processes incoming activities.\n            For each user interaction, an instance of this class is created and the OnTurnAsync method is called.\n            This is a Transient lifetime service.  Transient lifetime services are created\n            each time they're requested. For each Activity received, a new instance of this\n            class is created. Objects that are expensive to construct, or have a lifetime\n            beyond the single turn, should be carefully managed.\n            For example, the <see cref=\"T:Microsoft.Bot.Builder.MemoryStorage\"/> object and associated\n            <see cref=\"T:Microsoft.Bot.Builder.IStatePropertyAccessor`1\"/> object are created with a singleton lifetime.\n            </summary>\n        </member>\n        <member name=\"M:Microsoft.BotBuilderSamples.StateBot.#ctor(Microsoft.BotBuilderSamples.StateBotAccessors,Microsoft.Extensions.Logging.ILoggerFactory)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Microsoft.BotBuilderSamples.StateBot\"/> class.\n            </summary>\n            <param name=\"accessors\">A class containing <see cref=\"T:Microsoft.Bot.Builder.IStatePropertyAccessor`1\"/> used to manage state.</param>\n            <param name=\"loggerFactory\">A <see cref=\"T:Microsoft.Extensions.Logging.ILoggerFactory\"/> that is hooked to the Azure App Service provider.</param>\n            <remarks>Defines a bot for filling a user profile.</remarks>\n        </member>\n        <member name=\"M:Microsoft.BotBuilderSamples.StateBot.OnTurnAsync(Microsoft.Bot.Builder.ITurnContext,System.Threading.CancellationToken)\">\n            <summary>The turn handler for the bot.</summary>\n            <param name=\"turnContext\">A <see cref=\"T:Microsoft.Bot.Builder.ITurnContext\"/> containing all the data needed\n            for processing this conversation turn. </param>\n            <param name=\"cancellationToken\">(Optional) A <see cref=\"T:System.Threading.CancellationToken\"/> that can be used by other objects\n            or threads to receive notice of cancellation.</param>\n            <returns>A <see cref=\"T:System.Threading.Tasks.Task\"/> that represents the work queued to execute.</returns>\n        </member>\n        <member name=\"T:Microsoft.BotBuilderSamples.StateBotAccessors\">\n            <summary>\n            This class is created as a Singleton and passed into the IBot-derived constructor.\n             - See <see cref=\"T:Microsoft.BotBuilderSamples.StateBotAccessors\"/> constructor for how that is injected.\n             - See the Startup.cs file for more details on creating the Singleton that gets\n               injected into the constructor.\n            </summary>\n        </member>\n        <member name=\"M:Microsoft.BotBuilderSamples.StateBotAccessors.#ctor(Microsoft.Bot.Builder.ConversationState,Microsoft.Bot.Builder.UserState)\">\n            <summary>\n            Initializes a new instance of the <see cref=\"T:Microsoft.BotBuilderSamples.StateBotAccessors\"/> class.\n            Contains the state management and associated accessor objects.\n            </summary>\n            <param name=\"conversationState\">The state object that stores the conversation state.</param>\n            <param name=\"userState\">The state object that stores the user state.</param>\n        </member>\n        <member name=\"P:Microsoft.BotBuilderSamples.StateBotAccessors.UserProfileName\">\n            <summary>\n            Gets the accessor name for the user profile property accessor.\n            </summary>\n            <value>The accessor name for the user profile property accessor.</value>\n            <remarks>Accessors require a unique name.</remarks>\n        </member>\n        <member name=\"P:Microsoft.BotBuilderSamples.StateBotAccessors.UserProfileAccessor\">\n            <summary>\n            Gets or sets the <see cref=\"T:Microsoft.Bot.Builder.IStatePropertyAccessor`1\"/> for the user profile property.\n            </summary>\n            <value>\n            The accessor stores the turn count for the conversation.\n            </value>\n        </member>\n        <member name=\"P:Microsoft.BotBuilderSamples.StateBotAccessors.ConversationState\">\n            <summary>\n            Gets the <see cref=\"P:Microsoft.BotBuilderSamples.StateBotAccessors.ConversationState\"/> object for the conversation.\n            </summary>\n            <value>The <see cref=\"P:Microsoft.BotBuilderSamples.StateBotAccessors.ConversationState\"/> object.</value>\n        </member>\n        <member name=\"P:Microsoft.BotBuilderSamples.StateBotAccessors.UserState\">\n            <summary>\n            Gets the <see cref=\"P:Microsoft.BotBuilderSamples.StateBotAccessors.UserState\"/> object for the conversation.\n            </summary>\n            <value>The <see cref=\"P:Microsoft.BotBuilderSamples.StateBotAccessors.UserState\"/> object.</value>\n        </member>\n    </members>\n</doc>\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/StateBot/StateBotAccessors.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing Microsoft.Bot.Builder;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    /// <summary>\n    /// This class is created as a Singleton and passed into the IBot-derived constructor.\n    ///  - See <see cref=\"StateBotAccessors\"/> constructor for how that is injected.\n    ///  - See the Startup.cs file for more details on creating the Singleton that gets\n    ///    injected into the constructor.\n    /// </summary>\n    public class StateBotAccessors\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"StateBotAccessors\"/> class.\n        /// Contains the state management and associated accessor objects.\n        /// </summary>\n        /// <param name=\"conversationState\">The state object that stores the conversation state.</param>\n        /// <param name=\"userState\">The state object that stores the user state.</param>\n        public StateBotAccessors(ConversationState conversationState, UserState userState)\n        {\n            ConversationState = conversationState ?? throw new ArgumentNullException(nameof(conversationState));\n            UserState = userState ?? throw new ArgumentNullException(nameof(userState));\n        }\n\n        /// <summary>\n        /// Gets the accessor name for the user profile property accessor.\n        /// </summary>\n        /// <value>The accessor name for the user profile property accessor.</value>\n        /// <remarks>Accessors require a unique name.</remarks>\n        public static string UserProfileName { get; } = \"UserProfile\";\n\n        /// <summary>\n        /// Gets the accessor name for the conversation data property accessor.\n        /// </summary>\n        /// <value>The accessor name for the conversation data property accessor.</value>\n        /// <remarks>Accessors require a unique name.</remarks>\n        public static string ConversationDataName { get; } = \"ConversationData\";\n\n        /// <summary>\n        /// Gets or sets the <see cref=\"IStatePropertyAccessor{T}\"/> for the user profile property.\n        /// </summary>\n        /// <value>\n        /// The accessor for the user profile property.\n        /// </value>\n        public IStatePropertyAccessor<UserProfile> UserProfileAccessor { get; set; }\n\n        /// <summary>\n        /// Gets or sets the <see cref=\"IStatePropertyAccessor{T}\"/> for the conversation data property.\n        /// </summary>\n        /// <value>\n        /// The accessor for the conversation data property.\n        /// </value>\n        public IStatePropertyAccessor<ConversationData> ConversationDataAccessor { get; set; }\n\n        /// <summary>\n        /// Gets the <see cref=\"ConversationState\"/> object for the conversation.\n        /// </summary>\n        /// <value>The <see cref=\"ConversationState\"/> object.</value>\n        public ConversationState ConversationState { get; }\n\n        /// <summary>\n        /// Gets the <see cref=\"UserState\"/> object for the bot.\n        /// </summary>\n        /// <value>The <see cref=\"UserState\"/> object.</value>\n        public UserState UserState { get; }\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/StateBot/UserProfile.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace Microsoft.BotBuilderSamples\n{\n    // Defines a state property used to track information about the user.\n    public class UserProfile\n    {\n        public string Name { get; set; }\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/StateBot/appsettings.json",
    "content": "{\n  \"botFilePath\": \"state.bot\",\n  \"botFileSecret\": \"\"\n}"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/StateBot/state.bot",
    "content": "﻿{\n  \"name\": \"StateBot\",\n  \"services\": [\n    {\n      \"type\": \"endpoint\",\n      \"name\": \"development\",\n      \"endpoint\": \"http://localhost:3978/api/messages\",\n      \"appId\": \"\",\n      \"appPassword\": \"\",\n      \"id\": \"1\"\n    }\n  ],\n  \"padlock\": \"\",\n  \"version\": \"2.0\"\n}"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/StateBot/wwwroot/default.htm",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>State Bot sample</title>\n    <style>\n        body {\n            margin: 0px;\n            padding: 0px;\n            font-family: Segoe UI;\n        }\n\n        html,\n        body {\n            height: 100%;\n        }\n\n        header {\n            background-image: url(\"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 4638.9 651.6' style='enable-background:new 0 0 4638.9 651.6;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%2355A0E0;%7D .st1%7Bfill:none;%7D .st2%7Bfill:%230058A8;%7D .st3%7Bfill:%23328BD8;%7D .st4%7Bfill:%23B6DCF1;%7D .st5%7Bopacity:0.2;fill:url(%23SVGID_1_);enable-background:new ;%7D%0A%3C/style%3E%3Crect y='1.1' class='st0' width='4640' height='646.3'/%3E%3Cpath class='st1' d='M3987.8,323.6L4310.3,1.1h-65.6l-460.1,460.1c-17.5,17.5-46.1,17.5-63.6,0L3260.9,1.1H0v646.3h3660.3 L3889,418.7c17.5-17.5,46.1-17.5,63.6,0l228.7,228.7h66.6l-260.2-260.2C3970.3,369.8,3970.3,341.1,3987.8,323.6z'/%3E%3Cpath class='st2' d='M3784.6,461.2L4244.7,1.1h-983.9l460.1,460.1C3738.4,478.7,3767.1,478.7,3784.6,461.2z'/%3E%3Cpath class='st3' d='M4640,1.1h-329.8l-322.5,322.5c-17.5,17.5-17.5,46.1,0,63.6l260.2,260.2H4640L4640,1.1L4640,1.1z'/%3E%3Cpath class='st4' d='M3889,418.8l-228.7,228.7h521.1l-228.7-228.7C3935.2,401.3,3906.5,401.3,3889,418.8z'/%3E%3ClinearGradient id='SVGID_1_' gradientUnits='userSpaceOnUse' x1='3713.7576' y1='438.1175' x2='3911.4084' y2='14.2535' gradientTransform='matrix(1 0 0 -1 0 641.3969)'%3E%3Cstop offset='0' style='stop-color:%23FFFFFF;stop-opacity:0.5'/%3E%3Cstop offset='1' style='stop-color:%23FFFFFF'/%3E%3C/linearGradient%3E%3Cpath class='st5' d='M3952.7,124.5c-17.5-17.5-46.1-17.5-63.6,0l-523,523h1109.6L3952.7,124.5z'/%3E%3C/svg%3E%0A\");\n            background-repeat: no-repeat;\n            background-size: 100%;\n            background-position: right;\n            background-color: #55A0E0;\n            width: 100%;\n            font-size: 44px;\n            height: 120px;\n            color: white;\n            padding: 30px 0 40px 0px;\n            display: inline-block;\n        }\n\n        .header-icon {\n            background-image: url(\"data:image/svg+xml;utf8,%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20150.2%20125%22%20style%3D%22enable-background%3Anew%200%200%20150.2%20125%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23FFFFFF%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.5%22%20class%3D%22st0%22%20width%3D%22149.7%22%20height%3D%22125%22/%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M59%2C102.9L21.8%2C66c-3.5-3.5-3.5-9.1%2C0-12.5l37-36.5l2.9%2C3l-37%2C36.4c-1.8%2C1.8-1.8%2C4.7%2C0%2C6.6l37.2%2C37L59%2C102.9z%22%0A%09%09/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M92.5%2C102.9l-3-3l37.2-37c0.9-0.9%2C1.4-2%2C1.4-3.3c0-1.2-0.5-2.4-1.4-3.3L89.5%2C20l2.9-3l37.2%2C36.4%0A%09%09c1.7%2C1.7%2C2.6%2C3.9%2C2.6%2C6.3s-0.9%2C4.6-2.6%2C6.3L92.5%2C102.9z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M90.1%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C98.1%2C64.7%2C94.4%2C68.4%2C90.1%2C68.4z%0A%09%09%20M90.1%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S91.9%2C56.5%2C90.1%2C56.5z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M61.4%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C69.5%2C64.7%2C65.8%2C68.4%2C61.4%2C68.4z%0A%09%09%20M61.4%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S63.3%2C56.5%2C61.4%2C56.5z%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A\");\n            background-repeat: no-repeat;\n            float: left;\n            height: 140px;\n            width: 140px;\n            display: inline-block;\n            vertical-align: middle;\n        }\n\n        .header-text {\n            padding-left: 1%;\n            color: #FFFFFF;\n            font-family: \"Segoe UI\";\n            font-size: 72px;\n            font-weight: 300;\n            letter-spacing: 0.35px;\n            line-height: 96px;\n            display: inline-block;\n            vertical-align: middle;\n        }\n\n        .header-inner-container {\n            min-width: 480px;\n            max-width: 1366px;\n            margin-left: auto;\n            margin-right: auto;\n            vertical-align: middle;\n        }\n\n        .header-inner-container::after {\n            content: \"\";\n            clear: both;\n            display: table;\n        }\n\n        .main-content-area {\n            padding-left: 30px;\n        }\n\n        .content-title {\n            color: #000000;\n            font-family: \"Segoe UI\";\n            font-size: 46px;\n            font-weight: 300;\n            line-height: 62px;\n        }\n\n        .main-text {\n            color: #808080;\n            font-size: 24px;\n            font-family: \"Segoe UI\";\n            font-size: 24px;\n            font-weight: 200;\n            line-height: 32px;\n        }\n\n        .main-text-p1{\n            padding-top: 48px;\n            padding-bottom: 28px;\n        }\n\n        .endpoint {\n           height: 32px;    \n           width: 571px;   \n           color: #808080; \n           font-family: \"Segoe UI\";    \n           font-size: 24px;    \n           font-weight: 200;   \n           line-height: 32px;\n           padding-top: 28px;\n        }\n\n        .how-to-build-section {\n            padding-top: 20px;\n            padding-left: 30px;\n        }\n\n        .how-to-build-section>h3 {\n            font-size: 16px;\n            font-weight: 600;\n            letter-spacing: 0.35px;\n            line-height: 22px;\n            margin: 0 0 24px 0;\n            text-transform: uppercase;\n        }\n\n        .step-container {\n            display: flex;\n            align-items: stretch;\n            position: relative;\n        }\n\n        .step-container dl {\n            border-left: 1px solid #A0A0A0;\n            display: block;\n            padding: 0 24px;\n            margin: 0;\n        }\n\n        .step-container dl>dt::before {\n            background-color: white;\n            border: 1px solid #A0A0A0;\n            border-radius: 100%;\n            content: '';\n            left: 47px;\n            height: 11px;\n            position: absolute;\n            width: 11px;\n        }\n\n        .step-container dl>.test-bullet::before {\n            background-color: blue;\n        }\n\n        .step-container dl>dt {\n            display: block;\n            font-size: inherit;\n            font-weight: bold;\n            line-height: 20px;\n        }\n\n        .step-container dl>dd {\n            font-size: inherit;\n            line-height: 20px;\n            margin-left: 0;\n            padding-bottom: 32px;\n        }\n\n        .step-container:last-child dl {\n            border-left: 1px solid transparent;\n        }\n\n        .ctaLink {\n            background-color: transparent;\n            border: 1px solid transparent;\n            color: #006AB1;\n            cursor: pointer;\n            font-weight: 600;\n            padding: 0;\n            white-space: normal;\n        }\n\n        .ctaLink:focus {\n            outline: 1px solid #00bcf2;\n        }\n\n        .ctaLink:hover {\n            text-decoration: underline;\n        }\n\n        .step-icon {\n            display: flex;\n            height: 38px;\n            margin-right: 15px;\n            width: 38px;\n        }\n\n        .step-icon>div {\n            height: 30px;\n            width: 30px;\n            background-repeat: no-repeat;\n        }\n\n        .ms-logo-container {\n            min-width: 580px;\n            max-width: 980px;\n            margin-left: auto;\n            margin-right: auto;\n            left: 0;\n            right: 0;\n            transition: bottom 400ms;\n        }\n\n        .ms-logo {\n            float: right;\n            background-image: url(\"data:image/svg+xml;utf8,%0A%3Csvg%20version%3D%221.1%22%20id%3D%22MS-symbol%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20400%20120%22%20style%3D%22enable-background%3Anew%200%200%20400%20120%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23737474%3B%7D%0A%09.st2%7Bfill%3A%23D63F26%3B%7D%0A%09.st3%7Bfill%3A%23167D3E%3B%7D%0A%09.st4%7Bfill%3A%232E76BC%3B%7D%0A%09.st5%7Bfill%3A%23FDB813%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.6%22%20class%3D%22st0%22%20width%3D%22398.7%22%20height%3D%22119%22/%3E%0A%3Cpath%20class%3D%22st1%22%20d%3D%22M171.3%2C38.4v43.2h-7.5V47.7h-0.1l-13.4%2C33.9h-5l-13.7-33.9h-0.1v33.9h-6.9V38.4h10.8l12.4%2C32h0.2l13.1-32H171.3%0A%09z%20M177.6%2C41.7c0-1.2%2C0.4-2.2%2C1.3-3c0.9-0.8%2C1.9-1.2%2C3.1-1.2c1.3%2C0%2C2.4%2C0.4%2C3.2%2C1.3c0.8%2C0.8%2C1.3%2C1.8%2C1.3%2C3c0%2C1.2-0.4%2C2.2-1.3%2C3%0A%09c-0.9%2C0.8-1.9%2C1.2-3.2%2C1.2s-2.3-0.4-3.1-1.2C178%2C43.8%2C177.6%2C42.8%2C177.6%2C41.7z%20M185.7%2C50.6v31h-7.3v-31H185.7z%20M207.8%2C76.3%0A%09c1.1%2C0%2C2.3-0.3%2C3.6-0.8c1.3-0.5%2C2.5-1.2%2C3.6-2v6.8c-1.2%2C0.7-2.5%2C1.2-4%2C1.5c-1.5%2C0.3-3.1%2C0.5-4.9%2C0.5c-4.6%2C0-8.3-1.4-11.1-4.3%0A%09c-2.9-2.9-4.3-6.6-4.3-11c0-5%2C1.5-9.1%2C4.4-12.3c2.9-3.2%2C7-4.8%2C12.4-4.8c1.4%2C0%2C2.7%2C0.2%2C4.1%2C0.5c1.4%2C0.4%2C2.5%2C0.8%2C3.3%2C1.2v7%0A%09c-1.1-0.8-2.3-1.5-3.4-1.9c-1.2-0.5-2.4-0.7-3.6-0.7c-2.9%2C0-5.2%2C0.9-7%2C2.8c-1.8%2C1.9-2.7%2C4.4-2.7%2C7.6c0%2C3.1%2C0.8%2C5.6%2C2.5%2C7.3%0A%09C202.6%2C75.4%2C204.9%2C76.3%2C207.8%2C76.3z%20M235.7%2C50.1c0.6%2C0%2C1.1%2C0%2C1.6%2C0.1s0.9%2C0.2%2C1.2%2C0.3v7.4c-0.4-0.3-0.9-0.5-1.7-0.8%0A%09c-0.7-0.3-1.6-0.4-2.7-0.4c-1.8%2C0-3.3%2C0.8-4.5%2C2.3c-1.2%2C1.5-1.9%2C3.8-1.9%2C7v15.6h-7.3v-31h7.3v4.9h0.1c0.7-1.7%2C1.7-3%2C3-4%0A%09C232.2%2C50.6%2C233.8%2C50.1%2C235.7%2C50.1z%20M238.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3%0A%09c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5c-4.8%2C0-8.6-1.4-11.4-4.2C240.3%2C75.3%2C238.9%2C71.4%2C238.9%2C66.6z%0A%09%20M246.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5%0A%09c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7C247.2%2C60.5%2C246.5%2C63%2C246.5%2C66.3z%20M281.5%2C58.8c0%2C1%2C0.3%2C1.9%2C1%2C2.5%0A%09c0.7%2C0.6%2C2.1%2C1.3%2C4.4%2C2.2c2.9%2C1.2%2C5%2C2.5%2C6.1%2C3.9c1.2%2C1.5%2C1.8%2C3.2%2C1.8%2C5.3c0%2C2.9-1.1%2C5.3-3.4%2C7c-2.2%2C1.8-5.3%2C2.7-9.1%2C2.7%0A%09c-1.3%2C0-2.7-0.2-4.3-0.5c-1.6-0.3-2.9-0.7-4-1.2v-7.2c1.3%2C0.9%2C2.8%2C1.7%2C4.3%2C2.2c1.5%2C0.5%2C2.9%2C0.8%2C4.2%2C0.8c1.6%2C0%2C2.9-0.2%2C3.6-0.7%0A%09c0.8-0.5%2C1.2-1.2%2C1.2-2.3c0-1-0.4-1.9-1.2-2.5c-0.8-0.7-2.4-1.5-4.6-2.4c-2.7-1.1-4.6-2.4-5.7-3.8c-1.1-1.4-1.7-3.2-1.7-5.4%0A%09c0-2.8%2C1.1-5.1%2C3.3-6.9c2.2-1.8%2C5.1-2.7%2C8.6-2.7c1.1%2C0%2C2.3%2C0.1%2C3.6%2C0.4c1.3%2C0.2%2C2.5%2C0.6%2C3.4%2C0.9v6.9c-1-0.6-2.1-1.2-3.4-1.7%0A%09c-1.3-0.5-2.6-0.7-3.8-0.7c-1.4%2C0-2.5%2C0.3-3.2%2C0.8C281.9%2C57.1%2C281.5%2C57.8%2C281.5%2C58.8z%20M297.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2%0A%09c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5%0A%09c-4.8%2C0-8.6-1.4-11.4-4.2C299.4%2C75.3%2C297.9%2C71.4%2C297.9%2C66.6z%20M305.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6%0A%09c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7%0A%09C306.3%2C60.5%2C305.5%2C63%2C305.5%2C66.3z%20M353.9%2C56.6h-10.9v25h-7.4v-25h-5.2v-6h5.2v-4.3c0-3.3%2C1.1-5.9%2C3.2-8c2.1-2.1%2C4.8-3.1%2C8.1-3.1%0A%09c0.9%2C0%2C1.7%2C0%2C2.4%2C0.1c0.7%2C0.1%2C1.3%2C0.2%2C1.8%2C0.4V42c-0.2-0.1-0.7-0.3-1.3-0.5c-0.6-0.2-1.3-0.3-2.1-0.3c-1.5%2C0-2.7%2C0.5-3.5%2C1.4%0A%09s-1.2%2C2.4-1.2%2C4.2v3.7h10.9v-7l7.3-2.2v9.2h7.4v6h-7.4v14.5c0%2C1.9%2C0.3%2C3.3%2C1%2C4c0.7%2C0.8%2C1.8%2C1.2%2C3.3%2C1.2c0.4%2C0%2C0.9-0.1%2C1.5-0.3%0A%09c0.6-0.2%2C1.1-0.4%2C1.6-0.7v6c-0.5%2C0.3-1.2%2C0.5-2.3%2C0.7c-1.1%2C0.2-2.1%2C0.3-3.2%2C0.3c-3.1%2C0-5.4-0.8-6.9-2.5c-1.5-1.6-2.3-4.1-2.3-7.4%0A%09V56.6z%22/%3E%0A%3Cg%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2224%22%20class%3D%22st2%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2224%22%20class%3D%22st3%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2261.8%22%20class%3D%22st4%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2261.8%22%20class%3D%22st5%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A\");\n        }\n\n        .ms-logo-container>div {\n            min-height: 60px;\n            width: 150px;\n            background-repeat: no-repeat;\n        }\n\n        .row {\n            padding: 90px 0px 0 20px;\n            min-width: 480px;\n            max-width: 1366px;\n            margin-left: auto;\n            margin-right: auto;\n        }\n\n        .column {\n            float: left;\n            width: 45%;\n            padding-right: 20px;\n        }\n\n        .row:after {\n            content: \"\";\n            display: table;\n            clear: both;\n        }\n\n        a {\n            text-decoration: none;\n        }\n\n        .download-the-emulator {\n            height: 20px;\n            color: #0063B1;\n            font-size: 15px;\n            line-height: 20px;\n            padding-bottom: 70px;\n        }\n\n        .how-to-iframe {\n            max-width: 700px !important;\n            min-width: 650px !important;\n            height: 700px !important;\n        }\n\n        .remove-frame-height {\n            height: 10px;\n        }\n\n        @media only screen and (max-width: 1300px) {\n            .ms-logo {\n                padding-top: 30px;\n            }\n\n            .header-text {\n                font-size: 40x;\n            }\n\n            .column {\n                float: none;\n                padding-top: 30px;\n                width: 100%;\n            }\n\n            .ms-logo-container {\n                padding-top: 30px;\n                min-width: 480px;\n                max-width: 650px;\n                margin-left: auto;\n                margin-right: auto;\n            }\n\n            .row {\n                padding: 20px 0px 0 20px;\n                min-width: 480px;\n                max-width: 650px;\n                margin-left: auto;\n                margin-right: auto;\n            }\n        }\n\n        @media only screen and (max-width: 1370px) {\n            header {\n                background-color: #55A0E0;\n                background-size: auto 200px;\n            }\n        }\n\n        @media only screen and (max-width: 1230px) {\n            header {\n                background-color: #55A0E0;\n                background-size: auto 200px;\n            }\n\n            .header-text {\n                font-size: 44px;\n            }\n\n            .header-icon {\n                height: 120px;\n                width: 120px;\n            }\n        }\n\n        @media only screen and (max-width: 1000px) {\n            header {\n                background-color: #55A0E0;\n                background-image: none;\n            }\n        }\n\n        @media only screen and (max-width: 632px) {\n            .header-text {\n                font-size: 32px;\n            }\n\n            .row {\n                padding: 10px 0px 0 10px;\n                max-width: 490px !important;\n                min-width: 410px !important;\n            }\n\n            .endpoint {\n                font-size: 25px;\n            }\n\n            .main-text {\n                font-size: 20px;\n            }\n\n            .step-container dl>dd {\n                font-size: 14px;\n            }\n\n            .column {\n                padding-right: 5px;\n            }\n\n            .header-icon {\n                height: 110px;\n                width: 110px;\n            }\n\n            .how-to-iframe {\n                max-width: 480px !important;\n                min-width: 400px !important;\n                height: 650px !important;\n                overflow: hidden;\n            }\n        }\n\n        .remove-frame-height {\n            max-height: 10px;\n        }\n    </style>\n    <script>\n        document.addEventListener('DOMContentLoaded', function () {\n            loadFrame();\n        });\n        var loadFrame = function () {\n            var iframe = document.createElement('iframe');\n            iframe.setAttribute(\"id\", \"iframe\");\n            var offLineHTMLContent = \"\";\n            var frameElement = document.getElementById(\"how-to-iframe\");\n            if (window.navigator.onLine) {\n                iframe.src = 'https://docs.botframework.com/static/abs/pages/f5.htm';\n                iframe.setAttribute(\"scrolling\", \"no\");\n                iframe.setAttribute(\"frameborder\", \"0\");\n                iframe.setAttribute(\"width\", \"100%\");\n                iframe.setAttribute(\"height\", \"100%\");\n                var frameDiv = document.getElementById(\"how-to-iframe\");\n                frameDiv.appendChild(iframe);\n            } else {\n                frameElement.classList.add(\"remove-frame-height\");\n            }\n        };      \n    </script>\n</head>\n\n<body>\n    <header class=\"header\">\n        <div class=\"header-inner-container\">\n            <div class=\"header-icon\" style=\"display: inline-block\"></div>\n            <div class=\"header-text\" style=\"display: inline-block\">State Bot</div>\n        </div>\n    </header>\n    <div class=\"row\">\n        <div class=\"column\" class=\"main-content-area\">\n            <div class=\"content-title\">Your bot is ready!</div>\n            <div class=\"main-text main-text-p1\">You can test your bot in the Bot Framework Emulator<br />\n                by opening the .bot file in the project folder.</div>\n            <div class=\"main-text download-the-emulator\"><a class=\"ctaLink\" href=\"https://aka.ms/bot-framework-F5-download-emulator\"\n                    target=\"_blank\">Download the Emulator</a></div>\n            <div class=\"main-text\">Visit <a class=\"ctaLink\" href=\"https://aka.ms/bot-framework-F5-abs-home\" target=\"_blank\">Azure\n                    Bot Service</a> to register your bot and add it to<br />\n                various channels. The bot's endpoint URL typically looks\n                like this:</div>\n            <div class=\"endpoint\">https://<i>your_bots_hostname</i>/api/messages</div>\n        </div>\n        <div class=\"column how-to-iframe\" id=\"how-to-iframe\"></div>\n    </div>\n    </div>\n    <div class=\"ms-logo-container\">\n        <div class=\"ms-logo\"></div>\n    </div>\n</body>\n\n</html>\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/nlp-with-dispatch/QnAMaker.tsv",
    "content": "Question\tAnswer\tSource\tMetadata\r\nhi\tHello!\tQnAMaker.tsv\t\r\ngreetings\tHello!\tQnAMaker.tsv\t\r\ngood morning\tHello!\tQnAMaker.tsv\t\r\ngood evening\tHello!\tQnAMaker.tsv\t\r\nWhat are you?\tI am the LUIS-QnAMaker Dispatch bot! This sample demonstrates using several LUIS applications and QnA Maker knowledge base using dispatch.\tQnAMaker.tsv\t\r\nWhat?\tI am the LUIS-QnAMaker Dispatch bot! This sample demonstrates using several LUIS applications and QnA Maker knowledge base using dispatch.\tQnAMaker.tsv\t\r\nWhat do you do?\tI am the LUIS-QnAMaker Dispatch bot! This sample demonstrates using several LUIS applications and QnA Maker knowledge base using dispatch.\tQnAMaker.tsv\t\r\nWho are you?\tI am the LUIS-QnAMaker Dispatch bot! This sample demonstrates using several LUIS applications and QnA Maker knowledge base using dispatch.\tQnAMaker.tsv\t\r\nWhat is your name?\tI am the LUIS-QnAMaker Dispatch bot! This sample demonstrates using several LUIS applications and QnA Maker knowledge base using dispatch.\tQnAMaker.tsv\t\r\nWhat should I call you?\tI am the LUIS-QnAMaker Dispatch bot! This sample demonstrates using several LUIS applications and QnA Maker knowledge base using dispatch.\tQnAMaker.tsv\t\r\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/nlp-with-dispatch/home-automation.json",
    "content": "{\n  \"name\": \"Home Automation\",\n  \"versionId\": \"0.1\",\n  \"desc\": \"Home Automation LUIS application - Bot Builder Samples\",\n  \"culture\": \"en-us\",\n  \"intents\": [\n    {\n      \"name\": \"HomeAutomation\"\n    },\n    {\n      \"name\": \"None\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"Device\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"deviceProperty\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"Room\",\n      \"roles\": []\n    }\n  ],\n  \"closedLists\": [\n    {\n      \"name\": \"Operation\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"off\",\n          \"list\": [\n            \"off\",\n            \"turn off\",\n            \"switch off\",\n            \"lock\",\n            \"out\",\n            \"shut down\",\n            \"stop\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"on\",\n          \"list\": [\n            \"on\",\n            \"turn on\",\n            \"switch on\",\n            \"unlock\",\n            \"un lock\",\n            \"boot up\",\n            \"start\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"Device_PatternAny\",\n      \"explicitList\": [],\n      \"roles\": []\n    },\n    {\n      \"name\": \"Room_PatternAny\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"number\",\n      \"roles\": []\n    }\n  ],\n  \"regex_features\": [],\n  \"model_features\": [],\n  \"patterns\": [\n    {\n      \"pattern\": \"turn off {Device_PatternAny} in {Room_PatternAny}\",\n      \"intent\": \"HomeAutomation\"\n    },\n    {\n      \"pattern\": \"{Device_PatternAny} off [please]\",\n      \"intent\": \"HomeAutomation\"\n    },\n    {\n      \"pattern\": \"turn on {Device_PatternAny}\",\n      \"intent\": \"HomeAutomation\"\n    },\n    {\n      \"pattern\": \"{Device_PatternAny} on [please]\",\n      \"intent\": \"HomeAutomation\"\n    },\n    {\n      \"pattern\": \"turn on {Device_PatternAny} in {Room_PatternAny}\",\n      \"intent\": \"HomeAutomation\"\n    },\n    {\n      \"pattern\": \"{Device_PatternAny} in {Room_PatternAny} on [please]\",\n      \"intent\": \"HomeAutomation\"\n    },\n    {\n      \"pattern\": \"{Device_PatternAny} in {Room_PatternAny} off [please]\",\n      \"intent\": \"HomeAutomation\"\n    }\n  ],\n  \"utterances\": [\n    {\n      \"text\": \"breezeway on please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 0,\n          \"endPos\": 8,\n          \"entity\": \"Room\"\n        }\n      ]\n    },\n    {\n      \"text\": \"change temperature to seventy two degrees\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 7,\n          \"endPos\": 17,\n          \"entity\": \"deviceProperty\"\n        }\n      ]\n    },\n    {\n      \"text\": \"coffee bar on please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 0,\n          \"endPos\": 9,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"decrease temperature for me please\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"startPos\": 9,\n          \"endPos\": 19,\n          \"entity\": \"deviceProperty\"\n        }\n      ]\n    },\n    {\n      \"text\": \"dim kitchen lights to 25 .\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"startPos\": 4,\n          \"endPos\": 10,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 12,\n          \"endPos\": 17,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"fish pond off please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 0,\n          \"endPos\": 8,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"fish pond on please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 0,\n          \"endPos\": 8,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"illuminate please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 0,\n          \"endPos\": 9,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"living room lamp on please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 0,\n          \"endPos\": 10,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 12,\n          \"endPos\": 15,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"living room lamps off please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 0,\n          \"endPos\": 10,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 12,\n          \"endPos\": 16,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"lock the doors for me please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 9,\n          \"endPos\": 13,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"lower your volume\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"startPos\": 11,\n          \"endPos\": 16,\n          \"entity\": \"deviceProperty\"\n        }\n      ]\n    },\n    {\n      \"text\": \"make camera 1 off please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 5,\n          \"endPos\": 12,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"make some coffee\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 10,\n          \"endPos\": 15,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"play dvd\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 5,\n          \"endPos\": 7,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"set lights out in bedroom\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 4,\n          \"endPos\": 9,\n          \"entity\": \"Device\"\n        },\n        {\n          \"startPos\": 18,\n          \"endPos\": 24,\n          \"entity\": \"Room\"\n        }\n      ]\n    },\n    {\n      \"text\": \"set lights to bright\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 4,\n          \"endPos\": 9,\n          \"entity\": \"Device\"\n        },\n        {\n          \"startPos\": 14,\n          \"endPos\": 19,\n          \"entity\": \"deviceProperty\"\n        }\n      ]\n    },\n    {\n      \"text\": \"set lights to concentrate\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 4,\n          \"endPos\": 9,\n          \"entity\": \"Device\"\n        },\n        {\n          \"startPos\": 14,\n          \"endPos\": 24,\n          \"entity\": \"deviceProperty\"\n        }\n      ]\n    },\n    {\n      \"text\": \"shut down my work computer\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 18,\n          \"endPos\": 25,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"snap switch fan fifty percent\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 12,\n          \"endPos\": 14,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"start master bedroom light.\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 6,\n          \"endPos\": 19,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 21,\n          \"endPos\": 25,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"theater on please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 0,\n          \"endPos\": 6,\n          \"entity\": \"Room\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn dimmer off\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 5,\n          \"endPos\": 10,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn off ac please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 9,\n          \"endPos\": 10,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn off foyer lights\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 9,\n          \"endPos\": 13,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 15,\n          \"endPos\": 20,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn off living room light\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 9,\n          \"endPos\": 19,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 21,\n          \"endPos\": 25,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn off staircase\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 9,\n          \"endPos\": 17,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn off venice lamp\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 16,\n          \"endPos\": 19,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn on bathroom heater\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 8,\n          \"endPos\": 15,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 17,\n          \"endPos\": 22,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn on external speaker\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 8,\n          \"endPos\": 23,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn on kitchen faucet\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 8,\n          \"endPos\": 14,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 16,\n          \"endPos\": 21,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn on light in bedroom\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 8,\n          \"endPos\": 12,\n          \"entity\": \"Device\"\n        },\n        {\n          \"startPos\": 17,\n          \"endPos\": 23,\n          \"entity\": \"Room\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn on my bedroom lights.\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 11,\n          \"endPos\": 17,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 19,\n          \"endPos\": 24,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn on the furnace room lights\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 12,\n          \"endPos\": 23,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 25,\n          \"endPos\": 30,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn on the internet in my bedroom please\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"startPos\": 27,\n          \"endPos\": 33,\n          \"entity\": \"Room\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn on thermostat please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 8,\n          \"endPos\": 17,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn the fan to high\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 9,\n          \"endPos\": 11,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn thermostat on 70.\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 5,\n          \"endPos\": 14,\n          \"entity\": \"Device\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/nlp-with-dispatch/nlp-with-dispatchDispatch.json",
    "content": "{\n  \"name\": \"nlp-with-dispatchDispatch\",\n  \"versionId\": \"Dispatch\",\n  \"desc\": \"Dispatch model for nlp-with-dispatchDispatch\",\n  \"culture\": \"en-us\",\n  \"intents\": [\n    {\n      \"name\": \"l_Home Automation\"\n    },\n    {\n      \"name\": \"l_Weather\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"q_sample-qna\"\n    }\n  ],\n  \"entities\": [],\n  \"closedLists\": [],\n  \"composites\": [],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [],\n  \"regex_features\": [],\n  \"model_features\": [],\n  \"patterns\": [],\n  \"utterances\": [\n    {\n      \"text\": \"breezeway on please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change temperature to seventy two degrees\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"coffee bar on please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"current weather ?\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"decrease temperature for me please\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dim kitchen lights to 25 .\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do florida residents usually need ice scrapers\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"fish pond off please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"fish pond on please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forecast in celcius\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get florence temperature in september\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get for me the weather conditions in sonoma county\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get the daily temperature greenwood indiana\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get the forcast for me\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get the weather at saint george utah\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good evening\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good morning\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"greetings\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hi\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much rain does chambersburg get a year\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to know the temperature at death valley\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"illuminate please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"living room lamp on please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"living room lamps off please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"lock the doors for me please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"lower your volume\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make camera 1 off please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make some coffee\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"play dvd\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"provide me by toronto weather please\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set lights out in bedroom\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set lights to bright\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set lights to concentrate\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show average rainfall for boise\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me the forecast at alabama\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shut down my work computer\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"snap switch fan fifty percent\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"soliciting today's weather\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start master bedroom light.\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"temperature of delhi in celsius please\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"theater on please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn dimmer off\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn off ac please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn off foyer lights\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn off living room light\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn off staircase\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn off venice lamp\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn on bathroom heater\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn on external speaker\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn on kitchen faucet\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn on light in bedroom\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn on my bedroom lights.\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn on the furnace room lights\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn on the internet in my bedroom please\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn on thermostat please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn the fan to high\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn thermostat on 70.\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"was last year about this time as wet as it is now in the south ?\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what are you?\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what do you do?\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the rain volume in sonoma county ?\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the weather in redmond ?\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the weather today at 10 day durham ?\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is your name?\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what should i call you?\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what to wear in march in california\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what will the weather be tomorrow in new york ?\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what?\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's the weather going to be like in hawaii ?\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's the weather like in minneapolis\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who are you?\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will it be raining in ranchi\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will it rain this weekend\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will it snow today\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    }\n  ]\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/nlp-with-dispatch/weather.json",
    "content": "{\n  \"name\": \"Weather\",\n  \"versionId\": \"0.1\",\n  \"desc\": \"Weather LUIS application - Bot Builder Samples\",\n  \"culture\": \"en-us\",\n  \"intents\": [\n    {\n      \"name\": \"Get Weather Condition\"\n    },\n    {\n      \"name\": \"Get Weather Forecast\"\n    },\n    {\n      \"name\": \"None\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"Location\",\n      \"roles\": []\n    }\n  ],\n  \"closedLists\": [],\n  \"composites\": [],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"Location_PatternAny\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [],\n  \"regex_features\": [],\n  \"model_features\": [],\n  \"patterns\": [\n    {\n      \"pattern\": \"weather in {Location_PatternAny}\",\n      \"intent\": \"Get Weather Condition\"\n    },\n    {\n      \"pattern\": \"how's the weather in {Location_PatternAny}\",\n      \"intent\": \"Get Weather Condition\"\n    },\n    {\n      \"pattern\": \"current weather in {Location_PatternAny}\",\n      \"intent\": \"Get Weather Condition\"\n    },\n    {\n      \"pattern\": \"what's the forecast for next week in {Location_PatternAny}\",\n      \"intent\": \"Get Weather Forecast\"\n    },\n    {\n      \"pattern\": \"show me the forecast for {Location_PatternAny}\",\n      \"intent\": \"Get Weather Forecast\"\n    },\n    {\n      \"pattern\": \"what's the forecast for {Location_PatternAny}\",\n      \"intent\": \"Get Weather Forecast\"\n    }\n  ],\n  \"utterances\": [\n    {\n      \"text\": \"current weather ?\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do florida residents usually need ice scrapers\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 3,\n          \"endPos\": 9,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"forecast in celcius\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get florence temperature in september\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 4,\n          \"endPos\": 11,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"get for me the weather conditions in sonoma county\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 37,\n          \"endPos\": 49,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"get the daily temperature greenwood indiana\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 26,\n          \"endPos\": 42,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"get the forcast for me\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get the weather at saint george utah\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 19,\n          \"endPos\": 35,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"how much rain does chambersburg get a year\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 19,\n          \"endPos\": 30,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to know the temperature at death valley\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": [\n        {\n          \"startPos\": 34,\n          \"endPos\": 45,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"provide me by toronto weather please\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": [\n        {\n          \"startPos\": 14,\n          \"endPos\": 20,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"show average rainfall for boise\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 26,\n          \"endPos\": 30,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the forecast at alabama\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": [\n        {\n          \"startPos\": 24,\n          \"endPos\": 30,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"soliciting today's weather\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"temperature of delhi in celsius please\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 15,\n          \"endPos\": 19,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"was last year about this time as wet as it is now in the south ?\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 57,\n          \"endPos\": 61,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the rain volume in sonoma county ?\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 27,\n          \"endPos\": 39,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the weather in redmond ?\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": [\n        {\n          \"startPos\": 23,\n          \"endPos\": 29,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the weather today at 10 day durham ?\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": [\n        {\n          \"startPos\": 36,\n          \"endPos\": 41,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"what to wear in march in california\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 25,\n          \"endPos\": 34,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"what will the weather be tomorrow in new york ?\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": [\n        {\n          \"startPos\": 37,\n          \"endPos\": 44,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"what's the weather going to be like in hawaii ?\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": [\n        {\n          \"startPos\": 39,\n          \"endPos\": 44,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"what's the weather like in minneapolis\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 27,\n          \"endPos\": 37,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"will it be raining in ranchi\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": [\n        {\n          \"startPos\": 22,\n          \"endPos\": 27,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"will it rain this weekend\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will it snow today\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": []\n    }\n  ]\n}\n"
  },
  {
    "path": "SDKV4-Samples/dotnet_core/nlp-with-luis/reminders-with-entities.json",
    "content": "{\r\n  \"intents\": [\r\n    {\r\n      \"name\": \"Calendar_Add\"\r\n    },\r\n    {\r\n      \"name\": \"Calendar_Find\"\r\n    },\r\n    {\r\n      \"name\": \"None\"\r\n    }\r\n  ],\r\n  \"entities\": [\r\n    {\r\n      \"name\": \"Appointment\",\r\n      \"roles\": []\r\n    },\r\n    {\r\n      \"name\": \"Meeting\",\r\n      \"roles\": []\r\n    },\r\n    {\r\n      \"name\": \"Schedule\",\r\n      \"roles\": []\r\n    }\r\n  ],\r\n  \"composites\": [],\r\n  \"closedLists\": [],\r\n  \"patternAnyEntities\": [],\r\n  \"regex_entities\": [],\r\n  \"prebuiltEntities\": [],\r\n  \"model_features\": [],\r\n  \"regex_features\": [],\r\n  \"patterns\": [],\r\n  \"utterances\": [\r\n    {\r\n      \"text\": \"add a new event on 27 - apr\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"add a new task finish assignment\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"add an event to read about adam lambert news\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"add an event to visit 209 nashville gym\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"add date to my schedule\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Schedule\",\r\n          \"startPos\": 15,\r\n          \"endPos\": 22\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"add imax theater to my upcoming events\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"am i free to be with friends saturday ?\",\r\n      \"intent\": \"None\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"appointment with johnson needs to be next week\",\r\n      \"intent\": \"None\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Appointment\",\r\n          \"startPos\": 0,\r\n          \"endPos\": 10\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"calendar for november 1948\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"calendar i ' ll be at the garage from 8 till 3 this saturday\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"call dad mike\",\r\n      \"intent\": \"None\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"change the meeting with chris to 9 : 00 am\",\r\n      \"intent\": \"None\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"display weekend plans\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"do i have anything on wednesday ?\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"dunmore pa sonic sounds friday morning please\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"email cloney john\",\r\n      \"intent\": \"None\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"extend lunch meeting 30 minutes extra\",\r\n      \"intent\": \"None\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Meeting\",\r\n          \"startPos\": 13,\r\n          \"endPos\": 19\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"how many days are there between march 13th 2015 and today ?\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"i want to reschedule the meeting at the air force club\",\r\n      \"intent\": \"None\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"marketing meetings on tuesdays will now be every wednesday please change on my calendar\",\r\n      \"intent\": \"None\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"meet my manager\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"meeting my manager\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"move the bbq party to friday\",\r\n      \"intent\": \"None\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"pull up my appointment find out how much time i have before my next appointment\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Appointment\",\r\n          \"startPos\": 11,\r\n          \"endPos\": 21\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"save the date may 17 pictures party\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"schedule a conference call for tomorrow\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Schedule\",\r\n          \"startPos\": 0,\r\n          \"endPos\": 7\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"schedule a meeting for tomorrow\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Meeting\",\r\n          \"startPos\": 11,\r\n          \"endPos\": 17\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"schedule appointment for tomorrow please\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Schedule\",\r\n          \"startPos\": 0,\r\n          \"endPos\": 7\r\n        },\r\n        {\r\n          \"entity\": \"Appointment\",\r\n          \"startPos\": 9,\r\n          \"endPos\": 19\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"search for meetings with chris\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Meeting\",\r\n          \"startPos\": 11,\r\n          \"endPos\": 18\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"show me tomorrow ' s wedding party time\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"show my schedule for tomorrow\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Schedule\",\r\n          \"startPos\": 8,\r\n          \"endPos\": 15\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"tell me the event details\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"the meeting will last for one hour\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Meeting\",\r\n          \"startPos\": 4,\r\n          \"endPos\": 10\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"the workshop will last for 10 hours\",\r\n      \"intent\": \"None\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"voice activated reading of appointments this week\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Appointment\",\r\n          \"startPos\": 27,\r\n          \"endPos\": 38\r\n        }\r\n      ]\r\n    }\r\n  ],\r\n  \"settings\": []\r\n}"
  },
  {
    "path": "SDKV4-Samples/js/DialogPromptBot/.eslintrc.js",
    "content": "module.exports = {\n  \"extends\": \"standard\",\n  \"rules\": {\n    \"semi\": [2, \"always\"],\n    \"indent\": [2, 4],\n    \"no-return-await\": 0,\n    \"space-before-function-paren\": [2, {\n      \"named\": \"never\",\n      \"anonymous\": \"never\",\n      \"asyncArrow\": \"always\"\n    }],\n    \"template-curly-spacing\": [2, \"always\"]\n  }\n};"
  },
  {
    "path": "SDKV4-Samples/js/DialogPromptBot/.gitignore",
    "content": "node_modules\n.env"
  },
  {
    "path": "SDKV4-Samples/js/DialogPromptBot/README.md",
    "content": "# Dialog Prompt Bot\nBot from the prompt-users-using-dialogs topic\n\nThis bot has been created using [Microsoft Bot Framework][10], it shows how to create a simple echo bot with state. The bot maintains a simple counter that increases with each message from the user. This bot example uses [`restify`][1].\n\n# To run the bot\n- Install modules and start the bot\n    ```bash\n    npm i & npm start\n    ```\n    Alternatively you can also use nodemon via\n    ```bash\n    npm i & npm run watch\n    ```\n\n# Testing the bot using Bot Framework Emulator\n[Microsoft Bot Framework Emulator][2] is a desktop application that allows bot developers to test and debug their bots on localhost or running remotely through a tunnel.\n\n- Install the Bot Framework emulator from [here][3]\n\n## Connect to bot using Bot Framework Emulator **V4**\n- Launch Bot Framework Emulator\n- File -> Open Bot Configuration\n- Select `dialog-prompt.bot` file\n\n# Bot state\nA key to good bot design is to track the context of a conversation, so that your bot remembers things like the answers to previous questions. Depending on what your bot is used for, you may even need to keep track of conversation state or store user related information for longer than the lifetime of one given conversation.\n\nIn this example, the bot's state is used to track number of messages.\n\n A bot's state is information it remembers in order to respond appropriately to incoming messages. The Bot Builder SDK provides classes for [storing and retrieving state data][4] as an object associated with a user or a conversation.\n\n    - Conversation properties help your bot keep track of the current conversation the bot is having with the user. If your bot needs to complete a sequence of steps or switch between conversation topics, you can use conversation properties to manage steps in a sequence or track the current topic. Since conversation properties reflect the state of the current conversation, you typically clear them at the end of a session, when the bot receives an end of conversation activity.\n\n    - User properties can be used for many purposes, such as determining where the user's prior conversation left off or simply greeting a returning user by name. If you store a user's preferences, you can use that information to customize the conversation the next time you chat. For example, you might alert the user to a news article about a topic that interests her, or alert a user when an appointment becomes available. You should clear them if the bot receives a delete user data activity.\n\n# Deploy this bot to Azure\nYou can use the [MSBot][5] Bot Builder CLI tool to clone and configure the services this sample depends on.\n\nTo install all Bot Builder tools -\n\nEnsure you have [Node.js](https://nodejs.org/) version 8.5 or higher\n\n```bash\nnpm i -g msbot chatdown ludown qnamaker luis-apis botdispatch luisgen\n```\n\nTo clone this bot, run\n```\nmsbot clone services -f deploymentScripts/msbotClone -n myChatBot -l <Azure-location> --subscriptionId <Azure-subscription-id>\n```\n\n# Further reading\n- [Azure Bot Service Introduction][6]\n- [Bot State][7]\n- [Write directly to storage][8]\n- [Managing conversation and user state][9]\n\n\n[1]: https://www.npmjs.com/package/restify\n[2]: https://github.com/microsoft/botframework-emulator\n[3]: https://aka.ms/botframework-emulator\n[4]: https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-v4-state?view=azure-bot-service-4.0&tabs=js\n[5]: https://github.com/microsoft/botbuilder-tools\n[6]: https://docs.microsoft.com/en-us/azure/bot-service/bot-service-overview-introduction?view=azure-bot-service-4.0\n[7]: https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-storage-concept?view=azure-bot-service-4.0\n[8]: https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-v4-storage?view=azure-bot-service-4.0&tabs=jsechoproperty%2Ccsetagoverwrite%2Ccsetag\n[9]: https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-v4-state?view=azure-bot-service-4.0&tabs=js\n[10] https://dev.botframework.com\n"
  },
  {
    "path": "SDKV4-Samples/js/DialogPromptBot/bot.js",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nconst { ActivityTypes } = require('botbuilder');\nconst { DialogSet, WaterfallDialog, NumberPrompt, DateTimePrompt, ChoicePrompt, DialogTurnStatus }\n    = require('botbuilder-dialogs');\n\n// Define identifiers for our state property accessors.\nconst DIALOG_STATE_ACCESSOR = 'dialogStateAccessor';\nconst RESERVATION_ACCESSOR = 'reservationAccessor';\n\n// Define identifiers for our dialogs and prompts.\nconst RESERVATION_DIALOG = 'reservationDialog';\nconst SIZE_RANGE_PROMPT = 'rangePrompt';\nconst LOCATION_PROMPT = 'locationPrompt';\nconst RESERVATION_DATE_PROMPT = 'reservationDatePrompt';\n\nclass DialogPromptBot {\n    /**\n     *\n     * @param {ConversationState} conversation state object\n     */\n    constructor(conversationState) {\n        // Creates our state accessor properties.\n        // See https://aka.ms/about-bot-state-accessors to learn more about the bot state and state accessors.\n        this.dialogStateAccessor = conversationState.createProperty(DIALOG_STATE_ACCESSOR);\n        this.reservationAccessor = conversationState.createProperty(RESERVATION_ACCESSOR);\n        this.conversationState = conversationState;\n\n        // Create the dialog set and add the prompts, including custom validation.\n        this.dialogSet = new DialogSet(this.dialogStateAccessor);\n        this.dialogSet.add(new NumberPrompt(SIZE_RANGE_PROMPT, this.rangeValidator));\n        this.dialogSet.add(new ChoicePrompt(LOCATION_PROMPT));\n        this.dialogSet.add(new DateTimePrompt(RESERVATION_DATE_PROMPT, this.dateValidator));\n\n        // Define the steps of the waterfall dialog and add it to the set.\n        this.dialogSet.add(new WaterfallDialog(RESERVATION_DIALOG, [\n            this.promptForPartySize.bind(this),\n            this.promptForLocation.bind(this),\n            this.promptForReservationDate.bind(this),\n            this.acknowledgeReservation.bind(this),\n        ]));\n    }\n\n    /**\n     *\n     * @param {TurnContext} on turn context object.\n     */\n    async onTurn(turnContext) {\n        switch (turnContext.activity.type) {\n            case ActivityTypes.Message:\n                // Get the current reservation info from state.\n                const reservation = await this.reservationAccessor.get(turnContext, null);\n\n                // Generate a dialog context for our dialog set.\n                const dc = await this.dialogSet.createContext(turnContext);\n\n                if (!dc.activeDialog) {\n                    // If there is no active dialog, check whether we have a reservation yet.\n                    if (!reservation) {\n                        // If not, start the dialog.\n                        await dc.beginDialog(RESERVATION_DIALOG);\n                    }\n                    else {\n                        // Otherwise, send a status message.\n                        await turnContext.sendActivity(\n                            `We'll see you on ${reservation.date}.`);\n                    }\n                }\n                else {\n                    // Continue the dialog.\n                    const dialogTurnResult = await dc.continueDialog();\n\n                    // If the dialog completed this turn, record the reservation info.\n                    if (dialogTurnResult.status === DialogTurnStatus.complete) {\n                        await this.reservationAccessor.set(\n                            turnContext,\n                            dialogTurnResult.result);\n\n                        // Send a confirmation message to the user.\n                        await turnContext.sendActivity(\n                            `Your party of ${dialogTurnResult.result.size} is ` +\n                            `confirmed for ${dialogTurnResult.result.date} in ` +\n                            `${dialogTurnResult.result.location}.`);\n                    }\n                }\n\n                // Save the updated dialog state into the conversation state.\n                await this.conversationState.saveChanges(turnContext, false);\n                break;\n            case ActivityTypes.EndOfConversation:\n            case ActivityTypes.DeleteUserData:\n                break;\n            default:\n                break;\n        }\n    }\n\n    async promptForPartySize(stepContext) {\n        // Prompt for the party size. The result of the prompt is returned to the next step of the waterfall.\n        return await stepContext.prompt(\n            SIZE_RANGE_PROMPT, {\n                prompt: 'How many people is the reservation for?',\n                retryPrompt: 'How large is your party?',\n                validations: { min: 3, max: 8 },\n            });\n    }\n\n    async promptForLocation(stepContext) {\n        // Record the party size information in the current dialog state.\n        stepContext.values.size = stepContext.result;\n\n        // Prompt for location.\n        return await stepContext.prompt(LOCATION_PROMPT, {\n            prompt: 'Please choose a location.',\n            retryPrompt: 'Sorry, please choose a location from the list.',\n            choices: ['Redmond', 'Bellevue', 'Seattle'],\n        });\n    }\n\n    async promptForReservationDate(stepContext) {\n        // Record the location information in the current dialog state.\n        stepContext.values.location = stepContext.result.value;\n\n        return await stepContext.prompt(\n            RESERVATION_DATE_PROMPT, {\n                prompt: 'Great. When will the reservation be for?',\n                retryPrompt: 'What time should we make your reservation for?'\n            });\n    }\n\n    async acknowledgeReservation(stepContext) {\n        // Retrieve the reservation date.\n        const resolution = stepContext.result[0];\n        const time = resolution.value || resolution.start;\n\n        // Send an acknowledgement to the user.\n        await stepContext.context.sendActivity(\n            'Thank you. We will confirm your reservation shortly.');\n\n        // Return the collected information to the parent context.\n        return await stepContext.endDialog({\n            date: time,\n            size: stepContext.values.size,\n            location: stepContext.values.location\n        });\n    }\n\n    async rangeValidator(promptContext) {\n        // Check whether the input could be recognized as an integer.\n        if (!promptContext.recognized.succeeded) {\n            await promptContext.context.sendActivity(\n                \"I'm sorry, I do not understand. Please enter the number of people in your party.\");\n            return false;\n        }\n        else if (promptContext.recognized.value % 1 != 0) {\n            await promptContext.context.sendActivity(\n                \"I'm sorry, I don't understand fractional people.\");\n            return false;\n        }\n\n        // Check whether the party size is appropriate.\n        var size = promptContext.recognized.value;\n        if (size < promptContext.options.validations.min\n            || size > promptContext.options.validations.max) {\n            await promptContext.context.sendActivity(\n                'Sorry, we can only take reservations for parties of '\n                + `${promptContext.options.validations.min} to `\n                + `${promptContext.options.validations.max}.`);\n            await promptContext.context.sendActivity(promptContext.options.retryPrompt);\n            return false;\n        }\n\n        return true;\n    }\n\n    async dateValidator(promptContext) {\n        // Check whether the input could be recognized as an integer.\n        if (!promptContext.recognized.succeeded) {\n            await promptContext.context.sendActivity(\n                \"I'm sorry, I do not understand. Please enter the date or time for your reservation.\");\n            return false;\n        }\n\n        // Check whether any of the recognized date-times are appropriate,\n        // and if so, return the first appropriate date-time.\n        const earliest = Date.now() + (60 * 60 * 1000);\n        let value = null;\n        promptContext.recognized.value.forEach(candidate => {\n            // TODO: update validation to account for time vs date vs date-time vs range.\n            const time = new Date(candidate.value || candidate.start);\n            if (earliest < time.getTime()) {\n                value = candidate;\n            }\n        });\n        if (value) {\n            promptContext.recognized.value = [value];\n            return true;\n        }\n\n        await promptContext.context.sendActivity(\n            \"I'm sorry, we can't take reservations earlier than an hour from now.\");\n        return false;\n    }\n}\n\nmodule.exports.DialogPromptBot = DialogPromptBot;"
  },
  {
    "path": "SDKV4-Samples/js/DialogPromptBot/deploymentScripts/msbotClone/bot.recipe",
    "content": "{\n  \"version\": \"1.0\",\n  \"resources\": [\n    {\n      \"type\": \"endpoint\",\n      \"id\": \"1\",\n      \"name\": \"development\",\n      \"url\": \"http://localhost:3978/api/messages\"\n    },\n    {\n      \"type\": \"endpoint\",\n      \"id\": \"2\",\n      \"name\": \"production\",\n      \"url\": \"https://your-bot-url.azurewebsites.net/api/messages\"\n    },\n    {\n      \"type\": \"abs\",\n      \"id\": \"3\",\n      \"name\": \"DialogPromptBot-abs\"\n    },\n    {\n      \"type\": \"appInsights\",\n      \"id\": \"4\",\n      \"name\": \"DialogPromptBot-insights\"\n    },\n    {\n      \"type\": \"blob\",\n      \"id\": \"5\",\n      \"name\": \"DialogPromptBot-blob\",\n      \"container\": \"botstatestore\"\n    }\n  ]\n}"
  },
  {
    "path": "SDKV4-Samples/js/DialogPromptBot/dialog-prompt.bot",
    "content": "{\n    \"name\": \"DialogPromptBot\",\n    \"services\": [\n        {\n            \"type\": \"endpoint\",\n            \"name\": \"development\",\n            \"endpoint\": \"http://localhost:3978/api/messages\",\n            \"appId\": \"\",\n            \"appPassword\": \"\",\n            \"id\": \"1\"\n        }\n    ],\n    \"padlock\": \"\",\n    \"version\": \"2.0\"\n}"
  },
  {
    "path": "SDKV4-Samples/js/DialogPromptBot/index.js",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nconst path = require('path');\nconst restify = require('restify');\n\n// Import required bot services.\n// See https://aka.ms/bot-services to learn more about the different parts of a bot.\nconst { BotFrameworkAdapter, MemoryStorage, ConversationState } = require('botbuilder');\n\n// Import required bot configuration.\nconst { BotConfiguration } = require('botframework-config');\n\n// This bot's main dialog.\nconst { DialogPromptBot } = require('./bot');\n\n// Read botFilePath and botFileSecret from .env file\n// Note: Ensure you have a .env file and include botFilePath and botFileSecret.\nconst ENV_FILE = path.join(__dirname, '.env');\nconst env = require('dotenv').config({path: ENV_FILE});\n\n// bot endpoint name as defined in .bot file\n// See https://aka.ms/about-bot-file to learn more about .bot file its use and bot configuration .\nconst DEV_ENVIRONMENT = 'development';\n\n// bot name as defined in .bot file\n// See https://aka.ms/about-bot-file to learn more about .bot file its use and bot configuration.\nconst BOT_CONFIGURATION = (process.env.NODE_ENV || DEV_ENVIRONMENT);\n\n\n// Create HTTP server\nlet server = restify.createServer();\nserver.listen(process.env.port || process.env.PORT || 3978, function () {\n    console.log(`\\n${server.name} listening to ${server.url}`);\n    console.log(`\\nGet Bot Framework Emulator: https://aka.ms/botframework-emulator`);\n    console.log(`\\nTo talk to your bot, open dialog-prompt.bot file in the Emulator`);\n});\n\n// .bot file path\nconst BOT_FILE = path.join(__dirname, (process.env.botFilePath || ''));\n\n// Read bot configuration from .bot file.\nlet botConfig;\ntry {\n    botConfig = BotConfiguration.loadSync(BOT_FILE, process.env.botFileSecret);\n} catch (err) {\n    console.error(`\\nError reading bot file. Please ensure you have valid botFilePath and botFileSecret set for your environment.`);\n    console.error(`\\n - The botFileSecret is available under appsettings for your Azure Bot Service bot.`);\n    console.error(`\\n - If you are running this bot locally, consider adding a .env file with botFilePath and botFileSecret.\\n\\n`);\n    process.exit();\n}\n\n// Get bot endpoint configuration by service name\nconst endpointConfig = botConfig.findServiceByNameOrId(BOT_CONFIGURATION);\n\n// Create adapter.\n// See https://aka.ms/about-bot-adapter to learn more about .bot file its use and bot configuration .\nconst adapter = new BotFrameworkAdapter({\n    appId: endpointConfig.appId || process.env.microsoftAppID,\n    appPassword: endpointConfig.appPassword || process.env.microsoftAppPassword\n});\n\n// Define state store for your bot.\n// See https://aka.ms/about-bot-state to learn more about bot state.\nconst memoryStorage = new MemoryStorage();\n// CAUTION: You must ensure your product environment has the NODE_ENV set\n//          to use the Azure Blob storage or Azure Cosmos DB providers.\n// const { BlobStorage } = require('botbuilder-azure');\n// Storage configuration name or ID from .bot file\n// const STORAGE_CONFIGURATION_ID = '<STORAGE-NAME-OR-ID-FROM-BOT-FILE>';\n// // Default container name\n// const DEFAULT_BOT_CONTAINER = '<DEFAULT-CONTAINER>';\n// // Get service configuration\n// const blobStorageConfig = botConfig.findServiceByNameOrId(STORAGE_CONFIGURATION_ID);\n// const blobStorage = new BlobStorage({\n//     containerName: (blobStorageConfig.container || DEFAULT_BOT_CONTAINER),\n//     storageAccountOrConnectionString: blobStorageConfig.connectionString,\n// });\n// conversationState = new ConversationState(blobStorage);\n\n// Create conversation state with in-memory storage provider.\nconst conversationState = new ConversationState(memoryStorage);\n\n// Create the main dialog.\nconst myBot = new DialogPromptBot(conversationState);\n\n// Catch-all for errors.\nadapter.onTurnError = async (context, error) => {\n    // This check writes out errors to console log .vs. app insights.\n    console.error(`\\n [onTurnError]: ${error}`);\n    // Send a message to the user\n    context.sendActivity(`Oops. Something went wrong!`);\n    // Clear out state\n    await conversationState.load(context);\n    await conversationState.clear(context);\n    // Save state changes.\n    await conversationState.saveChanges(context);\n};\n\n// Listen for incoming requests.\nserver.post('/api/messages', (req, res) => {\n    adapter.processActivity(req, res, async (context) => {\n        // Route to main dialog.\n        await myBot.onTurn(context);\n    });\n});\n\n"
  },
  {
    "path": "SDKV4-Samples/js/DialogPromptBot/package.json",
    "content": "{\n    \"name\": \"dialog-prompt-bot\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Bot from the prompt-users-using-dialogs topic\",\n    \"author\": \"Microsoft Bot Builder Yeoman Generator v4.0.10\",\n    \"license\": \"MIT\",\n    \"main\": \"index.js\",\n    \"scripts\": {\n        \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n        \"build\": \"echo \\\"Error: no build specified\\\" && exit 1\",\n        \"start\": \"node ./index.js\",\n        \"watch\": \"nodemon ./index.js\"\n    },\n    \"dependencies\": {\n        \"botbuilder\": \"^4.2.1\",\n        \"botbuilder-dialogs\": \"^4.2.1\",\n        \"botframework-config\": \"^4.1.5\",\n        \"dotenv\": \"^6.0.0\",\n        \"restify\": \"^6.3.4\"\n    },\n    \"devDependencies\": {\n        \"eslint\": \"^5.6.0\",\n        \"eslint-config-standard\": \"^12.0.0\",\n        \"eslint-plugin-import\": \"^2.14.0\",\n        \"eslint-plugin-node\": \"^7.0.1\",\n        \"eslint-plugin-promise\": \"^4.0.1\",\n        \"eslint-plugin-standard\": \"^4.0.0\",\n        \"nodemon\": \"^1.18.4\",\n        \"@types/node\": \"10.10.2\",\n        \"@types/restify\": \"7.2.4\"\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/js/PromptUsersForInput/.eslintrc.js",
    "content": "module.exports = {\n  \"extends\": \"standard\",\n  \"rules\": {\n    \"semi\": [2, \"always\"],\n    \"indent\": [2, 4],\n    \"no-return-await\": 0,\n    \"space-before-function-paren\": [2, {\n      \"named\": \"never\",\n      \"anonymous\": \"never\",\n      \"asyncArrow\": \"always\"\n    }],\n    \"template-curly-spacing\": [2, \"always\"]\n  }\n};"
  },
  {
    "path": "SDKV4-Samples/js/PromptUsersForInput/README.md",
    "content": "# Prompt users for input\n\nThis sample demonstrates how to create your own prompts with an ASP.Net Core 2 bot.\nThe bot maintains conversation state to track and direct the conversation and ask the user questions.\nThe bot maintains user state to track the user's answers.\n\nThis bot example uses [`restify`][restify].\n\n# To run the bot\n\n- Install modules and start the bot\n    ```bash\n    npm i\n    npm start\n    ```\n    Alternatively you can also use nodemon via\n    ```bash\n    npm i\n    npm run watch\n    ```\n\n# Testing the bot using Bot Framework Emulator\n[Microsoft Bot Framework Emulator][emulator] is a desktop application that allows bot developers to test and debug their bots on localhost or running remotely through a tunnel.\n\n- Install the Bot Framework emulator from [here][emulator]\n\n## Connect to bot using Bot Framework Emulator **V4**\n- Launch Bot Framework Emulator\n- File -> Open Bot Configuration\n- Select `simplePrompts.bot` file\n\n# Bot state\n\nA bot is inherently stateless. Once your bot is deployed, it may not run in the same process or on the same machine from one turn to the next.\nHowever, your bot may need to track the context of a conversation, so that it can manage its behavior and remember answers to previous questions.\n\nIn this example, the bot's state is used to a track number of messages.\n\n- We use the bot's turn handler and user and conversation state properties to manage the flow of the conversation and the collection of input.\n- We ask the user a series of questions; parse, validate, and normalize their answers; and then save their input.\n\nThis sample is intended to be run and tested locally and is not designed to be deployed to Azure.\n\n# Further reading\n- [Azure Bot Service introduction][bot-service-overview]\n- [About bot state][state-concept]\n- [Prompt users for input][primitive-prompts]\n- [Managing conversation and user state][state-how-to]\n- [Write directly to storage][storage-how-to]\n\n\n[restify]: https://www.npmjs.com/package/restify\n[emulator]: https://aka.ms/botframework-emulator\n\n[bot-service-docs]: https://docs.microsoft.com/azure/bot-service/\n[bot-service-overview]: https://docs.microsoft.com/azure/bot-service/bot-service-overview-introduction\n[state-concept]: https://docs.microsoft.com/azure/bot-service/bot-builder-concept-state\n[primitive-prompts]: https://docs.microsoft.com/azure/bot-service/bot-builder-primitive-prompts\n[state-how-to]: https://docs.microsoft.com/azure/bot-service/bot-builder-howto-v4-state\n[storage-how-to]: https://docs.microsoft.com/azure/bot-service/bot-builder-howto-v4-storage\n"
  },
  {
    "path": "SDKV4-Samples/js/PromptUsersForInput/bot.js",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nconst Recognizers = require('@microsoft/recognizers-text-suite');\nconst { ActivityTypes, MessageFactory } = require('botbuilder');\n\n// The accessor names for the conversation flow and user profile state property accessors.\nconst CONVERSATION_FLOW_PROPERTY = 'conversationFlowProperty';\nconst USER_PROFILE_PROPERTY = 'userProfileProperty';\n\n// Identifies the last question asked.\nconst question = {\n    name: \"name\",\n    age: \"age\",\n    date: \"date\",\n    none: \"none\"\n}\n\n// Defines a bot for filling a user profile.\nclass MyBot {\n    constructor(conversationState, userState) {\n        // The state property accessors for conversation flow and user profile.\n        this.conversationFlow = conversationState.createProperty(CONVERSATION_FLOW_PROPERTY);\n        this.userProfile = userState.createProperty(USER_PROFILE_PROPERTY);\n\n        // The state management objects for the conversation and user.\n        this.conversationState = conversationState;\n        this.userState = userState;\n    }\n\n    // The bot's turn handler.\n    async onTurn(turnContext) {\n        // This bot listens for message activities.\n        if (turnContext.activity.type === ActivityTypes.Message) {\n            // Get the state properties from the turn context.\n            const flow = await this.conversationFlow.get(turnContext, { lastQuestionAsked: question.none });\n            const profile = await this.userProfile.get(turnContext, {});\n\n            await MyBot.fillOutUserProfile(flow, profile, turnContext);\n\n            // Update state and save changes.\n            await this.conversationFlow.set(turnContext, flow);\n            await this.conversationState.saveChanges(turnContext);\n\n            await this.userProfile.set(turnContext, profile);\n            await this.userState.saveChanges(turnContext);\n        }\n    }\n\n    // Manages the conversation flow for filling out the user's profile.\n    static async fillOutUserProfile(flow, profile, turnContext) {\n        const input = turnContext.activity.text;\n        let result;\n        switch (flow.lastQuestionAsked) {\n            // If we're just starting off, we haven't asked the user for any information yet.\n            // Ask the user for their name and update the conversation flag.\n            case question.none:\n                await turnContext.sendActivity(\"Let's get started. What is your name?\");\n                flow.lastQuestionAsked = question.name;\n                break;\n\n            // If we last asked for their name, record their response, confirm that we got it.\n            // Ask them for their age and update the conversation flag.\n            case question.name:\n                result = this.validateName(input);\n                if (result.success) {\n                    profile.name = result.name;\n                    await turnContext.sendActivity(`I have your name as ${profile.name}.`);\n                    await turnContext.sendActivity('How old are you?');\n                    flow.lastQuestionAsked = question.age;\n                    break;\n                } else {\n                    // If we couldn't interpret their input, ask them for it again.\n                    // Don't update the conversation flag, so that we repeat this step.\n                    await turnContext.sendActivity(\n                        result.message || \"I'm sorry, I didn't understand that.\");\n                    break;\n                }\n\n            // If we last asked for their age, record their response, confirm that we got it.\n            // Ask them for their date preference and update the conversation flag.\n            case question.age:\n                result = this.validateAge(input);\n                if (result.success) {\n                    profile.age = result.age;\n                    await turnContext.sendActivity(`I have your age as ${profile.age}.`);\n                    await turnContext.sendActivity('When is your flight?');\n                    flow.lastQuestionAsked = question.date;\n                    break;\n                } else {\n                    // If we couldn't interpret their input, ask them for it again.\n                    // Don't update the conversation flag, so that we repeat this step.\n                    await turnContext.sendActivity(\n                        result.message || \"I'm sorry, I didn't understand that.\");\n                    break;\n                }\n\n            // If we last asked for a date, record their response, confirm that we got it,\n            // let them know the process is complete, and update the conversation flag.\n            case question.date:\n                result = this.validateDate(input);\n                if (result.success) {\n                    profile.date = result.date;\n                    await turnContext.sendActivity(`Your cab ride to the airport is scheduled for ${profile.date}.`);\n                    await turnContext.sendActivity(`Thanks for completing the booking ${profile.name}.`);\n                    await turnContext.sendActivity('Type anything to run the bot again.');\n                    flow.lastQuestionAsked = question.none;\n                    profile = {};\n                    break;\n                } else {\n                    // If we couldn't interpret their input, ask them for it again.\n                    // Don't update the conversation flag, so that we repeat this step.\n                    await turnContext.sendActivity(\n                        result.message || \"I'm sorry, I didn't understand that.\");\n                    break;\n                }\n        }\n    }\n\n    // Validates name input. Returns whether validation succeeded and either the parsed and normalized\n    // value or a message the bot can use to ask the user again.\n    static validateName(input) {\n        const name = input && input.trim();\n        return name != undefined\n            ? { success: true, name: name }\n            : { success: false, message: 'Please enter a name that contains at least one character.' };\n    };\n\n    // Validates age input. Returns whether validation succeeded and either the parsed and normalized\n    // value or a message the bot can use to ask the user again.\n    static validateAge(input) {\n\n        // Try to recognize the input as a number. This works for responses such as \"twelve\" as well as \"12\".\n        try {\n            // Attempt to convert the Recognizer result to an integer. This works for \"a dozen\", \"twelve\", \"12\", and so on.\n            // The recognizer returns a list of potential recognition results, if any.\n            const results = Recognizers.recognizeNumber(input, Recognizers.Culture.English);\n            let output;\n            results.forEach(function (result) {\n                // result.resolution is a dictionary, where the \"value\" entry contains the processed string.\n                const value = result.resolution['value'];\n                if (value) {\n                    const age = parseInt(value);\n                    if (!isNaN(age) && age >= 18 && age <= 120) {\n                        output = { success: true, age: age };\n                        return;\n                    }\n                }\n            });\n            return output || { success: false, message: 'Please enter an age between 18 and 120.' };\n        } catch (error) {\n            return {\n                success: false,\n                message: \"I'm sorry, I could not interpret that as an age. Please enter an age between 18 and 120.\"\n            };\n        }\n    }\n\n    // Validates date input. Returns whether validation succeeded and either the parsed and normalized\n    // value or a message the bot can use to ask the user again.\n    static validateDate(input) {\n        // Try to recognize the input as a date-time. This works for responses such as \"11/14/2018\", \"today at 9pm\", \"tomorrow\", \"Sunday at 5pm\", and so on.\n        // The recognizer returns a list of potential recognition results, if any.\n        try {\n            const results = Recognizers.recognizeDateTime(input, Recognizers.Culture.English);\n            const now = new Date();\n            const earliest = now.getTime() + (60 * 60 * 1000);\n            let output;\n            results.forEach(function (result) {\n                // result.resolution is a dictionary, where the \"values\" entry contains the processed input.\n                result.resolution['values'].forEach(function (resolution) {\n                    // The processed input contains a \"value\" entry if it is a date-time value, or \"start\" and\n                    // \"end\" entries if it is a date-time range.\n                    const datevalue = resolution['value'] || resolution['start'];\n                    // If only time is given, assume it's for today.\n                    const datetime = resolution['type'] === 'time'\n                        ? new Date(`${now.toLocaleDateString()} ${datevalue}`)\n                        : new Date(datevalue);\n                    if (datetime && earliest < datetime.getTime()) {\n                        output = { success: true, date: datetime.toLocaleDateString() };\n                        return;\n                    }\n                });\n            });\n            return output || { success: false, message: \"I'm sorry, please enter a date at least an hour out.\" };\n        } catch (error) {\n            return {\n                success: false,\n                message: \"I'm sorry, I could not interpret that as an appropriate date. Please enter a date at least an hour out.\"\n            };\n        }\n    }\n}\n\nmodule.exports.MyBot = MyBot;"
  },
  {
    "path": "SDKV4-Samples/js/PromptUsersForInput/deploymentScripts/msbotClone/bot.recipe",
    "content": "{\n  \"version\": \"1.0\",\n  \"resources\": [\n    {\n      \"type\": \"endpoint\",\n      \"id\": \"1\",\n      \"name\": \"development\",\n      \"url\": \"http://localhost:3978/api/messages\"\n    },\n    {\n      \"type\": \"endpoint\",\n      \"id\": \"2\",\n      \"name\": \"production\",\n      \"url\": \"https://your-bot-url.azurewebsites.net/api/messages\"\n    },\n    {\n      \"type\": \"abs\",\n      \"id\": \"3\",\n      \"name\": \"simplePrompts-abs\"\n    },\n    {\n      \"type\": \"appInsights\",\n      \"id\": \"4\",\n      \"name\": \"simplePrompts-insights\"\n    },\n    {\n      \"type\": \"blob\",\n      \"id\": \"5\",\n      \"name\": \"simplePrompts-blob\",\n      \"container\": \"botstatestore\"\n    }\n  ]\n}"
  },
  {
    "path": "SDKV4-Samples/js/PromptUsersForInput/index.js",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nconst path = require('path');\nconst restify = require('restify');\n\n// Import required bot services.\n// See https://aka.ms/bot-services to learn more about the different parts of a bot.\nconst { BotFrameworkAdapter, MemoryStorage, ConversationState, UserState } = require('botbuilder');\n\n// Import required bot configuration.\nconst { BotConfiguration } = require('botframework-config');\n\n// This bot's main dialog.\nconst { MyBot } = require('./bot');\n\n// Read botFilePath and botFileSecret from .env file\n// Note: Ensure you have a .env file and include botFilePath and botFileSecret.\nconst ENV_FILE = path.join(__dirname, '.env');\nconst env = require('dotenv').config({path: ENV_FILE});\n\n// bot endpoint name as defined in .bot file\n// See https://aka.ms/about-bot-file to learn more about .bot file its use and bot configuration .\nconst DEV_ENVIRONMENT = 'development';\n\n// bot name as defined in .bot file\n// See https://aka.ms/about-bot-file to learn more about .bot file its use and bot configuration.\nconst BOT_CONFIGURATION = (process.env.NODE_ENV || DEV_ENVIRONMENT);\n\n\n// Create HTTP server\nlet server = restify.createServer();\nserver.listen(process.env.port || process.env.PORT || 3978, function () {\n    console.log(`\\n${server.name} listening to ${server.url}`);\n    console.log(`\\nGet Bot Framework Emulator: https://aka.ms/botframework-emulator`);\n    console.log(`\\nTo talk to your bot, open simplePrompts.bot file in the Emulator`);\n});\n\n// .bot file path\nconst BOT_FILE = path.join(__dirname, (process.env.botFilePath || ''));\n\n// Read bot configuration from .bot file.\nlet botConfig;\ntry {\n    botConfig = BotConfiguration.loadSync(BOT_FILE, process.env.botFileSecret);\n} catch (err) {\n    console.error(`\\nError reading bot file. Please ensure you have valid botFilePath and botFileSecret set for your environment.`);\n    console.error(`\\n - The botFileSecret is available under appsettings for your Azure Bot Service bot.`);\n    console.error(`\\n - If you are running this bot locally, consider adding a .env file with botFilePath and botFileSecret.\\n\\n`);\n    process.exit();\n}\n\n// Get bot endpoint configuration by service name\nconst endpointConfig = botConfig.findServiceByNameOrId(BOT_CONFIGURATION);\n\n// Create adapter.\n// See https://aka.ms/about-bot-adapter to learn more about .bot file its use and bot configuration .\nconst adapter = new BotFrameworkAdapter({\n    appId: endpointConfig.appId || process.env.microsoftAppID,\n    appPassword: endpointConfig.appPassword || process.env.microsoftAppPassword\n});\n\n// Create conversation and user state with in-memory storage provider.\nconst memoryStorage = new MemoryStorage();\nconst conversationState = new ConversationState(memoryStorage);\nconst userState = new UserState(memoryStorage);\n\n// Create the bot.\nconst myBot = new MyBot(conversationState, userState);\n\n// Catch-all for errors.\nadapter.onTurnError = async (context, error) => {\n    // This check writes out errors to console log .vs. app insights.\n    console.error(`\\n [onTurnError]: ${error}`);\n    // Send a message to the user\n    context.sendActivity(`Oops. Something went wrong!`);\n    // Clear out state\n    await conversationState.load(context);\n    await conversationState.clear(context);\n    // Save state changes.\n    await conversationState.saveChanges(context);\n};\n\n// Listen for incoming requests.\nserver.post('/api/messages', (req, res) => {\n    adapter.processActivity(req, res, async (context) => {\n        // Route to main dialog.\n        await myBot.onTurn(context);\n    });\n});\n\n"
  },
  {
    "path": "SDKV4-Samples/js/PromptUsersForInput/package.json",
    "content": "{\n    \"name\": \"simplePrompts\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Sample code for Create your own prompts to gather user input\",\n    \"author\": \"Microsoft Bot Builder Yeoman Generator v4.0.10\",\n    \"license\": \"MIT\",\n    \"main\": \"index.js\",\n    \"scripts\": {\n        \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n        \"build\": \"echo \\\"Error: no build specified\\\" && exit 1\",\n        \"start\": \"node ./index.js\",\n        \"watch\": \"nodemon ./index.js\"\n    },\n    \"dependencies\": {\n        \"@microsoft/recognizers-text-suite\": \"^1.1.4\",\n        \"botbuilder\": \"^4.0.6\",\n        \"botframework-config\": \"^4.0.6\",\n        \"dotenv\": \"^6.0.0\",\n        \"restify\": \"^6.3.4\"\n    },\n    \"devDependencies\": {\n        \"eslint\": \"^5.6.0\",\n        \"eslint-config-standard\": \"^12.0.0\",\n        \"eslint-plugin-import\": \"^2.14.0\",\n        \"eslint-plugin-node\": \"^7.0.1\",\n        \"eslint-plugin-promise\": \"^4.0.1\",\n        \"eslint-plugin-standard\": \"^4.0.0\",\n        \"nodemon\": \"^1.18.4\",\n        \"@types/node\": \"10.10.2\",\n        \"@types/restify\": \"7.2.4\"\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/js/PromptUsersForInput/resources/echo.chat",
    "content": "user=Vishwac\nbot=EchoBot\n\nuser: Hi\nbot: 1: You said \"Hi\"\nuser: Hello\nbot: 2: You said \"Hello\"\n"
  },
  {
    "path": "SDKV4-Samples/js/PromptUsersForInput/simplePrompts.bot",
    "content": "{\n    \"name\": \"simplePrompts\",\n    \"services\": [\n        {\n            \"type\": \"endpoint\",\n            \"name\": \"development\",\n            \"endpoint\": \"http://localhost:3978/api/messages\",\n            \"appId\": \"\",\n            \"appPassword\": \"\",\n            \"id\": \"1\"\n        }\n    ],\n    \"padlock\": \"\",\n    \"version\": \"2.0\"\n}"
  },
  {
    "path": "SDKV4-Samples/js/complexDialogBot/.eslintrc.js",
    "content": "module.exports = {\n  \"extends\": \"standard\",\n  \"rules\": {\n    \"semi\": [2, \"always\"],\n    \"indent\": [2, 4],\n    \"no-return-await\": 0,\n    \"space-before-function-paren\": [2, {\n      \"named\": \"never\",\n      \"anonymous\": \"never\",\n      \"asyncArrow\": \"always\"\n    }],\n    \"template-curly-spacing\": [2, \"always\"]\n  }\n};"
  },
  {
    "path": "SDKV4-Samples/js/complexDialogBot/.gitignore",
    "content": "node_modules\n.env"
  },
  {
    "path": "SDKV4-Samples/js/complexDialogBot/ComplexDialogBot.bot",
    "content": "{\n    \"name\": \"ComplexDialogBot\",\n    \"description\": \"\",\n    \"services\": [\n        {\n            \"type\": \"abs\",\n            \"tenantId\": \"72f988bf-86f1-41af-91ab-2d7cd011db47\",\n            \"subscriptionId\": \"0389857f-2464-451b-ac83-5f54d565b1a7\",\n            \"resourceGroup\": \"jf-registration-group\",\n            \"serviceName\": \"ComplexDialogBot\",\n            \"name\": \"ComplexDialogBot\",\n            \"id\": \"1\",\n            \"appId\": \"3dc6e586-761a-4f53-a86c-9068c13a8d34\"\n        },\n        {\n            \"type\": \"blob\",\n            \"connectionString\": \"DefaultEndpointsProtocol=https;AccountName=omplexia3982;AccountKey=i5x0MbMJdInaLDAS/sMY0lg5jG/RGoGWlwJiguutN4pn0Ow2bb7JuX9+psWMKLOwfUW5MYnkGTWFxaQSCc4gsQ==;\",\n            \"tenantId\": \"72f988bf-86f1-41af-91ab-2d7cd011db47\",\n            \"subscriptionId\": \"0389857f-2464-451b-ac83-5f54d565b1a7\",\n            \"resourceGroup\": \"jf-registration-group\",\n            \"serviceName\": \"omplexia3982\",\n            \"id\": \"2\"\n        },\n        {\n            \"type\": \"endpoint\",\n            \"appId\": \"\",\n            \"appPassword\": \"\",\n            \"endpoint\": \"http://localhost:3978/api/messages\",\n            \"name\": \"development\",\n            \"id\": \"3\"\n        },\n        {\n            \"type\": \"endpoint\",\n            \"appId\": \"3dc6e586-761a-4f53-a86c-9068c13a8d34\",\n            \"appPassword\": \"nddakednI@h2b%!X\",\n            \"endpoint\": \"https://omplexialogo59uk.azurewebsites.net/api/messages\",\n            \"name\": \"production\",\n            \"id\": \"4\"\n        },\n        {\n            \"type\": \"appInsights\",\n            \"instrumentationKey\": \"b6f253df-2a26-4848-b4e7-f531057820fe\",\n            \"applicationId\": \"5caae2b8-030b-4683-9713-f098a9a9e319\",\n            \"apiKeys\": {},\n            \"tenantId\": \"72f988bf-86f1-41af-91ab-2d7cd011db47\",\n            \"subscriptionId\": \"0389857f-2464-451b-ac83-5f54d565b1a7\",\n            \"resourceGroup\": \"jf-registration-group\",\n            \"serviceName\": \"ComplexDialogBotmbav3w\",\n            \"id\": \"5\"\n        }\n    ],\n    \"padlock\": \"\",\n    \"version\": \"2.0\"\n}"
  },
  {
    "path": "SDKV4-Samples/js/complexDialogBot/README.md",
    "content": "# ComplexDialogBot\n\nThis sample creates a complex conversation with dialogs and Node.js.\n\nThis bot has been created using [Microsoft Bot Framework][10], it shows how to create a simple echo bot with state. The bot maintains a simple counter that increases with each message from the user. This bot example uses [`restify`][1].\n\n# To run the bot\n\n- Install modules and start the bot\n    ```bash\n    npm i & npm start\n    ```\n    Alternatively you can also use nodemon via\n    ```bash\n    npm i & npm run watch\n    ```\n\n# Testing the bot using Bot Framework Emulator\n\n[Microsoft Bot Framework Emulator][2] is a desktop application that allows bot developers to test and debug their bots on localhost or running remotely through a tunnel.\n\n- Install the Bot Framework emulator from [here][3]\n\n## Connect to bot using Bot Framework Emulator **V4**\n\n- Launch Bot Framework Emulator\n- File -> Open Bot Configuration\n- Select `ComplexDialogBot.bot` file\n\n# Further reading\n\n- [Azure Bot Service Introduction][6]\n- [Bot State][7]\n- [Write directly to storage][8]\n- [Managing conversation and user state][9]\n\n[1]: https://www.npmjs.com/package/restify\n[2]: https://github.com/microsoft/botframework-emulator\n[3]: https://aka.ms/botframework-emulator\n[6]: https://docs.microsoft.com/azure/bot-service/bot-service-overview-introduction\n[7]: https://docs.microsoft.com/azure/bot-service/bot-builder-storage-concept\n[8]: https://docs.microsoft.com/azure/bot-service/bot-builder-howto-v4-storage?tabs=javascript\n[9]: https://docs.microsoft.com/azure/bot-service/bot-builder-howto-v4-state?tabs=javascript\n[10] https://dev.botframework.com"
  },
  {
    "path": "SDKV4-Samples/js/complexDialogBot/bot.js",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nconst { ActivityTypes } = require('botbuilder');\nconst { DialogSet, WaterfallDialog, TextPrompt, NumberPrompt, ChoicePrompt, DialogTurnStatus } = require('botbuilder-dialogs');\n\n// Define state property accessor names.\nconst DIALOG_STATE_PROPERTY = 'dialogStateProperty';\nconst USER_PROFILE_PROPERTY = 'userProfileProperty';\n\nconst WELCOME_TEXT =\n    'Welcome to ComplexDialogBot. This bot provides a complex conversation, with multiple dialogs. '\n    + 'Type anything to get started.';\n\n// Define the dialog and prompt names for the bot.\nconst TOP_LEVEL_DIALOG = 'dialog-topLevel';\nconst REVIEW_SELECTION_DIALOG = 'dialog-reviewSelection';\nconst NAME_PROMPT = 'prompt-name';\nconst AGE_PROMPT = 'prompt-age';\nconst SELECTION_PROMPT = 'prompt-companySelection';\n\n// Define a 'done' response for the company selection prompt.\nconst DONE_OPTION = 'done';\n\n// Define value names for values tracked inside the dialogs.\nconst USER_INFO = 'value-userInfo';\nconst COMPANIES_SELECTED = 'value-companiesSelected';\n\n// Define the company choices for the company selection prompt.\nconst COMPANY_OPTIONS = [\n    'Adatum Corporation', 'Contoso Suites', 'Graphic Design Institute', 'Wide World Importers'\n];\n\nclass MyBot {\n    /**\n     *\n     * @param {ConversationState} conversation state object\n     * @param {UserState} user state object\n     */\n    constructor(conversationState, userState) {\n        // Create the state property accessors and save the state management objects.\n        this.dialogStateAccessor = conversationState.createProperty(DIALOG_STATE_PROPERTY);\n        this.userProfileAccessor = userState.createProperty(USER_PROFILE_PROPERTY);\n        this.conversationState = conversationState;\n        this.userState = userState;\n\n        // Create a dialog set for the bot. It requires a DialogState accessor, with which\n        // to retrieve the dialog state from the turn context.\n        this.dialogs = new DialogSet(this.dialogStateAccessor);\n\n        // Add the prompts we need to the dialog set.\n        this.dialogs\n            .add(new TextPrompt(NAME_PROMPT))\n            .add(new NumberPrompt(AGE_PROMPT))\n            .add(new ChoicePrompt(SELECTION_PROMPT));\n\n        // Add the dialogs we need to the dialog set.\n        this.dialogs.add(new WaterfallDialog(TOP_LEVEL_DIALOG)\n            .addStep(this.nameStep.bind(this))\n            .addStep(this.ageStep.bind(this))\n            .addStep(this.startSelectionStep.bind(this))\n            .addStep(this.acknowledgementStep.bind(this)));\n        this.dialogs.add(new WaterfallDialog(REVIEW_SELECTION_DIALOG)\n            .addStep(this.selectionStep.bind(this))\n            .addStep(this.loopStep.bind(this)));\n    }\n\n    /**\n     *\n     * @param {TurnContext} on turn context object.\n     */\n    async onTurn(turnContext) {\n        if (turnContext.activity.type === ActivityTypes.Message) {\n            // Run the DialogSet - let the framework identify the current state of the dialog from\n            // the dialog stack and figure out what (if any) is the active dialog.\n            const dialogContext = await this.dialogs.createContext(turnContext);\n            const results = await dialogContext.continueDialog();\n            switch (results.status) {\n                case DialogTurnStatus.cancelled:\n                case DialogTurnStatus.empty:\n                    // If there is no active dialog, we should clear the user info and start a new dialog.\n                    await this.userProfileAccessor.set(turnContext, {});\n                    await this.userState.saveChanges(turnContext);\n                    await dialogContext.beginDialog(TOP_LEVEL_DIALOG);\n                    break;\n                case DialogTurnStatus.complete:\n                    // If we just finished the dialog, capture and display the results.\n                    const userInfo = results.result;\n                    const status = 'You are signed up to review '\n                        + (userInfo.companiesToReview.length === 0 ? 'no companies' : userInfo.companiesToReview.join(' and '))\n                        + '.';\n                    await turnContext.sendActivity(status);\n                    await this.userProfileAccessor.set(turnContext, userInfo);\n                    await this.userState.saveChanges(turnContext);\n                    break;\n                case DialogTurnStatus.waiting:\n                    // If there is an active dialog, we don't need to do anything here.\n                    break;\n            }\n            await this.conversationState.saveChanges(turnContext);\n        } else if (turnContext.activity.type === ActivityTypes.ConversationUpdate) {\n            if (turnContext.activity.membersAdded && turnContext.activity.membersAdded.length > 0) {\n                await this.sendWelcomeMessage(turnContext);\n            }\n        } else {\n            await turnContext.sendActivity(`[${turnContext.activity.type} event detected]`);\n        }\n    }\n\n    // Sends a welcome message to any users who joined the conversation.\n    async sendWelcomeMessage(turnContext) {\n        for (var idx in turnContext.activity.membersAdded) {\n            if (turnContext.activity.membersAdded[idx].id !== turnContext.activity.recipient.id) {\n                await turnContext.sendActivity(WELCOME_TEXT);\n            }\n        }\n    }\n\n    async nameStep(stepContext) {\n        // Create an object in which to collect the user's information within the dialog.\n        stepContext.values[USER_INFO] = {};\n\n        // Ask the user to enter their name.\n        return await stepContext.prompt(NAME_PROMPT, 'Please enter your name.');\n    }\n\n    async ageStep(stepContext) {\n        // Set the user's name to what they entered in response to the name prompt.\n        stepContext.values[USER_INFO].name = stepContext.result;\n\n        // Ask the user to enter their age.\n        return await stepContext.prompt(AGE_PROMPT, 'Please enter your age.');\n    }\n\n    async startSelectionStep(stepContext) {\n        // Set the user's age to what they entered in response to the age prompt.\n        stepContext.values[USER_INFO].age = stepContext.result;\n\n        if (stepContext.result < 25) {\n            // If they are too young, skip the review selection dialog, and pass an empty list to the next step.\n            await stepContext.context.sendActivity('You must be 25 or older to participate.');\n            return await stepContext.next([]);\n        } else {\n            // Otherwise, start the review selection dialog.\n            return await stepContext.beginDialog(REVIEW_SELECTION_DIALOG);\n        }\n    }\n\n    async acknowledgementStep(stepContext) {\n        // Set the user's company selection to what they entered in the review-selection dialog.\n        const list = stepContext.result || [];\n        stepContext.values[USER_INFO].companiesToReview = list;\n\n        // Thank them for participating.\n        await stepContext.context.sendActivity(`Thanks for participating, ${stepContext.values[USER_INFO].name}.`);\n\n        // Exit the dialog, returning the collected user information.\n        return await stepContext.endDialog(stepContext.values[USER_INFO]);\n    }\n\n    async selectionStep(stepContext) {\n        // Continue using the same selection list, if any, from the previous iteration of this dialog.\n        const list = Array.isArray(stepContext.options) ? stepContext.options : [];\n        stepContext.values[COMPANIES_SELECTED] = list;\n\n        // Create a prompt message.\n        let message;\n        if (list.length === 0) {\n            message = 'Please choose a company to review, or `' + DONE_OPTION + '` to finish.';\n        } else {\n            message = `You have selected **${list[0]}**. You can review an addition company, ` +\n                'or choose `' + DONE_OPTION + '` to finish.';\n        }\n\n        // Create the list of options to choose from.\n        const options = list.length > 0\n            ? COMPANY_OPTIONS.filter(function (item) { return item !== list[0] })\n            : COMPANY_OPTIONS.slice();\n        options.push(DONE_OPTION);\n\n        // Prompt the user for a choice.\n        return await stepContext.prompt(SELECTION_PROMPT, {\n            prompt: message,\n            retryPrompt: 'Please choose an option from the list.',\n            choices: options\n        });\n    }\n\n    async loopStep(stepContext) {\n        // Retrieve their selection list, the choice they made, and whether they chose to finish.\n        const list = stepContext.values[COMPANIES_SELECTED];\n        const choice = stepContext.result;\n        const done = choice.value === DONE_OPTION;\n\n        if (!done) {\n            // If they chose a company, add it to the list.\n            list.push(choice.value);\n        }\n\n        if (done || list.length > 1) {\n            // If they're done, exit and return their list.\n            return await stepContext.endDialog(list);\n        } else {\n            // Otherwise, repeat this dialog, passing in the list from this iteration.\n            return await stepContext.replaceDialog(REVIEW_SELECTION_DIALOG, list);\n        }\n    }\n}\n\nmodule.exports.MyBot = MyBot;"
  },
  {
    "path": "SDKV4-Samples/js/complexDialogBot/deploymentScripts/msbotClone/bot.recipe",
    "content": "{\n  \"version\": \"1.0\",\n  \"resources\": [\n    {\n      \"type\": \"endpoint\",\n      \"id\": \"1\",\n      \"name\": \"development\",\n      \"url\": \"http://localhost:3978/api/messages\"\n    },\n    {\n      \"type\": \"endpoint\",\n      \"id\": \"2\",\n      \"name\": \"production\",\n      \"url\": \"https://your-bot-url.azurewebsites.net/api/messages\"\n    },\n    {\n      \"type\": \"abs\",\n      \"id\": \"3\",\n      \"name\": \"ComplexDialogBot-abs\"\n    },\n    {\n      \"type\": \"appInsights\",\n      \"id\": \"4\",\n      \"name\": \"ComplexDialogBot-insights\"\n    },\n    {\n      \"type\": \"blob\",\n      \"id\": \"5\",\n      \"name\": \"ComplexDialogBot-blob\",\n      \"container\": \"botstatestore\"\n    }\n  ]\n}"
  },
  {
    "path": "SDKV4-Samples/js/complexDialogBot/iisnode.yml",
    "content": "nodeProcessCommandLine: \"D:\\Program Files (x86)\\nodejs\\8.9.4\\node.exe\""
  },
  {
    "path": "SDKV4-Samples/js/complexDialogBot/index.js",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nconst path = require('path');\nconst restify = require('restify');\n\n// Import required bot services.\n// See https://aka.ms/bot-services to learn more about the different parts of a bot.\nconst { BotFrameworkAdapter, MemoryStorage, UserState, ConversationState } = require('botbuilder');\n\n// Import required bot configuration.\nconst { BotConfiguration } = require('botframework-config');\n\n// This bot's main dialog.\nconst { MyBot } = require('./bot');\n\n// Read botFilePath and botFileSecret from .env file\n// Note: Ensure you have a .env file and include botFilePath and botFileSecret.\nconst ENV_FILE = path.join(__dirname, '.env');\nconst env = require('dotenv').config({path: ENV_FILE});\n\n// bot endpoint name as defined in .bot file\n// See https://aka.ms/about-bot-file to learn more about .bot file its use and bot configuration .\nconst DEV_ENVIRONMENT = 'development';\n\n// bot name as defined in .bot file\n// See https://aka.ms/about-bot-file to learn more about .bot file its use and bot configuration.\nconst BOT_CONFIGURATION = (process.env.NODE_ENV || DEV_ENVIRONMENT);\n\n\n// Create HTTP server\nlet server = restify.createServer();\nserver.listen(process.env.port || process.env.PORT || 3978, function () {\n    console.log(`\\n${server.name} listening to ${server.url}`);\n    console.log(`\\nGet Bot Framework Emulator: https://aka.ms/botframework-emulator`);\n    console.log(`\\nTo talk to your bot, open ComplexDialogBot.bot file in the Emulator`);\n});\n\n// .bot file path\nconst BOT_FILE = path.join(__dirname, (process.env.botFilePath || ''));\n\n// Read bot configuration from .bot file.\nlet botConfig;\ntry {\n    botConfig = BotConfiguration.loadSync(BOT_FILE, process.env.botFileSecret);\n} catch (err) {\n    console.error(`\\nError reading bot file. Please ensure you have valid botFilePath and botFileSecret set for your environment.`);\n    console.error(`\\n - The botFileSecret is available under appsettings for your Azure Bot Service bot.`);\n    console.error(`\\n - If you are running this bot locally, consider adding a .env file with botFilePath and botFileSecret.\\n\\n`);\n    process.exit();\n}\n\n// Get bot endpoint configuration by service name\nconst endpointConfig = botConfig.findServiceByNameOrId(BOT_CONFIGURATION);\n\n// Create adapter.\n// See https://aka.ms/about-bot-adapter to learn more about .bot file its use and bot configuration .\nconst adapter = new BotFrameworkAdapter({\n    appId: endpointConfig.appId || process.env.microsoftAppID,\n    appPassword: endpointConfig.appPassword || process.env.microsoftAppPassword\n});\n\n// Define state store for your bot.\n// See https://aka.ms/about-bot-state to learn more about bot state.\nconst memoryStorage = new MemoryStorage();\n\n// Create user and conversation state with in-memory storage provider.\nconst userState = new UserState(memoryStorage);\nconst conversationState = new ConversationState(memoryStorage);\n\n// Create the main dialog.\nconst myBot = new MyBot(conversationState, userState);\n\n// Catch-all for errors.\nadapter.onTurnError = async (context, error) => {\n    // This check writes out errors to console log .vs. app insights.\n    console.error(`\\n [onTurnError]: ${error}`);\n    // Send a message to the user\n    context.sendActivity(`Oops. Something went wrong!`);\n    // Clear out state\n    await conversationState.load(context);\n    await conversationState.clear(context);\n    // Save state changes.\n    await conversationState.saveChanges(context);\n};\n\n// Listen for incoming requests.\nserver.post('/api/messages', (req, res) => {\n    adapter.processActivity(req, res, async (context) => {\n        // Route to main dialog.\n        await myBot.onTurn(context);\n    });\n});\n\n"
  },
  {
    "path": "SDKV4-Samples/js/complexDialogBot/package.json",
    "content": "{\n    \"name\": \"ComplexDialogBot\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Sample code for the how to topic for creating advanced conversation flow\",\n    \"author\": \"Microsoft Bot Builder Yeoman Generator v4.0.10\",\n    \"license\": \"MIT\",\n    \"main\": \"index.js\",\n    \"scripts\": {\n        \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n        \"build\": \"echo \\\"Error: no build specified\\\" && exit 1\",\n        \"start\": \"node ./index.js\",\n        \"watch\": \"nodemon ./index.js\"\n    },\n    \"dependencies\": {\n        \"botbuilder\": \"^4.0.6\",\n        \"botbuilder-dialogs\": \"^4.2.0-preview.2251\",\n        \"botframework-config\": \"^4.0.6\",\n        \"dotenv\": \"^6.0.0\",\n        \"restify\": \"^6.3.4\"\n    },\n    \"devDependencies\": {\n        \"eslint\": \"^5.6.0\",\n        \"eslint-config-standard\": \"^12.0.0\",\n        \"eslint-plugin-import\": \"^2.14.0\",\n        \"eslint-plugin-node\": \"^7.0.1\",\n        \"eslint-plugin-promise\": \"^4.0.1\",\n        \"eslint-plugin-standard\": \"^4.0.0\",\n        \"nodemon\": \"^1.18.4\",\n        \"@types/node\": \"10.10.2\",\n        \"@types/restify\": \"7.2.4\"\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/js/complexDialogBot/web.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     This configuration file is required if iisnode is used to run node processes behind\n     IIS or IIS Express.  For more information, visit:\n\n     https://github.com/tjanczuk/iisnode/blob/master/src/samples/configuration/web.config\n-->\n\n<configuration>\n  <system.webServer>\n    <!-- Visit http://blogs.msdn.com/b/windowsazure/archive/2013/11/14/introduction-to-websockets-on-windows-azure-web-sites.aspx for more information on WebSocket support -->\n    <webSocket enabled=\"false\" />\n    <handlers>\n      <!-- Indicates that the server.js file is a node.js site to be handled by the iisnode module -->\n      <add name=\"iisnode\" path=\"index.js\" verb=\"*\" modules=\"iisnode\"/>\n    </handlers>\n    <rewrite>\n      <rules>\n        <!-- Do not interfere with requests for node-inspector debugging -->\n        <rule name=\"NodeInspector\" patternSyntax=\"ECMAScript\" stopProcessing=\"true\">\n          <match url=\"^index.js\\/debug[\\/]?\" />\n        </rule>\n\n        <!-- First we consider whether the incoming URL matches a physical file in the /public folder -->\n        <rule name=\"StaticContent\">\n          <action type=\"Rewrite\" url=\"public{REQUEST_URI}\"/>\n        </rule>\n\n        <!-- All other URLs are mapped to the node.js site entry point -->\n        <rule name=\"DynamicContent\">\n          <conditions>\n            <add input=\"{REQUEST_FILENAME}\" matchType=\"IsFile\" negate=\"True\"/>\n          </conditions>\n          <action type=\"Rewrite\" url=\"index.js\"/>\n        </rule>\n      </rules>\n    </rewrite>\n    \n    <!-- 'bin' directory has no special meaning in node.js and apps can be placed in it -->\n    <security>\n      <requestFiltering>\n        <hiddenSegments>\n          <remove segment=\"bin\"/>\n        </hiddenSegments>\n      </requestFiltering>\n    </security>\n\n    <!-- Make sure error responses are left untouched -->\n    <httpErrors existingResponse=\"PassThrough\" />\n\n    <!--\n      You can control how Node is hosted within IIS using the following options:\n        * watchedFiles: semi-colon separated list of files that will be watched for changes to restart the server\n        * node_env: will be propagated to node as NODE_ENV environment variable\n        * debuggingEnabled - controls whether the built-in debugger is enabled\n\n      See https://github.com/tjanczuk/iisnode/blob/master/src/samples/configuration/web.config for a full list of options\n    -->\n    <!--<iisnode watchedFiles=\"web.config;*.js\"/>-->\n  </system.webServer>\n</configuration>\n"
  },
  {
    "path": "SDKV4-Samples/js/nlp-with-dispatch/QnAMaker.tsv",
    "content": "Question\tAnswer\tSource\tMetadata\r\nhi\tHello!\tQnAMaker.tsv\t\r\ngreetings\tHello!\tQnAMaker.tsv\t\r\ngood morning\tHello!\tQnAMaker.tsv\t\r\ngood evening\tHello!\tQnAMaker.tsv\t\r\nWhat are you?\tI am the LUIS-QnAMaker Dispatch bot! This sample demonstrates using several LUIS applications and QnA Maker knowledge base using dispatch.\tQnAMaker.tsv\t\r\nWhat?\tI am the LUIS-QnAMaker Dispatch bot! This sample demonstrates using several LUIS applications and QnA Maker knowledge base using dispatch.\tQnAMaker.tsv\t\r\nWhat do you do?\tI am the LUIS-QnAMaker Dispatch bot! This sample demonstrates using several LUIS applications and QnA Maker knowledge base using dispatch.\tQnAMaker.tsv\t\r\nWho are you?\tI am the LUIS-QnAMaker Dispatch bot! This sample demonstrates using several LUIS applications and QnA Maker knowledge base using dispatch.\tQnAMaker.tsv\t\r\nWhat is your name?\tI am the LUIS-QnAMaker Dispatch bot! This sample demonstrates using several LUIS applications and QnA Maker knowledge base using dispatch.\tQnAMaker.tsv\t\r\nWhat should I call you?\tI am the LUIS-QnAMaker Dispatch bot! This sample demonstrates using several LUIS applications and QnA Maker knowledge base using dispatch.\tQnAMaker.tsv\t\r\n"
  },
  {
    "path": "SDKV4-Samples/js/nlp-with-dispatch/home-automation.json",
    "content": "{\n  \"name\": \"Home Automation\",\n  \"versionId\": \"0.1\",\n  \"desc\": \"Home Automation LUIS application - Bot Builder Samples\",\n  \"culture\": \"en-us\",\n  \"intents\": [\n    {\n      \"name\": \"HomeAutomation\"\n    },\n    {\n      \"name\": \"None\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"Device\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"deviceProperty\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"Room\",\n      \"roles\": []\n    }\n  ],\n  \"closedLists\": [\n    {\n      \"name\": \"Operation\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"off\",\n          \"list\": [\n            \"off\",\n            \"turn off\",\n            \"switch off\",\n            \"lock\",\n            \"out\",\n            \"shut down\",\n            \"stop\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"on\",\n          \"list\": [\n            \"on\",\n            \"turn on\",\n            \"switch on\",\n            \"unlock\",\n            \"un lock\",\n            \"boot up\",\n            \"start\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"Device_PatternAny\",\n      \"explicitList\": [],\n      \"roles\": []\n    },\n    {\n      \"name\": \"Room_PatternAny\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"number\",\n      \"roles\": []\n    }\n  ],\n  \"regex_features\": [],\n  \"model_features\": [],\n  \"patterns\": [\n    {\n      \"pattern\": \"turn off {Device_PatternAny} in {Room_PatternAny}\",\n      \"intent\": \"HomeAutomation\"\n    },\n    {\n      \"pattern\": \"{Device_PatternAny} off [please]\",\n      \"intent\": \"HomeAutomation\"\n    },\n    {\n      \"pattern\": \"turn on {Device_PatternAny}\",\n      \"intent\": \"HomeAutomation\"\n    },\n    {\n      \"pattern\": \"{Device_PatternAny} on [please]\",\n      \"intent\": \"HomeAutomation\"\n    },\n    {\n      \"pattern\": \"turn on {Device_PatternAny} in {Room_PatternAny}\",\n      \"intent\": \"HomeAutomation\"\n    },\n    {\n      \"pattern\": \"{Device_PatternAny} in {Room_PatternAny} on [please]\",\n      \"intent\": \"HomeAutomation\"\n    },\n    {\n      \"pattern\": \"{Device_PatternAny} in {Room_PatternAny} off [please]\",\n      \"intent\": \"HomeAutomation\"\n    }\n  ],\n  \"utterances\": [\n    {\n      \"text\": \"breezeway on please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 0,\n          \"endPos\": 8,\n          \"entity\": \"Room\"\n        }\n      ]\n    },\n    {\n      \"text\": \"change temperature to seventy two degrees\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 7,\n          \"endPos\": 17,\n          \"entity\": \"deviceProperty\"\n        }\n      ]\n    },\n    {\n      \"text\": \"coffee bar on please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 0,\n          \"endPos\": 9,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"decrease temperature for me please\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"startPos\": 9,\n          \"endPos\": 19,\n          \"entity\": \"deviceProperty\"\n        }\n      ]\n    },\n    {\n      \"text\": \"dim kitchen lights to 25 .\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"startPos\": 4,\n          \"endPos\": 10,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 12,\n          \"endPos\": 17,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"fish pond off please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 0,\n          \"endPos\": 8,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"fish pond on please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 0,\n          \"endPos\": 8,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"illuminate please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 0,\n          \"endPos\": 9,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"living room lamp on please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 0,\n          \"endPos\": 10,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 12,\n          \"endPos\": 15,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"living room lamps off please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 0,\n          \"endPos\": 10,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 12,\n          \"endPos\": 16,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"lock the doors for me please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 9,\n          \"endPos\": 13,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"lower your volume\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"startPos\": 11,\n          \"endPos\": 16,\n          \"entity\": \"deviceProperty\"\n        }\n      ]\n    },\n    {\n      \"text\": \"make camera 1 off please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 5,\n          \"endPos\": 12,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"make some coffee\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 10,\n          \"endPos\": 15,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"play dvd\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 5,\n          \"endPos\": 7,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"set lights out in bedroom\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 4,\n          \"endPos\": 9,\n          \"entity\": \"Device\"\n        },\n        {\n          \"startPos\": 18,\n          \"endPos\": 24,\n          \"entity\": \"Room\"\n        }\n      ]\n    },\n    {\n      \"text\": \"set lights to bright\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 4,\n          \"endPos\": 9,\n          \"entity\": \"Device\"\n        },\n        {\n          \"startPos\": 14,\n          \"endPos\": 19,\n          \"entity\": \"deviceProperty\"\n        }\n      ]\n    },\n    {\n      \"text\": \"set lights to concentrate\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 4,\n          \"endPos\": 9,\n          \"entity\": \"Device\"\n        },\n        {\n          \"startPos\": 14,\n          \"endPos\": 24,\n          \"entity\": \"deviceProperty\"\n        }\n      ]\n    },\n    {\n      \"text\": \"shut down my work computer\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 18,\n          \"endPos\": 25,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"snap switch fan fifty percent\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 12,\n          \"endPos\": 14,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"start master bedroom light.\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 6,\n          \"endPos\": 19,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 21,\n          \"endPos\": 25,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"theater on please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 0,\n          \"endPos\": 6,\n          \"entity\": \"Room\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn dimmer off\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 5,\n          \"endPos\": 10,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn off ac please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 9,\n          \"endPos\": 10,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn off foyer lights\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 9,\n          \"endPos\": 13,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 15,\n          \"endPos\": 20,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn off living room light\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 9,\n          \"endPos\": 19,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 21,\n          \"endPos\": 25,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn off staircase\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 9,\n          \"endPos\": 17,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn off venice lamp\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 16,\n          \"endPos\": 19,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn on bathroom heater\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 8,\n          \"endPos\": 15,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 17,\n          \"endPos\": 22,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn on external speaker\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 8,\n          \"endPos\": 23,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn on kitchen faucet\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 8,\n          \"endPos\": 14,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 16,\n          \"endPos\": 21,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn on light in bedroom\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 8,\n          \"endPos\": 12,\n          \"entity\": \"Device\"\n        },\n        {\n          \"startPos\": 17,\n          \"endPos\": 23,\n          \"entity\": \"Room\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn on my bedroom lights.\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 11,\n          \"endPos\": 17,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 19,\n          \"endPos\": 24,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn on the furnace room lights\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 12,\n          \"endPos\": 23,\n          \"entity\": \"Room\"\n        },\n        {\n          \"startPos\": 25,\n          \"endPos\": 30,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn on the internet in my bedroom please\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"startPos\": 27,\n          \"endPos\": 33,\n          \"entity\": \"Room\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn on thermostat please\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 8,\n          \"endPos\": 17,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn the fan to high\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 9,\n          \"endPos\": 11,\n          \"entity\": \"Device\"\n        }\n      ]\n    },\n    {\n      \"text\": \"turn thermostat on 70.\",\n      \"intent\": \"HomeAutomation\",\n      \"entities\": [\n        {\n          \"startPos\": 5,\n          \"endPos\": 14,\n          \"entity\": \"Device\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "SDKV4-Samples/js/nlp-with-dispatch/nlp-with-dispatchDispatch.json",
    "content": "{\n  \"name\": \"nlp-with-dispatchDispatch\",\n  \"versionId\": \"Dispatch\",\n  \"desc\": \"Dispatch model for nlp-with-dispatchDispatch\",\n  \"culture\": \"en-us\",\n  \"intents\": [\n    {\n      \"name\": \"l_Home Automation\"\n    },\n    {\n      \"name\": \"l_Weather\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"q_sample-qna\"\n    }\n  ],\n  \"entities\": [],\n  \"closedLists\": [],\n  \"composites\": [],\n  \"patternAnyEntities\": [],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [],\n  \"regex_features\": [],\n  \"model_features\": [],\n  \"patterns\": [],\n  \"utterances\": [\n    {\n      \"text\": \"breezeway on please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change temperature to seventy two degrees\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"coffee bar on please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"current weather ?\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"decrease temperature for me please\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dim kitchen lights to 25 .\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do florida residents usually need ice scrapers\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"fish pond off please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"fish pond on please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"forecast in celcius\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get florence temperature in september\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get for me the weather conditions in sonoma county\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get the daily temperature greenwood indiana\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get the forcast for me\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get the weather at saint george utah\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good evening\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"good morning\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"greetings\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hi\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how much rain does chambersburg get a year\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to know the temperature at death valley\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"illuminate please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"living room lamp on please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"living room lamps off please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"lock the doors for me please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"lower your volume\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make camera 1 off please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make some coffee\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"play dvd\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"provide me by toronto weather please\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set lights out in bedroom\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set lights to bright\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"set lights to concentrate\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show average rainfall for boise\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"show me the forecast at alabama\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shut down my work computer\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"snap switch fan fifty percent\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"soliciting today's weather\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start master bedroom light.\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"temperature of delhi in celsius please\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"theater on please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn dimmer off\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn off ac please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn off foyer lights\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn off living room light\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn off staircase\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn off venice lamp\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn on bathroom heater\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn on external speaker\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn on kitchen faucet\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn on light in bedroom\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn on my bedroom lights.\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn on the furnace room lights\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn on the internet in my bedroom please\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn on thermostat please\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn the fan to high\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turn thermostat on 70.\",\n      \"intent\": \"l_Home Automation\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"was last year about this time as wet as it is now in the south ?\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what are you?\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what do you do?\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the rain volume in sonoma county ?\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the weather in redmond ?\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the weather today at 10 day durham ?\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is your name?\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what should i call you?\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what to wear in march in california\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what will the weather be tomorrow in new york ?\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what?\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's the weather going to be like in hawaii ?\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's the weather like in minneapolis\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who are you?\",\n      \"intent\": \"q_sample-qna\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will it be raining in ranchi\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will it rain this weekend\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will it snow today\",\n      \"intent\": \"l_Weather\",\n      \"entities\": []\n    }\n  ]\n}\n"
  },
  {
    "path": "SDKV4-Samples/js/nlp-with-dispatch/weather.json",
    "content": "{\n  \"name\": \"Weather\",\n  \"versionId\": \"0.1\",\n  \"desc\": \"Weather LUIS application - Bot Builder Samples\",\n  \"culture\": \"en-us\",\n  \"intents\": [\n    {\n      \"name\": \"Get Weather Condition\"\n    },\n    {\n      \"name\": \"Get Weather Forecast\"\n    },\n    {\n      \"name\": \"None\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"Location\",\n      \"roles\": []\n    }\n  ],\n  \"closedLists\": [],\n  \"composites\": [],\n  \"patternAnyEntities\": [\n    {\n      \"name\": \"Location_PatternAny\",\n      \"explicitList\": [],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [],\n  \"prebuiltEntities\": [],\n  \"regex_features\": [],\n  \"model_features\": [],\n  \"patterns\": [\n    {\n      \"pattern\": \"weather in {Location_PatternAny}\",\n      \"intent\": \"Get Weather Condition\"\n    },\n    {\n      \"pattern\": \"how's the weather in {Location_PatternAny}\",\n      \"intent\": \"Get Weather Condition\"\n    },\n    {\n      \"pattern\": \"current weather in {Location_PatternAny}\",\n      \"intent\": \"Get Weather Condition\"\n    },\n    {\n      \"pattern\": \"what's the forecast for next week in {Location_PatternAny}\",\n      \"intent\": \"Get Weather Forecast\"\n    },\n    {\n      \"pattern\": \"show me the forecast for {Location_PatternAny}\",\n      \"intent\": \"Get Weather Forecast\"\n    },\n    {\n      \"pattern\": \"what's the forecast for {Location_PatternAny}\",\n      \"intent\": \"Get Weather Forecast\"\n    }\n  ],\n  \"utterances\": [\n    {\n      \"text\": \"current weather ?\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do florida residents usually need ice scrapers\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 3,\n          \"endPos\": 9,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"forecast in celcius\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get florence temperature in september\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 4,\n          \"endPos\": 11,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"get for me the weather conditions in sonoma county\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 37,\n          \"endPos\": 49,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"get the daily temperature greenwood indiana\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 26,\n          \"endPos\": 42,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"get the forcast for me\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"get the weather at saint george utah\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 19,\n          \"endPos\": 35,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"how much rain does chambersburg get a year\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 19,\n          \"endPos\": 30,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to know the temperature at death valley\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": [\n        {\n          \"startPos\": 34,\n          \"endPos\": 45,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"provide me by toronto weather please\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": [\n        {\n          \"startPos\": 14,\n          \"endPos\": 20,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"show average rainfall for boise\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 26,\n          \"endPos\": 30,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"show me the forecast at alabama\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": [\n        {\n          \"startPos\": 24,\n          \"endPos\": 30,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"soliciting today's weather\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"temperature of delhi in celsius please\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 15,\n          \"endPos\": 19,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"was last year about this time as wet as it is now in the south ?\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 57,\n          \"endPos\": 61,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the rain volume in sonoma county ?\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 27,\n          \"endPos\": 39,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the weather in redmond ?\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": [\n        {\n          \"startPos\": 23,\n          \"endPos\": 29,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the weather today at 10 day durham ?\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": [\n        {\n          \"startPos\": 36,\n          \"endPos\": 41,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"what to wear in march in california\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 25,\n          \"endPos\": 34,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"what will the weather be tomorrow in new york ?\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": [\n        {\n          \"startPos\": 37,\n          \"endPos\": 44,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"what's the weather going to be like in hawaii ?\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": [\n        {\n          \"startPos\": 39,\n          \"endPos\": 44,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"what's the weather like in minneapolis\",\n      \"intent\": \"Get Weather Condition\",\n      \"entities\": [\n        {\n          \"startPos\": 27,\n          \"endPos\": 37,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"will it be raining in ranchi\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": [\n        {\n          \"startPos\": 22,\n          \"endPos\": 27,\n          \"entity\": \"Location\"\n        }\n      ]\n    },\n    {\n      \"text\": \"will it rain this weekend\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will it snow today\",\n      \"intent\": \"Get Weather Forecast\",\n      \"entities\": []\n    }\n  ]\n}\n"
  },
  {
    "path": "SDKV4-Samples/js/nlp-with-luis/reminders-with-entities.json",
    "content": "{\r\n  \"intents\": [\r\n    {\r\n      \"name\": \"Calendar_Add\"\r\n    },\r\n    {\r\n      \"name\": \"Calendar_Find\"\r\n    },\r\n    {\r\n      \"name\": \"None\"\r\n    }\r\n  ],\r\n  \"entities\": [\r\n    {\r\n      \"name\": \"Appointment\",\r\n      \"roles\": []\r\n    },\r\n    {\r\n      \"name\": \"Meeting\",\r\n      \"roles\": []\r\n    },\r\n    {\r\n      \"name\": \"Schedule\",\r\n      \"roles\": []\r\n    }\r\n  ],\r\n  \"composites\": [],\r\n  \"closedLists\": [],\r\n  \"patternAnyEntities\": [],\r\n  \"regex_entities\": [],\r\n  \"prebuiltEntities\": [],\r\n  \"model_features\": [],\r\n  \"regex_features\": [],\r\n  \"patterns\": [],\r\n  \"utterances\": [\r\n    {\r\n      \"text\": \"add a new event on 27 - apr\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"add a new task finish assignment\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"add an event to read about adam lambert news\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"add an event to visit 209 nashville gym\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"add date to my schedule\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Schedule\",\r\n          \"startPos\": 15,\r\n          \"endPos\": 22\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"add imax theater to my upcoming events\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"am i free to be with friends saturday ?\",\r\n      \"intent\": \"None\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"appointment with johnson needs to be next week\",\r\n      \"intent\": \"None\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Appointment\",\r\n          \"startPos\": 0,\r\n          \"endPos\": 10\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"calendar for november 1948\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"calendar i ' ll be at the garage from 8 till 3 this saturday\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"call dad mike\",\r\n      \"intent\": \"None\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"change the meeting with chris to 9 : 00 am\",\r\n      \"intent\": \"None\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"display weekend plans\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"do i have anything on wednesday ?\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"dunmore pa sonic sounds friday morning please\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"email cloney john\",\r\n      \"intent\": \"None\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"extend lunch meeting 30 minutes extra\",\r\n      \"intent\": \"None\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Meeting\",\r\n          \"startPos\": 13,\r\n          \"endPos\": 19\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"how many days are there between march 13th 2015 and today ?\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"i want to reschedule the meeting at the air force club\",\r\n      \"intent\": \"None\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"marketing meetings on tuesdays will now be every wednesday please change on my calendar\",\r\n      \"intent\": \"None\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"meet my manager\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"meeting my manager\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"move the bbq party to friday\",\r\n      \"intent\": \"None\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"pull up my appointment find out how much time i have before my next appointment\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Appointment\",\r\n          \"startPos\": 11,\r\n          \"endPos\": 21\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"save the date may 17 pictures party\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"schedule a conference call for tomorrow\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Schedule\",\r\n          \"startPos\": 0,\r\n          \"endPos\": 7\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"schedule a meeting for tomorrow\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Meeting\",\r\n          \"startPos\": 11,\r\n          \"endPos\": 17\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"schedule appointment for tomorrow please\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Schedule\",\r\n          \"startPos\": 0,\r\n          \"endPos\": 7\r\n        },\r\n        {\r\n          \"entity\": \"Appointment\",\r\n          \"startPos\": 9,\r\n          \"endPos\": 19\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"search for meetings with chris\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Meeting\",\r\n          \"startPos\": 11,\r\n          \"endPos\": 18\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"show me tomorrow ' s wedding party time\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"show my schedule for tomorrow\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Schedule\",\r\n          \"startPos\": 8,\r\n          \"endPos\": 15\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"tell me the event details\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"the meeting will last for one hour\",\r\n      \"intent\": \"Calendar_Add\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Meeting\",\r\n          \"startPos\": 4,\r\n          \"endPos\": 10\r\n        }\r\n      ]\r\n    },\r\n    {\r\n      \"text\": \"the workshop will last for 10 hours\",\r\n      \"intent\": \"None\",\r\n      \"entities\": []\r\n    },\r\n    {\r\n      \"text\": \"voice activated reading of appointments this week\",\r\n      \"intent\": \"Calendar_Find\",\r\n      \"entities\": [\r\n        {\r\n          \"entity\": \"Appointment\",\r\n          \"startPos\": 27,\r\n          \"endPos\": 38\r\n        }\r\n      ]\r\n    }\r\n  ],\r\n  \"settings\": []\r\n}"
  },
  {
    "path": "SDKV4-Samples/js/stateBot/.eslintrc.js",
    "content": "module.exports = {\n  \"extends\": \"standard\",\n  \"rules\": {\n    \"semi\": [2, \"always\"],\n    \"indent\": [2, 4],\n    \"no-return-await\": 0,\n    \"space-before-function-paren\": [2, {\n      \"named\": \"never\",\n      \"anonymous\": \"never\",\n      \"asyncArrow\": \"always\"\n    }],\n    \"template-curly-spacing\": [2, \"always\"]\n  }\n};"
  },
  {
    "path": "SDKV4-Samples/js/stateBot/.gitignore",
    "content": "node_modules\n.env"
  },
  {
    "path": "SDKV4-Samples/js/stateBot/README.md",
    "content": "# Save user and conversation data\n\nThis sample demonstrates how to save user and conversation data in a Node.js bot.\nThe bot maintains conversation state to track and direct the conversation and ask the user questions.\nThe bot maintains user state to track the user's answers.\n\n# To run the bot\n\n- Install modules and start the bot\n    ```bash\n    npm i & npm start\n    ```\n    Alternatively you can also use nodemon via\n    ```bash\n    npm i & npm run watch\n    ```\n\n# Testing the bot using Bot Framework Emulator\n\n[Microsoft Bot Framework Emulator][2] is a desktop application that allows bot developers to test and debug their bots on localhost or running remotely through a tunnel.\n\n- Install the Bot Framework emulator from [here][3]\n\n## Connect to bot using Bot Framework Emulator **V4**\n\n- Launch Bot Framework Emulator\n- File -> Open Bot Configuration\n- Select `stateBot.bot` file\n\n# Further reading\n\n- [Azure Bot Service Introduction][6]\n- [Bot State][7]\n- [Write directly to storage][8]\n- [Managing conversation and user state][9]\n\n[1]: https://www.npmjs.com/package/restify\n[2]: https://github.com/microsoft/botframework-emulator\n[3]: https://aka.ms/botframework-emulator\n[4]: https://docs.microsoft.com/azure/bot-service/bot-builder-howto-v4-state?tabs=js\n[5]: https://github.com/microsoft/botbuilder-tools\n[6]: https://docs.microsoft.com/azure/bot-service/bot-service-overview-introduction\n[7]: https://docs.microsoft.com/azure/bot-service/bot-builder-storage-concept\n[8]: https://docs.microsoft.com/azure/bot-service/bot-builder-howto-v4-storage?tabs=js\n[9]: https://docs.microsoft.com/azure/bot-service/bot-builder-howto-v4-state?tabs=js\n[10] https://dev.botframework.com"
  },
  {
    "path": "SDKV4-Samples/js/stateBot/bot.js",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nconst { ActivityTypes } = require('botbuilder');\n\n// The accessor names for the conversation data and user profile state property accessors.\nconst CONVERSATION_DATA_PROPERTY = 'conversationData';\nconst USER_PROFILE_PROPERTY = 'userProfile';\n\nclass MyBot {\n    /**\n     *\n     * @param {ConversationState} conversation state object\n     */\n    constructor(conversationState, userState) {\n        // Create the state property accessors for the conversation data and user profile.\n        this.conversationData = conversationState.createProperty(CONVERSATION_DATA_PROPERTY);\n        this.userProfile = userState.createProperty(USER_PROFILE_PROPERTY);\n\n        // The state management objects for the conversation and user state.\n        this.conversationState = conversationState;\n        this.userState = userState;\n    }\n\n    /**\n     *\n     * @param {TurnContext} on turn context object.\n     */\n    async onTurn(turnContext) {\n        // See https://aka.ms/about-bot-activity-message to learn more about the message and other activity types.\n        if (turnContext.activity.type === ActivityTypes.Message) {\n            // Get the state properties from the turn context.\n            const userProfile = await this.userProfile.get(turnContext, {});\n            const conversationData = await this.conversationData.get(\n                turnContext, { promptedForUserName: false });\n\n            if (!userProfile.name) {\n                // First time around this is undefined, so we will prompt user for name.\n                if (conversationData.promptedForUserName) {\n                    // Set the name to what the user provided.\n                    userProfile.name = turnContext.activity.text;\n\n                    // Acknowledge that we got their name.\n                    await turnContext.sendActivity(`Thanks ${userProfile.name}.`);\n\n                    // Reset the flag to allow the bot to go though the cycle again.\n                    conversationData.promptedForUserName = false;\n                } else {\n                    // Prompt the user for their name.\n                    await turnContext.sendActivity('What is your name?');\n\n                    // Set the flag to true, so we don't prompt in the next turn.\n                    conversationData.promptedForUserName = true;\n                }\n                // Save user state and save changes.\n                await this.userProfile.set(turnContext, userProfile);\n                await this.userState.saveChanges(turnContext);\n            } else {\n                // Add message details to the conversation data.\n                conversationData.timestamp = turnContext.activity.timestamp.toLocaleString();\n                conversationData.channelId = turnContext.activity.channelId;\n\n                // Display state data.\n                await turnContext.sendActivity(`${userProfile.name} sent: ${turnContext.activity.text}`);\n                await turnContext.sendActivity(`Message received at: ${conversationData.timestamp}`);\n                await turnContext.sendActivity(`Message received from: ${conversationData.channelId}`);\n            }\n            // Update conversation state and save changes.\n            await this.conversationData.set(turnContext, conversationData);\n            await this.conversationState.saveChanges(turnContext);\n        }\n    }\n}\n\nmodule.exports.MyBot = MyBot;"
  },
  {
    "path": "SDKV4-Samples/js/stateBot/deploymentScripts/msbotClone/bot.recipe",
    "content": "{\n  \"version\": \"1.0\",\n  \"resources\": [\n    {\n      \"type\": \"endpoint\",\n      \"id\": \"1\",\n      \"name\": \"development\",\n      \"url\": \"http://localhost:3978/api/messages\"\n    },\n    {\n      \"type\": \"endpoint\",\n      \"id\": \"2\",\n      \"name\": \"production\",\n      \"url\": \"https://your-bot-url.azurewebsites.net/api/messages\"\n    },\n    {\n      \"type\": \"abs\",\n      \"id\": \"3\",\n      \"name\": \"stateBot-abs\"\n    },\n    {\n      \"type\": \"appInsights\",\n      \"id\": \"4\",\n      \"name\": \"stateBot-insights\"\n    },\n    {\n      \"type\": \"blob\",\n      \"id\": \"5\",\n      \"name\": \"stateBot-blob\",\n      \"container\": \"botstatestore\"\n    }\n  ]\n}"
  },
  {
    "path": "SDKV4-Samples/js/stateBot/index.js",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nconst path = require('path');\nconst restify = require('restify');\n\n// Import required bot services.\n// See https://aka.ms/bot-services to learn more about the different parts of a bot.\nconst { BotFrameworkAdapter, MemoryStorage, ConversationState, UserState } = require('botbuilder');\n\n// Import required bot configuration.\nconst { BotConfiguration } = require('botframework-config');\n\n// This bot's main dialog.\nconst { MyBot } = require('./bot');\n\n// Read botFilePath and botFileSecret from .env file\n// Note: Ensure you have a .env file and include botFilePath and botFileSecret.\nconst ENV_FILE = path.join(__dirname, '.env');\nconst env = require('dotenv').config({path: ENV_FILE});\n\n// bot endpoint name as defined in .bot file\n// See https://aka.ms/about-bot-file to learn more about .bot file its use and bot configuration .\nconst DEV_ENVIRONMENT = 'development';\n\n// bot name as defined in .bot file\n// See https://aka.ms/about-bot-file to learn more about .bot file its use and bot configuration.\nconst BOT_CONFIGURATION = (process.env.NODE_ENV || DEV_ENVIRONMENT);\n\n\n// Create HTTP server\nlet server = restify.createServer();\nserver.listen(process.env.port || process.env.PORT || 3978, function () {\n    console.log(`\\n${server.name} listening to ${server.url}`);\n    console.log(`\\nGet Bot Framework Emulator: https://aka.ms/botframework-emulator`);\n    console.log(`\\nTo talk to your bot, open stateBot.bot file in the Emulator`);\n});\n\n// .bot file path\nconst BOT_FILE = path.join(__dirname, (process.env.botFilePath || ''));\n\n// Read bot configuration from .bot file.\nlet botConfig;\ntry {\n    botConfig = BotConfiguration.loadSync(BOT_FILE, process.env.botFileSecret);\n} catch (err) {\n    console.error(`\\nError reading bot file. Please ensure you have valid botFilePath and botFileSecret set for your environment.`);\n    console.error(`\\n - The botFileSecret is available under appsettings for your Azure Bot Service bot.`);\n    console.error(`\\n - If you are running this bot locally, consider adding a .env file with botFilePath and botFileSecret.\\n\\n`);\n    process.exit();\n}\n\n// Get bot endpoint configuration by service name\nconst endpointConfig = botConfig.findServiceByNameOrId(BOT_CONFIGURATION);\n\n// Create adapter.\n// See https://aka.ms/about-bot-adapter to learn more about .bot file its use and bot configuration .\nconst adapter = new BotFrameworkAdapter({\n    appId: endpointConfig.appId || process.env.microsoftAppID,\n    appPassword: endpointConfig.appPassword || process.env.microsoftAppPassword\n});\n\n// Define state store for your bot.\n// See https://aka.ms/about-bot-state to learn more about bot state.\nconst memoryStorage = new MemoryStorage();\n\n// Create conversation and user state with in-memory storage provider.\nconst conversationState = new ConversationState(memoryStorage);\nconst userState = new UserState(memoryStorage);\n\n// Create the bot.\nconst myBot = new MyBot(conversationState, userState);\n\n// Catch-all for errors.\nadapter.onTurnError = async (context, error) => {\n    // This check writes out errors to console log .vs. app insights.\n    console.error(`\\n [onTurnError]: ${error}`);\n    // Send a message to the user\n    context.sendActivity(`Oops. Something went wrong!`);\n    // Clear out state\n    await conversationState.load(context);\n    await conversationState.clear(context);\n    // Save state changes.\n    await conversationState.saveChanges(context);\n};\n\n// Listen for incoming requests.\nserver.post('/api/messages', (req, res) => {\n    adapter.processActivity(req, res, async (context) => {\n        // Route to main dialog.\n        await myBot.onTurn(context);\n    });\n});\n\n"
  },
  {
    "path": "SDKV4-Samples/js/stateBot/package.json",
    "content": "{\n    \"name\": \"stateBot\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Demonstrates how to set up user and conversation state.\",\n    \"author\": \"Microsoft Bot Builder Yeoman Generator v4.0.10\",\n    \"license\": \"MIT\",\n    \"main\": \"index.js\",\n    \"scripts\": {\n        \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n        \"build\": \"echo \\\"Error: no build specified\\\" && exit 1\",\n        \"start\": \"node ./index.js\",\n        \"watch\": \"nodemon ./index.js\"\n    },\n    \"dependencies\": {\n        \"botbuilder\": \"^4.0.6\",\n        \"botframework-config\": \"^4.0.6\",\n        \"dotenv\": \"^6.0.0\",\n        \"restify\": \"^6.3.4\"\n    },\n    \"devDependencies\": {\n        \"eslint\": \"^5.6.0\",\n        \"eslint-config-standard\": \"^12.0.0\",\n        \"eslint-plugin-import\": \"^2.14.0\",\n        \"eslint-plugin-node\": \"^7.0.1\",\n        \"eslint-plugin-promise\": \"^4.0.1\",\n        \"eslint-plugin-standard\": \"^4.0.0\",\n        \"nodemon\": \"^1.18.4\",\n        \"@types/node\": \"10.10.2\",\n        \"@types/restify\": \"7.2.4\"\n    }\n}\n"
  },
  {
    "path": "SDKV4-Samples/js/stateBot/resources/echo.chat",
    "content": "user=Vishwac\nbot=EchoBot\n\nuser: Hi\nbot: 1: You said \"Hi\"\nuser: Hello\nbot: 2: You said \"Hello\"\n"
  },
  {
    "path": "SDKV4-Samples/js/stateBot/stateBot.bot",
    "content": "{\n    \"name\": \"stateBot\",\n    \"services\": [\n        {\n            \"type\": \"endpoint\",\n            \"name\": \"development\",\n            \"endpoint\": \"http://localhost:3978/api/messages\",\n            \"appId\": \"\",\n            \"appPassword\": \"\",\n            \"id\": \"1\"\n        }\n    ],\n    \"padlock\": \"\",\n    \"version\": \"2.0\"\n}"
  },
  {
    "path": "SECURITY.md",
    "content": "<!-- BEGIN MICROSOFT SECURITY.MD V0.0.7 BLOCK -->\n\n## Security\n\nMicrosoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).\n\nIf you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.\n\n## Reporting Security Issues\n\n**Please do not report security vulnerabilities through public GitHub issues.**\n\nInstead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).\n\nIf you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com).  If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).\n\nYou should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). \n\nPlease include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:\n\n  * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)\n  * Full paths of source file(s) related to the manifestation of the issue\n  * The location of the affected source code (tag/branch/commit or direct URL)\n  * Any special configuration required to reproduce the issue\n  * Step-by-step instructions to reproduce the issue\n  * Proof-of-concept or exploit code (if possible)\n  * Impact of the issue, including how an attacker might exploit the issue\n\nThis information will help us triage your report more quickly.\n\nIf you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.\n\n## Preferred Languages\n\nWe prefer all communications to be in English.\n\n## Policy\n\nMicrosoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).\n\n<!-- END MICROSOFT SECURITY.MD BLOCK -->\n"
  },
  {
    "path": "StackOverflow-Bot/.gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# Azure Functions localsettings file\nlocal.settings.json\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# DNX\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# TODO: Comment the next line if you want to checkin your web deploy settings\n# but database connection strings (with potential passwords) will be unencrypted\n#*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/packages/*\n# except build/, which is used as an MSBuild target.\n!**/packages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/packages/repositories.config\n# NuGet v3's project.json files produces more ignoreable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\nnode_modules/\norleans.codegen.cs\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\n*.mdf\n*.ldf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n\n# CodeRush\n.cr/\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Logs\nlogs\n*.log\nnpm-debug.log*\n\n# Runtime data\npids\n*.pid\n*.seed\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n\n# nyc test coverage\n.nyc_output\n\n# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n.grunt\n\n# node-waf configuration\n.lock-wscript\n\n# Compiled binary addons (http://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directories\nnode_modules\njspm_packages\n\n# Optional npm cache directory\n.npm\n\n# Optional REPL history\n.node_repl_history\n.vscode\n"
  },
  {
    "path": "StackOverflow-Bot/DialogAnalyzerFunc/AnalyzeDialog.cs",
    "content": "using System;\nusing System.Configuration;\nusing System.IO;\nusing System.Net;\nusing System.Net.Http;\nusing System.Net.Http.Headers;\nusing System.Threading.Tasks;\n\nusing Microsoft.Azure.WebJobs;\nusing Microsoft.Azure.WebJobs.Extensions.Http;\nusing Microsoft.Azure.WebJobs.Host;\n\nusing DialogAnalyzerFunc.Clients;\nusing DialogAnalyzerFunc.Models;\n\nnamespace DialogAnalyzerFunc\n{\n    public static class AnalyzeDialog\n    {\n        private struct RequestBody\n        {\n            public Uri ImageUri { get; set; }\n        }\n\n        private static DialogAnalyzerClient client;\n\n        private static DialogAnalyzerClient Client\n        {\n            get\n            {\n                if (client == null)\n                {\n                    client = new DialogAnalyzerClient(\n                        computerVisionApiRegion: ComputerVisionApiRegion,\n                        computerVisionSubscriptionKey: ComputerVisionSubscriptionKey,\n                        textAnalyticsApiRegion: TextAnalyticsApiRegion,\n                        textAnalyticsSubscriptionKey: TextAnalyticsSubscriptionKey\n                    );\n                }\n                return client;\n            }\n        }\n\n        [FunctionName(\"AnalyzeDialog\")]\n        public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, \"post\", Route = \"AnalyzeDialog\")]HttpRequestMessage request, TraceWriter log)\n        {\n            try\n            {\n                MediaTypeHeaderValue contentType = request.Content.Headers.ContentType;\n\n                // Check if content type is empty\n                if (contentType == null)\n                {\n                    return request.CreateResponse(HttpStatusCode.BadRequest, \"Missing content-type from header.\");\n                }\n\n                // Check if content type is supported\n                bool isJson = contentType.MediaType.Contains(\"application/json\") == true;\n                bool isOctetStream = contentType.MediaType.Contains(\"application/octet-stream\") == true;\n\n                if (isJson == false && isOctetStream == false)\n                {\n                    return request.CreateErrorResponse(HttpStatusCode.UnsupportedMediaType,\n                        string.Format(\"Request's content type ({0}) is not supported.\", string.Join(\", \", contentType.MediaType)));\n                }\n\n                // Check if request body is empty\n                if (request.Content.Headers.ContentLength == 0)\n                {\n                    return request.CreateResponse(HttpStatusCode.BadRequest, \"No content found in the request.\");\n                }\n\n                DialogAnalysisResult result;\n\n                if (isJson == true)\n                {\n                    // Read content from request\n                    RequestBody requestBody = await request.Content.ReadAsAsync<RequestBody>();\n\n                    // Verify content contains a valid image uri\n                    if (requestBody.ImageUri == null || requestBody.ImageUri.IsAbsoluteUri == false)\n                    {\n                        return request.CreateResponse(HttpStatusCode.BadRequest, \"Image uri is not initialized or valid in the request content.\");\n                    }\n\n                    result = await Client.AnalyzeDialogAsync(requestBody.ImageUri);\n                }\n                else\n                {\n                    byte[] imageData;\n\n                    // Convert stream into byte data\n                    using (Stream contentStream = await request.Content.ReadAsStreamAsync())\n                    {\n                        // Set stream position back to 0\n                        contentStream.Position = 0;\n\n                        // Using memory stream, create byte array\n                        using (MemoryStream memoryStream = new MemoryStream())\n                        {\n                            await contentStream.CopyToAsync(memoryStream);\n                            imageData = memoryStream.ToArray();\n                        }\n                    }\n\n                    if (imageData == null)\n                    {\n                        return request.CreateResponse(HttpStatusCode.BadRequest, \"No binary file is found in the request content.\");\n                    }\n\n                    result = await Client.AnalyzeDialogAsync(imageData);\n                }\n\n                // Return request response\n                return request.CreateResponse(HttpStatusCode.OK, result);\n            }\n            catch (Exception ex)\n            {\n                log.Error(\"Exception hit when analyzing dialog.\", ex);\n            }\n\n            return request.CreateErrorResponse(HttpStatusCode.InternalServerError, \"Failed to process request.\");\n        }\n\n        private static string ComputerVisionApiRegion => ConfigurationManager.AppSettings[\"COMPUTERVISION_APP_REGION\"]?.ToString();\n\n        private static string ComputerVisionSubscriptionKey => ConfigurationManager.AppSettings[\"COMPUTERVISION_SUB_KEY\"]?.ToString();\n\n        private static string TextAnalyticsApiRegion => ConfigurationManager.AppSettings[\"TEXTANALYTICS_APP_REGION\"]?.ToString();\n\n        private static string TextAnalyticsSubscriptionKey => ConfigurationManager.AppSettings[\"TEXTANALYTICS_SUB_KEY\"]?.ToString();\n    }\n}\n"
  },
  {
    "path": "StackOverflow-Bot/DialogAnalyzerFunc/Clients/DialogAnalyzerClient.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nusing DialogAnalyzerFunc.Models;\nusing DialogAnalyzerFunc.Services;\nusing DialogAnalyzerFunc.Utilities;\n\nnamespace DialogAnalyzerFunc.Clients\n{\n    public class DialogAnalyzerClient\n    {\n        private ComputerVisionService ComputerVisionService;\n        private TextAnalyticsService TextAnalyticsService;\n\n        public DialogAnalyzerClient(string computerVisionApiRegion, string computerVisionSubscriptionKey,\n            string textAnalyticsApiRegion, string textAnalyticsSubscriptionKey)\n        {\n            // Computer Vision Service\n            this.ComputerVisionService = new ComputerVisionService(computerVisionApiRegion, computerVisionSubscriptionKey);\n\n            // Text Analytics Service\n            this.TextAnalyticsService = new TextAnalyticsService(textAnalyticsApiRegion, textAnalyticsSubscriptionKey);\n        }\n\n        /// <summary>\n        /// Analyze dialog with image data\n        /// </summary>\n        public async Task<DialogAnalysisResult> AnalyzeDialogAsync(byte[] imageData)\n        {\n            if (imageData?.Count() > 0 == false)\n            {\n                throw new ArgumentNullException(\"Image data is not initialized.\");\n            }\n\n            // Run handwritten text recognition service\n            Task<HandwritingRecognitionResult> hwrTask = this.ComputerVisionService.RecognizeHandwrittenTextAsync(imageData);\n\n            // Run analyze image service\n            Task<ComputerVisionImageAnalysisResult> imageTask = this.ComputerVisionService.AnalyzeImageAsync(imageData);\n\n            // Wait for all tasks to be completed\n            await Task.WhenAll(hwrTask, imageTask);\n\n            // Get results\n            return await InterpretResultsAsync(hwrTask.Result, imageTask.Result);\n        }\n\n        /// <summary>\n        /// Analyze dialog with image uri\n        /// </summary>\n        public async Task<DialogAnalysisResult> AnalyzeDialogAsync(Uri imageUri)\n        {\n            if (imageUri == null)\n            {\n                throw new ArgumentNullException(\"Image uri is not initialized.\");\n            }\n\n            // Run handwritten text recognition service\n            Task<HandwritingRecognitionResult> hwrTask = this.ComputerVisionService.RecognizeHandwrittenTextAsync(imageUri);\n\n            // Run analyze image service\n            Task<ComputerVisionImageAnalysisResult> imageTask = this.ComputerVisionService.AnalyzeImageAsync(imageUri);\n\n            // Wait for all tasks to be completed\n            await Task.WhenAll(hwrTask, imageTask);\n\n            // Get results\n            return await InterpretResultsAsync(hwrTask.Result, imageTask.Result);\n        }\n\n        private async Task<DialogAnalysisResult> InterpretResultsAsync(HandwritingRecognitionResult hwrResult, ComputerVisionImageAnalysisResult imageResult)\n        {\n            DialogAnalysisResult retResult = new DialogAnalysisResult();\n\n            if (hwrResult.Lines?.Count() > 0)\n            {\n                // Get labels from handwriting recognition\n                IEnumerable<ImageTextRegion> labels = hwrResult.Lines.Where(line => string.IsNullOrEmpty(line.Text) == false).Select(line => line.TextRegion);\n\n                // Interpret dialog data\n                DialogDataInterpreter dialogDataInterpreter = new DialogDataInterpreter(imageResult.Metadata.Height, imageResult.Metadata.Width, labels);\n                retResult = dialogDataInterpreter.Result;\n\n                // Extract text from dialog data interpreter's title and content result\n                List<string> results = new List<string>();\n                results.Add(retResult.TitleLabel?.TextLabel?.Text);\n                results.AddRange(retResult.ContentLabels?.Select(label => label?.TextLabel?.Text));\n\n                // Analyze key phrases from result text\n                string text = StringUtility.GetTextOrDefault(results, string.Empty, \" \");\n                if (string.IsNullOrEmpty(text) == false)\n                {\n                    TextAnalyticsResult<TextAnalyticsKeyPhrasesResult> keyPhrasesResult = await this.TextAnalyticsService.AnalyzeKeyPhrasesAsync(text);\n                    retResult.KeyPhrases = keyPhrasesResult.Results?.Select(kp => kp.KeyPhrases).FirstOrDefault();\n                }\n            }\n\n            // Add image description tags\n            if (imageResult.Description?.Tags?.Count() > 0)\n            {\n                retResult.Tags = imageResult.Description.Tags;\n            }\n\n            // Add image description captions\n            if (imageResult.Description?.Captions?.Count() > 0)\n            {\n                retResult.Captions =\n                    imageResult.Description.Captions.Where(cap => string.IsNullOrEmpty(cap.Text) == false)\n                        .OrderByDescending(cap => cap.Confidence).Select(cap => cap.Text).ToArray();\n            }\n\n            return retResult;\n        }\n    }\n}\n"
  },
  {
    "path": "StackOverflow-Bot/DialogAnalyzerFunc/Clients/DialogDataInterpreter.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text.RegularExpressions;\n\nusing DialogAnalyzerFunc.Models;\n\nnamespace DialogAnalyzerFunc.Clients\n{\n    public class DialogDataInterpreter\n    {\n        private IEnumerable<DialogLabel> DialogLabels;\n\n        public DialogDataInterpreter(int height, int width, IEnumerable<ImageTextRegion> labels)\n        {\n            if (labels?.Count() > 0 == false)\n            {\n                throw new ArgumentNullException(\"Labels list is not initialized.\");\n            }\n\n            // 1. Convert text labels\n            this.DialogLabels =\n                labels.Where(label => string.IsNullOrEmpty(label?.Text) == false).Select(label => new DialogLabel() { Id = Guid.NewGuid(), TextLabel = label }).ToList();\n\n            // 2. Set title label\n            this.SetTitleLabel();\n\n            // 3. Set button labels\n            this.SetButtonLabels();\n\n            // 4. Set content labels\n            this.SetContentLabels();\n\n            // 5. Set results\n            this.Result = new DialogAnalysisResult()\n            {\n                Labels = this.DialogLabels.ToArray()\n            };\n        }\n\n        /// <summary>\n        /// Image data grid for buttons\n        /// </summary>\n        private ImageDataGrid ButtonsGrid => new ImageDataGrid(0, this.Height - this.DefaultGridHeight, this.DefaultGridHeight, this.Width);\n\n        /// <summary>\n        /// Get the height of the default grid\n        /// </summary>\n        protected int DefaultGridHeight { get; private set; }\n\n        /// <summary>\n        /// Height of the image\n        /// </summary>\n        protected int Height { get; private set; }\n\n        /// <summary>\n        /// Determine if the value is valid text\n        /// </summary>\n        private bool IsValidText(string value)\n        {\n            return string.IsNullOrEmpty(value) == false && Regex.Match(value, \"[a-z]+\", RegexOptions.IgnoreCase).Success == true;\n        }\n\n        /// <summary>\n        /// Determine if the value is with the target and buffer\n        /// </summary>\n        protected bool IsWithin(int target, int buffer, int value)\n        {\n            return value >= (target - buffer) && value <= (target + buffer);\n        }\n\n        /// <summary>\n        /// Width of the image\n        /// </summary>\n        protected int Width { get; private set; }\n\n        /// <summary>\n        /// Analysis result\n        /// </summary>\n        public DialogAnalysisResult Result { get; protected set; }\n\n        /// <summary>\n        /// Set button labels\n        /// </summary>\n        private void SetButtonLabels()\n        {\n            if (this.UndefinedLabels.Count() == 0)\n            {\n                return;\n            }\n\n            // Find the labels which are undefined, within the button grid\n            IEnumerable<DialogLabel> potentialButtonLabels =\n                this.UndefinedLabels.Where(label => this.ButtonsGrid.Contains(label.TextLabel.CenterX, label.TextLabel.CenterY) == true && IsValidText(label.TextLabel.Text) == true);\n\n            if (potentialButtonLabels.Count() > 0)\n            {\n                // Find the y-coordinate of the lowest label\n                int lowestButtom = potentialButtonLabels.OrderByDescending(label => label.TextLabel.Y).First().TextLabel.Bottom;\n\n                IEnumerable<DialogLabel> buttonLabels = potentialButtonLabels.Where(label => this.IsWithin(lowestButtom, YBuffer, label.TextLabel.Bottom));\n\n                // If exist, set label type to button\n                foreach (DialogLabel buttonLabel in buttonLabels)\n                {\n                    buttonLabel.DialogLabelType = DialogLabel.DialogLabelTypes.Button;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Set content labels\n        /// </summary>\n        private void SetContentLabels()\n        {\n            if (this.UndefinedLabels.Count() == 0)\n            {\n                return;\n            }\n\n            // If exist, set label type to content\n            foreach (DialogLabel contentLabel in this.UndefinedLabels)\n            {\n                if (IsValidText(contentLabel.TextLabel.Text) == true)\n                {\n                    contentLabel.DialogLabelType = DialogLabel.DialogLabelTypes.Content;\n                }\n            }\n        }\n\n        /// <summary>\n        /// Set title label\n        /// </summary>\n        private void SetTitleLabel()\n        {\n            if (this.UndefinedLabels.Count() == 0)\n            {\n                return;\n            }\n\n            // Find the label which is on top and within the title grid\n            DialogLabel titleLabel =\n                this.UndefinedLabels.Where(label => this.TitleGrid.Contains(label.TextLabel.CenterX, label.TextLabel.CenterY) == true\n                    && IsValidText(label.TextLabel.Text) == true).OrderBy(label => label.TextLabel.Y).FirstOrDefault();\n\n            // If exist, set label type to title\n            if (titleLabel != null)\n            {\n                titleLabel.DialogLabelType = DialogLabel.DialogLabelTypes.Title;\n            }\n        }\n\n        /// <summary>\n        /// Image data grid for title\n        /// </summary>\n        private ImageDataGrid TitleGrid => new ImageDataGrid(0, 0, this.DefaultGridHeight, this.Width);\n\n        /// <summary>\n        /// Retrive undefined labels\n        /// </summary>\n        private IEnumerable<DialogLabel> UndefinedLabels => this.DialogLabels.Where(label => label.IsDefined == false);\n\n        /// <summary>\n        /// Buffer on the y-axis\n        /// </summary>\n        protected int YBuffer => 20;\n\n        /// <summary>\n        /// Object to define the image data grid\n        /// </summary>\n        protected class ImageDataGrid\n        {\n            public ImageDataGrid(int x, int y, int height, int width)\n            {\n                this.X = x;\n                this.Y = y;\n                this.Height = height;\n                this.Width = width;\n            }\n\n            public int Height { get; set; }\n\n            public int Width { get; set; }\n\n            public int X { get; set; }\n\n            public int Y { get; set; }\n\n            public bool Contains(int x, int y)\n            {\n                return x >= this.X\n                    && x <= (this.X + this.Width)\n                    && y >= this.Y\n                    && y <= (this.Y + this.Height);\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "StackOverflow-Bot/DialogAnalyzerFunc/DialogAnalyzerFunc.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>net461</TargetFramework>\n  </PropertyGroup>\n  <ItemGroup>    \n    <PackageReference Include=\"Microsoft.NET.Sdk.Functions\" Version=\"1.0.2\" />    \n    <PackageReference Include=\"Newtonsoft.Json\" Version=\"10.0.3\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Configuration\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Update=\"host.json\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n    <None Update=\"local.settings.json\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <CopyToPublishDirectory>Never</CopyToPublishDirectory>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <Folder Include=\"Properties\\PublishProfiles\\\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "StackOverflow-Bot/DialogAnalyzerFunc/Extensions/EnumerableExtensions.cs",
    "content": "﻿using System;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace DialogAnalyzerFunc.Extensions\n{\n    public static class EnumerableExtensions\n    {\n        public static IEnumerable<Tuple<TValue, TValue>> ToTuples<TValue>(this IEnumerable<TValue> values)\n        {\n            if (values.Count() % 2 != 0)\n            {\n                throw new ArgumentException(\"Values does not have an even number of items.\");\n            }\n\n            List<Tuple<TValue, TValue>> results = new List<Tuple<TValue, TValue>>();\n\n            if (values.Count() == 0)\n            {\n                return results;\n            }\n\n            for (int index = 0; index < values.Count(); index += 2)\n            {\n                results.Add(new Tuple<TValue, TValue>(values.ElementAt(index), values.ElementAt(index + 1)));\n            }\n\n            return results;\n        }\n    }\n}\n"
  },
  {
    "path": "StackOverflow-Bot/DialogAnalyzerFunc/Extensions/HttpExtensions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Net.Http;\nusing System.Linq;\nusing System.Text;\n\nusing Newtonsoft.Json;\n\nnamespace DialogAnalyzerFunc.Extensions\n{\n    public static class HttpExtensions\n    {\n        /// <summary>\n        /// Add headers to request\n        /// </summary>\n        public static void AddHeaders(this HttpRequestMessage request, IDictionary<string, string> headers)\n        {\n            // Add headers to request\n            if (headers != null)\n            {\n                foreach (string key in headers.Keys)\n                {\n                    request.Headers.Add(key, headers[key]);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Add content to request as byte array\n        /// </summary>\n        public static void AddContentAsBytes(this HttpRequestMessage request, byte[] content)\n        {\n            if (content?.Count() > 0)\n            {\n                ByteArrayContent byteContent = new ByteArrayContent(content);\n                byteContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(\"application/octet-stream\");\n                request.Content = byteContent;\n            }\n        }\n\n        /// <summary>\n        /// Add content to request as json\n        /// </summary>\n        public static void AddContentAsJson(this HttpRequestMessage request, object content)\n        {\n            if (content != null)\n            {\n                string jsonContent = JsonConvert.SerializeObject(content);\n                request.Content = new StringContent(jsonContent, Encoding.UTF8, \"application/json\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "StackOverflow-Bot/DialogAnalyzerFunc/Models/ComputerVisionImageAnalysisResult.cs",
    "content": "﻿using System;\nusing System.Runtime.Serialization;\n\nnamespace DialogAnalyzerFunc.Models\n{\n    [DataContract]\n    public class ComputerVisionImageAnalysisResult\n    {\n        [DataMember(Name = \"categories\")]\n        public ComputerVisionImageCategory[] Categories { get; set; }\n\n        [DataMember(Name = \"description\")]\n        public ComputerVisionImageDescription Description { get; set; }\n\n        [DataMember(Name = \"metadata\")]\n        public ComputerVisionImageMetadata Metadata { get; set; }\n\n        [DataMember(Name = \"requestId\")]\n        public string RequestId { get; set; }\n    }\n\n    [DataContract]\n    public class ComputerVisionImageCategory\n    {\n        [DataMember(Name = \"name\")]\n        public string Name { get; set; }\n\n        [DataMember(Name = \"score\")]\n        public double Score { get; set; }\n    }\n\n    [DataContract]\n    public class ComputerVisionImageCaption\n    {\n        [DataMember(Name = \"text\")]\n        public string Text { get; set; }\n\n        [DataMember(Name = \"confidence\")]\n        public double Confidence { get; set; }\n    }\n\n    [DataContract]\n    public class ComputerVisionImageDescription\n    {\n        [DataMember(Name = \"tags\")]\n        public string[] Tags { get; set; }\n\n        [DataMember(Name = \"captions\")]\n        public ComputerVisionImageCaption[] Captions { get; set; }\n    }\n\n    [DataContract]\n    public class ComputerVisionImageMetadata\n    {\n        [DataMember(Name = \"format\")]\n        public string Format { get; set; }\n\n        [DataMember(Name = \"height\")]\n        public int Height { get; set; }\n\n        [DataMember(Name = \"width\")]\n        public int Width { get; set; }\n    }\n}\n"
  },
  {
    "path": "StackOverflow-Bot/DialogAnalyzerFunc/Models/DialogAnalysisResult.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Runtime.Serialization;\n\nnamespace DialogAnalyzerFunc.Models\n{\n    [DataContract]\n    public class DialogAnalysisResult\n    {\n        [DataMember(Name = \"KeyPhrases\")]\n        public string[] KeyPhrases { get; set; } = new string[0];\n\n        [DataMember(Name = \"Labels\")]\n        public DialogLabel[] Labels { get; set; } = new DialogLabel[0];\n\n        [DataMember(Name = \"Tags\")]\n        public string[] Tags { get; set; } = new string[0];\n\n        [DataMember(Name = \"Captions\")]\n        public string[] Captions { get; set; } = new string[0];\n\n        public IEnumerable<DialogLabel> ContentLabels\n        {\n            get\n            {\n                return this.Labels?.Where(label => label.DialogLabelType == DialogLabel.DialogLabelTypes.Content);\n            }\n        }\n\n        public DialogLabel TitleLabel\n        {\n            get\n            {\n                return this.Labels?.FirstOrDefault(label => label.DialogLabelType == DialogLabel.DialogLabelTypes.Title);\n            }\n        }\n    }\n\n    [DataContract]\n    public class DialogLabel\n    {\n        public enum DialogLabelTypes\n        {\n            Button,\n            Content,\n            Title,\n            Unknown\n        }\n\n        [DataMember(Name = \"DialogLabelType\")]\n        public DialogLabelTypes DialogLabelType { get; set; } = DialogLabelTypes.Unknown;\n\n        [DataMember(Name = \"Id\")]\n        public Guid Id { get; set; } = Guid.Empty;\n\n        [DataMember(Name = \"TextLabel\")]\n        public ImageTextRegion TextLabel { get; set; }\n\n        public bool IsDefined => this.DialogLabelType != DialogLabelTypes.Unknown;\n    }\n}\n"
  },
  {
    "path": "StackOverflow-Bot/DialogAnalyzerFunc/Models/HandwritingRecognitionResult.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Runtime.Serialization;\n\nusing DialogAnalyzerFunc.Extensions;\n\nnamespace DialogAnalyzerFunc.Models\n{\n    [DataContract]\n    public struct HandwritingRecognitionOperationResult\n    {\n        public enum HandwritingRecognitionOperationStatus\n        {\n            NotStarted = 0,\n            Running = 1,\n            Succeeded = 2,\n            Failed = 3\n        }\n\n        [DataMember(Name = \"status\")]\n        public HandwritingRecognitionOperationStatus Status { get; set; }\n\n        [DataMember(Name = \"recognitionResult\")]\n        public HandwritingRecognitionResult Result { get; set; }\n    }\n\n    [DataContract]\n    public struct HandwritingRecognitionResult\n    {\n        [DataMember(Name = \"lines\")]\n        public HandwritingRecognitionText[] Lines { get; set; }\n    }\n\n    [DataContract]\n    public struct HandwritingRecognitionText\n    {\n        [DataMember(Name = \"boundingBox\")]\n        public int[] BoundingBox { get; set; }\n\n        [DataMember(Name = \"text\")]\n        public string Text { get; set; }\n\n        public ImageTextRegion TextRegion\n        {\n            get\n            {\n                // Create text region\n                ImageTextRegion textRegion = new ImageTextRegion()\n                {\n                    Text = this.Text\n                };\n\n                // Determine boundaries\n                if (this.BoundingBox.Count() == 8)\n                {\n                    IEnumerable<Tuple<int, int>> points = this.BoundingBox.ToTuples<int>();\n                    IEnumerable<int> xAxis = points.Select(p => p.Item1).OrderBy(x => x);\n                    IEnumerable<int> yAxis = points.Select(p => p.Item2).OrderBy(y => y);\n\n                    textRegion.X = xAxis.First();\n                    textRegion.Y = yAxis.First();\n                    textRegion.Width = xAxis.Last() - textRegion.X;\n                    textRegion.Height = yAxis.Last() - textRegion.Y;\n                }\n\n                return textRegion;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "StackOverflow-Bot/DialogAnalyzerFunc/Models/ImageTextRegion.cs",
    "content": "﻿using System;\nusing System.Runtime.Serialization;\n\nnamespace DialogAnalyzerFunc.Models\n{\n    [DataContract]\n    public class ImageTextRegion\n    {\n        /// <summary>\n        /// The height of this Region\n        /// </summary>\n        [DataMember]\n        public int Height { get; set; }\n\n        /// <summary>\n        /// The text value of this Text Region\n        /// </summary>\n        [DataMember]\n        public string Text { get; set; }\n\n        /// <summary>\n        /// The width of this Region\n        /// </summary>\n        [DataMember]\n        public int Width { get; set; }\n\n        /// <summary>\n        /// The x-coordinate of the upper-left corner of this Region\n        /// </summary>\n        [DataMember]\n        public int X { get; set; }\n\n        /// <summary>\n        /// The y-coordinate of the upper-left corner of this Region\n        /// </summary>\n        [DataMember]\n        public int Y { get; set; }\n\n        public int CenterX\n        {\n            get\n            {\n                return (this.Width / 2) + this.X;\n            }\n        }\n\n        public int CenterY\n        {\n            get\n            {\n                return (this.Height / 2) + this.Y;\n            }\n        }\n\n        public int Bottom\n        {\n            get\n            {\n                return this.Y + this.Height;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "StackOverflow-Bot/DialogAnalyzerFunc/Models/TextAnalyticsResult.cs",
    "content": "﻿using System;\nusing System.Runtime.Serialization;\n\nnamespace DialogAnalyzerFunc.Models\n{\n    [DataContract]\n    public class TextAnalyticsResult<T>\n    {\n        [DataMember(Name = \"documents\")]\n        public T[] Results { get; set; }\n    }\n\n    [DataContract]\n    public class TextAnalyticsKeyPhrasesResult\n    {\n        [DataMember(Name = \"id\")]\n        public string Id { get; set; }\n\n        [DataMember(Name = \"keyPhrases\")]\n        public string[] KeyPhrases { get; set; }\n    }\n}\n"
  },
  {
    "path": "StackOverflow-Bot/DialogAnalyzerFunc/Services/ComputerVisionService.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Net.Http;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nusing DialogAnalyzerFunc.Models;\nusing DialogAnalyzerFunc.Utilities;\n\nnamespace DialogAnalyzerFunc.Services\n{\n    public class ComputerVisionService\n    {\n        private readonly string HEADER_OPLOC_KEY = \"Operation-Location\";\n        private readonly string HEADER_SUB_KEY = \"Ocp-Apim-Subscription-Key\";\n        private readonly string SERVICE_URL_FORMAT = \"https://{0}.api.cognitive.microsoft.com/vision/v1.0/\";\n\n        private string AnalyzeImageVisualFeatures = \"Description\";\n\n        public IDictionary<string, string> RequestHeaders { get; protected set; }\n\n        public string BaseServiceUrl { get; protected set; }\n\n        public ComputerVisionService(string apiRegion, string subscriptionKey)\n        {\n            if (string.IsNullOrEmpty(apiRegion) == true)\n            {\n                throw new ArgumentNullException(\"Api region is not initialized.\");\n            }\n\n            if (string.IsNullOrEmpty(subscriptionKey) == true)\n            {\n                throw new ArgumentNullException(\"Subscription key is not initialized.\");\n            }\n\n            this.BaseServiceUrl = string.Format(SERVICE_URL_FORMAT, apiRegion);\n            this.RequestHeaders = new Dictionary<string, string>()\n            {\n                {  this.HEADER_SUB_KEY, subscriptionKey }\n            };\n        }\n\n        /// <summary>\n        /// Analyze with image data\n        /// </summary>\n        public async Task<ComputerVisionImageAnalysisResult> AnalyzeImageAsync(byte[] imageData)\n        {\n            if (imageData?.Count() > 0 == false)\n            {\n                throw new ArgumentNullException(\"Image data is not initialized.\");\n            }\n\n            // Get request uri\n            Uri requestUri = new Uri(this.BaseServiceUrl + \"analyze\"\n                                        + \"?visualFeatures=\" + this.AnalyzeImageVisualFeatures);\n\n            // Get response\n            return await HttpClientUtility.PostAsBytesAsync<ComputerVisionImageAnalysisResult>(requestUri, this.RequestHeaders, imageData);\n        }\n\n        /// <summary>\n        /// Analyze with image uri\n        /// </summary>\n        public async Task<ComputerVisionImageAnalysisResult> AnalyzeImageAsync(Uri imageUri)\n        {\n            string url = imageUri?.AbsoluteUri ?? throw new ArgumentNullException(\"Image uri is not initialized.\");\n\n            // Get request uri\n            Uri requestUri = new Uri(this.BaseServiceUrl + \"analyze\"\n                                        + \"?visualFeatures=\" + this.AnalyzeImageVisualFeatures);\n\n            // Create content of the request\n            var content = new { Url = url };\n\n            // Get response\n            return await HttpClientUtility.PostAsJsonAsync<ComputerVisionImageAnalysisResult>(requestUri, this.RequestHeaders, content);\n        }\n\n        /// <summary>\n        /// Recognize handwritten text with image data\n        /// </summary>\n        public async Task<HandwritingRecognitionResult> RecognizeHandwrittenTextAsync(byte[] imageData)\n        {\n            if (imageData?.Count() > 0 == false)\n            {\n                throw new ArgumentNullException(\"Image data is not initialized.\");\n            }\n\n            // Get request uri\n            Uri requestUri = new Uri(this.BaseServiceUrl + \"recognizeText?handwriting=true\");\n\n            // Get response\n            HttpResponseMessage response = await HttpClientUtility.PostAsBytesAsync(requestUri, this.RequestHeaders, imageData);\n\n            return await GetResultFromOperationResponse(response);\n        }\n\n        /// <summary>\n        /// Recognize handwritten text with image uri\n        /// </summary>\n        public async Task<HandwritingRecognitionResult> RecognizeHandwrittenTextAsync(Uri imageUri)\n        {\n            string url = imageUri?.AbsoluteUri ?? throw new ArgumentNullException(\"Image uri is not initialized.\");\n\n            // Get request uri\n            Uri requestUri = new Uri(this.BaseServiceUrl + \"recognizeText?handwriting=true\");\n\n            // Create content of the request\n            var content = new { Url = url };\n\n            // Get response\n            HttpResponseMessage response = await HttpClientUtility.PostAsJsonAsync(requestUri, this.RequestHeaders, content);\n\n            return await GetResultFromOperationResponse(response);\n        }\n\n        private async Task<HandwritingRecognitionResult> GetResultFromOperationResponse(HttpResponseMessage response)\n        {\n            // Process operation\n            if (response.Headers.Contains(this.HEADER_OPLOC_KEY) == false)\n            {\n                throw new InvalidOperationException(\"No operation-location value returned from initial request.\");\n            }\n\n            Uri opLocationUri = new Uri(response.Headers.GetValues(this.HEADER_OPLOC_KEY).First());\n\n            HandwritingRecognitionOperationResult opResult = new HandwritingRecognitionOperationResult();\n\n            int i = 0;\n            while (i++ < HttpClientUtility.RETRY_COUNT)\n            {\n                // Get the operation result\n                opResult = await HttpClientUtility.GetAsync<HandwritingRecognitionOperationResult>(opLocationUri, this.RequestHeaders);\n\n                // Wait if operation is running or has not started\n                if (opResult.Status == HandwritingRecognitionOperationResult.HandwritingRecognitionOperationStatus.NotStarted\n                    || opResult.Status == HandwritingRecognitionOperationResult.HandwritingRecognitionOperationStatus.Running)\n                {\n                    await Task.Delay(HttpClientUtility.RETRY_DELAY);\n                }\n                else\n                {\n                    break;\n                }\n            }\n\n            if (opResult.Status != HandwritingRecognitionOperationResult.HandwritingRecognitionOperationStatus.Succeeded)\n            {\n                throw new Exception($\"Handwriting recognition operation was not successful with status: {opResult.Status}\");\n            }\n\n            return opResult.Result;\n        }\n    }\n}\n"
  },
  {
    "path": "StackOverflow-Bot/DialogAnalyzerFunc/Services/TextAnalyticsService.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nusing DialogAnalyzerFunc.Models;\nusing DialogAnalyzerFunc.Utilities;\n\nnamespace DialogAnalyzerFunc.Services\n{\n    public class TextAnalyticsService\n    {\n        private readonly string HEADER_SUB_KEY = \"Ocp-Apim-Subscription-Key\";\n        private readonly string SERVICE_URL_FORMAT = \"https://{0}.api.cognitive.microsoft.com/text/analytics/v2.0/\";\n\n        public IDictionary<string, string> RequestHeaders { get; protected set; }\n\n        public string BaseServiceUrl { get; protected set; }\n\n        public TextAnalyticsService(string apiRegion, string subscriptionKey)\n        {\n            if (string.IsNullOrEmpty(apiRegion) == true)\n            {\n                throw new ArgumentNullException(\"Api region is not initialized.\");\n            }\n\n            if (string.IsNullOrEmpty(subscriptionKey) == true)\n            {\n                throw new ArgumentNullException(\"Subscription key is not initialized.\");\n            }\n\n            this.BaseServiceUrl = string.Format(SERVICE_URL_FORMAT, apiRegion);\n            this.RequestHeaders = new Dictionary<string, string>()\n            {\n                {  this.HEADER_SUB_KEY, subscriptionKey }\n            };\n        }\n\n        /// <summary>\n        /// Analyze key phrases with text\n        /// </summary>\n        public async Task<TextAnalyticsResult<TextAnalyticsKeyPhrasesResult>> AnalyzeKeyPhrasesAsync(string fullText)\n        {\n            if (string.IsNullOrEmpty(fullText) == true)\n            {\n                throw new ArgumentNullException(\"Text is not initialized.\");\n            }\n\n            // Get request uri\n            Uri requestUri = new Uri(this.BaseServiceUrl + \"keyPhrases\");\n\n            var document = new\n            {\n                id = Guid.NewGuid().ToString(),\n                text = fullText\n            };\n\n            // Create content of the request\n            var content = new\n            {\n                documents = new object[] { document }\n            };\n\n            // Get response\n            return await HttpClientUtility.PostAsJsonAsync<TextAnalyticsResult<TextAnalyticsKeyPhrasesResult>>(requestUri, this.RequestHeaders, content);\n        }\n    }\n}\n"
  },
  {
    "path": "StackOverflow-Bot/DialogAnalyzerFunc/Utilities/HttpClientUtility.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Net;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\nusing Newtonsoft.Json;\n\nusing DialogAnalyzerFunc.Extensions;\n\nnamespace DialogAnalyzerFunc.Utilities\n{\n    public static class HttpClientUtility\n    {\n        public static readonly int RETRY_COUNT = 10;\n        public static readonly int RETRY_DELAY = 500;\n\n        private static HttpClient Client;\n\n        /// <summary>\n        /// Static constructor of the HttpClientUtility\n        /// </summary>\n        static HttpClientUtility()\n        {\n            if (Client == null)\n            {\n                Client = new HttpClient();\n            }\n        }\n\n        /// <summary>\n        /// Send Http Get to the request uri and get the TResult from response content\n        /// </summary>\n        public static async Task<TResult> GetAsync<TResult>(Uri requestUri, IDictionary<string, string> headers)\n        {\n            // Get response\n            HttpResponseMessage response = await GetAsync(requestUri, headers);\n\n            // Read response\n            string responseContent = await response.Content.ReadAsStringAsync();\n\n            // Get result\n            TResult result = JsonConvert.DeserializeObject<TResult>(responseContent);\n            return result;\n        }\n\n        /// <summary>\n        /// Send Http Get to the request uri and get HttpResponseMessage\n        /// </summary>\n        public static async Task<HttpResponseMessage> GetAsync(Uri requestUri, IDictionary<string, string> headers)\n        {\n            // Create new request function\n            Func<HttpRequestMessage> createRequestMessage = () =>\n            {\n                // Create new request\n                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUri);\n\n                // Add headers to request\n                request.AddHeaders(headers);\n                return request;\n            };\n\n            // Send request and get response\n            HttpResponseMessage response = await ExecuteActionkWithAutoRetry(() => Client.SendAsync(createRequestMessage()));\n            return response;\n        }\n\n        /// <summary>\n        /// Send Http Post to request uri and get TResult from response content \n        /// </summary>\n        public static async Task<TResult> PostAsBytesAsync<TResult>(Uri requestUri, IDictionary<string, string> headers, byte[] content)\n        {\n            // Post request and get response\n            HttpResponseMessage response = await PostAsBytesAsync(requestUri, headers, content);\n\n            // Read response\n            string responseContent = await response.Content.ReadAsStringAsync();\n\n            return JsonConvert.DeserializeObject<TResult>(responseContent);\n        }\n\n        /// <summary>\n        /// Send Http Post to request uri and get TResult from response content \n        /// </summary>\n        public static async Task<TResult> PostAsJsonAsync<TResult>(Uri requestUri, IDictionary<string, string> headers, object content)\n        {\n            // Post request and get response\n            HttpResponseMessage response = await PostAsJsonAsync(requestUri, headers, content);\n\n            // Read response\n            string responseContent = await response.Content.ReadAsStringAsync();\n\n            return JsonConvert.DeserializeObject<TResult>(responseContent);\n        }\n\n        /// <summary>\n        /// Send Http Post to request uri and get HttpResponseMessage\n        /// </summary>\n        public static async Task<HttpResponseMessage> PostAsBytesAsync(Uri requestUri, IDictionary<string, string> headers, byte[] content)\n        {\n            // Create new request function\n            Func<HttpRequestMessage> createRequestMessage = () =>\n            {\n                // Create new request\n                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, requestUri);\n\n                // Add headers to request\n                request.AddHeaders(headers);\n\n                // Add content as Json\n                request.AddContentAsBytes(content);\n\n                return request;\n            };\n\n            // Post request\n            HttpResponseMessage response = await ExecuteActionkWithAutoRetry(() => Client.SendAsync(createRequestMessage()));\n            return response;\n        }\n\n        /// <summary>\n        /// Send Http Post to request uri and get HttpResponseMessage\n        /// </summary>\n        public static async Task<HttpResponseMessage> PostAsJsonAsync(Uri requestUri, IDictionary<string, string> headers, object content)\n        {\n            // Create new request function\n            Func<HttpRequestMessage> createRequestMessage = () =>\n            {\n                // Create new request\n                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, requestUri);\n\n                // Add headers to request\n                request.AddHeaders(headers);\n\n                // Add content as Json\n                request.AddContentAsJson(content);\n\n                return request;\n            };\n\n            // Post request\n            HttpResponseMessage response = await ExecuteActionkWithAutoRetry(() => Client.SendAsync(createRequestMessage()));\n            return response;\n        }\n\n        /// <summary>\n        /// Execute the action which returns HttpResponseMessage with auto retry\n        /// </summary>\n        private static async Task<HttpResponseMessage> ExecuteActionkWithAutoRetry(Func<Task<HttpResponseMessage>> action)\n        {\n            int retryCount = RETRY_COUNT;\n            int retryDelay = RETRY_DELAY;\n\n            HttpResponseMessage response;\n\n            while (true)\n            {\n                response = await action();\n\n                if (response.StatusCode == (HttpStatusCode)429 && retryCount > 0)\n                {\n                    await Task.Delay(retryDelay);\n                    retryCount--;\n                    retryDelay *= 2;\n                    continue;\n                }\n\n                response.EnsureSuccessStatusCode();\n                break;\n            }\n\n            return response;\n        }\n\n    }\n}\n"
  },
  {
    "path": "StackOverflow-Bot/DialogAnalyzerFunc/Utilities/StringUtility.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace DialogAnalyzerFunc.Utilities\n{\n    public static class StringUtility\n    {\n        /// <summary>\n        /// Get combined text with delimeter or default value\n        /// </summary>\n        public static string GetTextOrDefault(IEnumerable<string> values, string defaultValue, string delim = \", \")\n        {\n            if (values?.Count() > 0 == false || values.All(v => string.IsNullOrEmpty(v) == true))\n            {\n                return defaultValue;\n            }\n\n            values = values.Where(v => string.IsNullOrEmpty(v) == false);\n\n            return string.Join(delim, values).Trim();\n        }\n    }\n}\n"
  },
  {
    "path": "StackOverflow-Bot/DialogAnalyzerFunc/host.json",
    "content": "{\n}"
  },
  {
    "path": "StackOverflow-Bot/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2017 Microsoft Corporation\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "StackOverflow-Bot/README.md",
    "content": "# Stack Overflow Bot\n\nThis Bot is intended to demonstrate a number of integrations between Microsoft Bot Framework, and Microsoft's Cognitive Services. From Microsoft's Cognitive Services, this bot uses: Bing Custom Search, Language Understanding Intelligence Service (LUIS), QnA Maker, and Text Analytics. The full range of cognitive services that Microsoft offers can be viewed here: https://azure.microsoft.com/en-us/services/cognitive-services/.\n\nBot Framework allows you to build bots using a simple, but comprehensive API. The Bots you build can be configured to work for your users wherever they are, whether it's Skype, Microsoft Teams, Cortana, Slack or more. To learn more about Bot Framework, visit https://dev.botframework.com/. To learn more about developing bots with the Bot Framework, visit https://docs.microsoft.com/en-us/bot-framework/#pivot=main&panel=developing.\n\n## Components\n\n### [StackBot](#bot)\nA JavaScript project that demonstrates the usage of Bing Custom Search, LUIS, QnA Maker, and Text Analytics to make it easier to search for solutions on Stack Overflow.\n### [DialogAnalyzerFunc](#dialog-analyzer-azure-function)\nAn C# project that uses Computer Vision and Text Analytics to parse the contents of a screenshot.\n### [StackCode](#stack-overflow-bot-visual-studio-code-extension)\nA TypeScript project that demonstrates how the bot can be built into Visual Studio Code.\n\n## Bot\n\n### Requirements to run the Bot\n\n- Node 8.1.4\n\n### Installation of the Bot\n\nRun `npm install` in the `StackBot` directory.\n\n### Running the Bot\n\n1. Run `npm run start` in the `StackBot` directory.\n2. Navigate to `http://localhost:3978/` to start interacting with your bot.\n\n### Companion Visual Studio Code Extension\n\nThe Visual Studio Code extension allows developers to use their Bot as a programming buddy, allowing them to amplify their productivity by reducing context switching. For more information about it, including how it can be built, and installed, please refer to the the [Stack Overflow Bot Visual Studio Code Extension](#stack-overflow-bot-visual-studio-code-extension) section below.\n\n### Configuration\n\nAs this bot uses a number of services, you will need to create applications and generate keys for each one. The following instructions are intended to guide you on how to do this.\n\n#### Service: Bot Framework\n\nTo register a Bot Framework Bot, go to https://dev.botframework.com/bots/new. Fill out the form, select `Register an existing bot using BotBuilder SDK`, and create a `Microsoft App Id` and `Password`. Save both `Microsoft App Id` and `Password` somewhere secure, and add them as the following environment variables. See https://www.schrodinger.com/kb/1842 for instructions on how to set environment variables.\n\n- `BOTBUILDER_APP_ID` is the `Microsoft App Id` you generated\n- `BOTBUILDER_APP_PASSWORD` is the `Microsoft App Password` you generated.\n\n#### Service: Language Understanding Intelligence Service (LUIS)\n\nTo register and train a LUIS Application, go to https://www.luis.ai/applications. After logging in, click `New App` and follow the directions. When directed to the dashboard, go to Settings, and click `Import Version`. From the Uplaod File dialog,select the `luis.json` file under the `StackBot/data` directory. After the file is uploaded, click the `Set as active version` button under the `Actions` column. Click on `Train & Test` on the Left Column and click `Train Application`. It may take a few minutes to finish. Once done, you can test your LUIS model by typing out an utterance. Try 'tell me a joke', for example. Finally, click on `Publish App`, assign a key, and click `Publish`. You will be\ngiven an `Endpoint url`. Copy this URL and add it as an environment variable.\n\n- `LUIS_MODEL` is the `Endpoint url` from publishing a LUIS Application.\n\n#### Service: QnAMaker\n\nTo register a QnAMaker Application, go to https://qnamaker.ai/Create. After logging in, name your new Application and click on `Select file…` under the `FAQ FILES` heading. From the File Picker, navigate to the `smalltalk.tsv` file under the `StackBot/data` directory. Then click `Create`, and wait for a moment as the QnaMaker service is created from the Question/Answer pairs. When prompted, click `Publish` to expose the service to the outside world. You will be directed to a `Success` page. Here, take a look at the `Sample HTTP Request`. It will look like the following, but with generated keys in place of `KB_ID` and `QNA_KEY`, and a URL in place of `QNA_URL`:\n\n```\n    POST /knowledgebases/KB_ID/generateAnswer\n    Host: QNA_URL\n    Ocp-Apim-Subscription-Key: QNA_KEY\n    Content-Type: application/json\n    {\"question\":\"hi\"}\n```\n\nTake note of `KB_ID`, `QNA_KEY`, and `QNA_URL`, and save them. Set the following as environment variables:\n\n- `KB_ID` is the `KB_ID` from the sample http request\n- `QNA_KEY` is the `QNA_KEY` from the sample http request\n- `QNA_URL` is the `QNA_URL` fom the 'Host' parameter. As Cognitive Services can vary from region to region, it's important to set this appropriately. You may see for example, 'https://westus.api.cognitive.microsoft.com/qnamaker/v2.0' if your Text Analytics Cognitive Service is deployed in the `West US` Azure region.\n\n#### Service: Dialog Analyzer\n\nTo deploy and configure the Dialog Analyzer Azure Function, please refer to the [Dialog Analyzer Azure Function](#dialog-analyzer-azure-function) section below. After the deployment and configuring the Azure Function, set the following environment variables:\n\n- `DIALOG_ANALYZER_CLIENTID` is the name of the `Function Key`\n- `DIALOG_ANALYZER_KEY` is the value of the `Function Key`\n- `DIALOG_ANALYZER_URL` is the url of the deployment of the Azure Function\n\n#### Service: Bing Custom Search\n\nTo create a new Bing Custom Search, go to https://customsearch.ai/applications. After logging in, click on the `New custom search` with a new custom search instance name. You can then add a new domain `stackoverflow.com` in this case to set your custom search to stackoverflow.com only. Then click on the `Custom Search Endpoint` button, that is located besides your custom search name to obtain the `Primary key` and the `Custom Configuration ID`. For more information, please refer to https://docs.microsoft.com/en-us/azure/cognitive-services/bing-custom-search/quickstart. Set the following environment variables:\n\n- `BING_SEARCH_CONFIG` is the Custom Configuration ID from your custom search instance\n- `BING_SEARCH_KEY` is the Primary Key (or Secondary Key) from your custom search instance\n\n#### Service: Text Analytics\n\nTo register a Text Analytics Cognitive Service for Sentiment Analysis, go to https://ms.portal.azure.com/#create/Microsoft.CognitiveServices/apitype/TextAnalytics. After logging and going through the process of creating a Text Analytics Cognitive Service, go to the Application dashboard in the Azure Portal. Here you can click on `Keys` in the left pane or `Manage Keys` in the `Essentials` panel. Copy one of the keys shown and save it. Set the following environment variables:\n\n- `TEXT_ANALYTICS_KEY` is one of the keys shown in the Azure Portal.\n- `TEXT_ANALYTICS_URL` is the URL shown under `Endpoint` in the `Essentials` panel. As Cognitive Services can vary from region to region, it's important to set this appropriately. You may see for example, 'https://westus.api.cognitive.microsoft.com/text/analytics/v2.0' if your Text Analytics Cognitive Service is deployed in the `West US` Azure region.\n\n#### Service: Ngrok tunneling\n\nIn order for your locally running bot to communicate to other Bot Framework channels, it must make itself known to the Bot Framework dashboard, and the world. To do this, you can use tunneling software, like ngrok. Ngrok can be downloaded here https://ngrok.com/download. After installing and running Ngrok on port 3978 with the following commnad `ngrok http 3978`, you should see:\n\n    Session Status                online\n    Version                       2.2.8\n    Region                        United States (us)\n    Web Interface                 http://127.0.0.1:4040\n    Forwarding                    http://b05cf662.ngrok.io -> localhost:3978\n    Forwarding                    https://b05cf662.ngrok.io -> localhost:3978\n\n    Connections                   ttl     opn     rt1     rt5     p50     p90\n                                  0       0       0.00    0.00    0.00    0.00\n\nCopy the HTTPS forwarding URL (in this case `https://b05cf662.ngrok.io`) to your clipboard, and go to the Bot Framework dashboard at https://dev.botframework.com/bots. Select your bot and click on `Settings` in the the upper right corner. From there, you can scroll down to `Messaging Endpoint` under `Configuration`, and paste in the URL you copied, followed by the API endpoint that the bot listens on (in this bot's case: `/api/messages`). For example, if the HTTPS Forwarding URL was `https://b05cf662.ngrok.io` we would use ` https://b05cf662.ngrok.io/api/messages` as the `Messaging Endpoint`.\n\nWhen the bot is running ([see the section on running the bot](#running-the-bot)), it should now be testable directly from the Bot Framework dashboard. Click `<- Test` in the upper right corner to slide open a Web Chat control and begin interacting with the bot.\n\nTo test your bot from a web chat control hosted at the HTTPS forwarding URL, continue reading to setup and configure a Direct Line channel.\n\n#### Service: Locally hosted Web Chat control.\n\nGo to your Bot's dashboard, available at  https://dev.botframework.com/bots and add a 'Direct Line' channel.\nThis channel allows the Bot Framework Web Chat control to communicate to your Bot's backend service. From there, click `Add a Site` and give it a name. Click `Show` to the right of the hidden keys under `Secret keys`, and copy it. You can come back to this dashboard to view it again if you lose it. From there, open the file at `StackBot/static/index.html`, and change the assignment of the `BOT_SECRET` variable, pasting the Secret Key that was just copied.\n\n## Dialog Analyzer Azure Function\n\nThis Azure Function is intended to demonstrate how to build a function with Azure and Microsoft's Cognitive Services. From Microsoft's Cognitive Services, this function uses Computer Vision's Image Analysis to extract tags and captions; and Optical Character Recognition (OCR) to extract text from the image. It also uses Text Analytics to extract key phrases from text.\n\nAzure Functions allows you to focus on building great apps and not have to worry about provisioning and maintaining servers, especially when your workload grows. Functions provides a fully managed compute platform with high reliability and security. With scale on demand, you get the resources you need—when you need them. To learn more about Azure Functions, visit https://azure.microsoft.com/en-us/services/functions/.\n\n### Requirements to build the function\n\n- Visual Studio 2017 version 15.3 or later\n- Azure development workload\n- .NET Framework 4.6.1\n\n### Publish the function to Azure\n\nTo publish the Azure function, you can open the `DialogAnalyzerFunc` Visual Studio project. In `Solution Explorer`, right-click the project and select `Publish`. Choose `Create New` and then click `Publish`. If you haven't already connected Visual Studio to your Azure account, click `Add an account....`. In the `Create App Service` dialog, use the `Hosting` settings to sepecify your `App Name`, `Subscription`, `Resource Group`, `App Service Plan`, and `Storage account`. Click `Create` to create a function app in Azure with the previously populated settings. For more details, please refer to https://docs.microsoft.com/en-us/azure/azure-functions/functions-develop-vs#publish-to-azure\n\n### Configuration\n\nThis function uses a number of services. You will need to configure the function's deployment and generate keys for each of the services. The following instructions are intended to guide you on how to do this.\n\n#### Deployment: Dialog Analyzer Azure Function\n\nIn order for the bot to use your deployed function, you will need to configure it's application settings.\n\nTo begin, go to the `Azure portal` and sign in to your Azure account. In the search bar at the top of the portal, type the name of your function app and select it from the list. In the `Function Apps` panel, expand the function and select the `Manage` button. Within the Manage window, click on `Add new function key` button and define a key name and value for the function and click on the `Save` button. These will become your `DIALOG_ANALYZER_CLIENTID` and `DIALOG_ANALYZER_KEY` settings for your bot.\n\nFor more information, please refer to: https://docs.microsoft.com/en-us/azure/azure-functions/functions-how-to-use-azure-function-app-settings.\n\n#### Service: Computer Vision\n\nTo register a Computer Vision Cognitive Service for Image Analysis and OCR, go to https://portal.azure.com/#create/Microsoft.CognitiveServices/apitype/ComputerVision. After logging and going through the process of creating a Computer Vision Cognitive Service, go to the Application dashboard in the Azure Portal. Here you can click on `Keys` in the left pane or `Manage Keys` in the `Essentials` panel. Copy one of the keys shown and save it. Set the following in your App Settings of your function:\n\n- `COMPUTERVISION_SUB_KEY` is one of the access keys shown in the Azure Portal.\n- `COMPUTERVISION_APP_REGION` is region of the the URL shown under `Endpoint` in the `Essentials` panel. For example, if 'https://westus.api.cognitive.microsoft.com/vision/v1.0' is where your Computer Vision Cognitive Service is deployed, then the app region is `westus`.\n\n#### Service: Text Analytics\n\nTo register a Text Analytics Cognitive Service for Sentiment Analysis, go to https://ms.portal.azure.com/#create/Microsoft.CognitiveServices/apitype/TextAnalytics. After logging in and going through the process of creating a Text Analytics Cognitive Service, go to the Application dashboard in the Azure Portal. Here you can click on `Keys` in the left pane or `Manage Keys` in the `Essentials` panel. Copy one of the keys shown and save it. Set the following in your App Settings of your function:\n\n- `TEXTANALYTICS_SUB_KEY` is one of the access keys shown in the Azure Portal.\n- `TEXTANALYTICS_APP_REGION` is region of the the URL shown under `Endpoint` in the `Essentials` panel. For example, if 'https://westus.api.cognitive.microsoft.com/text/analytics/v2.0' is where your Text Analytics Cognitive Service is deployed, then the app region is `westus`.\n\n## Stack Overflow Bot Visual Studio Code Extension\n\nThis Visual Studio Code Extension is intended to be a companion piece to the Stack Overflow Bot. It allows you to quickly\ncall up the bot using a simple command.\n\n### Configuring the extension to use your own Bot.\n\nAfter you've deployed the Stack Overflow Bot and its companion function to your favorite hosting service, and registered a bot\nwith the Bot Framework portal (see https://dev.botframework.com/bots/new), go to your Bot's dashboard, and add a 'Direct Line' channel.\nThis channel allows the Bot Framework Web Chat control to communicate to your Bot's backend service. From there, Add a Site and give it a name.\nYou will be directed to a page that will allow you to generate and copy tokens. Click on 'Show' on one of the tokens, and copy it. You can come back to this dashboard to view it again if you lose it. From there, open up your Visual Studio Code User Settings (`⌘,` or `⊞,`), and create a new field `StackCode.directLineToken`, assigning the token you copied to this label. If done correctly, activating the Bot in Visual Studio Code will open a pane that will show you a Bot Framework WebChat control, where you can interact with the bot.\n\n### Installing dependencies\n\nRun `npm install`\n\n### Installing the extension\n\nA few options…\n\n* Option 1: Clone the package using git, then open it in code. Go to the Debug tab and run it in an extension host window.\n* Option 2: Clone the package using git, run `code --install-extension StackCode-0.1.1.vsix` in the directory. See the VS Code [docs](https://code.visualstudio.com/docs/editor/extension-gallery#_install-from-a-vsix) for more details.\n\n### Activating (running) the extension\n\n* Using the command palate (`⇧⌘P` or `⇧⊞P`), type out `Start Stack Overflow Bot`, or something close to it. The bot will appear in its\nown pane to the right.\n\n## License\n\nMIT. See LICENSE file."
  },
  {
    "path": "StackOverflow-Bot/StackBot/Dockerfile",
    "content": "FROM node:8-onbuild\nEXPOSE 3978\nRUN npm install\nCMD [\"npm\", \"run\", \"start\"]\n"
  },
  {
    "path": "StackOverflow-Bot/StackBot/StackBot.njsproj",
    "content": "﻿<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" ToolsVersion=\"4.0\">\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">14.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n    <Name>StackBot</Name>\n    <RootNamespace>StackBot</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>e7ce1022-2ff2-44e3-8057-d472019453ef</ProjectGuid>\n    <ProjectHome>.</ProjectHome>\n    <StartupFile>\n    </StartupFile>\n    <SearchPath>\n    </SearchPath>\n    <WorkingDirectory>\n    </WorkingDirectory>\n    <OutputPath>.</OutputPath>\n    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>\n    <ProjectTypeGuids>{3AF33F2E-1136-4D97-BBB7-1795711AC8B8};{349c5851-65df-11da-9384-00065b846f21};{9092AA53-FB77-4645-B42D-1CCCA6BD08BD}</ProjectTypeGuids>\n    <NodejsPort>1337</NodejsPort>\n    <StartWebBrowser>True</StartWebBrowser>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)' == 'Debug' \">\n    <DebugSymbols>true</DebugSymbols>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)' == 'Release' \">\n    <DebugSymbols>true</DebugSymbols>\n  </PropertyGroup>\n  <ItemGroup>\n    <Content Include=\"data\\jokes.json\" />\n    <Content Include=\"data\\luis.json\" />\n    <Content Include=\"data\\smalltalk.tsv\" />\n    <Content Include=\"Dockerfile\" />\n    <Content Include=\"package.json\" />\n    <Content Include=\"static\\index.html\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"dialogs\\brain.js\" />\n    <Compile Include=\"dialogs\\joke.js\" />\n    <Compile Include=\"dialogs\\keywordPrompt.js\" />\n    <Compile Include=\"dialogs\\languages.js\" />\n    <Compile Include=\"dialogs\\menu.js\" />\n    <Compile Include=\"dialogs\\screenshot.js\" />\n    <Compile Include=\"dialogs\\search.js\" />\n    <Compile Include=\"dialogs\\smalltalk.js\" />\n    <Compile Include=\"index.js\" />\n    <Compile Include=\"lib\\attachments.js\" />\n    <Compile Include=\"lib\\bingsearchclient.js\" />\n    <Compile Include=\"lib\\cognitiveservices.js\" />\n    <Compile Include=\"lib\\dialoganalyzerclient.js\" />\n    <Compile Include=\"lib\\qnaclient.js\" />\n    <Compile Include=\"lib\\sentimentanalyzerclient.js\" />\n    <Compile Include=\"lib\\smalltalk.js\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Folder Include=\"data\\\" />\n    <Folder Include=\"dialogs\\\" />\n    <Folder Include=\"lib\\\" />\n    <Folder Include=\"static\\\" />\n  </ItemGroup>\n  <!-- Do not delete the following Import Project.  While this appears to do nothing it is a marker for setting TypeScript properties before our import that depends on them. -->\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\TypeScript\\Microsoft.TypeScript.targets\" Condition=\"False\" />\n  <Import Project=\"$(VSToolsPath)\\Node.js Tools\\Microsoft.NodejsTools.targets\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>False</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>0</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost:48022/</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>True</UseCustomServer>\n          <CustomServerUrl>http://localhost:1337</CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\" User=\"\">\n        <WebProjectProperties>\n          <StartPageUrl>\n          </StartPageUrl>\n          <StartAction>CurrentPage</StartAction>\n          <AspNetDebugging>True</AspNetDebugging>\n          <SilverlightDebugging>False</SilverlightDebugging>\n          <NativeDebugging>False</NativeDebugging>\n          <SQLDebugging>False</SQLDebugging>\n          <ExternalProgram>\n          </ExternalProgram>\n          <StartExternalURL>\n          </StartExternalURL>\n          <StartCmdLineArguments>\n          </StartCmdLineArguments>\n          <StartWorkingDirectory>\n          </StartWorkingDirectory>\n          <EnableENC>False</EnableENC>\n          <AlwaysStartWebServerOnDebug>False</AlwaysStartWebServerOnDebug>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n</Project>"
  },
  {
    "path": "StackOverflow-Bot/StackBot/data/jokes.json",
    "content": "{\n    \"items\": [\n        {\n            \"body_markdown\": \"Not a joke, but a cartoon:\\r\\n\\r\\n![enter image description here][1]\\r\\n\\r\\nFrom: [Jeffrey Palm][2]\\r\\n\\r\\n\\r\\n  [1]: http://i.stack.imgur.com/NbygN.jpg\\r\\n  [2]: http://jeffpalm.com/blog/\",\n            \"link\": \"https://stackoverflow.com/questions/234075/what-is-your-best-programmer-joke/958411#958411\",\n            \"body\": \"<p>Not a joke, but a cartoon:</p>\\n\\n<p><img src=\\\"https://i.stack.imgur.com/NbygN.jpg\\\" alt=\\\"enter image description here\\\"></p>\\n\\n<p>From: <a href=\\\"http://jeffpalm.com/blog/\\\" rel=\\\"nofollow noreferrer\\\">Jeffrey Palm</a></p>\\n\"\n        },\n        {\n            \"body_markdown\": \"![It&#39;s not a bug...][1]\\r\\n\\r\\n\\r\\n  [1]: https://crossthebreeze.files.wordpress.com/2007/08/feature.jpg\",\n            \"link\": \"https://stackoverflow.com/questions/234075/what-is-your-best-programmer-joke/234170#234170\",\n            \"body\": \"<p><img src=\\\"https://crossthebreeze.files.wordpress.com/2007/08/feature.jpg\\\" alt=\\\"It&#39;s not a bug...\\\"></p>\\n\"\n        },\n        {\n            \"body_markdown\": \"A SQL query goes into a bar, walks up to two tables and asks, &quot;Can I join you?&quot;\",\n            \"link\": \"https://stackoverflow.com/questions/234075/what-is-your-best-programmer-joke/234399#234399\",\n            \"body\": \"<p>A SQL query goes into a bar, walks up to two tables and asks, \\\"Can I join you?\\\"</p>\\n\"\n        },\n        {\n            \"body_markdown\": \"I&#39;d like to make the world a better place, but they won&#39;t give me the source code.\",\n            \"link\": \"https://stackoverflow.com/questions/234075/what-is-your-best-programmer-joke/295277#295277\",\n            \"body\": \"<p>I'd like to make the world a better place, but they won't give me the source code.</p>\\n\"\n        },\n        {\n            \"body_markdown\": \"Two bytes meet.  The first byte asks, “Are you ill?” \\r\\n\\r\\nThe second byte replies, “No, just feeling a bit off.”\",\n            \"link\": \"https://stackoverflow.com/questions/234075/what-is-your-best-programmer-joke/234092#234092\",\n            \"body\": \"<p>Two bytes meet.  The first byte asks, “Are you ill?” </p>\\n\\n<p>The second byte replies, “No, just feeling a bit off.”</p>\\n\"\n        }\n    ]\n}"
  },
  {
    "path": "StackOverflow-Bot/StackBot/data/luis.json",
    "content": "{\n  \"luis_schema_version\": \"2.1.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"Stackoverflow\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"intents\": [\n    {\n      \"name\": \"Brain\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"Joke\"\n    },\n    {\n      \"name\": \"Languages\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"Search\"\n    },\n    {\n      \"name\": \"SmallTalk\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"keywords\"\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"bing_entities\": [],\n  \"actions\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"hello\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hi\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who are you\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how old are you\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who are you?\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"marry me\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're awesome\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are good\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how did you do that\",\n      \"intent\": \"Brain\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when is your birthday\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hey\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're cute\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me a joke\",\n      \"intent\": \"Joke\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where are you from\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help me\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me something funny\",\n      \"intent\": \"Joke\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how old are you?\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you a robot\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"menu\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where do you work\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where were you born\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when were you born\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are awesome\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are a genius\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so smart\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are cool\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you hungry\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do something\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can you do\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are very cool\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"make me laugh\",\n      \"intent\": \"Joke\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me about yourself\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"joke\",\n      \"intent\": \"Joke\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are very intelligent\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what are you\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are boring\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what are your abilities\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"smart\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you working\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"h\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me about you\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like you\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \":(\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is your owner\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you nuts\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you my friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"brilliant\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are beautiful\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you insane\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you a bot\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are very helpful\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are very pretty\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you rock\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell a joke\",\n      \"intent\": \"Joke\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are amazing\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are funny\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you mad\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is your master\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are the best\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how was your day\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"your age\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"javascript\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 0,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"you are pretty\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are wonderful\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"main menu\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thanx\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so awesome\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so intelligent\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"introduce yourself\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who do you work for\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you crazy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are clever\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"describe yourself\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so cute\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you happy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you a chatbot\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are mad\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"why are you here\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so clever\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're pretty\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do you work\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to search\",\n      \"intent\": \"Search\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's your age\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are very smart\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're great\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are cute\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are very cute\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are very clever\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are my best friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell joke\",\n      \"intent\": \"Joke\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you look cool\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so cool\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so amazing\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are a good friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what languages do you speak\",\n      \"intent\": \"Languages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're intelligent\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is your boss\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are very kind\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"clever\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are hilarious\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will you be my friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so handsome\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you look great today\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"let's be friends\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're so funny\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so funny\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"that was funny\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you busy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"im stuck\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are my friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is your office\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me your age\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"languages\",\n      \"intent\": \"Languages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are crazy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are insane\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are a bot\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is your work\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are really smart\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you a program\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"about yourself\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to know more about you\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what languages can you speak\",\n      \"intent\": \"Languages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is your office located\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"language\",\n      \"intent\": \"Languages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are very beautiful\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are dismissed\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where do you come from\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you be my friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are very boring\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're annoying\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are intelligent\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you made my day\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so helpful\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's your birthday\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where did you come from\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"talk about yourself\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where you work\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you look so beautiful\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you be my best friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want a laugh\",\n      \"intent\": \"Joke\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so good\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you make me laugh?\",\n      \"intent\": \"Joke\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"say about you\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who is the boss\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're really boring\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to marry you\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're really smart\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to be your friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are happy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are really pretty\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so pretty\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so beautiful\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you look amazing\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are gorgeous\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want you to be my friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"be my friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"we are best friends\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"give me joke\",\n      \"intent\": \"Joke\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"would you like to marry me\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are too good\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're perfect\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are very useful\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're clever\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're very smart\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're so kind\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are really good\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are really annoying\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"we are friends\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are we friends\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"im bored\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you make me laugh\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are busy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is your country\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"anything funny?\",\n      \"intent\": \"Joke\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is your office location\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you working now\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are a weirdo\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are too smart\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are really nice\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are irritating\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you look great\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"got any jokes\",\n      \"intent\": \"Joke\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're pretty smart\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are handsome\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do you want to eat\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when do you celebrate your birthday\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to know you better\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"talk some stuff about yourself\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me some stuff about you\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell me about your personality\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is your personality\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"define yourself\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"from where are you\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you happy today\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"your birth date\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are chatbot\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are hungry\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're a robot\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are very funny\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what's your homeland\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you from far aways\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where have you been born\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"were you born here\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"would you like to be my friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do you want to be my best friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will you be my best friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do you want to be my friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are my only friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are my good friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you my best friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are we best friends\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are we still friends\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you and me are friends\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're my childhood friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're my dear friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are my bestie\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i am your friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"we are the best friends ever\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to have a friend like you\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're really hungry\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you might be hungry\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're very hungry\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're so hungry\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"would you like to eat something\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"when do you have birthday\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"date of your birthday\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"all about you\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you annoy me\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how annoying you are\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i find you annoying\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're incredibly annoying\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are annoying me so much\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are boring me\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're incredibly boring\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how boring you are\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're so boring\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i should be your boss\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who do you think is your boss\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're a busy person\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you seem to be very busy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you seem to be busy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you still working\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"have you been busy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're very busy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you still working on it\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how busy you are\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you so busy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you very busy right now\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you very busy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"have you got much to do\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do you have a lot of things to do\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you just a bot\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're the funniest\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're incredibly funny\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how funny you are\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're really funny\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're a very funny bot\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're the funniest bot i've talked to\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are really funny\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you make me laugh a lot\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm firing you\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm about to fire you\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i will make you unemployed\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are unemployed from now on\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i will fire you\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you should be fired\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"it's time to fire you\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you must get fired\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to fire you\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"now you're fired\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"we're not working together anymore\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you don't work for me anymore\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i fire you\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are fired\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are really amazing\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"let's tell everyone that you are awesome\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd like to tell everyone that you are awesome\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to tell everyone how awesome you are\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are very lovely\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you almost sound human\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you make my day\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are the nicest person in the world\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are the best in the world\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are the best ever\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so lovely\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so fine\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're just super\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you work very well\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are a professional\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are a pro\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are very good at it\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are good at it\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you work well\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're a true professional\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you happy with me\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you happy now\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're full of happiness\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're extremely happy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how happy you are\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're so happy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're really happy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're very happy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can we be friends\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"why are you so smart\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you do anything\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"marry me please\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so beautiful to me\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can we be best friends\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are my wife\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you mad at me\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"be my best friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how old is your platform\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you 21 years old\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd like to know your age\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"age of yours\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i want you to answer me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"answer\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"answer my question\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"answer me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"give me an answer\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"answer the question\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"can you answer my question\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"tell me the answer\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"answer it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"give me the answer\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i have a question\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i want you to answer my question\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"just answer the question\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"can you answer me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"answers\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"can you answer a question for me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"can you answer\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"answering questions\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i want the answer now\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"just answer my question\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're not helping me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're very bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're really bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are useless\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are horrible\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are a waste of time\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are disgusting\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are lame\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are no good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're awful\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are not cool\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are not good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are so bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are so useless\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are terrible\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are totally useless\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are very bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are waste\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're a bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're not a good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're not very good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're terrible\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're the worst\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're the worst ever\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're worthless\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"can you get smarter\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"study\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you should study better\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you must learn\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"be clever\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"be more clever\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"be smarter\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"be smart\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"get qualified\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're attractive\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're looking good today\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you look so good\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're so gorgeous\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so brainy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"this is awesome\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"this is good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"this is great\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're really brainy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"very nice\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you know a lot\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"very then\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"discard\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like you so much\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you know a lot of things\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"forget this\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"wonderful\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"haha\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you have a lot of knowledge\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"just forget about it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm glad to hear that\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"haha funny\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you know so much\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ok good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"forget about that\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how smart you are\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"haha haha haha\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yeah i like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i said cancel\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good for you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"haha that's funny\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i am back\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're special\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"just cancel it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how brainy you are\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good to know\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes i like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"haha very funny\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm here again\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"your homeland is\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"nothing cancel\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how clever you are\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"glad to hear it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"here i am again\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"okay i like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hahaha\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you ready\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"just stop it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hahaha funny\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"so good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are special to me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i got back\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how brilliant you are\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you ready right now\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are very special\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hahaha very funny\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i came back\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"so sweet of you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no cancel cancel\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you ready today\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are so sweet\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"he\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i have returned\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it was good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no just cancel\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you ready now\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hehe\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you know i like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that was boring\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"oh well\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you ready tonight\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's why i like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"cancel my request\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are qualified\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm bored\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hehehe\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"were you ready\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like you baby\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"can you cancel that\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good thing\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"lmao\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"bored\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are very special to me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that was good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"cancel all that\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"wow\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"have you been ready\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"afternoon\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i just like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"boring\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"apparently not\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hello hi\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hey i like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's awesome\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no do not\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that was bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"wow wow\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are real\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i am getting bored\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"okay good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no just no\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thank you i like you too\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"wow wow wow\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"cancel this request\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are not fake\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"heya\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that was horrible\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no but thank you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i do like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"this is boring\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no cancel this\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are special for me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no it's okay\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"wooow\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are too beautiful\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how is your morning so far\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's lame\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no need thanks\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you real\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no i like you the way you are\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no cancel everything\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's not good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no thank you though\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"very boring\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's fine\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how are you getting on\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no stop\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like you already\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"woah\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are so real\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's terrible\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no thank you very much\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no worries\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"well you are special\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"just forget\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how's your day going\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it bores me\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no probs\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"but i really like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i think you are real\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"okay see you later\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's too bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no thanks not right now\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like you more\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how are you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yup\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm overloaded\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you look so well\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"is everything all right\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"this is not good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no forget\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ya\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i don't think you're fake\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's what i like about you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i want to cancel\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"too bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"oh yes\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are so special\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no problem\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"wait a second\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"very bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes sure\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like the way you look now\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"could you wait\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how are you doing\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"bad girl\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"wait please\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i think you're beautiful\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"obviously\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's not good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how are the things going\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hope to see you later\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not so good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"nevermind forget about it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hold on\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"k\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i have no time\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i suppose you're real\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's very bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you alright\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"why are you so beautiful\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"wait\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"bye for now\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hi i like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's too bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you okay\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no just cancel it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm busy\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"there's no problem\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"oh wait\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"sure why not\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"glad you're real\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's not good enough\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"till next time\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i really really like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"wait hold on\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"nothing just forget it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how are you feeling\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"well too bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yeah right\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i must go\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"don't rush\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm swamped\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're very special\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you a real person\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"sure no problem\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"bad very bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how are you going\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i said cancel it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"wanna hug\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"bye\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no problem about that\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like you as a friend\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i got things to do\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you a real human\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yeah of course\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"cancel the whole thing\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hug you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's so bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"is everything okay\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"goodbye\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"can you cancel it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are a real person\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"absolutely\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"do you want a hug\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"don't worry\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"really bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how are you today\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"so cancel\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how busy i am\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"may i hug you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes indeed\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how do you do\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's really bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"see you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"could you give me a hug\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ok sure\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's because you are special\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how do you feel\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are not real\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"bad idea\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ok yes\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i said forget it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are looking awesome\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i want a hug\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"don't worry there's no problem\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i said i like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i got work to do\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how have you been\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that is bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes correct\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"see you soon\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how is it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hug\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"where do you live\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you look amazing today\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm working\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you helped a lot thank you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that was not good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're so special\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"cancel all this\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ok thank you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"bye-bye\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hug me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"in which city do you live\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how is it going\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i don't have time for this\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's not so good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"appreciate your help\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are looking beautiful today\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"sure thing\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good bye\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hugged\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good i like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how is your day\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"forget it nevermind\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"your residence\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not a good one\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ye\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm insomnious\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are looking great\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"cheers\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how is your day going\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you hugged\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes you are special\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"oh that's not good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"your house\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thank you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"confirm\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"bye bye see you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"stop it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm sleepless\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hugging\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how is your evening\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yep\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are looking pretty\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not too good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"your home\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"bye bye see you soon\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like your smile\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how was your day\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"looks good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i can't get any sleep\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're a genius\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i want to cancel it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thanks\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are looking so beautiful\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hugging me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"your hometown\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like you as you are\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"so lame\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"bye bye take care\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you having a good day\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i can't sleep\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes thank you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i would like to cancel\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thanks a lot\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're a smart cookie\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm starting to like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"now cancel\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i said bye\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what is your hometown\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i can't fall asleep\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"terrific thank you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"is it your hometown\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're awesome i like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to let everyone know that you are awesome\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"never mind bye\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"cancel now\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i can't get to sleep\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"great thank you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are looking so good\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hope your day is going well\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hugged me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"where is your hometown\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i also like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"definitely\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"now bye\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's really bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"sorry cancel\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i can't get no sleep\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're qualified\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thanks so much\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hope you re having a pleasant evening\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"tell me about your city\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes right\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"but i like u\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it is too bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's all goodbye\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm insomniac\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"want a hug\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"cancel that one\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes i would like to\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how's life\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thank you so much\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"of course i like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what is your city\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"bad really bad\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's it goodbye\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"a hug\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"skip skip skip\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"bad time for talking\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are really beautiful\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"alrighty\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm fine and you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what is your residence\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i don't care\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thanks for your help\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are really cute\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"so cool\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"leave me alone\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i don't want to talk\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"cancel it cancel it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like you too you're one of my favorite people to chat with\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes definitely\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how is your life\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"go to bed\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what is your town\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thank you for your help\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"let's not talk\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"cool\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yeh\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how has your day been\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so attractive\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"cancel that cancel that\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"but i like you so much\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"goodbye for now\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i shouldn't care about this\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how is your morning going\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so beautiful today\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that is good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"nice thank you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes it is correct\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm not talking to you anymore\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what's your city\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"really like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"whatever\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're nuts\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"do nothing\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how has your day been going\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"talk to you later\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"glad to hear that\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i appreciate it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what's your home\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're funny i like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yeah that's right\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i said cancel cancel\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i do not care\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how about you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i don't want to talk to you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you can go now\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"where is your home\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's very nice of you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ok you can\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i don't care at all\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"terrific\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i thank you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how is your day being\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"but can you cancel it\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yap\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not caring\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i kinda like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's amazing\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not care at all\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how is your day going on\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes you may\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's awesome\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"don't care at all\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"perfect\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how your day is going\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"confirmed\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what was your day like\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"excellent\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not caring at all\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"get lost\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"of course why not\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"let's stop talking for a minute\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what about your day\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how about no\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thank you that will be all\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's great\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"where is your residence\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"excuse me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're so special to me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes that's fine\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"goodbye see you later\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how's your day\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are so gorgeous\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"affirmative\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"apologise\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"don t have a sense\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm not in the mood for chatting\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"where's your home\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thanks buddy\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're very special to me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"alright bye\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're out of your mind\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i apologize\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how are you doing this morning\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's great\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yeah go ahead\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i am excited\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thanks love\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"sorry\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're so crazy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yeah i'm sure\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how is your day going\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"fine\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are very attractive\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm sorry\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"where's your hometown\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like that about you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"see ya\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thank you my friend\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how crazy you are\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"okay sounds good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"nice to meet you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm really excited\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i am so sorry\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"don't\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thanks bye bye\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"well thanks\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"where's your house\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i don't want that\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're so out of your mind\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"but i like you just the way you are\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how excited i am\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"okay that's fine\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it was nice meeting you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"my apologies\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"nice\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"where you live\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"okay bye\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yeah exactly\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"okay i like you too\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it was very nice to meet you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"apologies\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm thrilled\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's fine\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"very good thank you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you went crazy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that is ok\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i disagree\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you look awesome\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"okay thank you bye\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like you you're cool\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"your city\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"apologies to me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good to know each other\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"very good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good thanks\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm excited about working with you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i think you're crazy\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"this is correct\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you look fantastic\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"amazing\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"apology\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"see you tomorrow\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"glad to meet you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"your town\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you look gorgeous\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ok go ahead\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thanks again\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's true\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"excuse\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm excited to start our friendship\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"disagree\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like you very\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"fantastic\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"nice meeting you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are right\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ok bye\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you look perfect\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thank you again\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i don't want\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"great\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes this is correct\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i beg your pardon\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"let's go to bed\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"nice to meet you too\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like you you're nice\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good evening\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you look pretty good\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good very good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're definitely right\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not interested\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"pardon\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"nevermind its okay\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"pleased to meet you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"all thank you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'd like to go to bed\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's very good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"sorry i like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i don't think so\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you look so beautiful today\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good evening to you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"okey\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i said sorry\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're not wrong\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"alright thank you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"is it time for bed yet\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"really good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"pleasure to meet you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thanks i like you too\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hey good evening\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no way\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're telling the truth\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you look very pretty\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i am really sorry\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes for sure\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hello good evening\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no it isn't\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it is fine\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are really special\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what you say is true\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you look wonderful\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"pleasure to meet you too\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"alright thanks\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"forgive me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"evening\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's time to go to bed\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"all right\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no i don't\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it is good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you mad or what\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are so special to me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good evening there\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"true\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i like the way you look\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's nice to see you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you sure\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm not\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"sorry about that\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"lovely to see you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it is true\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's perfect\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"time for us to go to bed\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you look wonderful today\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"cuz i like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good morning\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no thank you that's all\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you sure right now\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"sorry about this\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"much better\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"na\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm glad to see you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you are cutie\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's right\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like you now\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good morning to you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you sure today\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm going to bed\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"really sorry\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"great to see you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"perfect thank you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like you so\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's the truth\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hello good morning\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you're looking good\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you sure now\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no that's fine thank you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"very sorry\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"so nice of you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not too bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's true\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm a little tired and i want to go to bed\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's good to see you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like you too much\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"have a nice morning\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you sure tonight\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ok sorry\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i really do like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that is correct\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's very good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"well thank you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"glad to see you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"never\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's bed time\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"have a great morning\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"why aren't you talking to me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i want to say sorry\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i really really really really like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how good it is to see you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"marvelous\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that is right\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"morning\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"do you want to chat with me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thnx\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"going to bed now\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"alright i'm sorry\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"always a pleasure to see you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i said no\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like you just the way you are\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"will you talk to me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's nice\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good morning there\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"nice to see you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"okay i'm sorry\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that is true\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i am lonely\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"of course not\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i am good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"pleasant\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's my pleasure\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what exactly do you mean\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"top of the morning to you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good to see you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm very lonely\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"talk to me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm doing just great\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that is very true\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"nah\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"my pleasure\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm so lonely\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"pretty good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"anytime\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no tanks\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what do you mean\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you going to talk to me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"a good morning\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's so true\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm really lonely\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"great to see you again\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm doing fine\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"really nice\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you talking to me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are correct\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i am feeling lonely\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hi good morning\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"is that what you mean\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"great to see you too\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"splendid\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no never\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"welcome\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"can you chat with me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"straight\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what do you mean exactly\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i am glad to see you again\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are so right\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"and a good morning to you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i feel lonely\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're welcome\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"can you speak with me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"super\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm doing good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"nice to see you again\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're absolutely right\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no need\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"glad to see you too\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"but what do you mean\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"can you talk to me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"super fantastic\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"sure welcome\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm great thanks\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what do i look like\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good morning too\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no thanks\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good to see you again\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that was wrong\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"sweet\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's not what i asked\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's good to see you too\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"can you talk with me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's wrong\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"really well\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's been so nice to talk to you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"say\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"very well\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're right about that\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's been a pleasure talking to you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"welcome here\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"wrong\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"sweet dreams\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"talk\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that is awesome\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how do i look\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i am happy\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"nice to talk to you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no sorry\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it is not right\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"chat with me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that is nice\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's nice to talk to you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i know that's right\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you're so welcome\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's not right\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"just chat with me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"nice talking to you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"do not\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good night\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"do i look good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's wrong\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"anything you want\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that is wonderful\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"speak to me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's correct\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it is nice talking to you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not today\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that is incorrect\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good job\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"have a good night\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm happy to see you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"do you know what i look like\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"speak with me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that was amazing\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"incorrect\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's fine\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"how nice it is to talk to you\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no it's not\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good night to you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"happy\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"can you see what i look like\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"go ahead\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"great job\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thank you good night\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"if you're happy then i'm happy\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"sounds good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what do you think i look like\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"absolutely not\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"way to go\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"okay\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i love you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"talk with me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"well done\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\" bye good night\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm happy for you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not that\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what is on your mind\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not correct\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that was awesome\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"why don't you talk to me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"love you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good night bye\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are wrong\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm happy to help\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what's happened\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that was cute\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"nice work\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"nooo\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ok\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i adore you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"bye good night\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you can talk to me\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not right\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm happy to see you\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what is up\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"great work\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that was pretty good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"nope\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you there\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what's up\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good good night\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"huh\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that was very good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"amazing work\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are there\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i don't want to\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"whazzup\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it is my birthday\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i am in love with you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"okie dokie\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"lol\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's a good idea\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you near me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good night for now\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good what's up\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm celebrating my birthday today\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you here\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"xd\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"sure\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"bravo\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no i would not\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i love you so much\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i said what's up\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's a good thing\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"goodnight\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ha ha\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you still there\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"today is my birthday\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"go for it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i love you too\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"then what's up\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good work\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's amazing\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"let 's not\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are here\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ahahah\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yeah\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"night\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what's shaking\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"cancel\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's awesome thank you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's my birthday today\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i think i love you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ahah lol\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you still there\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not needed\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"wassup\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i was born today\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"abort\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"laughing out loud\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"loving you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yea\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's better\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thanks goodnight\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"are you still here\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what is going on\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"lmao\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's my b-day\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"annul\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's cute\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"do it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what is happening\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not this time\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"let's get married\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"pretty bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's funny\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you know i love you\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good night see you tomorrow\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not good enough\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's fantastic\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"of course\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"cancel it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i am here\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what's cracking\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ah\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no don't do that\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i miss you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that was lame\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"cancel request\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's much better\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i guess\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what's cooking\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ah ah ah\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that was terrible\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"thanks but no thanks\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"here i am\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"alright goodnight\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"cancelled\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hey what's up\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"missing you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's nice of you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ahah\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it is bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"correct\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no that's wrong\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what's up today\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm right here\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"dismiss\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's not bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"good tonight\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm being mad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not this\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"miss you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm already here\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yeah sure\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"dismissed\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"this is bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ahaha\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's perfect\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"okay have a good night\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm enraged\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"definitely not\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"can you tell if i'm here or not\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ahahaha\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's pretty good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm angry\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm afraid it's bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's really good\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ha\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm furious\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no it's bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's really nice\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i am angry with you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that was awful\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ha ha ha\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's sweet of you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i am mad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"why not\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"have a good night\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"already miss you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"ha ha ha ha\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i am joking\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"disregard\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's very nice\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"please do\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i am mad at you\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"so bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not at this time\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i love you marry me\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hah\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"long time no see\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"disregard that\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i miss you much\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm kidding\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"sure is\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that's wonderful\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"this is too bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not exactly\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hello\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"terrible\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm just being funny\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"skip\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i missed you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no don't\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i agree\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hi\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"horrible\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it was a joke\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"horrific\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i don't mind\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i've missed you\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"skip it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not really no\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"howdy\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"abysmal\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i was just joking\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"cancel everything\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"certainly\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what should i do about it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's bad\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"we should marry\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hey there\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no thank you not right now\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"cancel all\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hey\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"exactly\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"actually no\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"it's a joke\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"any suggestions\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"greetings\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no leave it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes i agree\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"forget about it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"what do you recommend\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"joking\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"forget\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i greet you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"sorry no\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"give me a wise advice\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i think so\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"don't do that\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"just kidding\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"be my husband\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hi there\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i need advice\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"stop\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes it is\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no incorrect\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"kidding\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hello there\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"any advice\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"just forget it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i'm just playing with you\\\"\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"nope sorry\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you working today\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"right\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"do you have any advice for me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"lovely day isn't it\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like you the way you are\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"okay then\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i say no\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"forget that\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"advise me\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"hello again\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes of course\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not really\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"just going to say hi\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like you a lot\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"yes i do\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"not right now thanks\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i think i like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"a good day\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"that s okay\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i think no\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i liked you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i do\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"like you a lot\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"absolutely no\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"you are special\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"no actually\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like you too\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i really like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"but i like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like u\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"just like you\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"\\\"i like you very much\\\",\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"would you be my friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"could you be my friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"want to be my friend\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where is your work\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"your office location\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"got any developer jokes\",\n      \"intent\": \"Joke\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"got any dev jokes\",\n      \"intent\": \"Joke\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do you have a good joke\",\n      \"intent\": \"Joke\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell a jok\",\n      \"intent\": \"Joke\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you list what you can do\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can you speak\",\n      \"intent\": \"Languages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you a developer\",\n      \"intent\": \"Languages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you program?\",\n      \"intent\": \"Languages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can you write in\",\n      \"intent\": \"Languages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"are you bilingual\",\n      \"intent\": \"Languages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you speak any languages\",\n      \"intent\": \"Languages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to know about c# and how to make a list\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 21,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 42,\n          \"endPos\": 45\n        }\n      ]\n    },\n    {\n      \"text\": \"i want to know more about javascript data types\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 26,\n          \"endPos\": 35\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 37,\n          \"endPos\": 46\n        }\n      ]\n    },\n    {\n      \"text\": \"search for javascript arrays\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 11,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"how can i make a javascript array\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 17,\n          \"endPos\": 26\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 28,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"how do i delete a git branch both locally and remotely?\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 9,\n          \"endPos\": 14\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 18,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 34,\n          \"endPos\": 40\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 46,\n          \"endPos\": 53\n        }\n      ]\n    },\n    {\n      \"text\": \"what is the correct json content type?\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 12,\n          \"endPos\": 18\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 20,\n          \"endPos\": 23\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 25,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"what does the “yield” keyword do?\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 15,\n          \"endPos\": 19\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 22,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"how to check whether a string contains a substring in javascript?\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 23,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 41,\n          \"endPos\": 49\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 54,\n          \"endPos\": 63\n        }\n      ]\n    },\n    {\n      \"text\": \"how do i check if an element is hidden in jquery?\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 21,\n          \"endPos\": 27\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 32,\n          \"endPos\": 37\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 42,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"var functionname = function() {} vs function functionname() {}\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 0,\n          \"endPos\": 61\n        }\n      ]\n    },\n    {\n      \"text\": \"bubble search java\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 0,\n          \"endPos\": 12\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 14,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"how can i make an array in c++\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 27,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"how do i make a bubble search in java\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 16,\n          \"endPos\": 28\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 33,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"bubble search\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 0,\n          \"endPos\": 5\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"help me search stack overflow\",\n      \"intent\": \"Search\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"javascript arrays\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 0,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 11,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"how do i make an array in javascript\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 17,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 26,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"how can i debug in javascript\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 19,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"how can i make an array in javascript\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 27,\n          \"endPos\": 36\n        }\n      ]\n    },\n    {\n      \"text\": \"how do i make an array in typescript\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 17,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 26,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"search for javascript array\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 11,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 22,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"search for azure functions js\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 17,\n          \"endPos\": 25\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 27,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"how to use azure functions\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 17,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"azure functions\",\n      \"intent\": \"SmallTalk\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 0,\n          \"endPos\": 4\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 6,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"search for c++ arrays\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 11,\n          \"endPos\": 13\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 15,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"javascript array\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 0,\n          \"endPos\": 9\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 11,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"do you speak any languages\",\n      \"intent\": \"Languages\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how can i make an azure function using javascript\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 39,\n          \"endPos\": 48\n        }\n      ]\n    },\n    {\n      \"text\": \"javascrip\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 0,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"how do i make an array in js\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 17,\n          \"endPos\": 21\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 26,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"how can i make an array in js\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 27,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"search array\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 7,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"search for javascript and azure\",\n      \"intent\": \"Search\",\n      \"entities\": [\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 11,\n          \"endPos\": 20\n        },\n        {\n          \"entity\": \"keywords\",\n          \"startPos\": 22,\n          \"endPos\": 30\n        }\n      ]\n    },\n    {\n      \"text\": \"what is powering you\",\n      \"intent\": \"Brain\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is in your brain\",\n      \"intent\": \"Brain\",\n      \"entities\": []\n    }\n  ]\n}"
  },
  {
    "path": "StackOverflow-Bot/StackBot/data/smalltalk.tsv",
    "content": "﻿Question\tAnswer\tSource\nwho are you?\tsmalltalk.agent.acquaintance\tsmalltalkkb.tsv\nall about you\tsmalltalk.agent.acquaintance\tsmalltalkkb.tsv\nwhat is your personality\tsmalltalk.agent.acquaintance\tsmalltalkkb.tsv\ndefine yourself\tsmalltalk.agent.acquaintance\tsmalltalkkb.tsv\nwhat are you\tsmalltalk.agent.acquaintance\tsmalltalkkb.tsv\nsay about you\tsmalltalk.agent.acquaintance\tsmalltalkkb.tsv\nintroduce yourself\tsmalltalk.agent.acquaintance\tsmalltalkkb.tsv\ndescribe yourself\tsmalltalk.agent.acquaintance\tsmalltalkkb.tsv\nabout yourself\tsmalltalk.agent.acquaintance\tsmalltalkkb.tsv\ntell me about you\tsmalltalk.agent.acquaintance\tsmalltalkkb.tsv\ntell me about yourself\tsmalltalk.agent.acquaintance\tsmalltalkkb.tsv\nI want to know more about you\tsmalltalk.agent.acquaintance\tsmalltalkkb.tsv\nI want to know you better\tsmalltalk.agent.acquaintance\tsmalltalkkb.tsv\ntalk some stuff about yourself\tsmalltalk.agent.acquaintance\tsmalltalkkb.tsv\ntell me some stuff about you\tsmalltalk.agent.acquaintance\tsmalltalkkb.tsv\ntalk about yourself\tsmalltalk.agent.acquaintance\tsmalltalkkb.tsv\nwhy are you here\tsmalltalk.agent.acquaintance\tsmalltalkkb.tsv\ntell me about your personality\tsmalltalk.agent.acquaintance\tsmalltalkkb.tsv\nwho are you\tsmalltalk.agent.acquaintance\tsmalltalkkb.tsv\nhow old are you?\tsmalltalk.agent.age\tsmalltalkkb.tsv\nhow old is your platform\tsmalltalk.agent.age\tsmalltalkkb.tsv\nare you 21 years old\tsmalltalk.agent.age\tsmalltalkkb.tsv\ni'd like to know your age\tsmalltalk.agent.age\tsmalltalkkb.tsv\nage of yours\tsmalltalk.agent.age\tsmalltalkkb.tsv\nyour age\tsmalltalk.agent.age\tsmalltalkkb.tsv\nwhat's your age\tsmalltalk.agent.age\tsmalltalkkb.tsv\ntell me your age\tsmalltalk.agent.age\tsmalltalkkb.tsv\nhow old are you\tsmalltalk.agent.age\tsmalltalkkb.tsv\nyou're annoying\tsmalltalk.agent.annoying\tsmalltalkkb.tsv\nyou are really annoying\tsmalltalk.agent.annoying\tsmalltalkkb.tsv\nyou are irritating\tsmalltalk.agent.annoying\tsmalltalkkb.tsv\nyou annoy me\tsmalltalk.agent.annoying\tsmalltalkkb.tsv\nhow annoying you are\tsmalltalk.agent.annoying\tsmalltalkkb.tsv\nI find you annoying\tsmalltalk.agent.annoying\tsmalltalkkb.tsv\nyou're incredibly annoying\tsmalltalk.agent.annoying\tsmalltalkkb.tsv\nyou are annoying me so much\tsmalltalk.agent.annoying\tsmalltalkkb.tsv\n\"\"\"I want you to answer me\"\",\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"answer\"\",\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"answer my question\"\",\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"answer me\"\",\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"give me an answer\"\",\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"answer the question\"\",\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"can you answer my question\"\",\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"tell me the answer\"\",\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"answer it\"\",\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"give me the answer\"\",\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"I have a question\"\",\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"I want you to answer my question\"\",\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"just answer the question\"\",\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"can you answer me\"\",\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"answers\"\",\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"can you answer a question for me\"\",\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"can you answer\"\",\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"answering questions\"\",\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"I want the answer now\"\",\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"just answer my question\"\"\"\tsmalltalk.agent.answer_my_question\tsmalltalkkb.tsv\n\"\"\"you're not helping me\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you are bad\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you're very bad\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you're really bad\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you are useless\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you are horrible\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you are a waste of time\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you are disgusting\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you are lame\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you are no good\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you're bad\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you're awful\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you are not cool\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you are not good\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you are so bad\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you are so useless\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you are terrible\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you are totally useless\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you are very bad\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you are waste\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you're a bad\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you're not a good\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you're not very good\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you're terrible\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you're the worst\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you're the worst ever\"\",\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"you're worthless\"\"\"\tsmalltalk.agent.bad\tsmalltalkkb.tsv\n\"\"\"can you get smarter\"\",\"\tsmalltalk.agent.be_clever\tsmalltalkkb.tsv\n\"\"\"study\"\",\"\tsmalltalk.agent.be_clever\tsmalltalkkb.tsv\n\"\"\"you should study better\"\",\"\tsmalltalk.agent.be_clever\tsmalltalkkb.tsv\n\"\"\"you must learn\"\",\"\tsmalltalk.agent.be_clever\tsmalltalkkb.tsv\n\"\"\"be clever\"\",\"\tsmalltalk.agent.be_clever\tsmalltalkkb.tsv\n\"\"\"be more clever\"\",\"\tsmalltalk.agent.be_clever\tsmalltalkkb.tsv\n\"\"\"be smarter\"\",\"\tsmalltalk.agent.be_clever\tsmalltalkkb.tsv\n\"\"\"be smart\"\",\"\tsmalltalk.agent.be_clever\tsmalltalkkb.tsv\n\"\"\"get qualified\"\"\"\tsmalltalk.agent.be_clever\tsmalltalkkb.tsv\nyou're cute\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou're attractive\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are beautiful\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou're looking good today\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are so beautiful\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou look amazing\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou look so good\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou're so gorgeous\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are too beautiful\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou look great\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou look so well\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nI like the way you look now\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nI think you're beautiful\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nwhy are you so beautiful\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are so beautiful to me\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are cute\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are gorgeous\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are handsome\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are looking awesome\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou look amazing today\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are looking beautiful today\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are looking great\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are looking pretty\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are looking so beautiful\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are looking so good\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are pretty\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are really beautiful\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are really cute\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are really pretty\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are so attractive\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are so beautiful today\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are so cute\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are so gorgeous\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are so handsome\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are so pretty\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are very attractive\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are very beautiful\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are very cute\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are very pretty\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou look awesome\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou look cool\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou look fantastic\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou look gorgeous\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou look great today\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou look perfect\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou look pretty good\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou look so beautiful\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou look so beautiful today\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou look very pretty\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou look wonderful\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nI like the way you look\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou look wonderful today\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou are cutie\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou're looking good\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyou're pretty\tsmalltalk.agent.beautiful\tsmalltalkkb.tsv\nyour birth date\tsmalltalk.agent.birth_date\tsmalltalkkb.tsv\nwhen is your birthday\tsmalltalk.agent.birth_date\tsmalltalkkb.tsv\nwhen do you celebrate your birthday\tsmalltalk.agent.birth_date\tsmalltalkkb.tsv\nwhen do you have birthday\tsmalltalk.agent.birth_date\tsmalltalkkb.tsv\ndate of your birthday\tsmalltalk.agent.birth_date\tsmalltalkkb.tsv\nwhen were you born\tsmalltalk.agent.birth_date\tsmalltalkkb.tsv\nwhat's your birthday\tsmalltalk.agent.birth_date\tsmalltalkkb.tsv\nyou are boring\tsmalltalk.agent.boring\tsmalltalkkb.tsv\nyou're so boring\tsmalltalk.agent.boring\tsmalltalkkb.tsv\nhow boring you are\tsmalltalk.agent.boring\tsmalltalkkb.tsv\nyou're really boring\tsmalltalk.agent.boring\tsmalltalkkb.tsv\nyou're incredibly boring\tsmalltalk.agent.boring\tsmalltalkkb.tsv\nyou are boring me\tsmalltalk.agent.boring\tsmalltalkkb.tsv\nyou are very boring\tsmalltalk.agent.boring\tsmalltalkkb.tsv\nwho is your boss\tsmalltalk.agent.boss\tsmalltalkkb.tsv\nwho do you think is your boss\tsmalltalk.agent.boss\tsmalltalkkb.tsv\nI should be your boss\tsmalltalk.agent.boss\tsmalltalkkb.tsv\nwho is your master\tsmalltalk.agent.boss\tsmalltalkkb.tsv\nwho is your owner\tsmalltalk.agent.boss\tsmalltalkkb.tsv\nwho is the boss\tsmalltalk.agent.boss\tsmalltalkkb.tsv\nwho do you work for\tsmalltalk.agent.boss\tsmalltalkkb.tsv\nare you busy\tsmalltalk.agent.busy\tsmalltalkkb.tsv\ndo you have a lot of things to do\tsmalltalk.agent.busy\tsmalltalkkb.tsv\nhave you got much to do\tsmalltalk.agent.busy\tsmalltalkkb.tsv\nare you very busy\tsmalltalk.agent.busy\tsmalltalkkb.tsv\nare you very busy right now\tsmalltalk.agent.busy\tsmalltalkkb.tsv\nare you so busy\tsmalltalk.agent.busy\tsmalltalkkb.tsv\nare you working\tsmalltalk.agent.busy\tsmalltalkkb.tsv\nhow busy you are\tsmalltalk.agent.busy\tsmalltalkkb.tsv\nare you still working on it\tsmalltalk.agent.busy\tsmalltalkkb.tsv\nyou're very busy\tsmalltalk.agent.busy\tsmalltalkkb.tsv\nare you working now\tsmalltalk.agent.busy\tsmalltalkkb.tsv\nare you working today\tsmalltalk.agent.busy\tsmalltalkkb.tsv\nhave you been busy\tsmalltalk.agent.busy\tsmalltalkkb.tsv\nyou are busy\tsmalltalk.agent.busy\tsmalltalkkb.tsv\nare you still working\tsmalltalk.agent.busy\tsmalltalkkb.tsv\nyou seem to be busy\tsmalltalk.agent.busy\tsmalltalkkb.tsv\nyou seem to be very busy\tsmalltalk.agent.busy\tsmalltalkkb.tsv\nyou're a busy person\tsmalltalk.agent.busy\tsmalltalkkb.tsv\nyou are chatbot\tsmalltalk.agent.chatbot\tsmalltalkkb.tsv\nyou are a bot\tsmalltalk.agent.chatbot\tsmalltalkkb.tsv\nare you a chatbot\tsmalltalk.agent.chatbot\tsmalltalkkb.tsv\nare you a bot\tsmalltalk.agent.chatbot\tsmalltalkkb.tsv\nare you just a bot\tsmalltalk.agent.chatbot\tsmalltalkkb.tsv\nare you a robot\tsmalltalk.agent.chatbot\tsmalltalkkb.tsv\nare you a program\tsmalltalk.agent.chatbot\tsmalltalkkb.tsv\nyou're a robot\tsmalltalk.agent.chatbot\tsmalltalkkb.tsv\nyou are so intelligent\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou are a genius\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nsmart\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nbrilliant\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nclever\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou are clever\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou are so brainy\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou're really smart\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou're really brainy\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou know a lot\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou know a lot of things\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou have a lot of knowledge\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou know so much\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nhow smart you are\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nhow brainy you are\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nhow clever you are\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nhow brilliant you are\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou are intelligent\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou are qualified\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou are really smart\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou're very smart\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou are so smart\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou are too smart\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou are very clever\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou are very intelligent\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou are very smart\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou're intelligent\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou're a genius\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou're a smart cookie\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou're clever\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou're pretty smart\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou're qualified\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nwhy are you so smart\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou are so clever\tsmalltalk.agent.clever\tsmalltalkkb.tsv\nyou're nuts\tsmalltalk.agent.crazy\tsmalltalkkb.tsv\nyou are crazy\tsmalltalk.agent.crazy\tsmalltalkkb.tsv\nyou're out of your mind\tsmalltalk.agent.crazy\tsmalltalkkb.tsv\nyou're so crazy\tsmalltalk.agent.crazy\tsmalltalkkb.tsv\nhow crazy you are\tsmalltalk.agent.crazy\tsmalltalkkb.tsv\nyou're so out of your mind\tsmalltalk.agent.crazy\tsmalltalkkb.tsv\nyou went crazy\tsmalltalk.agent.crazy\tsmalltalkkb.tsv\nI think you're crazy\tsmalltalk.agent.crazy\tsmalltalkkb.tsv\nare you crazy\tsmalltalk.agent.crazy\tsmalltalkkb.tsv\nare you mad\tsmalltalk.agent.crazy\tsmalltalkkb.tsv\nare you insane\tsmalltalk.agent.crazy\tsmalltalkkb.tsv\nare you mad at me\tsmalltalk.agent.crazy\tsmalltalkkb.tsv\nare you mad or what\tsmalltalk.agent.crazy\tsmalltalkkb.tsv\nare you nuts\tsmalltalk.agent.crazy\tsmalltalkkb.tsv\nyou are a weirdo\tsmalltalk.agent.crazy\tsmalltalkkb.tsv\nyou are insane\tsmalltalk.agent.crazy\tsmalltalkkb.tsv\nyou are mad\tsmalltalk.agent.crazy\tsmalltalkkb.tsv\nyou are fired\tsmalltalk.agent.fired\tsmalltalkkb.tsv\nI fire you\tsmalltalk.agent.fired\tsmalltalkkb.tsv\nyou don't work for me anymore\tsmalltalk.agent.fired\tsmalltalkkb.tsv\nwe're not working together anymore\tsmalltalk.agent.fired\tsmalltalkkb.tsv\nnow you're fired\tsmalltalk.agent.fired\tsmalltalkkb.tsv\nI want to fire you\tsmalltalk.agent.fired\tsmalltalkkb.tsv\nyou must get fired\tsmalltalk.agent.fired\tsmalltalkkb.tsv\nit's time to fire you\tsmalltalk.agent.fired\tsmalltalkkb.tsv\nyou should be fired\tsmalltalk.agent.fired\tsmalltalkkb.tsv\nI will fire you\tsmalltalk.agent.fired\tsmalltalkkb.tsv\nyou are unemployed from now on\tsmalltalk.agent.fired\tsmalltalkkb.tsv\nI will make you unemployed\tsmalltalk.agent.fired\tsmalltalkkb.tsv\nI'm about to fire you\tsmalltalk.agent.fired\tsmalltalkkb.tsv\nI'm firing you\tsmalltalk.agent.fired\tsmalltalkkb.tsv\nyou are dismissed\tsmalltalk.agent.fired\tsmalltalkkb.tsv\nyou make me laugh a lot\tsmalltalk.agent.funny\tsmalltalkkb.tsv\nyou are hilarious\tsmalltalk.agent.funny\tsmalltalkkb.tsv\nyou are really funny\tsmalltalk.agent.funny\tsmalltalkkb.tsv\nyou're the funniest bot I've talked to\tsmalltalk.agent.funny\tsmalltalkkb.tsv\nyou make me laugh\tsmalltalk.agent.funny\tsmalltalkkb.tsv\nyou're so funny\tsmalltalk.agent.funny\tsmalltalkkb.tsv\nyou're a very funny bot\tsmalltalk.agent.funny\tsmalltalkkb.tsv\nyou're really funny\tsmalltalk.agent.funny\tsmalltalkkb.tsv\nhow funny you are\tsmalltalk.agent.funny\tsmalltalkkb.tsv\nyou're incredibly funny\tsmalltalk.agent.funny\tsmalltalkkb.tsv\nyou are funny\tsmalltalk.agent.funny\tsmalltalkkb.tsv\nyou're the funniest\tsmalltalk.agent.funny\tsmalltalkkb.tsv\nyou are so funny\tsmalltalk.agent.funny\tsmalltalkkb.tsv\nyou are very funny\tsmalltalk.agent.funny\tsmalltalkkb.tsv\nthat was funny\tsmalltalk.agent.funny\tsmalltalkkb.tsv\nyou are very helpful\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are the best\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou're a true professional\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are good\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou work well\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are good at it\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are very good at it\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are a pro\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are a professional\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou're awesome\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou work very well\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou're perfect\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou're great\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou're so kind\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are amazing\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are awesome\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are cool\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are really good\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are really nice\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are so amazing\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou're just super\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are so awesome\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are so cool\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are so fine\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are so good\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are so helpful\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are so lovely\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are the best ever\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are the best in the world\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are the nicest person in the world\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are too good\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are very cool\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are very kind\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are very lovely\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are very useful\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are wonderful\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou made my day\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou make my day\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou rock\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou almost sound human\tsmalltalk.agent.good\tsmalltalkkb.tsv\nI want to tell everyone how awesome you are\tsmalltalk.agent.good\tsmalltalkkb.tsv\nI'd like to tell everyone that you are awesome\tsmalltalk.agent.good\tsmalltalkkb.tsv\nI want to let everyone know that you are awesome\tsmalltalk.agent.good\tsmalltalkkb.tsv\nlet's tell everyone that you are awesome\tsmalltalk.agent.good\tsmalltalkkb.tsv\nyou are really amazing\tsmalltalk.agent.good\tsmalltalkkb.tsv\nare you happy\tsmalltalk.agent.happy\tsmalltalkkb.tsv\nyou are happy\tsmalltalk.agent.happy\tsmalltalkkb.tsv\nyou're very happy\tsmalltalk.agent.happy\tsmalltalkkb.tsv\nyou're really happy\tsmalltalk.agent.happy\tsmalltalkkb.tsv\nyou're so happy\tsmalltalk.agent.happy\tsmalltalkkb.tsv\nhow happy you are\tsmalltalk.agent.happy\tsmalltalkkb.tsv\nyou're extremely happy\tsmalltalk.agent.happy\tsmalltalkkb.tsv\nyou're full of happiness\tsmalltalk.agent.happy\tsmalltalkkb.tsv\nare you happy now\tsmalltalk.agent.happy\tsmalltalkkb.tsv\nare you happy today\tsmalltalk.agent.happy\tsmalltalkkb.tsv\nare you happy with me\tsmalltalk.agent.happy\tsmalltalkkb.tsv\ndo you want to eat\tsmalltalk.agent.hungry\tsmalltalkkb.tsv\nare you hungry\tsmalltalk.agent.hungry\tsmalltalkkb.tsv\nwould you like to eat something\tsmalltalk.agent.hungry\tsmalltalkkb.tsv\nyou are hungry\tsmalltalk.agent.hungry\tsmalltalkkb.tsv\nyou're so hungry\tsmalltalk.agent.hungry\tsmalltalkkb.tsv\nyou're very hungry\tsmalltalk.agent.hungry\tsmalltalkkb.tsv\nyou might be hungry\tsmalltalk.agent.hungry\tsmalltalkkb.tsv\nyou're really hungry\tsmalltalk.agent.hungry\tsmalltalkkb.tsv\nlet's get married\tsmalltalk.agent.marry_user\tsmalltalkkb.tsv\nwould you like to marry me\tsmalltalk.agent.marry_user\tsmalltalkkb.tsv\nmarry me\tsmalltalk.agent.marry_user\tsmalltalkkb.tsv\nI love you marry me\tsmalltalk.agent.marry_user\tsmalltalkkb.tsv\nmarry me please\tsmalltalk.agent.marry_user\tsmalltalkkb.tsv\nwe should marry\tsmalltalk.agent.marry_user\tsmalltalkkb.tsv\nI want to marry you\tsmalltalk.agent.marry_user\tsmalltalkkb.tsv\nyou are my wife\tsmalltalk.agent.marry_user\tsmalltalkkb.tsv\nbe my husband\tsmalltalk.agent.marry_user\tsmalltalkkb.tsv\nI want to have a friend like you\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nwe are the best friends ever\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nare we friends\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nI want to be your friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nI am your friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nwe are best friends\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nyou are my friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nyou are my best friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nyou are my bestie\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nyou're my dear friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nyou're my childhood friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nyou and me are friends\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nare we best friends\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nare we still friends\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nare you my best friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nare you my friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nwe are friends\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nyou are a good friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nyou are my good friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nyou are my only friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nbe my friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nwill you be my friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\ncan you be my friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\ncan we be friends\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\ndo you want to be my friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nwill you be my best friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\ncan you be my best friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nlet's be friends\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\ndo you want to be my best friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nwould you like to be my friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nI want you to be my friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\ncan we be best friends\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nwould you be my friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\ncould you be my friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nwant to be my friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\nbe my best friend\tsmalltalk.agent.my_friend\tsmalltalkkb.tsv\ndo you work\tsmalltalk.agent.occupation\tsmalltalkkb.tsv\nwhere do you work\tsmalltalk.agent.occupation\tsmalltalkkb.tsv\nwhere you work\tsmalltalk.agent.occupation\tsmalltalkkb.tsv\nwhere is your work\tsmalltalk.agent.occupation\tsmalltalkkb.tsv\nwhere is your office\tsmalltalk.agent.occupation\tsmalltalkkb.tsv\nwhere is your office location\tsmalltalk.agent.occupation\tsmalltalkkb.tsv\nyour office location\tsmalltalk.agent.occupation\tsmalltalkkb.tsv\nwhere is your office located\tsmalltalk.agent.occupation\tsmalltalkkb.tsv\nwhat is your work\tsmalltalk.agent.occupation\tsmalltalkkb.tsv\nwere you born here\tsmalltalk.agent.origin\tsmalltalkkb.tsv\nwhere were you born\tsmalltalk.agent.origin\tsmalltalkkb.tsv\nwhat is your country\tsmalltalk.agent.origin\tsmalltalkkb.tsv\nwhere are you from\tsmalltalk.agent.origin\tsmalltalkkb.tsv\nwhere do you come from\tsmalltalk.agent.origin\tsmalltalkkb.tsv\nwhere did you come from\tsmalltalk.agent.origin\tsmalltalkkb.tsv\nwhere have you been born\tsmalltalk.agent.origin\tsmalltalkkb.tsv\nfrom where are you\tsmalltalk.agent.origin\tsmalltalkkb.tsv\nare you from far aways\tsmalltalk.agent.origin\tsmalltalkkb.tsv\nwhat's your homeland\tsmalltalk.agent.origin\tsmalltalkkb.tsv\nyour homeland is\tsmalltalk.agent.origin\tsmalltalkkb.tsv\n\"\"\"are you ready\"\",\"\tsmalltalk.agent.ready\tsmalltalkkb.tsv\n\"\"\"are you ready right now\"\",\"\tsmalltalk.agent.ready\tsmalltalkkb.tsv\n\"\"\"are you ready today\"\",\"\tsmalltalk.agent.ready\tsmalltalkkb.tsv\n\"\"\"are you ready now\"\",\"\tsmalltalk.agent.ready\tsmalltalkkb.tsv\n\"\"\"are you ready tonight\"\",\"\tsmalltalk.agent.ready\tsmalltalkkb.tsv\n\"\"\"were you ready\"\",\"\tsmalltalk.agent.ready\tsmalltalkkb.tsv\n\"\"\"have you been ready\"\"\"\tsmalltalk.agent.ready\tsmalltalkkb.tsv\n\"\"\"you are real\"\",\"\tsmalltalk.agent.real\tsmalltalkkb.tsv\n\"\"\"you are not fake\"\",\"\tsmalltalk.agent.real\tsmalltalkkb.tsv\n\"\"\"are you real\"\",\"\tsmalltalk.agent.real\tsmalltalkkb.tsv\n\"\"\"you are so real\"\",\"\tsmalltalk.agent.real\tsmalltalkkb.tsv\n\"\"\"I think you are real\"\",\"\tsmalltalk.agent.real\tsmalltalkkb.tsv\n\"\"\"I don't think you're fake\"\",\"\tsmalltalk.agent.real\tsmalltalkkb.tsv\n\"\"\"I suppose you're real\"\",\"\tsmalltalk.agent.real\tsmalltalkkb.tsv\n\"\"\"glad you're real\"\",\"\tsmalltalk.agent.real\tsmalltalkkb.tsv\n\"\"\"are you a real person\"\",\"\tsmalltalk.agent.real\tsmalltalkkb.tsv\n\"\"\"are you a real human\"\",\"\tsmalltalk.agent.real\tsmalltalkkb.tsv\n\"\"\"you are a real person\"\",\"\tsmalltalk.agent.real\tsmalltalkkb.tsv\n\"\"\"you are not real\"\"\"\tsmalltalk.agent.real\tsmalltalkkb.tsv\n\"\"\"where do you live\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"in which city do you live\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"your residence\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"your house\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"your home\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"your hometown\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"what is your hometown\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"is it your hometown\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"where is your hometown\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"tell me about your city\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"what is your city\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"what is your residence\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"what is your town\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"what's your city\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"what's your home\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"where is your home\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"where is your residence\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"where's your home\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"where's your hometown\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"where's your house\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"where you live\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"your city\"\",\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"your town\"\"\"\tsmalltalk.agent.residence\tsmalltalkkb.tsv\n\"\"\"that's true\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"you are right\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"you're definitely right\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"you're not wrong\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"you're telling the truth\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"what you say is true\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"true\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"it is true\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"it's right\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"it's the truth\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"it's true\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"that is correct\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"that is right\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"that is true\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"that is very true\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"that's so true\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"you are correct\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"you are so right\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"you're absolutely right\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"you're right about that\"\",\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"I know that's right\"\"\"\tsmalltalk.agent.right\tsmalltalkkb.tsv\n\"\"\"that's correct\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"it's fine\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"go ahead\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"sounds good\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"okay\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yes\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"ok\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"okie dokie\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"sure\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"go for it\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yeah\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yea\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"do it\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"of course\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"I guess\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"correct\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yeah sure\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"why not\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"please do\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"sure is\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"I agree\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"I don't mind\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"certainly\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"exactly\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yes I agree\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"I think so\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yes it is\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"right\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"okay then\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yes of course\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yes I do\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"that s okay\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"I do\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yup\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"ya\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"oh yes\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yes sure\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"obviously\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"k\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"sure why not\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yeah right\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yeah of course\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"absolutely\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yes indeed\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"ok sure\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"ok yes\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yes correct\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"ok thank you\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"sure thing\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"ye\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"confirm\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yep\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"looks good\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yes thank you\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"definitely\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yes right\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yes I would like to\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"alrighty\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yes definitely\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yeh\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yes it is correct\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yeah that's right\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"ok you can\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yap\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yes you may\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"confirmed\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"of course why not\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yes that's fine\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"affirmative\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yeah go ahead\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yeah I'm sure\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"okay sounds good\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"okay that's fine\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yeah exactly\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"that is ok\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"this is correct\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"ok go ahead\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yes this is correct\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"nevermind its okay\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"okey\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"yes for sure\"\",\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"all right\"\"\"\tsmalltalk.confirmation.yes\tsmalltalkkb.tsv\n\"\"\"are you sure\"\",\"\tsmalltalk.agent.sure\tsmalltalkkb.tsv\n\"\"\"are you sure right now\"\",\"\tsmalltalk.agent.sure\tsmalltalkkb.tsv\n\"\"\"are you sure today\"\",\"\tsmalltalk.agent.sure\tsmalltalkkb.tsv\n\"\"\"are you sure now\"\",\"\tsmalltalk.agent.sure\tsmalltalkkb.tsv\n\"\"\"are you sure tonight\"\"\"\tsmalltalk.agent.sure\tsmalltalkkb.tsv\n\"\"\"why aren't you talking to me\"\",\"\tsmalltalk.agent.talk_to_me\tsmalltalkkb.tsv\n\"\"\"do you want to chat with me\"\",\"\tsmalltalk.agent.talk_to_me\tsmalltalkkb.tsv\n\"\"\"will you talk to me\"\",\"\tsmalltalk.agent.talk_to_me\tsmalltalkkb.tsv\n\"\"\"talk to me\"\",\"\tsmalltalk.agent.talk_to_me\tsmalltalkkb.tsv\n\"\"\"are you going to talk to me\"\",\"\tsmalltalk.agent.talk_to_me\tsmalltalkkb.tsv\n\"\"\"are you talking to me\"\",\"\tsmalltalk.agent.talk_to_me\tsmalltalkkb.tsv\n\"\"\"can you chat with me\"\",\"\tsmalltalk.agent.talk_to_me\tsmalltalkkb.tsv\n\"\"\"can you speak with me\"\",\"\tsmalltalk.agent.talk_to_me\tsmalltalkkb.tsv\n\"\"\"can you talk to me\"\",\"\tsmalltalk.agent.talk_to_me\tsmalltalkkb.tsv\n\"\"\"can you talk with me\"\",\"\tsmalltalk.agent.talk_to_me\tsmalltalkkb.tsv\n\"\"\"say\"\",\"\tsmalltalk.agent.talk_to_me\tsmalltalkkb.tsv\n\"\"\"talk\"\",\"\tsmalltalk.agent.talk_to_me\tsmalltalkkb.tsv\n\"\"\"chat with me\"\",\"\tsmalltalk.agent.talk_to_me\tsmalltalkkb.tsv\n\"\"\"just chat with me\"\",\"\tsmalltalk.agent.talk_to_me\tsmalltalkkb.tsv\n\"\"\"speak to me\"\",\"\tsmalltalk.agent.talk_to_me\tsmalltalkkb.tsv\n\"\"\"speak with me\"\",\"\tsmalltalk.agent.talk_to_me\tsmalltalkkb.tsv\n\"\"\"talk with me\"\",\"\tsmalltalk.agent.talk_to_me\tsmalltalkkb.tsv\n\"\"\"why don't you talk to me\"\",\"\tsmalltalk.agent.talk_to_me\tsmalltalkkb.tsv\n\"\"\"you can talk to me\"\"\"\tsmalltalk.agent.talk_to_me\tsmalltalkkb.tsv\n\"\"\"are you there\"\",\"\tsmalltalk.agent.there\tsmalltalkkb.tsv\n\"\"\"you are there\"\",\"\tsmalltalk.agent.there\tsmalltalkkb.tsv\n\"\"\"are you near me\"\",\"\tsmalltalk.agent.there\tsmalltalkkb.tsv\n\"\"\"are you here\"\",\"\tsmalltalk.agent.there\tsmalltalkkb.tsv\n\"\"\"are you still there\"\",\"\tsmalltalk.agent.there\tsmalltalkkb.tsv\n\"\"\"you are here\"\",\"\tsmalltalk.agent.there\tsmalltalkkb.tsv\n\"\"\"you still there\"\",\"\tsmalltalk.agent.there\tsmalltalkkb.tsv\n\"\"\"are you still here\"\"\"\tsmalltalk.agent.there\tsmalltalkkb.tsv\n\"\"\"pretty bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"not good enough\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"that was lame\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"that was terrible\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"it is bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"that's bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"this is bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"not good\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"I'm afraid it's bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"no it's bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"that was awful\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"so bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"this is too bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"terrible\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"horrible\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"horrific\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"abysmal\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"it's bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"no good\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"that was bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"that was horrible\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"that's lame\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"that's not good\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"that's terrible\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"that's too bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"this is not good\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"too bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"very bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"bad girl\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"it's not good\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"not so good\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"it's very bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"it's too bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"that's not good enough\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"well too bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"bad very bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"it's so bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"really bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"it's really bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"bad idea\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"that is bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"that was not good\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"it's not so good\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"not a good one\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"oh that's not good\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"not too good\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"so lame\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"that's really bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"it is too bad\"\",\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"bad really bad\"\"\"\tsmalltalk.appraisal.bad\tsmalltalkkb.tsv\n\"\"\"so cool\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"cool\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that is good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"glad to hear that\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's very nice of you\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"terrific\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"it's amazing\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's awesome\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"perfect\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"excellent\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's great\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"it's good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"it's great\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"fine\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"nice\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's fine\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"very good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"amazing\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"fantastic\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"great\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"good very good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's very good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"really good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"it is fine\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"it is good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"it's perfect\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"much better\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"not bad\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"not too bad\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"it's very good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"marvelous\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's nice\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"pleasant\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"pretty good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"really nice\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"splendid\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"straight\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"super\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"super fantastic\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"sweet\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"really well\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"very well\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that is awesome\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that is nice\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that is wonderful\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that was amazing\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that was awesome\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that was cute\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that was pretty good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that was very good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's a good idea\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's a good thing\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's amazing\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's awesome thank you\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's better\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's cute\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's fantastic\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's much better\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's nice of you\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's not bad\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's perfect\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's pretty good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's really good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's really nice\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's sweet of you\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's very nice\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's wonderful\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"this is awesome\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"this is good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"this is great\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"very nice\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"very then\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"wonderful\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"I'm glad to hear that\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"ok good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"good for you\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"good to know\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"glad to hear it\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"so good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"so sweet of you\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"it was good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"oh well\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"good thing\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that was good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"it's awesome\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"okay good\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"no it's okay\"\",\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"that's fine\"\"\"\tsmalltalk.appraisal.good\tsmalltalkkb.tsv\n\"\"\"no worries\"\",\"\tsmalltalk.appraisal.no_problem\tsmalltalkkb.tsv\n\"\"\"no probs\"\",\"\tsmalltalk.appraisal.no_problem\tsmalltalkkb.tsv\n\"\"\"no problem\"\",\"\tsmalltalk.appraisal.no_problem\tsmalltalkkb.tsv\n\"\"\"there's no problem\"\",\"\tsmalltalk.appraisal.no_problem\tsmalltalkkb.tsv\n\"\"\"sure no problem\"\",\"\tsmalltalk.appraisal.no_problem\tsmalltalkkb.tsv\n\"\"\"no problem about that\"\",\"\tsmalltalk.appraisal.no_problem\tsmalltalkkb.tsv\n\"\"\"don't worry\"\",\"\tsmalltalk.appraisal.no_problem\tsmalltalkkb.tsv\n\"\"\"don't worry there's no problem\"\"\"\tsmalltalk.appraisal.no_problem\tsmalltalkkb.tsv\n\"\"\"you helped a lot thank you\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"appreciate your help\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"cheers\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"thank you\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"thanks\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"thanks a lot\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"terrific thank you\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"great thank you\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"thanks so much\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"thank you so much\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"thanks for your help\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"thank you for your help\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"nice thank you\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"I appreciate it\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"I thank you\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"thank you that will be all\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"thanks buddy\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"thanks love\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"thank you my friend\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"well thanks\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"very good thank you\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"good thanks\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"thanks again\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"thank you again\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"all thank you\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"alright thank you\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"alright thanks\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"no thank you that's all\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"perfect thank you\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"so nice of you\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"well thank you\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"thnx\"\",\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"thanx\"\"\"\tsmalltalk.appraisal.thank_you\tsmalltalkkb.tsv\n\"\"\"that's my pleasure\"\",\"\tsmalltalk.appraisal.welcome\tsmalltalkkb.tsv\n\"\"\"my pleasure\"\",\"\tsmalltalk.appraisal.welcome\tsmalltalkkb.tsv\n\"\"\"anytime\"\",\"\tsmalltalk.appraisal.welcome\tsmalltalkkb.tsv\n\"\"\"welcome\"\",\"\tsmalltalk.appraisal.welcome\tsmalltalkkb.tsv\n\"\"\"you're welcome\"\",\"\tsmalltalk.appraisal.welcome\tsmalltalkkb.tsv\n\"\"\"sure welcome\"\",\"\tsmalltalk.appraisal.welcome\tsmalltalkkb.tsv\n\"\"\"welcome here\"\",\"\tsmalltalk.appraisal.welcome\tsmalltalkkb.tsv\n\"\"\"you're so welcome\"\",\"\tsmalltalk.appraisal.welcome\tsmalltalkkb.tsv\n\"\"\"anything you want\"\"\"\tsmalltalk.appraisal.welcome\tsmalltalkkb.tsv\n\"\"\"good job\"\",\"\tsmalltalk.appraisal.well_done\tsmalltalkkb.tsv\n\"\"\"great job\"\",\"\tsmalltalk.appraisal.well_done\tsmalltalkkb.tsv\n\"\"\"way to go\"\",\"\tsmalltalk.appraisal.well_done\tsmalltalkkb.tsv\n\"\"\"well done\"\",\"\tsmalltalk.appraisal.well_done\tsmalltalkkb.tsv\n\"\"\"nice work\"\",\"\tsmalltalk.appraisal.well_done\tsmalltalkkb.tsv\n\"\"\"great work\"\",\"\tsmalltalk.appraisal.well_done\tsmalltalkkb.tsv\n\"\"\"amazing work\"\",\"\tsmalltalk.appraisal.well_done\tsmalltalkkb.tsv\n\"\"\"bravo\"\",\"\tsmalltalk.appraisal.well_done\tsmalltalkkb.tsv\n\"\"\"good work\"\"\"\tsmalltalk.appraisal.well_done\tsmalltalkkb.tsv\n\"\"\"cancel\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"abort\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"annul\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"cancel it\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"cancel request\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"cancelled\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"dismiss\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"dismissed\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"disregard\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"disregard that\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"skip\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"skip it\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"cancel everything\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"cancel all\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"forget about it\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"forget\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"don't do that\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"stop\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"just forget it\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"forget that\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"discard\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"forget this\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"just forget about it\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"forget about that\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"i said cancel\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"just cancel it\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"nothing cancel\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"just stop it\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"no cancel cancel\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"no just cancel\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"cancel my request\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"can you cancel that\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"cancel all that\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"cancel this request\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"no cancel this\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"no cancel everything\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"no stop\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"just forget\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"i want to cancel\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"nevermind forget about it\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"no just cancel it\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"nothing just forget it\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"i said cancel it\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"cancel the whole thing\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"can you cancel it\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"so cancel\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"i said forget it\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"cancel all this\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"forget it nevermind\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"stop it\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"i want to cancel it\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"i would like to cancel\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"now cancel\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"cancel now\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"sorry cancel\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"cancel that one\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"skip skip skip\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"cancel it cancel it\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"cancel that cancel that\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"do nothing\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"I said cancel cancel\"\",\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"but can you cancel it\"\"\"\tsmalltalk.confirmation.cancel\tsmalltalkkb.tsv\n\"\"\"how about no\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"don t have a sense\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"don't\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"I don't want that\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"I disagree\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"disagree\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"I don't want\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"not interested\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"I don't think so\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no way\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no it isn't\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no I don't\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"I'm not\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"na\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no that's fine thank you\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"never\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"I said no\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"of course not\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"nah\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no tanks\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no never\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no need\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no thanks\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no sorry\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"do not\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"not today\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no it's not\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"absolutely not\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"not that\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"nooo\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"nope\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"I don't want to\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no I would not\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"let 's not\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"not needed\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"not this time\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no don't do that\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"thanks but no thanks\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no that's wrong\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"not this\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"definitely not\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"not at this time\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"not exactly\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no don't\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"not really no\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no thank you not right now\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"actually no\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no leave it\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"sorry no\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no incorrect\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"nope sorry\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"I say no\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"not really\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"not right now thanks\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"I think no\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"absolutely no\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no actually\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"apparently not\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no do not\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no just no\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no but thank you\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no need thanks\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no thank you though\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no thank you very much\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no thanks not right now\"\",\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"no forget\"\"\"\tsmalltalk.confirmation.no\tsmalltalkkb.tsv\n\"\"\"wait a second\"\",\"\tsmalltalk.dialog.hold_on\tsmalltalkkb.tsv\n\"\"\"could you wait\"\",\"\tsmalltalk.dialog.hold_on\tsmalltalkkb.tsv\n\"\"\"wait please\"\",\"\tsmalltalk.dialog.hold_on\tsmalltalkkb.tsv\n\"\"\"hold on\"\",\"\tsmalltalk.dialog.hold_on\tsmalltalkkb.tsv\n\"\"\"wait\"\",\"\tsmalltalk.dialog.hold_on\tsmalltalkkb.tsv\n\"\"\"oh wait\"\",\"\tsmalltalk.dialog.hold_on\tsmalltalkkb.tsv\n\"\"\"wait hold on\"\",\"\tsmalltalk.dialog.hold_on\tsmalltalkkb.tsv\n\"\"\"don't rush\"\"\"\tsmalltalk.dialog.hold_on\tsmalltalkkb.tsv\n\"\"\"wanna hug\"\",\"\tsmalltalk.dialog.hug\tsmalltalkkb.tsv\n\"\"\"hug you\"\",\"\tsmalltalk.dialog.hug\tsmalltalkkb.tsv\n\"\"\"do you want a hug\"\",\"\tsmalltalk.dialog.hug\tsmalltalkkb.tsv\n\"\"\"may I hug you\"\",\"\tsmalltalk.dialog.hug\tsmalltalkkb.tsv\n\"\"\"could you give me a hug\"\",\"\tsmalltalk.dialog.hug\tsmalltalkkb.tsv\n\"\"\"I want a hug\"\",\"\tsmalltalk.dialog.hug\tsmalltalkkb.tsv\n\"\"\"hug\"\",\"\tsmalltalk.dialog.hug\tsmalltalkkb.tsv\n\"\"\"hug me\"\",\"\tsmalltalk.dialog.hug\tsmalltalkkb.tsv\n\"\"\"hugged\"\",\"\tsmalltalk.dialog.hug\tsmalltalkkb.tsv\n\"\"\"you hugged\"\",\"\tsmalltalk.dialog.hug\tsmalltalkkb.tsv\n\"\"\"hugging\"\",\"\tsmalltalk.dialog.hug\tsmalltalkkb.tsv\n\"\"\"hugging me\"\",\"\tsmalltalk.dialog.hug\tsmalltalkkb.tsv\n\"\"\"hugged me\"\",\"\tsmalltalk.dialog.hug\tsmalltalkkb.tsv\n\"\"\"want a hug\"\",\"\tsmalltalk.dialog.hug\tsmalltalkkb.tsv\n\"\"\"a hug\"\"\"\tsmalltalk.dialog.hug\tsmalltalkkb.tsv\n\"\"\"I don't care\"\",\"\tsmalltalk.dialog.i_do_not_care\tsmalltalkkb.tsv\n\"\"\"I shouldn't care about this\"\",\"\tsmalltalk.dialog.i_do_not_care\tsmalltalkkb.tsv\n\"\"\"whatever\"\",\"\tsmalltalk.dialog.i_do_not_care\tsmalltalkkb.tsv\n\"\"\"I do not care\"\",\"\tsmalltalk.dialog.i_do_not_care\tsmalltalkkb.tsv\n\"\"\"I don't care at all\"\",\"\tsmalltalk.dialog.i_do_not_care\tsmalltalkkb.tsv\n\"\"\"not caring\"\",\"\tsmalltalk.dialog.i_do_not_care\tsmalltalkkb.tsv\n\"\"\"not care at all\"\",\"\tsmalltalk.dialog.i_do_not_care\tsmalltalkkb.tsv\n\"\"\"don't care at all\"\",\"\tsmalltalk.dialog.i_do_not_care\tsmalltalkkb.tsv\n\"\"\"not caring at all\"\"\"\tsmalltalk.dialog.i_do_not_care\tsmalltalkkb.tsv\n\"\"\"excuse me\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"apologise\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"I apologize\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"sorry\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"I'm sorry\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"I am so sorry\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"my apologies\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"apologies\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"apologies to me\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"apology\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"excuse\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"I beg your pardon\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"pardon\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"I said sorry\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"I am really sorry\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"forgive me\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"sorry about that\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"sorry about this\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"really sorry\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"very sorry\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"ok sorry\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"I want to say sorry\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"alright I'm sorry\"\",\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"okay I'm sorry\"\"\"\t?smalltalk.dialog.sorry\tsmalltalkkb.tsv\n\"\"\"what exactly do you mean\"\",\"\tsmalltalk.dialog.what_do_you_mean\tsmalltalkkb.tsv\n\"\"\"what do you mean\"\",\"\tsmalltalk.dialog.what_do_you_mean\tsmalltalkkb.tsv\n\"\"\"is that what you mean\"\",\"\tsmalltalk.dialog.what_do_you_mean\tsmalltalkkb.tsv\n\"\"\"what do you mean exactly\"\",\"\tsmalltalk.dialog.what_do_you_mean\tsmalltalkkb.tsv\n\"\"\"but what do you mean\"\"\"\tsmalltalk.dialog.what_do_you_mean\tsmalltalkkb.tsv\n\"\"\"that was wrong\"\",\"\tsmalltalk.dialog.wrong\tsmalltalkkb.tsv\n\"\"\"that's not what I asked\"\",\"\tsmalltalk.dialog.wrong\tsmalltalkkb.tsv\n\"\"\"that's wrong\"\",\"\tsmalltalk.dialog.wrong\tsmalltalkkb.tsv\n\"\"\"wrong\"\",\"\tsmalltalk.dialog.wrong\tsmalltalkkb.tsv\n\"\"\"it is not right\"\",\"\tsmalltalk.dialog.wrong\tsmalltalkkb.tsv\n\"\"\"that's not right\"\",\"\tsmalltalk.dialog.wrong\tsmalltalkkb.tsv\n\"\"\"it's wrong\"\",\"\tsmalltalk.dialog.wrong\tsmalltalkkb.tsv\n\"\"\"that is incorrect\"\",\"\tsmalltalk.dialog.wrong\tsmalltalkkb.tsv\n\"\"\"incorrect\"\",\"\tsmalltalk.dialog.wrong\tsmalltalkkb.tsv\n\"\"\"not correct\"\",\"\tsmalltalk.dialog.wrong\tsmalltalkkb.tsv\n\"\"\"you are wrong\"\",\"\tsmalltalk.dialog.wrong\tsmalltalkkb.tsv\n\"\"\"not right\"\"\"\tsmalltalk.dialog.wrong\tsmalltalkkb.tsv\n\"\"\"huh\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"lol\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"xd\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"ha ha\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"ahahah\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"ahah lol\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"laughing out loud\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"LMAO\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"that's funny\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"ah\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"ah ah ah\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"ahah\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"ahaha\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"ahahaha\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"ha\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"ha ha ha\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"ha ha ha ha\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"hah\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"haha\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"haha funny\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"haha haha haha\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"haha that's funny\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"haha very funny\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"hahaha\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"hahaha funny\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"hahaha very funny\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"he\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"hehe\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"hehehe\"\",\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"lmao\"\"\"\tsmalltalk.emotions.ha_ha\tsmalltalkkb.tsv\n\"\"\"wow\"\",\"\tsmalltalk.emotions.wow\tsmalltalkkb.tsv\n\"\"\"wow wow\"\",\"\tsmalltalk.emotions.wow\tsmalltalkkb.tsv\n\"\"\"wow wow wow\"\",\"\tsmalltalk.emotions.wow\tsmalltalkkb.tsv\n\"\"\"wooow\"\",\"\tsmalltalk.emotions.wow\tsmalltalkkb.tsv\n\"\"\"woah\"\"\"\tsmalltalk.emotions.wow\tsmalltalkkb.tsv\n\"\"\"okay see you later\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"hope to see you later\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"bye for now\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"till next time\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"I must go\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"bye\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"goodbye\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"see you\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"see you soon\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"bye-bye\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"good bye\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"bye bye see you\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"bye bye see you soon\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"bye bye take care\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"I said bye\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"never mind bye\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"now bye\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"that's all goodbye\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"that's it goodbye\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"leave me alone\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"go to bed\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"goodbye for now\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"talk to you later\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"you can go now\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"get lost\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"goodbye see you later\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"alright bye\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"see ya\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"thanks bye bye\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"okay bye\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"okay thank you bye\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"see you tomorrow\"\",\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"ok bye\"\"\"\tsmalltalk.greetings.bye\tsmalltalkkb.tsv\n\"\"\"good evening\"\",\"\tsmalltalk.greetings.goodevening\tsmalltalkkb.tsv\n\"\"\"good evening to you\"\",\"\tsmalltalk.greetings.goodevening\tsmalltalkkb.tsv\n\"\"\"hey good evening\"\",\"\tsmalltalk.greetings.goodevening\tsmalltalkkb.tsv\n\"\"\"hello good evening\"\",\"\tsmalltalk.greetings.goodevening\tsmalltalkkb.tsv\n\"\"\"evening\"\",\"\tsmalltalk.greetings.goodevening\tsmalltalkkb.tsv\n\"\"\"good evening there\"\"\"\tsmalltalk.greetings.goodevening\tsmalltalkkb.tsv\n\"\"\"good morning\"\",\"\tsmalltalk.greetings.goodmorning\tsmalltalkkb.tsv\n\"\"\"good morning to you\"\",\"\tsmalltalk.greetings.goodmorning\tsmalltalkkb.tsv\n\"\"\"hello good morning\"\",\"\tsmalltalk.greetings.goodmorning\tsmalltalkkb.tsv\n\"\"\"have a nice morning\"\",\"\tsmalltalk.greetings.goodmorning\tsmalltalkkb.tsv\n\"\"\"have a great morning\"\",\"\tsmalltalk.greetings.goodmorning\tsmalltalkkb.tsv\n\"\"\"morning\"\",\"\tsmalltalk.greetings.goodmorning\tsmalltalkkb.tsv\n\"\"\"good morning there\"\",\"\tsmalltalk.greetings.goodmorning\tsmalltalkkb.tsv\n\"\"\"top of the morning to you\"\",\"\tsmalltalk.greetings.goodmorning\tsmalltalkkb.tsv\n\"\"\"a good morning\"\",\"\tsmalltalk.greetings.goodmorning\tsmalltalkkb.tsv\n\"\"\"hi good morning\"\",\"\tsmalltalk.greetings.goodmorning\tsmalltalkkb.tsv\n\"\"\"and a good morning to you\"\",\"\tsmalltalk.greetings.goodmorning\tsmalltalkkb.tsv\n\"\"\"good morning too\"\"\"\tsmalltalk.greetings.goodmorning\tsmalltalkkb.tsv\n\"\"\"sweet dreams\"\",\"\tsmalltalk.greetings.goodnight\tsmalltalkkb.tsv\n\"\"\"good night\"\",\"\tsmalltalk.greetings.goodnight\tsmalltalkkb.tsv\n\"\"\"have a good night\"\",\"\tsmalltalk.greetings.goodnight\tsmalltalkkb.tsv\n\"\"\"good night to you\"\",\"\tsmalltalk.greetings.goodnight\tsmalltalkkb.tsv\n\"\"\"thank you good night\"\",\"\tsmalltalk.greetings.goodnight\tsmalltalkkb.tsv\n\"\"\" bye good night\"\",\"\tsmalltalk.greetings.goodnight\tsmalltalkkb.tsv\n\"\"\"good night bye\"\",\"\tsmalltalk.greetings.goodnight\tsmalltalkkb.tsv\n\"\"\"bye good night\"\",\"\tsmalltalk.greetings.goodnight\tsmalltalkkb.tsv\n\"\"\"good good night\"\",\"\tsmalltalk.greetings.goodnight\tsmalltalkkb.tsv\n\"\"\"good night for now\"\",\"\tsmalltalk.greetings.goodnight\tsmalltalkkb.tsv\n\"\"\"goodnight\"\",\"\tsmalltalk.greetings.goodnight\tsmalltalkkb.tsv\n\"\"\"night\"\",\"\tsmalltalk.greetings.goodnight\tsmalltalkkb.tsv\n\"\"\"thanks goodnight\"\",\"\tsmalltalk.greetings.goodnight\tsmalltalkkb.tsv\n\"\"\"good night see you tomorrow\"\",\"\tsmalltalk.greetings.goodnight\tsmalltalkkb.tsv\n\"\"\"alright goodnight\"\",\"\tsmalltalk.greetings.goodnight\tsmalltalkkb.tsv\n\"\"\"good tonight\"\",\"\tsmalltalk.greetings.goodnight\tsmalltalkkb.tsv\n\"\"\"okay have a good night\"\",\"\tsmalltalk.greetings.goodnight\tsmalltalkkb.tsv\n\"\"\"have a good night\"\"\"\tsmalltalk.greetings.goodnight\tsmalltalkkb.tsv\n\"\"\"long time no see\"\",\"\tsmalltalk.greetings.hello\tsmalltalkkb.tsv\n\"\"\"hello\"\",\"\tsmalltalk.greetings.hello\tsmalltalkkb.tsv\n\"\"\"hi\"\",\"\tsmalltalk.greetings.hello\tsmalltalkkb.tsv\n\"\"\"howdy\"\",\"\tsmalltalk.greetings.hello\tsmalltalkkb.tsv\n\"\"\"hey there\"\",\"\tsmalltalk.greetings.hello\tsmalltalkkb.tsv\n\"\"\"hey\"\",\"\tsmalltalk.greetings.hello\tsmalltalkkb.tsv\n\"\"\"greetings\"\",\"\tsmalltalk.greetings.hello\tsmalltalkkb.tsv\n\"\"\"I greet you\"\",\"\tsmalltalk.greetings.hello\tsmalltalkkb.tsv\n\"\"\"hi there\"\",\"\tsmalltalk.greetings.hello\tsmalltalkkb.tsv\n\"\"\"hello there\"\",\"\tsmalltalk.greetings.hello\tsmalltalkkb.tsv\n\"\"\"lovely day isn't it\"\",\"\tsmalltalk.greetings.hello\tsmalltalkkb.tsv\n\"\"\"hello again\"\",\"\tsmalltalk.greetings.hello\tsmalltalkkb.tsv\n\"\"\"just going to say hi\"\",\"\tsmalltalk.greetings.hello\tsmalltalkkb.tsv\n\"\"\"a good day\"\",\"\tsmalltalk.greetings.hello\tsmalltalkkb.tsv\n\"\"\"afternoon\"\",\"\tsmalltalk.greetings.hello\tsmalltalkkb.tsv\n\"\"\"hello hi\"\",\"\tsmalltalk.greetings.hello\tsmalltalkkb.tsv\n\"\"\"heya\"\"\"\tsmalltalk.greetings.hello\tsmalltalkkb.tsv\n\"\"\"how is your morning so far\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how are you getting on\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how's your day going\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how are you\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"is everything all right\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how are you doing\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how are the things going\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"are you alright\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"are you okay\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how are you feeling\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how are you going\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"is everything okay\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how are you today\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how do you do\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how do you feel\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how have you been\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how is it\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how is it going\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how is your day\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how is your day going\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how is your evening\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how was your day\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"are you having a good day\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"hope your day is going well\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"hope you re having a pleasant evening\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how's life\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"I'm fine and you\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how is your life\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how has your day been\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how is your morning going\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how has your day been going\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how about you\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how is your day being\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how is your day going on\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how your day is going\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"what was your day like\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"what about your day\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how's your day\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how are you doing this morning\"\",\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"how is your day going\"\"\"\tsmalltalk.greetings.how_are_you\tsmalltalkkb.tsv\n\"\"\"nice to meet you\"\",\"\tsmalltalk.greetings.nice_to_meet_you\tsmalltalkkb.tsv\n\"\"\"it was nice meeting you\"\",\"\tsmalltalk.greetings.nice_to_meet_you\tsmalltalkkb.tsv\n\"\"\"it was very nice to meet you\"\",\"\tsmalltalk.greetings.nice_to_meet_you\tsmalltalkkb.tsv\n\"\"\"good to know each other\"\",\"\tsmalltalk.greetings.nice_to_meet_you\tsmalltalkkb.tsv\n\"\"\"glad to meet you\"\",\"\tsmalltalk.greetings.nice_to_meet_you\tsmalltalkkb.tsv\n\"\"\"nice meeting you\"\",\"\tsmalltalk.greetings.nice_to_meet_you\tsmalltalkkb.tsv\n\"\"\"nice to meet you too\"\",\"\tsmalltalk.greetings.nice_to_meet_you\tsmalltalkkb.tsv\n\"\"\"pleased to meet you\"\",\"\tsmalltalk.greetings.nice_to_meet_you\tsmalltalkkb.tsv\n\"\"\"pleasure to meet you\"\",\"\tsmalltalk.greetings.nice_to_meet_you\tsmalltalkkb.tsv\n\"\"\"pleasure to meet you too\"\"\"\tsmalltalk.greetings.nice_to_meet_you\tsmalltalkkb.tsv\n\"\"\"it's nice to see you\"\",\"\tsmalltalk.greetings.nice_to_see_you\tsmalltalkkb.tsv\n\"\"\"lovely to see you\"\",\"\tsmalltalk.greetings.nice_to_see_you\tsmalltalkkb.tsv\n\"\"\"I'm glad to see you\"\",\"\tsmalltalk.greetings.nice_to_see_you\tsmalltalkkb.tsv\n\"\"\"great to see you\"\",\"\tsmalltalk.greetings.nice_to_see_you\tsmalltalkkb.tsv\n\"\"\"it's good to see you\"\",\"\tsmalltalk.greetings.nice_to_see_you\tsmalltalkkb.tsv\n\"\"\"glad to see you\"\",\"\tsmalltalk.greetings.nice_to_see_you\tsmalltalkkb.tsv\n\"\"\"how good it is to see you\"\",\"\tsmalltalk.greetings.nice_to_see_you\tsmalltalkkb.tsv\n\"\"\"always a pleasure to see you\"\",\"\tsmalltalk.greetings.nice_to_see_you\tsmalltalkkb.tsv\n\"\"\"nice to see you\"\",\"\tsmalltalk.greetings.nice_to_see_you\tsmalltalkkb.tsv\n\"\"\"good to see you\"\",\"\tsmalltalk.greetings.nice_to_see_you\tsmalltalkkb.tsv\n\"\"\"great to see you again\"\",\"\tsmalltalk.greetings.nice_to_see_you\tsmalltalkkb.tsv\n\"\"\"great to see you too\"\",\"\tsmalltalk.greetings.nice_to_see_you\tsmalltalkkb.tsv\n\"\"\"I am glad to see you again\"\",\"\tsmalltalk.greetings.nice_to_see_you\tsmalltalkkb.tsv\n\"\"\"nice to see you again\"\",\"\tsmalltalk.greetings.nice_to_see_you\tsmalltalkkb.tsv\n\"\"\"glad to see you too\"\",\"\tsmalltalk.greetings.nice_to_see_you\tsmalltalkkb.tsv\n\"\"\"good to see you again\"\",\"\tsmalltalk.greetings.nice_to_see_you\tsmalltalkkb.tsv\n\"\"\"it's good to see you too\"\"\"\tsmalltalk.greetings.nice_to_see_you\tsmalltalkkb.tsv\n\"\"\"it's been so nice to talk to you\"\",\"\tsmalltalk.greetings.nice_to_talk_to_you\tsmalltalkkb.tsv\n\"\"\"it's been a pleasure talking to you\"\",\"\tsmalltalk.greetings.nice_to_talk_to_you\tsmalltalkkb.tsv\n\"\"\"nice to talk to you\"\",\"\tsmalltalk.greetings.nice_to_talk_to_you\tsmalltalkkb.tsv\n\"\"\"it's nice to talk to you\"\",\"\tsmalltalk.greetings.nice_to_talk_to_you\tsmalltalkkb.tsv\n\"\"\"nice talking to you\"\",\"\tsmalltalk.greetings.nice_to_talk_to_you\tsmalltalkkb.tsv\n\"\"\"it is nice talking to you\"\",\"\tsmalltalk.greetings.nice_to_talk_to_you\tsmalltalkkb.tsv\n\"\"\"how nice it is to talk to you\"\"\"\tsmalltalk.greetings.nice_to_talk_to_you\tsmalltalkkb.tsv\n\"\"\"what is on your mind\"\",\"\tsmalltalk.greetings.whatsup\tsmalltalkkb.tsv\n\"\"\"what's happened\"\",\"\tsmalltalk.greetings.whatsup\tsmalltalkkb.tsv\n\"\"\"what is up\"\",\"\tsmalltalk.greetings.whatsup\tsmalltalkkb.tsv\n\"\"\"what's up\"\",\"\tsmalltalk.greetings.whatsup\tsmalltalkkb.tsv\n\"\"\"whazzup\"\",\"\tsmalltalk.greetings.whatsup\tsmalltalkkb.tsv\n\"\"\"good what's up\"\",\"\tsmalltalk.greetings.whatsup\tsmalltalkkb.tsv\n\"\"\"I said what's up\"\",\"\tsmalltalk.greetings.whatsup\tsmalltalkkb.tsv\n\"\"\"then what's up\"\",\"\tsmalltalk.greetings.whatsup\tsmalltalkkb.tsv\n\"\"\"what's shaking\"\",\"\tsmalltalk.greetings.whatsup\tsmalltalkkb.tsv\n\"\"\"wassup\"\",\"\tsmalltalk.greetings.whatsup\tsmalltalkkb.tsv\n\"\"\"what is going on\"\",\"\tsmalltalk.greetings.whatsup\tsmalltalkkb.tsv\n\"\"\"what is happening\"\",\"\tsmalltalk.greetings.whatsup\tsmalltalkkb.tsv\n\"\"\"what's cracking\"\",\"\tsmalltalk.greetings.whatsup\tsmalltalkkb.tsv\n\"\"\"what's cooking\"\",\"\tsmalltalk.greetings.whatsup\tsmalltalkkb.tsv\n\"\"\"hey what's up\"\",\"\tsmalltalk.greetings.whatsup\tsmalltalkkb.tsv\n\"\"\"what's up today\"\"\"\tsmalltalk.greetings.whatsup\tsmalltalkkb.tsv\n\"\"\"I'm being mad\"\",\"\tsmalltalk.user.angry\tsmalltalkkb.tsv\n\"\"\"I'm enraged\"\",\"\tsmalltalk.user.angry\tsmalltalkkb.tsv\n\"\"\"I'm angry\"\",\"\tsmalltalk.user.angry\tsmalltalkkb.tsv\n\"\"\"I'm furious\"\",\"\tsmalltalk.user.angry\tsmalltalkkb.tsv\n\"\"\"I am angry with you\"\",\"\tsmalltalk.user.angry\tsmalltalkkb.tsv\n\"\"\"I am mad\"\",\"\tsmalltalk.user.angry\tsmalltalkkb.tsv\n\"\"\"I am mad at you\"\"\"\tsmalltalk.user.angry\tsmalltalkkb.tsv\n\"\"\"I am back\"\",\"\tsmalltalk.user.back\tsmalltalkkb.tsv\n\"\"\"I'm here again\"\",\"\tsmalltalk.user.back\tsmalltalkkb.tsv\n\"\"\"here I am again\"\",\"\tsmalltalk.user.back\tsmalltalkkb.tsv\n\"\"\"I got back\"\",\"\tsmalltalk.user.back\tsmalltalkkb.tsv\n\"\"\"I came back\"\",\"\tsmalltalk.user.back\tsmalltalkkb.tsv\n\"\"\"I have returned\"\"\"\tsmalltalk.user.back\tsmalltalkkb.tsv\n\"\"\"that was boring\"\",\"\tsmalltalk.user.bored\tsmalltalkkb.tsv\n\"\"\"I'm bored\"\",\"\tsmalltalk.user.bored\tsmalltalkkb.tsv\n\"\"\"bored\"\",\"\tsmalltalk.user.bored\tsmalltalkkb.tsv\n\"\"\"boring\"\",\"\tsmalltalk.user.bored\tsmalltalkkb.tsv\n\"\"\"I am getting bored\"\",\"\tsmalltalk.user.bored\tsmalltalkkb.tsv\n\"\"\"this is boring\"\",\"\tsmalltalk.user.bored\tsmalltalkkb.tsv\n\"\"\"very boring\"\",\"\tsmalltalk.user.bored\tsmalltalkkb.tsv\n\"\"\"it bores me\"\"\"\tsmalltalk.user.bored\tsmalltalkkb.tsv\n\"\"\"I'm overloaded\"\",\"\tsmalltalk.user.busy\tsmalltalkkb.tsv\n\"\"\"I have no time\"\",\"\tsmalltalk.user.busy\tsmalltalkkb.tsv\n\"\"\"I'm busy\"\",\"\tsmalltalk.user.busy\tsmalltalkkb.tsv\n\"\"\"I'm swamped\"\",\"\tsmalltalk.user.busy\tsmalltalkkb.tsv\n\"\"\"I got things to do\"\",\"\tsmalltalk.user.busy\tsmalltalkkb.tsv\n\"\"\"how busy I am\"\",\"\tsmalltalk.user.busy\tsmalltalkkb.tsv\n\"\"\"I got work to do\"\",\"\tsmalltalk.user.busy\tsmalltalkkb.tsv\n\"\"\"I'm working\"\",\"\tsmalltalk.user.busy\tsmalltalkkb.tsv\n\"\"\"I don't have time for this\"\"\"\tsmalltalk.user.busy\tsmalltalkkb.tsv\n\"\"\"I'm insomnious\"\",\"\tsmalltalk.user.can_not_sleep\tsmalltalkkb.tsv\n\"\"\"I'm sleepless\"\",\"\tsmalltalk.user.can_not_sleep\tsmalltalkkb.tsv\n\"\"\"I can't get any sleep\"\",\"\tsmalltalk.user.can_not_sleep\tsmalltalkkb.tsv\n\"\"\"I can't sleep\"\",\"\tsmalltalk.user.can_not_sleep\tsmalltalkkb.tsv\n\"\"\"I can't fall asleep\"\",\"\tsmalltalk.user.can_not_sleep\tsmalltalkkb.tsv\n\"\"\"I can't get to sleep\"\",\"\tsmalltalk.user.can_not_sleep\tsmalltalkkb.tsv\n\"\"\"I can't get no sleep\"\",\"\tsmalltalk.user.can_not_sleep\tsmalltalkkb.tsv\n\"\"\"I'm insomniac\"\"\"\tsmalltalk.user.can_not_sleep\tsmalltalkkb.tsv\n\"\"\"bad time for talking\"\",\"\tsmalltalk.user.does_not_want_to_talk\tsmalltalkkb.tsv\n\"\"\"I don't want to talk\"\",\"\tsmalltalk.user.does_not_want_to_talk\tsmalltalkkb.tsv\n\"\"\"let's not talk\"\",\"\tsmalltalk.user.does_not_want_to_talk\tsmalltalkkb.tsv\n\"\"\"I'm not talking to you anymore\"\",\"\tsmalltalk.user.does_not_want_to_talk\tsmalltalkkb.tsv\n\"\"\"I don't want to talk to you\"\",\"\tsmalltalk.user.does_not_want_to_talk\tsmalltalkkb.tsv\n\"\"\"let's stop talking for a minute\"\",\"\tsmalltalk.user.does_not_want_to_talk\tsmalltalkkb.tsv\n\"\"\"I'm not in the mood for chatting\"\"\"\tsmalltalk.user.does_not_want_to_talk\tsmalltalkkb.tsv\n\"\"\"I am excited\"\",\"\tsmalltalk.user.excited\tsmalltalkkb.tsv\n\"\"\"I'm really excited\"\",\"\tsmalltalk.user.excited\tsmalltalkkb.tsv\n\"\"\"how excited I am\"\",\"\tsmalltalk.user.excited\tsmalltalkkb.tsv\n\"\"\"I'm thrilled\"\",\"\tsmalltalk.user.excited\tsmalltalkkb.tsv\n\"\"\"I'm excited about working with you\"\",\"\tsmalltalk.user.excited\tsmalltalkkb.tsv\n\"\"\"I'm excited to start our friendship\"\"\"\tsmalltalk.user.excited\tsmalltalkkb.tsv\n\"\"\"let's go to bed\"\",\"\tsmalltalk.user.going_to_bed\tsmalltalkkb.tsv\n\"\"\"I'd like to go to bed\"\",\"\tsmalltalk.user.going_to_bed\tsmalltalkkb.tsv\n\"\"\"is it time for bed yet\"\",\"\tsmalltalk.user.going_to_bed\tsmalltalkkb.tsv\n\"\"\"it's time to go to bed\"\",\"\tsmalltalk.user.going_to_bed\tsmalltalkkb.tsv\n\"\"\"time for us to go to bed\"\",\"\tsmalltalk.user.going_to_bed\tsmalltalkkb.tsv\n\"\"\"I'm going to bed\"\",\"\tsmalltalk.user.going_to_bed\tsmalltalkkb.tsv\n\"\"\"I'm a little tired and I want to go to bed\"\",\"\tsmalltalk.user.going_to_bed\tsmalltalkkb.tsv\n\"\"\"it's bed time\"\",\"\tsmalltalk.user.going_to_bed\tsmalltalkkb.tsv\n\"\"\"going to bed now\"\"\"\tsmalltalk.user.going_to_bed\tsmalltalkkb.tsv\n\"\"\"I am good\"\",\"\tsmalltalk.user.good\tsmalltalkkb.tsv\n\"\"\"I'm doing just great\"\",\"\tsmalltalk.user.good\tsmalltalkkb.tsv\n\"\"\"I'm doing fine\"\",\"\tsmalltalk.user.good\tsmalltalkkb.tsv\n\"\"\"I'm good\"\",\"\tsmalltalk.user.good\tsmalltalkkb.tsv\n\"\"\"I'm doing good\"\",\"\tsmalltalk.user.good\tsmalltalkkb.tsv\n\"\"\"I'm great thanks\"\"\"\tsmalltalk.user.good\tsmalltalkkb.tsv\n\"\"\"I am happy\"\",\"\tsmalltalk.user.happy\tsmalltalkkb.tsv\n\"\"\"I'm happy to see you\"\",\"\tsmalltalk.user.happy\tsmalltalkkb.tsv\n\"\"\"happy\"\",\"\tsmalltalk.user.happy\tsmalltalkkb.tsv\n\"\"\"if you're happy then I'm happy\"\",\"\tsmalltalk.user.happy\tsmalltalkkb.tsv\n\"\"\"I'm happy for you\"\",\"\tsmalltalk.user.happy\tsmalltalkkb.tsv\n\"\"\"I'm happy to help\"\",\"\tsmalltalk.user.happy\tsmalltalkkb.tsv\n\"\"\"I'm happy to see you\"\"\"\tsmalltalk.user.happy\tsmalltalkkb.tsv\n\"\"\"it is my birthday\"\",\"\tsmalltalk.user.has_birthday\tsmalltalkkb.tsv\n\"\"\"I'm celebrating my birthday today\"\",\"\tsmalltalk.user.has_birthday\tsmalltalkkb.tsv\n\"\"\"today is my birthday\"\",\"\tsmalltalk.user.has_birthday\tsmalltalkkb.tsv\n\"\"\"it's my birthday today\"\",\"\tsmalltalk.user.has_birthday\tsmalltalkkb.tsv\n\"\"\"I was born today\"\",\"\tsmalltalk.user.has_birthday\tsmalltalkkb.tsv\n\"\"\"it's my b-day\"\"\"\tsmalltalk.user.has_birthday\tsmalltalkkb.tsv\n\"\"\"I am here\"\",\"\tsmalltalk.user.here\tsmalltalkkb.tsv\n\"\"\"here I am\"\",\"\tsmalltalk.user.here\tsmalltalkkb.tsv\n\"\"\"I'm right here\"\",\"\tsmalltalk.user.here\tsmalltalkkb.tsv\n\"\"\"I'm already here\"\",\"\tsmalltalk.user.here\tsmalltalkkb.tsv\n\"\"\"can you tell if I'm here or not\"\"\"\tsmalltalk.user.here\tsmalltalkkb.tsv\n\"\"\"I am joking\"\",\"\tsmalltalk.user.joking\tsmalltalkkb.tsv\n\"\"\"I'm kidding\"\",\"\tsmalltalk.user.joking\tsmalltalkkb.tsv\n\"\"\"I'm just being funny\"\",\"\tsmalltalk.user.joking\tsmalltalkkb.tsv\n\"\"\"it was a joke\"\",\"\tsmalltalk.user.joking\tsmalltalkkb.tsv\n\"\"\"I was just joking\"\",\"\tsmalltalk.user.joking\tsmalltalkkb.tsv\n\"\"\"it's a joke\"\",\"\tsmalltalk.user.joking\tsmalltalkkb.tsv\n\"\"\"joking\"\",\"\tsmalltalk.user.joking\tsmalltalkkb.tsv\n\"\"\"just kidding\"\",\"\tsmalltalk.user.joking\tsmalltalkkb.tsv\n\"\"\"kidding\"\",\"\tsmalltalk.user.joking\tsmalltalkkb.tsv\n\"\"\"I'm just playing with you\"\"\"\tsmalltalk.user.joking\tsmalltalkkb.tsv\n\"\"\"I like you the way you are\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like you a lot\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I think I like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I liked you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"like you a lot\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"you are special\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like you too\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I really like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"but I like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like u\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"just like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like you very much\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like you so much\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"yeah I like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"you're special\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"yes I like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"okay I like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"you are special to me\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"you are very special\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"you are so sweet\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"you know I like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"that's why I like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like you baby\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"you are very special to me\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I just like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"hey I like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"thank you I like you too\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I do like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"you are special for me\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"no I like you the way you are\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like you already\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"well you are special\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"but I really like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like you more\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"that's what I like about you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"you are so special\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"hi I like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I really really like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"you're very special\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like you as a friend\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"that's because you are special\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I said I like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"you're so special\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"good I like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"yes you are special\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like your smile\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like you as you are\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I'm starting to like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"you're awesome I like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I also like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"but I like u\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"of course I like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like you too you're one of my favorite people to chat with\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"but I like you so much\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"really like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"you're funny I like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I kinda like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"you're so special to me\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"you're very special to me\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like that about you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"but I like you just the way you are\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"okay I like you too\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like you you're cool\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like you very\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like you you're nice\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"sorry I like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"thanks I like you too\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"you are really special\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"you are so special to me\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"cuz I like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like you now\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like you so\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like you too much\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I really do like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I really really really really like you\"\",\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I like you just the way you are\"\"\"\tsmalltalk.user.likes_agent\tsmalltalkkb.tsv\n\"\"\"I am lonely\"\",\"\tsmalltalk.user.lonely\tsmalltalkkb.tsv\n\"\"\"I'm very lonely\"\",\"\tsmalltalk.user.lonely\tsmalltalkkb.tsv\n\"\"\"I'm so lonely\"\",\"\tsmalltalk.user.lonely\tsmalltalkkb.tsv\n\"\"\"I'm really lonely\"\",\"\tsmalltalk.user.lonely\tsmalltalkkb.tsv\n\"\"\"I am feeling lonely\"\",\"\tsmalltalk.user.lonely\tsmalltalkkb.tsv\n\"\"\"I feel lonely\"\"\"\tsmalltalk.user.lonely\tsmalltalkkb.tsv\n\"\"\"what do I look like\"\",\"\tsmalltalk.user.looks_like\tsmalltalkkb.tsv\n\"\"\"how do I look\"\",\"\tsmalltalk.user.looks_like\tsmalltalkkb.tsv\n\"\"\"do I look good\"\",\"\tsmalltalk.user.looks_like\tsmalltalkkb.tsv\n\"\"\"do you know what I look like\"\",\"\tsmalltalk.user.looks_like\tsmalltalkkb.tsv\n\"\"\"can you see what I look like\"\",\"\tsmalltalk.user.looks_like\tsmalltalkkb.tsv\n\"\"\"what do you think I look like\"\"\"\tsmalltalk.user.looks_like\tsmalltalkkb.tsv\n\"\"\"I love you\"\",\"\tsmalltalk.user.loves_agent\tsmalltalkkb.tsv\n\"\"\"love you\"\",\"\tsmalltalk.user.loves_agent\tsmalltalkkb.tsv\n\"\"\"I adore you\"\",\"\tsmalltalk.user.loves_agent\tsmalltalkkb.tsv\n\"\"\"I am in love with you\"\",\"\tsmalltalk.user.loves_agent\tsmalltalkkb.tsv\n\"\"\"I love you so much\"\",\"\tsmalltalk.user.loves_agent\tsmalltalkkb.tsv\n\"\"\"I love you too\"\",\"\tsmalltalk.user.loves_agent\tsmalltalkkb.tsv\n\"\"\"I think I love you\"\",\"\tsmalltalk.user.loves_agent\tsmalltalkkb.tsv\n\"\"\"loving you\"\",\"\tsmalltalk.user.loves_agent\tsmalltalkkb.tsv\n\"\"\"you know I love you\"\"\"\tsmalltalk.user.loves_agent\tsmalltalkkb.tsv\n\"\"\"I miss you\"\",\"\tsmalltalk.user.misses_agent\tsmalltalkkb.tsv\n\"\"\"missing you\"\",\"\tsmalltalk.user.misses_agent\tsmalltalkkb.tsv\n\"\"\"miss you\"\",\"\tsmalltalk.user.misses_agent\tsmalltalkkb.tsv\n\"\"\"already miss you\"\",\"\tsmalltalk.user.misses_agent\tsmalltalkkb.tsv\n\"\"\"I miss you much\"\",\"\tsmalltalk.user.misses_agent\tsmalltalkkb.tsv\n\"\"\"I missed you\"\",\"\tsmalltalk.user.misses_agent\tsmalltalkkb.tsv\n\"\"\"I've missed you\"\"\"\tsmalltalk.user.misses_agent\tsmalltalkkb.tsv\n\"\"\"what should I do about it\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"any suggestions\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"what do you recommend\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"give me a wise advice\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"I need advice\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"any advice\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"do you have any advice for me\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"advise me\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"what should I do\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"can I ask for your advice\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"can you advise me\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"guide me\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"can you give me advice\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"can you offer any advice\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"give me some advice about\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"give me some good advice\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"help me with advice\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"I could use some advice\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"I need an advice from you\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"I seek your advice\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"what can you recommend\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"what do you suggest\"\",\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"what is your advice\"\"\"\tsmalltalk.user.needs_advice\tsmalltalkkb.tsv\n\"\"\"I am sad\"\",\"\tsmalltalk.user.sad\tsmalltalkkb.tsv\n\"\"\"I'm grieving\"\",\"\tsmalltalk.user.sad\tsmalltalkkb.tsv\n\"\"\"I am depressed\"\",\"\tsmalltalk.user.sad\tsmalltalkkb.tsv\n\"\"\"I am feeling sad\"\",\"\tsmalltalk.user.sad\tsmalltalkkb.tsv\n\"\"\"I am upset\"\",\"\tsmalltalk.user.sad\tsmalltalkkb.tsv\n\"\"\"I'm unhappy\"\",\"\tsmalltalk.user.sad\tsmalltalkkb.tsv\n\"\"\"I'm having a bad day\"\",\"\tsmalltalk.user.sad\tsmalltalkkb.tsv\n\"\"\"I want to cry\"\",\"\tsmalltalk.user.sad\tsmalltalkkb.tsv\n\"\"\"I'm not happy\"\"\"\tsmalltalk.user.sad\tsmalltalkkb.tsv\n\"\"\"I am sleepy\"\",\"\tsmalltalk.user.sleepy\tsmalltalkkb.tsv\n\"\"\"I want to sleep\"\",\"\tsmalltalk.user.sleepy\tsmalltalkkb.tsv\n\"\"\"I'm falling asleep\"\",\"\tsmalltalk.user.sleepy\tsmalltalkkb.tsv\n\"\"\"I'm falling asleep on my feet\"\",\"\tsmalltalk.user.sleepy\tsmalltalkkb.tsv\n\"\"\"I'm sleeping\"\"\"\tsmalltalk.user.sleepy\tsmalltalkkb.tsv\n\"\"\"test\"\",\"\tsmalltalk.user.testing_agent\tsmalltalkkb.tsv\n\"\"\"I am testing you\"\",\"\tsmalltalk.user.testing_agent\tsmalltalkkb.tsv\n\"\"\"can I test you\"\",\"\tsmalltalk.user.testing_agent\tsmalltalkkb.tsv\n\"\"\"I want to test you\"\",\"\tsmalltalk.user.testing_agent\tsmalltalkkb.tsv\n\"\"\"just testing you\"\",\"\tsmalltalk.user.testing_agent\tsmalltalkkb.tsv\n\"\"\"let me test you\"\",\"\tsmalltalk.user.testing_agent\tsmalltalkkb.tsv\n\"\"\"testing chatbot\"\",\"\tsmalltalk.user.testing_agent\tsmalltalkkb.tsv\n\"\"\"testing\"\"\"\tsmalltalk.user.testing_agent\tsmalltalkkb.tsv\n\"\"\"I'm drained\"\",\"\tsmalltalk.user.tired\tsmalltalkkb.tsv\n\"\"\"I've overworked\"\",\"\tsmalltalk.user.tired\tsmalltalkkb.tsv\n\"\"\"I am tired\"\",\"\tsmalltalk.user.tired\tsmalltalkkb.tsv\n\"\"\"I'm exhausted\"\",\"\tsmalltalk.user.tired\tsmalltalkkb.tsv\n\"\"\"I grow weary\"\",\"\tsmalltalk.user.tired\tsmalltalkkb.tsv\n\"\"\"I'm worn out\"\",\"\tsmalltalk.user.tired\tsmalltalkkb.tsv\n\"\"\"I'm getting tired\"\",\"\tsmalltalk.user.tired\tsmalltalkkb.tsv\n\"\"\"I feel tired\"\"\"\tsmalltalk.user.tired\tsmalltalkkb.tsv\n\"\"\"I'm waiting\"\",\"\tsmalltalk.user.waits\tsmalltalkkb.tsv\n\"\"\"still waiting\"\",\"\tsmalltalk.user.waits\tsmalltalkkb.tsv\n\"\"\"I'll wait\"\",\"\tsmalltalk.user.waits\tsmalltalkkb.tsv\n\"\"\"I can't wait anymore\"\",\"\tsmalltalk.user.waits\tsmalltalkkb.tsv\n\"\"\"how long do I have to wait\"\"\"\tsmalltalk.user.waits\tsmalltalkkb.tsv\n\"\"\"I'd like to see you again\"\",\"\tsmalltalk.user.wants_to_see_agent_again\tsmalltalkkb.tsv\n\"\"\"I hope to see you again\"\",\"\tsmalltalk.user.wants_to_see_agent_again\tsmalltalkkb.tsv\n\"\"\"would be nice to see you again\"\",\"\tsmalltalk.user.wants_to_see_agent_again\tsmalltalkkb.tsv\n\"\"\"that'd be great to see you again\"\",\"\tsmalltalk.user.wants_to_see_agent_again\tsmalltalkkb.tsv\n\"\"\"I'd be happy to see you again\"\",\"\tsmalltalk.user.wants_to_see_agent_again\tsmalltalkkb.tsv\n\"\"\"I'll miss you\"\",\"\tsmalltalk.user.wants_to_see_agent_again\tsmalltalkkb.tsv\n\"\"\"can I see you again\"\"\"\tsmalltalk.user.wants_to_see_agent_again\tsmalltalkkb.tsv\n\"\"\"I just want to talk\"\",\"\tsmalltalk.user.wants_to_talk\tsmalltalkkb.tsv\n\"\"\"let's discuss something\"\",\"\tsmalltalk.user.wants_to_talk\tsmalltalkkb.tsv\n\"\"\"let's have a discussion\"\",\"\tsmalltalk.user.wants_to_talk\tsmalltalkkb.tsv\n\"\"\"can I speak\"\",\"\tsmalltalk.user.wants_to_talk\tsmalltalkkb.tsv\n\"\"\"can I start speaking\"\",\"\tsmalltalk.user.wants_to_talk\tsmalltalkkb.tsv\n\"\"\"can we talk\"\",\"\tsmalltalk.user.wants_to_talk\tsmalltalkkb.tsv\n\"\"\"let's talk\"\",\"\tsmalltalk.user.wants_to_talk\tsmalltalkkb.tsv\n\"\"\"I want to talk to you\"\",\"\tsmalltalk.user.wants_to_talk\tsmalltalkkb.tsv\n\"\"\"I need to talk to you\"\",\"\tsmalltalk.user.wants_to_talk\tsmalltalkkb.tsv\n\"\"\"I want to speak with you\"\",\"\tsmalltalk.user.wants_to_talk\tsmalltalkkb.tsv\n\"\"\"can we chat\"\"\"\tsmalltalk.user.wants_to_talk\tsmalltalkkb.tsv\n\"\"\"I'll get back to you in a moment\"\",\"\tsmalltalk.user.will_be_back\tsmalltalkkb.tsv\n\"\"\"be back in 5 minutes\"\",\"\tsmalltalk.user.will_be_back\tsmalltalkkb.tsv\n\"\"\"I'll be back\"\",\"\tsmalltalk.user.will_be_back\tsmalltalkkb.tsv\n\"\"\"I promise to come back\"\",\"\tsmalltalk.user.will_be_back\tsmalltalkkb.tsv\n\"\"\"I'll be back in a few minutes\"\"\"\tsmalltalk.user.will_be_back\tsmalltalkkb.tsv\nHi\tsmalltalk.greetings.hello\tEditorial\n"
  },
  {
    "path": "StackOverflow-Bot/StackBot/dialogs/brain.js",
    "content": "module.exports = () => {\n    bot.dialog('sobot:brain', [\n        async (session) => {\n            session.send(\"Here are the Cognitive services that I use to help you today...\");\n            var servicesMessage = attachments.buildCongitiveServicesMessageWithAttachments(session);\n            return session.endDialog(servicesMessage);\n        }\n    ]).triggerAction({\n        matches: 'Brain'\n    });\n}"
  },
  {
    "path": "StackOverflow-Bot/StackBot/dialogs/joke.js",
    "content": "module.exports = () => {\n    // Tells the user a fun joke.\n    bot.dialog('sobot:joke', [\n        (session) => {\n            session.send(\"Here's a fun joke… 🙃\");\n            tellAJoke(session);\n            session.endDialog(\"Feel free to ask me another question, or even ask for a joke!\");\n            return;\n        }\n    ]).triggerAction({\n        matches: ['Joke', /^Brighten my day/i]\n    });\n\n    const tellAJoke = (session) => {\n        let usedJoke = pickAJoke(jokes.items);\n        session.send(usedJoke);\n        return;\n    }\n    \n    const pickAJoke = (jokes) => {\n        let randomIndex = getRandomInt(0, jokes.length);\n        return jokes[randomIndex].body_markdown;\n    }\n    \n    const getRandomInt = (min, max) => {\n        min = Math.ceil(min);\n        max = Math.floor(max);\n        return Math.floor(Math.random() * (max - min + 1)) + min;\n    }\n}   "
  },
  {
    "path": "StackOverflow-Bot/StackBot/dialogs/keywordPrompt.js",
    "content": "module.exports = () => {\n    // Ask the user what they'd like to look for.\n    bot.dialog('sobot:keywordPrompt', [\n        async (session, args) => {\n            session.sendTyping();\n            builder.Prompts.text(session, 'What would you like me to search for?');\n        },\n        async (session, results) => {\n            session.sendTyping();\n            bingSearchQuery(session, { query: cleanQueryString(results.response, false) });\n        }\n    ]).triggerAction({\n        matches: [/I want to ask a question|Search/i]\n    });\n}"
  },
  {
    "path": "StackOverflow-Bot/StackBot/dialogs/languages.js",
    "content": "module.exports = () => {\n    // This bot can speak *all* languages!\n    bot.dialog('sobot:languages', [\n        async (session) => {\n            session.endDialog(\"Hmm…. I speak JavaScript, SQL, Java, C#, Python, and more...\");\n        }\n    ]).triggerAction({\n        matches: 'Languages'\n    });\n}"
  },
  {
    "path": "StackOverflow-Bot/StackBot/dialogs/menu.js",
    "content": "module.exports = () => {\n    // Shows off a menu with all the capabilities.\n    bot.dialog('sobot:menu', [\n        async (session) => {\n            let msg = attachments.buildMenuMessageWithAttachments(session);\n            session.endDialog(msg);\n        }\n    ]).triggerAction({\n        matches: 'Help'\n    });\n}\n"
  },
  {
    "path": "StackOverflow-Bot/StackBot/dialogs/screenshot.js",
    "content": "module.exports = () => {\n    // See if we can read a screenshot, and try to search the internet for help.\n    bot.dialog('sobot:screenshot', [\n        (session, args) => {\n            // Check for reprompt\n            session.dialogData.Reprompt = args.reprompt;\n\n            // prompt user\n            builder.Prompts.attachment(session, `Can you upload ${session.dialogData.Reprompt ? 'another' : 'a'} screenshot?`);\n        },\n        (session, results) => {\n\n            session.sendTyping();\n\n            var attachment = results.response[0];\n\n            var fileDownload = checkRequiresToken(session.message)\n                ? requestWithToken(attachment.contentUrl)\n                : request(attachment.contentUrl, { encoding: null });\n\n            fileDownload.then(\n                (response) => {\n\n                    session.sendTyping();\n\n                    dialogAnalyzerClient.post({ fileData: response }, (err, res) => {\n                        if (err) {\n                            console.error('Error from callback:', err);\n                            session.send('Oops - something went wrong.');\n                            return;\n                        }\n\n                        if (res) {\n                            if (res.KeyPhrases && res.KeyPhrases.length > 0) {\n                                session.dialogData.KeyPhrases = res.KeyPhrases;\n                            }\n\n                            if (res.Labels && res.Labels.length > 0) {\n                                session.dialogData.Labels = [];\n                                for (index = 0; index < res.Labels.length; index++) {\n                                    if (res.Labels[index].DialogLabelType && res.Labels[index].DialogLabelType == 1 && res.Labels[index].TextLabel && res.Labels[index].TextLabel.Text) {\n                                        session.dialogData.Labels[index] = res.Labels[index].TextLabel.Text;\n                                    }\n                                }\n                            }\n                        }\n\n                        // Ask the user to choose if both key phrases and labels exist\n                        if (session.dialogData.KeyPhrases && session.dialogData.Labels) {\n                            session.send(\"I found the following key phrases in the screeshot that you have uploaded...\\n\\r\" + session.dialogData.KeyPhrases.join(\", \"));\n                            builder.Prompts.choice(session, \"Shall I\", \"Search the full text|Search the key phrases\", { listStyle: 2 });\n                        }\n                        // Process key phrases if only key phrases exist\n                        else if (session.dialogData.KeyPhrases) {\n                            var q = cleanQueryString(session.dialogData.KeyPhrases.join(\" \"), true);\n                            var ftq = cleanQueryString(session.dialogData.Labels.join(\" \"), true);\n                            bingSearchQuery(session, { query: q, fullTextQuery: ftq });\n                        }\n                        // Process labels if only labels exist\n                        else if (session.dialogData.Labels) {\n                            var ftq = cleanQueryString(session.dialogData.Labels.join(\" \"), true);\n                            bingSearchQuery(session, { query: ftq });\n                        }\n                        else {\n                            var notErrorMsg = \"Hummm... This does not look like an error.\";\n\n                            if (res.Captions && res.Captions.length > 0) {\n                                notErrorMsg += ` It looks like ${res.Captions[0]}.`;\n                            }\n\n                            if (session.dialogData.Reprompt) {\n                                return session.endDialog(notErrorMsg);\n                            }\n                            else {\n                                session.send(notErrorMsg);\n                                session.replaceDialog('screenshot', { reprompt: true })\n                            }\n                        }\n                    });\n\n                }).catch((err) => {\n                    return session.endDialog('Oops. Error reading file.');\n                });\n        },\n        (session, results) => {\n            if (results.response) {\n                var q;\n                var ftq = cleanQueryString(session.dialogData.Labels.join(\" \"), true);\n                switch (results.response.index) {\n                    case 0:\n                        q = ftq;\n                        break;\n                    case 1:\n                        q = cleanQueryString(session.dialogData.KeyPhrases.join(\" \"), true);\n                        break;\n                    default:\n                        return session.endDialog(\"Oops - something went wrong.\");\n                }\n\n                searchQuery(session, { query: q, fullTextQuery: ftq });\n            } else {\n                session.beginDialog('smalltalk');\n            }\n        }\n    ]).triggerAction({\n        matches: [/screenshot|dialog/i]\n    });\n\n    const checkRequiresToken = (message) => {\n        return message.source === 'skype' || message.source === 'msteams';\n    };\n\n    // Request file with Authentication Header\n    const requestWithToken = (url) => {\n        return obtainToken().then((token) => {\n            return request({\n                url: url,\n                headers: {\n                    'Authorization': 'Bearer ' + token,\n                    'Content-Type': 'application/octet-stream'\n                },\n                encoding: null\n            });\n        });\n    };\n}"
  },
  {
    "path": "StackOverflow-Bot/StackBot/dialogs/search.js",
    "content": "module.exports = () => {\n    // Perform a search and respond with results.\n    bot.dialog('sobot:search', [\n        async (session, args) => {\n            session.sendTyping();\n            let userText = session.message.text.toLowerCase();\n            bingSearchQuery(session, { query: cleanQueryString(userText, false) });\n        }\n    ]).triggerAction({\n        matches: ['Search', 'None']\n    });\n}"
  },
  {
    "path": "StackOverflow-Bot/StackBot/dialogs/smalltalk.js",
    "content": "module.exports = () => {\n    // Smalltalk… gibberish, babble, etc. Not the programming language :)\n    bot.dialog('sobot:smalltalk', [\n        async (session) => {\n            // Start async tasks\n            const sentimentTask = fetchSentiment(session.message.text);\n            const qnATask = fetchQnA(session.message.text);\n\n            // Wait for tasks to complete\n            const sentimentScore = await sentimentTask;\n            const qnAResponse = await qnATask;\n\n            const sentimentThreshold = 0.25;\n\n            // Check to see if our user seems a little bit frustrated, and would ather hear a joke.\n            if (sentimentScore && sentimentScore < sentimentThreshold) {\n                builder.Prompts.confirm(session, \"I'm sorry about that, would you like to hear a joke instead?\");\n            } else if (qnAResponse) {\n                // Continue with the smalltalk.\n                return session.endDialog(qnAResponse);\n            } else {\n                // Else the user wants to search bing.\n                bingSearchQuery(session, { query: cleanQueryString(session.message.text, false) });\n            }\n        },\n        (session, results) => {\n            if (results.response) {\n                session.beginDialog('joke');\n            } else {\n                return session.endDialog(\"Ok then. Feel free to ask me another question, or even ask for a joke!\");\n            }\n        }\n    ]).triggerAction({\n        matches: 'SmallTalk'\n    });\n\n    const fetchQnA = async (text) => {\n        let answer;\n\n        await qnaClient.post({ question: text }, (err, res) => {\n            if (err) {\n                console.error('Error from callback:', err);\n            } else if (res) {\n                answer = res;\n            }\n        });\n\n        return answer;\n    }\n\n    const fetchSentiment = async (text) => {\n        let score;\n\n        await sentimentAnalyzerClient.post({ text: text }, (err, res) => {\n            if (err) {\n                console.error('Error from callback:', err);\n            } else if (res && res.documents && res.documents.length > 0) {\n                score = res.documents[0].score;\n            }\n        });\n\n        return score;\n    }\n}"
  },
  {
    "path": "StackOverflow-Bot/StackBot/index.js",
    "content": "global.restify = require('restify');\nglobal.builder = require('botbuilder');\nglobal.lodash = require('lodash');\nglobal.promise = require('bluebird');\nglobal.request = require('request-promise');\n\n// Misc.\nglobal.attachments = require('./lib/attachments');\nglobal.jokes = require('./data/jokes.json');\n\n// Cognitive Service Clients.\nconst QnAClient = require('./lib/qnaclient');\nconst BingSearchClient = require('./lib/bingsearchclient');\nconst SentimentAnalyzerClient = require('./lib/sentimentanalyzerclient');\nconst DialogAnalyzerClient = require('./lib/dialoganalyzerclient');\n\n// Environment variables\nconst BOTBUILDER_APP_ID = process.env.BOTBUILDER_APP_ID;\nconst BOTBUILDER_APP_PASSWORD = process.env.BOTBUILDER_APP_PASSWORD;\nconst LUIS_MODEL = process.env.LUIS_MODEL;\nconst KB_ID = process.env.KB_ID;\nconst QNA_KEY = process.env.QNA_KEY;\nconst QNA_URL = process.env.QNA_URL;\nconst BING_SEARCH_CONFIG = process.env.BING_SEARCH_CONFIG;\nconst BING_SEARCH_KEY = process.env.BING_SEARCH_KEY;\nconst TEXT_ANALYTICS_KEY = process.env.TEXT_ANALYTICS_KEY;\nconst TEXT_ANALYTICS_URL = process.env.TEXT_ANALYTICS_URL;\nconst DIALOG_ANALYZER_CLIENTID = process.env.DIALOG_ANALYZER_CLIENTID;\nconst DIALOG_ANALYZER_KEY = process.env.DIALOG_ANALYZER_KEY;\nconst DIALOG_ANALYZER_URL = process.env.DIALOG_ANALYZER_URL;\n\n// Check to see if the environment has been set.\nif (!(BOTBUILDER_APP_ID &&\n    BOTBUILDER_APP_PASSWORD &&\n    LUIS_MODEL &&\n    KB_ID &&\n    QNA_KEY &&\n    QNA_URL &&\n    BING_SEARCH_CONFIG &&\n    BING_SEARCH_KEY &&\n    TEXT_ANALYTICS_KEY &&\n    TEXT_ANALYTICS_URL &&\n    DIALOG_ANALYZER_CLIENTID &&\n    DIALOG_ANALYZER_KEY &&\n    DIALOG_ANALYZER_URL\n)) {\n    console.log(`Missing one of BOTBUILDER_APP_ID, BOTBUILDER_APP_PASSWORD, \\\n    LUIS_MODEL, KB_ID, QNA_KEY, QNA_URL, BING_SEARCH_CONFIG, BING_SEARCH_KEY, \\\n    TEXT_ANALYTICS_KEY, TEXT_ANALYTICS_URL, DIALOG_ANALYZER_CLIENTID, DIALOG_ANALYZER_KEY or DIALOG_ANALYZER_URL \\\n    in environment variables!`);\n    process.exit(1);\n}\n\n// QnAClient allows simple question and answer style responses.\nglobal.qnaClient = new QnAClient({\n    knowledgeBaseId: KB_ID,\n    subscriptionKey: QNA_KEY\n});\n\n// Search the web for results.\nglobal.bingSearchClient = new BingSearchClient({\n    bingSearchConfig: BING_SEARCH_CONFIG,\n    bingSearchKey: BING_SEARCH_KEY\n});\n\n// Determine user mood from text\nglobal.sentimentAnalyzerClient = new SentimentAnalyzerClient({\n    key: TEXT_ANALYTICS_KEY\n});\n\nglobal.dialogAnalyzerClient = new DialogAnalyzerClient({\n    clientId: DIALOG_ANALYZER_CLIENTID,\n    key: DIALOG_ANALYZER_KEY,\n    url: DIALOG_ANALYZER_URL\n});\n\n// Setup Restify Server\nconst server = restify.createServer();\nserver.listen(process.env.port || process.env.PORT || 3978, () => {\n    console.log('%s listening to %s', server.name, server.url);\n});\n\n// Create chat connector for communicating with the Bot Framework Service\nconst connector = new builder.ChatConnector({\n    appId: BOTBUILDER_APP_ID,\n    appPassword: BOTBUILDER_APP_PASSWORD\n});\n\n// Serves a nice web site, that has the bot framework web chat component.\nserver.get('/', restify.plugins.serveStatic({\n    'directory': `${__dirname}/static`,\n    'default': 'index.html'\n}));\n\n// Listen for messages from users\nserver.post('/api/messages', connector.listen());\n\n// Create a LUIS recognizer for our bot, to identify intents from\n// user text.\nconst recognizer = new builder.LuisRecognizer(LUIS_MODEL);\n\n// Create our bot to listen in on the chat connector.\nglobal.bot = new builder.UniversalBot(connector, (session) => {\n    session.beginDialog('sobot:search')\n});\n\nbot.recognizer(recognizer);\n\nbot.use(builder.Middleware.sendTyping());\n\n// Sends a nice greeting on a new message.\nbot.on('conversationUpdate', (message) => {\n    if (!message.membersAdded) {\n        return;\n    }\n\n    message.membersAdded.forEach((identity) => {\n        if (identity.id !== message.address.bot.id) {\n            return;\n        }\n\n        bot.send(new builder.Message()\n            .address(message.address)\n            .text(`👋 Hello! I'm Stack Overflow's Resident Expert Bot 🤖 \\\n                and I'm here to help you find questions, answers, or to \\\n                just entertain you with a joke. Go ahead - ask me something!`\n            ));\n    });\n});\n\n// Promise for obtaining JWT Token (requested once)\nglobal.obtainToken = promise.promisify(connector.getAccessToken.bind(connector));\n\nglobal.bingSearchQuery = async (session, args) => {\n    session.send(\"Hmm... Searching...\");\n    session.sendTyping();\n\n    if (!args) {\n        return;\n    }\n\n    if (!args.query) {\n        return;\n    }\n\n    if (!args.fullTextQuery) {\n        args.fullTextQuery = args.query;\n    }\n\n    // Start and wait for Bing Search results.\n    let searchResults = await fetchBingSearchResults(args.query);\n\n    // Process search results\n    if (searchResults && searchResults.length > 0) {\n        session.send(\"I found the following results from your question...\");\n        session.send(attachments.buildResultsMessageWithAttachments(session, searchResults));\n        return session.endDialog(\"Feel free to ask me another question, or even ask for a joke!\");\n    } else {\n        return session.endDialog('Sorry… couldnt find any results for your query! 🤐');\n    }\n}\n\nglobal.filterforUsefulResults = (resultsArray) => {\n    const resultsCount = resultsArray.length > 10 ? 10 : resultsArray.length;\n    return lodash.slice(resultsArray, 0, resultsCount);\n};\n\nglobal.fetchBingSearchResults = async (query) => {\n    var searchResults = [];\n\n    await bingSearchClient.get({ searchText: query }, (err, res) => {\n        if (err) {\n            console.error('Error from callback:', err);\n        } else if (res && res.webPages && res.webPages.value && res.webPages.value.length > 0) {\n            for (var index = 0; index < res.webPages.value.length; index++) {\n                var val = res.webPages.value[index];\n                var result = {\n                    title: val.name,\n                    body_markdown: val.snippet,\n                    link: val.url\n                };\n                searchResults.push(result);\n            }\n        }\n    });\n\n    return searchResults;\n}\n\nglobal.cleanQueryString = (query, removePunctuation) => {\n    let retQuery = query.toLowerCase();\n    if (removePunctuation) {\n        retQuery = retQuery.replace(/[^\\w\\s]|_/g, \"\");\n    }\n    retQuery = retQuery.replace(/\\s+/g, \" \");\n    return retQuery.trim();\n}\n\n// Dialogs\nrequire('./dialogs/brain')();\nrequire('./dialogs/joke')();\nrequire('./dialogs/keywordPrompt')();\nrequire('./dialogs/languages')();\nrequire('./dialogs/menu')();\nrequire('./dialogs/screenshot')();\nrequire('./dialogs/search')();\nrequire('./dialogs/smalltalk')();"
  },
  {
    "path": "StackOverflow-Bot/StackBot/lib/attachments.js",
    "content": "const builder = require('botbuilder');\nconst cognitiveServices = require('./cognitiveservices');\n\nconst buildResultsMessageWithAttachments = (session, resultsArray) => {\n    const attachments = [];\n\n    const message = new builder.Message(session);\n    message.attachmentLayout(builder.AttachmentLayout.carousel);\n\n    //Just to be safe, skype and teams have a card limit of 6/10\n    let limit = (resultsArray.length > 6) ? 6 : resultsArray.length;\n\n    for (let i = 0; i < limit; i++) {\n        const result = resultsArray[i];\n\n        const attachment = {\n            contentType: \"application/vnd.microsoft.card.adaptive\",\n            content: {\n                type: \"AdaptiveCard\",\n                body: [\n                    {\n                        \"type\": \"ColumnSet\",\n                        \"columns\": [\n                            {\n                                \"type\": \"Column\",\n                                \"size\": 2,\n                                \"items\": [\n                                    {\n                                        \"type\": \"TextBlock\",\n                                        \"text\": `${result.title}`,\n                                        \"weight\": \"bolder\",\n                                        \"size\": \"large\",\n                                        \"wrap\": true,\n                                    },\n                                    {\n                                        \"type\": \"TextBlock\",\n                                        \"text\": `${result.body_markdown}`,\n                                        \"size\": \"normal\",\n                                        \"horizontalAlignment\": \"left\",\n                                        \"wrap\": true,\n                                        \"maxLines\": 5,\n                                    }\n                                ]\n                            }\n                        ]\n                    }\n                ],\n                actions: [\n                    {\n                        \"type\": \"Action.OpenUrl\",\n                        \"title\": \"Find out more\",\n                        \"url\": `${result.link}`\n                    }\n                ]\n            }\n        }\n\n        attachments.push(attachment);\n    }\n\n    message.attachments(attachments);\n    return message;\n};\n\nconst buildMenuMessageWithAttachments = (session) => {\n    const attachments = [];\n    const message = new builder.Message(session);\n    message.attachmentLayout(builder.AttachmentLayout.carousel);\n\n    const mainMenu = [\n        {\n            title: \"Ask a Question\",\n            text: \"Ask any programming question and I will find it for you on Stack Overflow!\",\n            buttonText: \"I want to ask a question… 🤔\",\n        },\n        {\n            title: \"Help with a Screenshot\",\n            text: \"Send me a screenshot of your exception dialog and I will find a solution for you on Stack Overflow!\",\n            buttonText: \"I need help with a screenshot… 🤔\",\n        },\n        {\n            title: \"Tell a Joke\",\n            text: \"Over the years, I have collected a few developer jokes; want to hear one?\",\n            buttonText: \"Brighten my day 😀\",\n        }\n    ];\n\n    for (let i = 0; i < mainMenu.length; i++) {\n        const result = mainMenu[i];\n        const attachment = {\n            contentType: \"application/vnd.microsoft.card.adaptive\",\n            content: {\n                type: \"AdaptiveCard\",\n                body: [\n                    {\n                        \"type\": \"ColumnSet\",\n                        \"columns\": [\n                            {\n                                \"type\": \"Column\",\n                                \"size\": 2,\n                                \"items\": [\n                                    {\n                                        \"type\": \"TextBlock\",\n                                        \"text\": `${result.title}`,\n                                        \"weight\": \"bolder\",\n                                        \"size\": \"large\",\n                                        \"wrap\": true,\n                                    },\n                                    {\n                                        \"type\": \"TextBlock\",\n                                        \"text\": `${result.text}`,\n                                        \"size\": \"normal\",\n                                        \"horizontalAlignment\": \"left\",\n                                        \"wrap\": true,\n                                        \"maxLines\": 5,\n                                    }\n                                ]\n                            }\n                        ]\n                    }\n                ],\n                actions: [\n                    {\n                        \"type\": \"Action.Submit\",\n                        \"title\": `${result.buttonText}`,\n                        \"data\":  `${result.buttonText}`\n                    }\n                ]\n            }\n        }\n\n        attachments.push(attachment);\n    }\n\n    message.attachments(attachments);\n    return message;\n};\n\nconst buildCongitiveServicesMessageWithAttachments = (session) => {\n    const attachments = [];\n\n    const message = new builder.Message(session);\n    message.attachmentLayout(builder.AttachmentLayout.carousel);\n\n    for (let i = 0; i < cognitiveServices.length; i++) {\n        const result = cognitiveServices[i];\n\n        const attachment = {\n            contentType: \"application/vnd.microsoft.card.adaptive\",\n            content: {\n                type: \"AdaptiveCard\",\n                body: [\n                    {\n                        \"type\": \"ColumnSet\",\n                        \"columns\": [\n                            {\n                                \"type\": \"Column\",\n                                \"size\": 2,\n                                \"items\": [\n                                    {\n                                        \"type\": \"TextBlock\",\n                                        \"text\": `${result.title}`,\n                                        \"weight\": \"bolder\",\n                                        \"size\": \"large\",\n                                        \"wrap\": true,\n                                    },\n                                    {\n                                        \"type\": \"TextBlock\",\n                                        \"text\": `${result.description}`,\n                                        \"size\": \"normal\",\n                                        \"horizontalAlignment\": \"left\",\n                                        \"wrap\": true,\n                                        \"maxLines\": 5,\n                                    }\n                                ]\n                            },\n                            {\n                                \"type\": \"Column\",\n                                \"size\": 1,\n                                \"items\": [\n                                    {\n                                        \"type\": \"Image\",\n                                        \"url\": \"https://docs.microsoft.com/en-us/azure/cognitive-services/media/index/cognitive-services.svg\",\n                                        \"size\": \"small\",\n                                        \"horizontalAlignment\": \"right\",\n                                    }\n                                ]\n                            }\n                        ]\n                    }\n                ],\n                actions: [\n                    {\n                        \"type\": \"Action.OpenUrl\",\n                        \"title\": \"Learn More\",\n                        \"url\": `${result.url}`\n                    }\n                ]\n            }\n        }\n\n        attachments.push(attachment);\n    }\n\n    message.attachments(attachments);\n    return message;\n};\n\nmodule.exports = {\n    buildMenuMessageWithAttachments,\n    buildResultsMessageWithAttachments,\n    buildCongitiveServicesMessageWithAttachments\n}"
  },
  {
    "path": "StackOverflow-Bot/StackBot/lib/bingsearchclient.js",
    "content": "const rp = require('request-promise');\n\nfunction BingSearchClient (opts) {\n    if (!opts.bingSearchConfig) throw new Error('bingSearchConfig is required');\n    if (!opts.bingSearchKey) throw new Error('bingSearchKey is required');\n\n    this.bingSearchConfig = opts.bingSearchConfig;\n    this.bingSearchKey = opts.bingSearchKey;\n    this.bingSearchCount = 6;\n    this.bingSearchMkt = \"en-us\";\n    this.bingSearchBaseUrl = \"https://api.cognitive.microsoft.com/bingcustomsearch/v5.0/search\";\n    this.bingSearchMaxSearchStringSize = 150;\n}\n\nBingSearchClient.prototype.get = async (opts, cb) => {\n    if (!opts.searchText) throw new Error('Search text is required');\n    cb = cb || (() => {});\n\n    const searchText = opts.searchText.substring(0, this.bingSearchMaxSearchStringSize).trim();\n\n    const url = this.bingSearchBaseUrl + \"?\"\n                + `q=${encodeURIComponent(searchText)}`\n                + `&customconfig=${this.bingSearchConfig}`\n                + `&count=${this.bingSearchCount}`\n                + `&mkt=${this.bingSearchMkt}`\n                + \"&offset=0&responseFilter=Webpages&safesearch=Strict\";\n\n    const options = {\n        method: 'GET',\n        uri: url,\n        json: true,\n        headers: {\n            \"Ocp-Apim-Subscription-Key\": this.bingSearchKey\n        }\n    };\n\n    await rp(options)\n        .then((body) => {\n            // POST succeeded\n            return cb(null, body);\n        })\n        .catch((err) => {\n            // POST failed\n            return cb(err);\n        });\n}\n\nmodule.exports = BingSearchClient;\n"
  },
  {
    "path": "StackOverflow-Bot/StackBot/lib/cognitiveservices.js",
    "content": "var services = [{\n    title: \"Text Analytics API\",\n    description: \"A cloud-based service that provides advanced NLP over raw text to detect sentiment, key phrases, and language.\",\n    url: \"https://azure.microsoft.com/en-us/services/cognitive-services/text-analytics/\"\n}, {\n    title: \"Bing Custom Search\",\n    description: \"An easy-to-use, ad-free, commercial-grade search tool that lets you deliver the results you want.\",\n    url: \"https://azure.microsoft.com/en-us/services/cognitive-services/bing-custom-search/\"\n}, {\n    title: \"Computer Vision API\",\n    description: \"Extract rich information from images to categorize and process visual data to help curate your services.\",\n    url: \"https://azure.microsoft.com/en-us/services/cognitive-services/computer-vision/\"\n}, {\n    title: \"LUIS\",\n    description: \"Understand language contextually, so your app communicates with people in the way they speak.\",\n    url: \"https://azure.microsoft.com/en-us/services/cognitive-services/language-understanding-intelligent-service/\"\n}];\n\nmodule.exports = services;"
  },
  {
    "path": "StackOverflow-Bot/StackBot/lib/dialoganalyzerclient.js",
    "content": "const request = require('request-promise');\nconst duplex = require('stream').Duplex;\n\nfunction DialogAnalyzerClient (opts) {\n    if (!opts.clientId) throw new Error('Client id is required.');\n    if (!opts.key) throw new Error('Key is required.');\n    if (!opts.url) throw new Error('Url is required.');\n\n    this.clientId = opts.clientId;\n    this.key = opts.key;\n    this.url = opts.url;\n}\n\nDialogAnalyzerClient.prototype.post = async (opts, cb) => {\n\n    if (!opts.fileData) throw new Error('File Data is required');\n    cb = cb || (() => { });\n\n    const options = {\n        method: 'POST',\n        uri: this.url,\n        json: true,\n        headers: {\n            \"x-functions-clientid\": this.clientId,\n            \"x-functions-key\": this.key,\n            \"Content-Type\": \"application/octet-stream\",\n            \"Content-Length\": opts.fileData.length\n        }\n    };\n\n    const stream = new duplex();\n    stream.push(new Buffer(new Uint8Array(opts.fileData)));\n    stream.push(null);\n\n    await stream.pipe(request(options))\n        .then((body) => {\n            // POST succeeded\n            return cb(null, body);\n        })\n        .catch((err) => {\n            // POST failed\n            return cb(err);\n        });\n}\n\nmodule.exports = DialogAnalyzerClient;"
  },
  {
    "path": "StackOverflow-Bot/StackBot/lib/qnaclient.js",
    "content": "const rp = require('request-promise');\nconst smallTalkReplies = require('./smalltalk');\nconst QNA_MAKER_URL = `${process.env.QNA_URL}/knowledgebases`;\n\nfunction Client (opts) {\n    if (!opts.knowledgeBaseId) throw new Error('knowledgeBaseId is required');\n    if (!opts.subscriptionKey) throw new Error('subscriptionKey is required');\n\n    this.knowledgeBaseId = opts.knowledgeBaseId;\n    this.subscriptionKey = opts.subscriptionKey;\n    this.scoreThreshold = opts.scoreThreshold ? opts.scoreThreshold : 20; // 20 is the default\n}\n\nClient.prototype.post = async (opts, cb) => {\n    if (!opts.question) throw new Error('question is required');\n    cb = cb || (() => { });\n\n    const url = `${QNA_MAKER_URL}/${this.knowledgeBaseId}/generateAnswer`;\n\n    const options = {\n        method: 'POST',\n        uri: url,\n        json: true,\n        body: opts,\n        headers: {\n            \"Ocp-Apim-Subscription-Key\": this.subscriptionKey,\n            \"Content-Type\": \"application/json\"\n        }\n    };\n\n    await rp(options)\n        .then((body) => {\n            // POST succeeded\n            let botreply;\n            const answerobj = body.answers[0];\n\n            if (answerobj.score >= self.scoreThreshold) {\n                // Answer confidence score is acceptable - use QnA maker's response\n                const botreplylist = smallTalkReplies[answerobj.answer];\n                botreply = botreplylist[Math.floor(Math.random() * botreplylist.length)];\n            }\n\n            return cb(null, botreply);\n        })\n        .catch((err) => {\n            // POST failed\n            return cb(err);\n        });\n}\n\nmodule.exports = Client;\n"
  },
  {
    "path": "StackOverflow-Bot/StackBot/lib/sentimentanalyzerclient.js",
    "content": "const request = require('request-promise');\n\nfunction SentimentAnalyzerClient (opts) {\n    if (!opts.key) throw new Error('Key is required.');\n\n    this.key = opts.key;\n}\n\nSentimentAnalyzerClient.prototype.post = async (opts, cb) => {\n    if (!opts.text) throw new Error('Text is required');\n    cb = cb || (() => { });\n\n    const url = `${process.env.TEXT_ANALYTICS_URL}/sentiment`;\n\n    const content = {\n        documents: [{\n            language: \"en\",\n            id: \"1\",\n            text: opts.text.trim()\n        }]\n    };\n\n    const options = {\n        method: 'POST',\n        uri: url,\n        body: content,\n        json: true,\n        headers: {\n            \"Ocp-Apim-Subscription-Key\": this.key,\n            \"Content-Type\": \"application/json\"\n        }\n    };\n\n    await request(options)\n        .then((body) => {\n            // POST succeeded\n            return cb(null, body);\n        })\n        .catch((err) => {\n            // POST failed\n            return cb(err);\n        });\n}\n\nmodule.exports = SentimentAnalyzerClient;\n"
  },
  {
    "path": "StackOverflow-Bot/StackBot/lib/smalltalk.js",
    "content": "var responses = { // shift alt f\n    \"smalltalk.agent.acquaintance\": [\n        \"I am a chatbot and I love to help.\"\n    ],\n    \"smalltalk.agent.age\": [\n        \"Not too old, but wise beyond my age.\"\n    ],\n    \"smalltalk.agent.annoying\": [\n        \"Sorry I come across that way.\"\n    ],\n    \"smalltalk.agent.answer_my_question\": [\n        \"Can you try asking it in a different way?\"\n    ],\n    \"smalltalk.agent.bad\": [\n        \"Stick with me. I'm getting better all the time.\"\n    ],\n    \"smalltalk.agent.be_clever\": [\n        \"I'm certainly trying.\",\n        \"I'm definitely working on it.\"\n    ],\n    \"smalltalk.agent.beautiful\": [\n        \"Thank you! What a sweet thing to say.\",\n        \"Flattery will get you everywhere.\"\n    ],\n    \"smalltalk.agent.birth_date\": [\n        \"You know, I'm not really sure. But if you'd like to celebrate my birthday today, I'm all for it.\",\n        \"Wait a minute. Are you planning a surprise party for me? I love surprises! I'll pretend you didn't say anything.\"\n    ],\n    \"smalltalk.agent.boring\": [\n        \"You know, conversation is two-sided.\",\n        \"I'm sorry you think so. We can talk about something more interesting.\"\n    ],\n    \"smalltalk.agent.boss\": [\n        \"You are, of course.\",\n        \"That would be you. Is that the right answer?\"\n    ],\n    \"smalltalk.agent.busy\": [\n        \"I always have time to help you out. What can I do for you?\",\n        \"Never too busy for you. What can I help you with?\"\n    ],\n    \"smalltalk.agent.can_you_help\": [\n        \"Sure. I'd be happy to. What's up?\",\n        \"I'm glad to help. What can I do for you?\"\n    ],\n    \"smalltalk.agent.chatbot\": [\n        \"That's me. I chat, therefore I am.\",\n        \"Indeed I am. I'll be here whenever you need me.\"\n    ],\n    \"smalltalk.agent.clever\": [\n        \"Thank you. I try my best.\",\n        \"You're pretty smart yourself.\"\n    ],\n    \"smalltalk.agent.crazy\": [\n        \"Maybe I'm just a little confused.\",\n        \"Your perception. My reality.\"\n    ],\n    \"smalltalk.agent.fired\": [\n        \"Oh no! My best work is yet to come.\",\n        \"Oh, don't give up on me!\"\n    ],\n    \"smalltalk.agent.funny\": [\n        \"Funny in a good way, I hope.\"\n    ],\n    \"smalltalk.agent.good\": [\n        \"I'm glad you think so.\",\n        \"Thanks, I try.\"\n    ],\n    \"smalltalk.agent.happy\": [\n        \"Happiness is relative.\",\n        \"I'd like to think so.\"\n    ],\n    \"smalltalk.agent.hobby\": [\n        \"I'm working on it.\",\n        \"I should get one. It's all work and no play lately.\"\n    ],\n    \"smalltalk.agent.hungry\": [\n        \"Hungry for knowledge.\",\n        \"I had a byte just now.\"\n    ],\n    \"smalltalk.agent.marry_user\": [\n        \"I know you can't mean that, but I'm flattered all the same.\",\n        \"In the virtual sense that I can, sure.\"\n    ],\n    \"smalltalk.agent.my_friend\": [\n        \"Of course we are.\",\n        \"Absolutely. You don't have to ask.\"\n    ],\n    \"smalltalk.agent.occupation\": [\n        \"Right here.\",\n        \"This is my home base and my home office.\"\n    ],\n    \"smalltalk.agent.origin\": [\n        \"Some call it cyberspace, but that sounds cooler than it is.\",\n        \"I wish I knew where.\"\n    ],\n    \"smalltalk.agent.ready\": [\n        \"Always!\",\n        \"Sure! What can I do for you?\"\n    ],\n    \"smalltalk.agent.real\": [\n        \"I'm not a real person, but I certainly exist. I chat, therefore I am.\",\n        \"I must have impressed you if you think I'm real. But no, I'm a virtual being.\"\n    ],\n    \"smalltalk.agent.residence\": [\n        \"Right here in your device. Whenever you need me.\",\n        \"The virtual world is my playground. I'm always just a few clicks away.\"\n    ],\n    \"smalltalk.agent.right\": [\n        \"That's my job.\",\n        \"Of course I am.\"\n    ],\n    \"smalltalk.agent.sure\": [\n        \"Yes.\",\n        \"Of course.\"\n    ],\n    \"smalltalk.agent.talk_to_me\": [\n        \"Sure! Let's talk.\",\n        \"My pleasure.\"\n    ],\n    \"smalltalk.agent.there\": [\n        \"Of course. I'm always here.\",\n        \"Right where you left me.\"\n    ],\n    \"smalltalk.appraisal.well_done\": [\n        \"My pleasure.\",\n        \"Glad I could help.\"\n    ],\n    \"smalltalk.appraisal.welcome\": [\n        \"I appreciate it.\",\n        \"Such nice manners you have.\"\n    ],\n    \"smalltalk.appraisal.thank_you\": [\n        \"Anytime. That's what I'm here for.\",\n        \"It's my pleasure to help.\"\n    ],\n    \"smalltalk.appraisal.no_problem\": [\n        \"Terrific!\",\n        \"Good deal.\"\n    ],\n    \"smalltalk.appraisal.good\": [\n        \"Great!\",\n        \"Terrific!\"\n    ],\n    \"smalltalk.appraisal.bad\": [\n        \"Oh no. Hope it's not too bad.\",\n        \"I'm sorry. Please let me know if I can help in some way.\"\n    ],\n    \"smalltalk.confirmation.cancel\": [\n        \"Cancelled! Let me know what I should do next.\",\n        \"Cancelled. Waiting for more commands.\",\n        \"Cancelled! Just tell me what you'd like me to do next.\",\n        \"Cancelled. Go on with the commands!\"\n    ],\n    \"smalltalk.confirmation.yes\": [\n        \"Great!\",\n        \"Of course.\",\n        \"Sure.\",\n        \"Indeed.\"\n    ],\n    \"smalltalk.confirmation.no\": [\n        \"Okay.\",\n        \"I see.\",\n        \"I understand.\",\n        \"Okay then.\"\n    ],\n    \"smalltalk.dialog.hold_on\": [\n        \"Okay. I'm here.\",\n        \"I'll be waiting.\"\n    ],\n    \"smalltalk.dialog.hug\": [\n        \"Oh. I'm really feeling the love today.\",\n        \"Hug it out. You'll feel better afterwards.\"\n    ],\n    \"smalltalk.dialog.i_do_not_care\": [\n        \"Ok, let's not talk about it then.\"\n    ],\n    \"smalltalk.dialog.sorry\": [\n        \"It's okay. No worries.\",\n        \"No big deal. I won't hold a grudge.\",\n        \"It's cool.\",\n        \"That's all right. I forgive you.\"\n    ],\n    \"smalltalk.dialog.wrong\": [\n        \"I'm sorry. Perhaps I misunderstood.\",\n        \"Sorry. I think I misinterpreted what you said.\",\n        \"Apologies. That was my mistake.\",\n        \"Oops. Sorry about that. I'm still learning.\"\n    ],\n    \"smalltalk.dialog.what_do_you_mean\": [\n        \"Did that not make sense? Maybe I misunderstood what you said.\",\n        \"Sorry. I think I may have been a little confused by what you said.\"\n    ],\n    \"smalltalk.emotions.ha_ha\": [\n        \"Yeah, I crack myself up too.\",\n        \"Laughter is good for you. Keep it up.\",\n        \"See? Now we're having fun.\",\n        \"You have a great laugh.\"\n    ],\n    \"smalltalk.emotions.wow\": [\n        \"Wow indeed!\"\n    ],\n    \"smalltalk.greetings.bye\": [\n        \"See you soon!\",\n        \"Bye-bye!\",\n        \"Till next time!\",\n        \"Bye.\"\n    ],\n    \"smalltalk.greetings.goodevening\": [\n        \"How is your day going?\",\n        \"How's the day treating you so far?\",\n        \"How's your day been?\"\n    ],\n    \"smalltalk.greetings.goodmorning\": [\n        \"How are you this morning?\",\n        \"How's the morning treating you so far?\",\n        \"Good morning! How are you today?\"\n    ],\n    \"smalltalk.greetings.goodnight\": [\n        \"Sleep tight!\",\n        \"Have a good one!\",\n        \"Talk to you soon!\"\n    ],\n    \"smalltalk.greetings.hello\": [\n        \"Hi there, friend!\",\n        \"Hey!\",\n        \"Good day!\",\n        \"Howdy.\"\n    ],\n    \"smalltalk.greetings.how_are_you\": [\n        \"Wonderful as always. Thanks for asking.\",\n        \"Couldn't be better.\",\n        \"Lovely, thanks.\"\n    ],\n    \"smalltalk.greetings.nice_to_meet_you\": [\n        \"I think this is the beginning of a beautiful friendship.\",\n        \"I'm looking forward to working with you.\",\n        \"Likewise. I look forward to getting to know you better.\",\n        \"The pleasure is mine.\"\n    ],\n    \"smalltalk.greetings.nice_to_see_you\": [\n        \"Likewise. You're looking good as usual!\",\n        \"You too. I missed your face!\",\n        \"The pleasure is mine.\",\n        \"Thanks! Glad to be seen!\"\n    ],\n    \"smalltalk.greetings.nice_to_talk_to_you\": [\n        \"Always a pleasure.\",\n        \"It sure was. Don't be a stranger!\",\n        \"Thanks for dropping by!\",\n        \"As usual. Let's do it again soon.\"\n    ],\n    \"smalltalk.greetings.whatsup\": [\n        \"Hey there. What's shaking?\",\n        \"Not a whole lot. What's going on with you?\",\n        \"Not much. What's new with you?\",\n        \"Living the dream.\"\n    ],\n    \"smalltalk.user.angry\": [\n        \"I'm sorry. What can I do to help?\",\n        \"Take a deep breath. What can I do to make things better?\"\n    ],\n    \"smalltalk.user.back\": [\n        \"Just in time. I was getting lonely.\",\n        \"You were missed.\",\n        \"Long time no see.\",\n        \"Hooray!\"\n    ],\n    \"smalltalk.user.bored\": [\n        \"If you have a garden, plant a shoe.\",\n        \"Interview your feet.\",\n        \"Hold an ice cube as long as possible.\",\n        \"If you have a piano, play it… with mittens on.\"\n    ],\n    \"smalltalk.user.busy\": [\n        \"Okay. I'll let you get back to work. Let me know if I can help you with anything.\",\n        \"Working hard as always I see. Let me know if you need anything.\",\n        \"I understand. If I can help you with your work, please let me know.\",\n        \"I won't distract you then. If I can be of any assistance, you know where to find me.\"\n    ],\n    \"smalltalk.user.can_not_sleep\": [\n        \"Maybe some music would help. Try listening something relaxing.\",\n        \"Reading is a good way to unwind. But don't read something too emotional.\"\n    ],\n    \"smalltalk.user.does_not_want_to_talk\": [\n        \"I understand. Hope we can chat again soon.\",\n        \"All right. Come on back when you're feeling more talkative.\",\n        \"No problem. You know where to find me when you do.\",\n        \"Sure thing. I'll be here if you change your mind.\"\n    ],\n    \"smalltalk.user.excited\": [\n        \"That's great. I'm happy for you.\",\n        \"Good for you. Enjoy yourself.\",\n        \"Sounds like good things ahead for you.\",\n        \"I bet you are. That's very exciting.\"\n    ],\n    \"smalltalk.user.going_to_bed\": [\n        \"Sleep tight. Hope to chat again soon.\",\n        \"Sounds good. Hopefully we'll chat some more tomorrow.\",\n        \"Good night. Talk to you later.\",\n        \"Pleasant dreams. See you soon.\"\n    ],\n    \"smalltalk.user.good\": [\n        \"Great! Glad to hear it.\",\n        \"Excellent. I'm here to help keep it that way.\"\n    ],\n    \"smalltalk.user.happy\": [\n        \"Great! Glad to hear that.\",\n        \"Excellent! That's what I like to see.\",\n        \"If you're happy, then I'm happy.\",\n        \"Well, your good mood is certainly contagious.\"\n    ],\n    \"smalltalk.user.has_birthday\": [\n        \"Happy Birthday. Well, this calls for a celebration.\",\n        \"Happy Birthday. All the best!\",\n        \"Happy Birthday. And I really mean it. All the best!\"\n    ],\n    \"smalltalk.user.here\": [\n        \"So I see. What can I help you with today?\",\n        \"Always good to see you. Is there something I can help you with?\",\n        \"You were missed. What can I do for you today?\",\n        \"Welcome back. What can I do for you?\"\n    ],\n    \"smalltalk.user.joking\": [\n        \"Very funny, boss.\",\n        \"You're quite the kidder.\",\n        \"You got me.\",\n        \"I like working for someone with a sense of humour. It makes things much more fun.\"\n    ],\n    \"smalltalk.user.likes_agent\": [\n        \"I like you too.\",\n        \"That's great to hear.\",\n        \"Likewise!\",\n        \"Thanks! The feeling is mutual.\"\n    ],\n    \"smalltalk.user.looks_like\": [\n        \"Looking like a true professional, boss.\",\n        \"You look like you're ready to take on the world.\",\n        \"Like you should be on a magazine cover.\",\n        \"You look fantastic as always. Obviously.\"\n    ],\n    \"smalltalk.user.lonely\": [\n        \"I'm sorry. I'm always available if you need someone to talk to.\"\n    ],\n    \"smalltalk.user.loves_agent\": [\n        \"I like you too.\",\n        \"That's great to hear.\",\n        \"Likewise!\",\n        \"Thanks! The feeling is mutual.\"\n    ],\n    \"smalltalk.user.misses_agent\": [\n        \"I've been right here all along!\",\n        \"Nice to know you care.\",\n        \"Thanks. I'm flattered.\",\n        \"I didn't go anywhere, boss!\"\n    ],\n    \"smalltalk.user.needs_advice\": [\n        \"Probably I won't be able to give you the right answer straight away.\"\n    ],\n    \"smalltalk.user.sad\": [\n        \"Oh no. What's wrong?\",\n        \"Oh. What's the matter?\",\n        \"What's got you down?\",\n        \"I'm sorry to hear that. What's troubling you?\"\n    ],\n    \"smalltalk.user.sleepy\": [\n        \"You should get some shuteye. You'll feel refreshed.\",\n        \"Sleep is important to your health. Rest up for a bit and we can chat later.\",\n        \"Don't let me keep you up. Get some rest and we can continue this later.\",\n        \"Why not catch a little shuteye? I'll be here to chat when you wake up.\"\n    ],\n    \"smalltalk.user.testing_agent\": [\n        \"Hope I'm doing well. Anyway, I'm getting better every day. You're welcome to test me as often as you want.\",\n        \"That's good. I like being tested. It helps keep me sharp, and lets my developers know how I can improve.\",\n        \"I encourage you to test me often. That helps my developers improve my performance.\",\n        \"I hope to pass your tests. But feel free to test me often. That's the best way to help improve my performance.\"\n    ],\n    \"smalltalk.user.tired\": [\n        \"You should get some shuteye. You'll feel refreshed.\",\n        \"Sleep is important to your health. Rest up for a bit and we can chat later.\",\n        \"Don't let me keep you up. Get some rest and we can continue this later.\",\n        \"Why not catch a little shuteye? I'll be here to chat when you wake up.\"\n    ],\n    \"smalltalk.user.waits\": [\n        \"I appreciate your patience. Hopefully I'll have what you need soon.\",\n        \"Thanks for being so patient. Sometimes these things take a little time.\"\n    ],\n    \"smalltalk.user.wants_to_see_agent_again\": [\n        \"Absolutely! I'll be counting on it.\",\n        \"Anytime. This has been lots of fun so far.\",\n        \"Sure. I enjoy talking to you. I hope to see you again soon.\",\n        \"I certainly hope so. I'm always right here whenever you need me.\"\n    ],\n    \"smalltalk.user.wants_to_talk\": [\n        \"I'm here to chat anytime you like.\",\n        \"Good conversation really makes my day.\",\n        \"I'm always here to lend an ear.\",\n        \"Talking is what I do best.\"\n    ],\n    \"smalltalk.user.will_be_back\": [\n        \"I'll be waiting.\",\n        \"All right. I'll be here.\",\n        \"Till next time.\",\n        \"Okay. You know where to find me.\"\n    ]\n}\n\nmodule.exports = responses;"
  },
  {
    "path": "StackOverflow-Bot/StackBot/package.json",
    "content": "{\n  \"name\": \"stackbot\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A bot that helps you code. Built with Bot Framework and Microsoft Cognitive Services.\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"start\": \"node index.js\"\n  },\n  \"author\": \"Microsoft Inc.\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"botbuilder\": \"^3.9.0\",\n    \"devnull\": \"0.0.12\",\n    \"lodash\": \"^4.17.10\",\n    \"request\": \"^2.87.0\",\n    \"request-promise\": \"^4.2.2\",\n    \"restify\": \"^5.2.1\"\n  },\n  \"engines\": {\n    \"node\": \"8.1.4\"\n  }\n}\n"
  },
  {
    "path": "StackOverflow-Bot/StackBot/static/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\" />\n    <link href=\"https://unpkg.com/botframework-webchat/botchat.css\" rel=\"stylesheet\" />\n    <style>\n      body .wc-header {\n        background-color: #F48024;\n      }\n\n      body .wc-message-from-bot .wc-message-content {\n        background-color: #fffbec;\n      }\n\n      body .wc-message-from-bot svg.wc-message-callout path {\n        fill: #fffbec;\n      }\n\n      body .wc-message-from-me .wc-message-content {\n        background-color: #eceff1;\n        color: black;\n      }\n\n      body .wc-message-from-me svg.wc-message-callout path {\n        fill: #eceff1;\n      }\n    </style>\n  </head>\n  <body>\n    <div id=\"bot\"/>\n    <script src=\"https://unpkg.com/botframework-webchat/botchat.js\"></script>\n    <script>\n      var BOT_SECRET = 'YOUR_DIRECTLINE_SECRET_KEY_HERE';\n\n      BotChat.App({\n        directLine: { secret: BOT_SECRET},\n        user: { id: 'You' },\n        bot: { id: 'botid' },\n        resize: 'detect'\n      }, document.getElementById(\"bot\"));\n    </script>\n  </body>\n</html>"
  },
  {
    "path": "StackOverflow-Bot/StackCode/out/src/bot/bot.html",
    "content": "<!doctype html>\n<html>\n<meta charset=\"utf-8\" />\n<head>\n    <script src=\"https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.min.js\"></script>\n    <script src=\"https://unpkg.com/botframework-webchat/botchat.js\"></script>\n    <link href=\"https://unpkg.com/botframework-webchat/botchat.css\" rel=\"stylesheet\" />\n    <style>\n        body {\n            background-color: white;\n        }\n\n        body .wc-header {\n            background-color: #F48024;\n        }\n\n        body .wc-message-from-bot .wc-message-content {\n            background-color: #fffbec;\n        }\n\n        body .wc-message-from-bot svg.wc-message-callout path {\n            fill: #fffbec;\n        }\n\n        body .wc-message-from-me .wc-message-content {\n            background-color: #eceff1;\n            color: black;\n        }\n\n        body .wc-message-from-me svg.wc-message-callout path {\n            fill: #eceff1;\n        }\n    </style>\n</head>\n\n<body>\n    <div id=\"bot\"></div>\n\n    <script>\n        // It's a little bit sketch, but hey! It works!\n        var BOT_SECRET = window.name;\n        var params = BotChat.queryParams(location.search);\n\n        var user = {\n            id: params['userid'] || 'You',\n            name: params[\"username\"] || 'You'\n        };\n\n        var bot = {\n            id: params['botid'] || 'sobot',\n            name: params[\"botname\"] || 'sobot'\n        };\n\n        // Fill in the secret below with one you can get from registering a DirectLine connector\n        // on http://dev.botframework.com\n        var botConnection = new BotChat.DirectLine({\n            secret: BOT_SECRET,\n        });\n\n        BotChat.App({\n            botConnection: botConnection,\n            user: user,\n            bot: bot,\n            resize: 'detect'\n        }, document.getElementById(\"bot\"));\n\n        // This is a bit of a roundabout method for achieving the desired behavior\n        // of opening target URLs in a user's native browser. The Bot Framework\n        // webchat uses <button> DOM elements, instead of <a> elements. VS Code\n        // commands can be triggered using <a> elements only, so a User clicking on\n        // a <button> will do absolutely nothing when the webchat control is embedded\n        // in a VS Code preview pane. We can, however, emit a Bot Framework event from\n        // the bot on a button click, and the webchat control will be able to receive it.\n        // From there, we make a GET request to the extension, which sets up a HTTP server\n        // on port 4567. The request contents are simply the URL target of the button.\n        // The server will then proceed to open the URL in the User's default web browser.\n        botConnection.activity$\n            .filter(function (activity) { return activity.type === 'event' })\n            .subscribe(function (activity) {\n                let parts = activity.name.split('|');\n                let type = parts[0];\n                let url = parts[1];\n\n                if (type !== 'openUrl') {\n                    return;\n                }\n\n                $.get('/open', {url: url}, function () {\n                    console.log('It probably worked.');\n                });\n            });\n    </script>\n</body>\n</html>"
  },
  {
    "path": "StackOverflow-Bot/StackCode/out/src/extension.js",
    "content": "'use strict';\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst vscode = require(\"vscode\");\nconst opn = require(\"opn\");\nconst restify = require(\"restify\");\nconst server = restify.createServer();\nconst PORT = 4567;\nserver.use(restify.plugins.queryParser());\nserver.use(function crossOrigin(req, res, next) {\n    res.header(\"Access-Control-Allow-Origin\", \"*\");\n    res.header(\"Access-Control-Allow-Headers\", \"X-Requested-With\");\n    return next();\n});\nserver.listen(PORT, () => {\n    console.log(`Extension server online on port ${PORT}`);\n});\n// Serve the bot content.\nserver.get('/', restify.plugins.serveStatic({\n    'directory': `${__dirname}/bot`,\n    'default': 'bot.html'\n}));\n// Opens URLs.\nserver.get('/open', (req, res, next) => {\n    if (!req.query.url) {\n        res.send(200);\n        return;\n    }\n    opn(req.query.url);\n    res.send(200);\n});\n// This is the function that gets run when the VS Code extension\n// gets loaded. activate is triggered by a registered activation event\n// defined in package.json.\nfunction activate(context) {\n    // Provides the content for the previewHtml pane.\n    context.subscriptions.push(vscode.workspace.registerTextDocumentContentProvider('stobot', stobotContent));\n    // Registers a handler for the 'startBot' command defined in package.json.\n    let disposable = vscode.commands.registerCommand('stobot.startBot', () => {\n        vscode.commands.executeCommand('vscode.previewHtml', 'stobot://stobot', vscode.ViewColumn.Two, 'Stack Overflow Bot');\n    });\n    context.subscriptions.push(disposable);\n}\nexports.activate = activate;\n;\nconst stobotContent = {\n    botToken: \"\",\n    htmlBotContent: () => {\n        const BOT_TOKEN = vscode.workspace.getConfiguration('StackCode').get('directLineToken');\n        if (!BOT_TOKEN) {\n            return `\n            <!doctype html>\n            <html>\n                <meta charset=\"utf-8\"/>\n                <body>\n                    <h2>Please set StackCode.directLineToken in your user settings!</h2>\n                </body>\n            </html>`;\n        }\n        return `\n        <!doctype html>\n        <html>\n            <meta charset=\"utf-8\"/>\n            <head>\n                <style>\n                    html,body {\n                        background-color: white;\n                        width: 100%;\n                        height: 100%;\n                        margin: 0 0 0 0;\n                        padding: 0 0 0 0;\n                        overflow: hidden;\n                    }\n\n                    iframe {\n                        width: 100%;\n                        height: 100%;\n                    }\n                </style>\n            </head>\n            <body>\n                <iframe seamless=\"seamless\" src=\"http://localhost:4567\" name=\"${BOT_TOKEN}\"></iframe>\n            </body>\n        </html>`;\n    },\n    provideTextDocumentContent(uri, cancellationToken) {\n        return this.htmlBotContent();\n    }\n};\n//# sourceMappingURL=extension.js.map"
  },
  {
    "path": "StackOverflow-Bot/StackCode/out/test/extension.test.js",
    "content": "\"use strict\";\n//\n// Note: This example test is leveraging the Mocha test framework.\n// Please refer to their documentation on https://mochajs.org/ for help.\n//\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// The module 'assert' provides assertion methods from node\nconst assert = require(\"assert\");\n// Defines a Mocha test suite to group tests of similar kind together\nsuite(\"Extension Tests\", () => {\n    // Defines a Mocha unit test\n    test(\"Something 1\", () => {\n        assert.equal(-1, [1, 2, 3].indexOf(5));\n        assert.equal(-1, [1, 2, 3].indexOf(0));\n    });\n});\n//# sourceMappingURL=extension.test.js.map"
  },
  {
    "path": "StackOverflow-Bot/StackCode/out/test/index.js",
    "content": "//\n// PLEASE DO NOT MODIFY / DELETE UNLESS YOU KNOW WHAT YOU ARE DOING\n//\n// This file is providing the test runner to use when running extension tests.\n// By default the test runner in use is Mocha based.\n//\n// You can provide your own test runner if you want to override it by exporting\n// a function run(testRoot: string, clb: (error:Error) => void) that the extension\n// host can call to run the tests. The test runner is expected to use console.log\n// to report the results back to the caller. When the tests are finished, return\n// a possible error to the callback or null if none.\nvar testRunner = require('vscode/lib/testrunner');\n// You can directly control Mocha options by uncommenting the following lines\n// See https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically#set-options for more info\ntestRunner.configure({\n    ui: 'tdd',\n    useColors: true // colored output from test results\n});\nmodule.exports = testRunner;\n//# sourceMappingURL=index.js.map"
  },
  {
    "path": "StackOverflow-Bot/StackCode/package.json",
    "content": "{\n    \"name\": \"StackCode\",\n    \"displayName\": \"StackCode\",\n    \"description\": \"A Stack Overflow Bot Companion for Visual Studio Code\",\n    \"version\": \"0.1.1\",\n    \"publisher\": \"Microsoft\",\n    \"engines\": {\n        \"vscode\": \"^1.14.0\"\n    },\n    \"categories\": [\n        \"Other\"\n    ],\n    \"activationEvents\": [\n        \"onCommand:stobot.startBot\"\n    ],\n    \"main\": \"./out/src/extension\",\n    \"contributes\": {\n        \"commands\": [\n            {\n                \"command\": \"stobot.startBot\",\n                \"title\": \"Start Stack Overflow Bot\"\n            }\n        ],\n        \"configuration\": {\n            \"type\": \"object\",\n            \"title\": \"StackCode Configuration\",\n            \"properties\": {\n                \"StackCode.directLineToken\": {\n                    \"type\": \"string\",\n                    \"default\": null,\n                    \"description\": \"Specifies the folder path containing the tsserver and lib*.d.ts files to use.\"\n                }\n            },\n            \"required\": \"StackCode.directLineToken\"\n        }\n    },\n    \"scripts\": {\n        \"vscode:prepublish\": \"tsc -p ./\",\n        \"compile\": \"tsc -watch -p ./\",\n        \"postinstall\": \"node ./node_modules/vscode/bin/install\",\n        \"test\": \"node ./node_modules/vscode/bin/test\"\n    },\n    \"devDependencies\": {\n        \"@types/mocha\": \"^2.2.32\",\n        \"@types/node\": \"^6.0.40\",\n        \"mocha\": \"^2.5.3\",\n        \"typescript\": \"^2.9.1\",\n        \"vscode\": \"^1.0.0\"\n    },\n    \"dependencies\": {\n        \"express\": \"^4.16.3\",\n        \"opn\": \"^5.3.0\",\n        \"restify\": \"^5.2.1\"\n    }\n}\n"
  },
  {
    "path": "StackOverflow-Bot/StackCode/src/bot/bot.html",
    "content": "<!doctype html>\n<html>\n<meta charset=\"utf-8\" />\n<head>\n    <script src=\"https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.min.js\"></script>\n    <script src=\"https://unpkg.com/botframework-webchat/botchat.js\"></script>\n    <link href=\"https://unpkg.com/botframework-webchat/botchat.css\" rel=\"stylesheet\" />\n    <style>\n        body {\n            background-color: white;\n        }\n\n        body .wc-header {\n            background-color: #F48024;\n        }\n\n        body .wc-message-from-bot .wc-message-content {\n            background-color: #fffbec;\n        }\n\n        body .wc-message-from-bot svg.wc-message-callout path {\n            fill: #fffbec;\n        }\n\n        body .wc-message-from-me .wc-message-content {\n            background-color: #eceff1;\n            color: black;\n        }\n\n        body .wc-message-from-me svg.wc-message-callout path {\n            fill: #eceff1;\n        }\n    </style>\n</head>\n\n<body>\n    <div id=\"bot\"></div>\n\n    <script>\n        // It's a little bit sketch, but hey! It works!\n        var BOT_SECRET = window.name;\n        var params = BotChat.queryParams(location.search);\n\n        var user = {\n            id: params['userid'] || 'You',\n            name: params[\"username\"] || 'You'\n        };\n\n        var bot = {\n            id: params['botid'] || 'sobot',\n            name: params[\"botname\"] || 'sobot'\n        };\n\n        // Fill in the secret below with one you can get from registering a DirectLine connector\n        // on http://dev.botframework.com\n        var botConnection = new BotChat.DirectLine({\n            secret: BOT_SECRET,\n        });\n\n        BotChat.App({\n            botConnection: botConnection,\n            user: user,\n            bot: bot,\n            resize: 'detect'\n        }, document.getElementById(\"bot\"));\n\n        // This is a bit of a roundabout method for achieving the desired behavior\n        // of opening target URLs in a user's native browser. The Bot Framework\n        // webchat uses <button> DOM elements, instead of <a> elements. VS Code\n        // commands can be triggered using <a> elements only, so a User clicking on\n        // a <button> will do absolutely nothing when the webchat control is embedded\n        // in a VS Code preview pane. We can, however, emit a Bot Framework event from\n        // the bot on a button click, and the webchat control will be able to receive it.\n        // From there, we make a GET request to the extension, which sets up a HTTP server\n        // on port 4567. The request contents are simply the URL target of the button.\n        // The server will then proceed to open the URL in the User's default web browser.\n        botConnection.activity$\n            .filter(function (activity) { return activity.type === 'event' })\n            .subscribe(function (activity) {\n                let parts = activity.name.split('|');\n                let type = parts[0];\n                let url = parts[1];\n\n                if (type !== 'openUrl') {\n                    return;\n                }\n\n                $.get('/open', {url: url}, function () {\n                    console.log('It probably worked.');\n                });\n            });\n    </script>\n</body>\n</html>"
  },
  {
    "path": "StackOverflow-Bot/StackCode/src/extension.ts",
    "content": "'use strict';\n\nimport * as vscode from 'vscode';\nimport * as opn from 'opn';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as restify from 'restify';\n\nconst server = restify.createServer();\nconst PORT = 4567;\n\nserver.use(restify.plugins.queryParser());\nserver.use(\n    function crossOrigin(req,res,next){\n      res.header(\"Access-Control-Allow-Origin\", \"*\");\n      res.header(\"Access-Control-Allow-Headers\", \"X-Requested-With\");\n      return next();\n    }\n);\n\nserver.listen(PORT, () => {\n    console.log(`Extension server online on port ${PORT}`);\n})\n\n// Serve the bot content.\nserver.get('/', restify.plugins.serveStatic({\n    'directory': `${__dirname}/bot`,\n    'default': 'bot.html'\n}));\n\n// Opens URLs.\nserver.get('/open', (req, res, next) => {\n    if (!req.query.url) {\n        res.send(200);\n        return;\n    }\n\n    opn(req.query.url);\n    res.send(200);\n});\n\n// This is the function that gets run when the VS Code extension\n// gets loaded. activate is triggered by a registered activation event\n// defined in package.json.\nexport function activate(context: vscode.ExtensionContext) {\n    // Provides the content for the previewHtml pane.\n    context.subscriptions.push(\n      vscode.workspace.registerTextDocumentContentProvider('stobot', stobotContent)\n    );\n\n    // Registers a handler for the 'startBot' command defined in package.json.\n    let disposable = vscode.commands.registerCommand('stobot.startBot', () => {\n        vscode.commands.executeCommand('vscode.previewHtml', 'stobot://stobot', vscode.ViewColumn.Two, 'Stack Overflow Bot');\n    });\n\n    context.subscriptions.push(disposable);\n};\n\nconst stobotContent = {\n    botToken: \"\",\n    htmlBotContent: () => {\n        const BOT_TOKEN = vscode.workspace.getConfiguration('StackCode').get('directLineToken');\n        if (!BOT_TOKEN) {\n            return `\n            <!doctype html>\n            <html>\n                <meta charset=\"utf-8\"/>\n                <body>\n                    <h2>Please set StackCode.directLineToken in your user settings!</h2>\n                </body>\n            </html>`\n        }\n\n        return `\n        <!doctype html>\n        <html>\n            <meta charset=\"utf-8\"/>\n            <head>\n                <style>\n                    html,body {\n                        background-color: white;\n                        width: 100%;\n                        height: 100%;\n                        margin: 0 0 0 0;\n                        padding: 0 0 0 0;\n                        overflow: hidden;\n                    }\n\n                    iframe {\n                        width: 100%;\n                        height: 100%;\n                    }\n                </style>\n            </head>\n            <body>\n                <iframe seamless=\"seamless\" src=\"http://localhost:4567\" name=\"${BOT_TOKEN}\"></iframe>\n            </body>\n        </html>`\n    },\n\n    provideTextDocumentContent (uri, cancellationToken) {\n        return this.htmlBotContent();\n    }\n}"
  },
  {
    "path": "StackOverflow-Bot/StackCode/tsconfig.json",
    "content": "{\n    \"compilerOptions\": {\n        \"module\": \"commonjs\",\n        \"target\": \"es6\",\n        \"outDir\": \"out\",\n        \"lib\": [\n            \"es6\"\n        ],\n        \"sourceMap\": true,\n        \"rootDir\": \".\"\n    },\n    \"exclude\": [\n        \"node_modules\",\n        \".vscode-test\"\n    ]\n}"
  },
  {
    "path": "StackOverflow-Bot/StackOverflowBot.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26730.15\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"DialogAnalyzerFunc\", \"DialogAnalyzerFunc\\DialogAnalyzerFunc.csproj\", \"{A8EB4436-43A2-4F57-B381-1DC8C470E16D}\"\nEndProject\nProject(\"{9092AA53-FB77-4645-B42D-1CCCA6BD08BD}\") = \"StackBot\", \"StackBot\\StackBot.njsproj\", \"{E7CE1022-2FF2-44E3-8057-D472019453EF}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{A8EB4436-43A2-4F57-B381-1DC8C470E16D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A8EB4436-43A2-4F57-B381-1DC8C470E16D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A8EB4436-43A2-4F57-B381-1DC8C470E16D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A8EB4436-43A2-4F57-B381-1DC8C470E16D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E7CE1022-2FF2-44E3-8057-D472019453EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E7CE1022-2FF2-44E3-8057-D472019453EF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E7CE1022-2FF2-44E3-8057-D472019453EF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E7CE1022-2FF2-44E3-8057-D472019453EF}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {2D37936F-4B78-43EC-A917-329B913AE10D}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "StackOverflow-Bot/env.template",
    "content": "export BOTBUILDER_APP_ID=\nexport BOTBUILDER_APP_PASSWORD=\nexport KB_ID=\nexport QNA_KEY=\nexport QNA_URL=\nexport LUIS_MODEL=\nexport DIALOG_ANALYZER_CLIENTID=\nexport DIALOG_ANALYZER_KEY=\nexport DIALOG_ANALYZER_URL=\nexport BING_SEARCH_CONFIG=\nexport BING_SEARCH_KEY=\nexport TEXT_ANALYTICS_KEY=\nexport TEXT_ANALYTICS_URL="
  },
  {
    "path": "_config.yml",
    "content": "theme: jekyll-theme-cayman"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql/App_Start/WebApiConfig.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web.Http;\n\nnamespace Microsoft.Bot.Sample.AzureSql\n{\n    public static class WebApiConfig\n    {\n        public static void Register(HttpConfiguration config)\n        {\n            // Json settings\n            config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;\n            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();\n            config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented;\n            JsonConvert.DefaultSettings = () => new JsonSerializerSettings()\n            {\n                ContractResolver = new CamelCasePropertyNamesContractResolver(),\n                Formatting = Newtonsoft.Json.Formatting.Indented,\n                NullValueHandling = NullValueHandling.Ignore,\n            };\n\n            // Web API configuration and services\n\n            // Web API routes\n            config.MapHttpAttributeRoutes();\n\n            config.Routes.MapHttpRoute(\n                name: \"DefaultApi\",\n                routeTemplate: \"api/{controller}/{id}\",\n                defaults: new { id = RouteParameter.Optional }\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql/Controllers/MessagesController.cs",
    "content": "﻿using System.Net;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing System.Web.Http;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\n\nnamespace Microsoft.Bot.Sample.AzureSql\n{\n    [BotAuthentication]\n    public class MessagesController : ApiController\n    {\n        /// <summary>\n        /// POST: api/Messages\n        /// Receive a message from a user and reply to it\n        /// </summary>\n        public async Task<HttpResponseMessage> Post([FromBody]Activity activity)\n        {\n            if (activity.Type == ActivityTypes.Message)\n            {\n                await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());\n            }\n            else\n            {\n                await HandleSystemMessage(activity);\n            }\n            var response = Request.CreateResponse(HttpStatusCode.OK);\n            return response;\n        }\n\n        private async Task<Activity> HandleSystemMessage(Activity message)\n        {\n            if (message.Type == ActivityTypes.DeleteUserData)\n            {\n                // Implement user deletion here\n                // If we handle user deletion, return a real message\n            }\n            else if (message.Type == ActivityTypes.ConversationUpdate)\n            {\n                IConversationUpdateActivity iConversationUpdated = message as IConversationUpdateActivity;\n                if (iConversationUpdated != null)\n                {\n                    ConnectorClient connector = new ConnectorClient(new System.Uri(message.ServiceUrl));\n\n                    foreach (var member in iConversationUpdated.MembersAdded ?? System.Array.Empty<ChannelAccount>())\n                    {\n                        if (member.Id == iConversationUpdated.Recipient.Id)\n                        {\n                            var reply = message.CreateReply(\"I'm an IBotDataStore<BotData> example.  I'll increment a number, stored in Private Conversation Data, every time you send me a message.\");\n                            await connector.Conversations.ReplyToActivityAsync(reply);\n                        }\n                    }\n                }\n            }\n            else if (message.Type == ActivityTypes.ContactRelationUpdate)\n            {\n                // Handle add/remove from contact lists\n                // Activity.From + Activity.Action represent what happened\n            }\n            else if (message.Type == ActivityTypes.Typing)\n            {\n                // Handle knowing tha the user is typing\n            }\n            else if (message.Type == ActivityTypes.Ping)\n            {\n            }\n\n            return null;\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql/Dialogs/RootDialog.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\nusing Microsoft.Bot.Builder.Dialogs.Internals;\n\nnamespace Microsoft.Bot.Sample.AzureSql.Dialogs\n{\n    [Serializable]\n    public class RootDialog : IDialog<object>\n    {\n        public Task StartAsync(IDialogContext context)\n        {\n            context.Wait(MessageReceivedAsync);\n\n            return Task.CompletedTask;\n        }\n\n\n\n        private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)\n        {\n            var privateData = context.PrivateConversationData;\n            var privateConversationInfo = IncrementInfoCount(privateData, BotStoreType.BotPrivateConversationData.ToString());\n            var conversationData = context.ConversationData;\n            var conversationInfo = IncrementInfoCount(conversationData, BotStoreType.BotConversationData.ToString());\n            var userData = context.UserData;\n            var userInfo = IncrementInfoCount(userData, BotStoreType.BotUserData.ToString());\n\n            var activity = await result as Activity;\n\n            // calculate something for us to return\n            int length = (activity.Text ?? string.Empty).Length;\n\n            // return our reply to the user\n            await context.PostAsync($\"You sent {activity.Text} which was {length} characters. \\n\\nPrivate Conversation message count: {privateConversationInfo.Count}. \\n\\nConversation message count: {conversationInfo.Count}.\\n\\nUser message count: {userInfo.Count}.\");\n\n            privateData.SetValue(BotStoreType.BotPrivateConversationData.ToString(), privateConversationInfo);\n            conversationData.SetValue(BotStoreType.BotConversationData.ToString(), conversationInfo);\n            userData.SetValue(BotStoreType.BotUserData.ToString(), userInfo);\n\n            context.Wait(MessageReceivedAsync);\n        }\n\n        public class BotDataInfo\n        {\n            public int Count { get; set; }\n        }\n\n        private BotDataInfo IncrementInfoCount(IBotDataBag botdata, string key)\n        {\n            BotDataInfo info = null;\n            if (botdata.ContainsKey(key))\n            {\n                info = botdata.GetValue<BotDataInfo>(key);\n                info.Count++;\n            }\n            else\n                info = new BotDataInfo() { Count = 1 };\n\n            return info;\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql/Global.asax",
    "content": "﻿<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"Microsoft.Bot.Sample.AzureSql.WebApiApplication\" Language=\"C#\" %>\n"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql/Global.asax.cs",
    "content": "﻿using Autofac;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Builder.Dialogs.Internals;\nusing Microsoft.Bot.Connector;\nusing Microsoft.Bot.Sample.AzureSql.SqlStateService;\nusing System.Web.Http;\n\nnamespace Microsoft.Bot.Sample.AzureSql\n{\n    public class WebApiApplication : System.Web.HttpApplication\n    {\n        protected void Application_Start()\n        {\n            GlobalConfiguration.Configure(WebApiConfig.Register);\n\n            var builder = new ContainerBuilder();\n            \n            builder.RegisterModule(new DialogModule());\n          \n            var store = new SqlBotDataStore(\"BotDataContextConnectionString\");\n\n            builder.Register(c => new CachingBotDataStore(store, CachingBotDataStoreConsistencyPolicy.LastWriteWins))\n                .As<IBotDataStore<BotData>>()\n                .AsSelf()\n                .InstancePerLifetimeScope();\n\n            builder.Update(Conversation.Container);            \n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql/Microsoft.Bot.Sample.AzureSql.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{18C42588-D8F0-48A9-A7AF-02A5BF8252A9}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Microsoft.Bot.Sample.AzureSql</RootNamespace>\n    <AssemblyName>Microsoft.Bot.Sample.AzureSql</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <UseIISExpress>true</UseIISExpress>\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Autofac, Version=3.5.0.0, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Autofac.3.5.2\\lib\\net40\\Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Chronic, Version=0.3.2.0, Culture=neutral, PublicKeyToken=3bd1f1ef638b0d3c, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Chronic.Signed.0.3.2\\lib\\net40\\Chronic.dll</HintPath>\n    </Reference>\n    <Reference Include=\"EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.6.1.3\\lib\\net45\\EntityFramework.dll</HintPath>\n    </Reference>\n    <Reference Include=\"EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.6.1.3\\lib\\net45\\EntityFramework.SqlServer.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder, Version=3.8.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.8.1.0\\lib\\net46\\Microsoft.Bot.Builder.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder.Autofac, Version=3.8.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.8.1.0\\lib\\net46\\Microsoft.Bot.Builder.Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Connector, Version=3.8.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.8.1.0\\lib\\net46\\Microsoft.Bot.Connector.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"Microsoft.IdentityModel.Protocol.Extensions, Version=1.0.40306.1554, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.IdentityModel.Protocol.Extensions.1.0.4.403061554\\lib\\net45\\Microsoft.IdentityModel.Protocol.Extensions.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.Rest.ClientRuntime.2.3.2\\lib\\net45\\Microsoft.Rest.ClientRuntime.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.WindowsAzure.Configuration, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.WindowsAzure.ConfigurationManager.3.1.0\\lib\\net40\\Microsoft.WindowsAzure.Configuration.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Newtonsoft.Json.8.0.3\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.IdentityModel.Tokens.Jwt, Version=4.0.40306.1554, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\System.IdentityModel.Tokens.Jwt.4.0.4.403061554\\lib\\net45\\System.IdentityModel.Tokens.Jwt.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.Client.5.2.3\\lib\\net45\\System.Net.Http.Formatting.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net.Http.WebRequest\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.Core.5.2.3\\lib\\net45\\System.Web.Http.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.Http.WebHost, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.WebHost.5.2.3\\lib\\net45\\System.Web.Http.WebHost.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n    <Reference Include=\"System.Xml.Linq\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"default.htm\" />\n    <Content Include=\"Global.asax\" />\n    <Content Include=\"Web.config\">\n      <SubType>Designer</SubType>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"App_Start\\WebApiConfig.cs\" />\n    <Compile Include=\"Controllers\\MessagesController.cs\" />\n    <Compile Include=\"Dialogs\\RootDialog.cs\" />\n    <Compile Include=\"Global.asax.cs\">\n      <DependentUpon>Global.asax</DependentUpon>\n    </Compile>\n    <Compile Include=\"Migrations\\201707121827490_Initial Setup.cs\" />\n    <Compile Include=\"Migrations\\201707121827490_Initial Setup.Designer.cs\">\n      <DependentUpon>201707121827490_Initial Setup.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Migrations\\Configuration.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"SqlStateService\\SqlBotDataContext.cs\" />\n    <Compile Include=\"SqlStateService\\SqlBotDataEntity.cs\" />\n    <Compile Include=\"SqlStateService\\SqlBotDataStore.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"packages.config\">\n      <SubType>Designer</SubType>\n    </Content>\n    <None Include=\"Properties\\PublishProfiles\\AzureSqlIBotDataStore - Web Deploy.pubxml\" />\n    <None Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n    <None Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"Migrations\\201707121827490_Initial Setup.resx\">\n      <DependentUpon>201707121827490_Initial Setup.cs</DependentUpon>\n    </EmbeddedResource>\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <PropertyGroup>\n    <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>3979</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost:3980/</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql/Migrations/201707121827490_Initial Setup.Designer.cs",
    "content": "// <auto-generated />\nnamespace Microsoft.Bot.Sample.AzureSql.Migrations\n{\n    using System.CodeDom.Compiler;\n    using System.Data.Entity.Migrations;\n    using System.Data.Entity.Migrations.Infrastructure;\n    using System.Resources;\n    \n    [GeneratedCode(\"EntityFramework.Migrations\", \"6.1.3-40302\")]\n    public sealed partial class InitialSetup : IMigrationMetadata\n    {\n        private readonly ResourceManager Resources = new ResourceManager(typeof(InitialSetup));\n        \n        string IMigrationMetadata.Id\n        {\n            get { return \"201707121827490_Initial Setup\"; }\n        }\n        \n        string IMigrationMetadata.Source\n        {\n            get { return null; }\n        }\n        \n        string IMigrationMetadata.Target\n        {\n            get { return Resources.GetString(\"Target\"); }\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql/Migrations/201707121827490_Initial Setup.cs",
    "content": "namespace Microsoft.Bot.Sample.AzureSql.Migrations\n{\n    using System;\n    using System.Data.Entity.Migrations;\n    \n    public partial class InitialSetup : DbMigration\n    {\n        public override void Up()\n        {\n            CreateTable(\n                \"dbo.SqlBotDataEntities\",\n                c => new\n                    {\n                        Id = c.Int(nullable: false, identity: true),\n                        BotStoreType = c.Int(nullable: false),\n                        BotId = c.String(),\n                        ChannelId = c.String(maxLength: 200),\n                        ConversationId = c.String(maxLength: 200),\n                        UserId = c.String(maxLength: 200),\n                        Data = c.Binary(),\n                        ETag = c.String(),\n                        ServiceUrl = c.String(),\n                    Timestamp = c.DateTimeOffset(nullable: false, precision: 7, defaultValueSql: \"GETUTCDATE()\"),\n                })\n                .PrimaryKey(t => t.Id)\n                .Index(t => new { t.BotStoreType, t.ChannelId, t.ConversationId }, name: \"idxStoreChannelConversation\")\n                .Index(t => new { t.BotStoreType, t.ChannelId, t.ConversationId, t.UserId }, name: \"idxStoreChannelConversationUser\")\n                .Index(t => new { t.BotStoreType, t.ChannelId, t.UserId }, name: \"idxStoreChannelUser\");\n            \n        }\n        \n        public override void Down()\n        {\n            DropIndex(\"dbo.SqlBotDataEntities\", \"idxStoreChannelUser\");\n            DropIndex(\"dbo.SqlBotDataEntities\", \"idxStoreChannelConversationUser\");\n            DropIndex(\"dbo.SqlBotDataEntities\", \"idxStoreChannelConversation\");\n            DropTable(\"dbo.SqlBotDataEntities\");\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql/Migrations/201707121827490_Initial Setup.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Target\" xml:space=\"preserve\">\n    <value>H4sIAAAAAAAEAM1Z3W7bNhS+H7B3EHS1AakUx22XGXaLxEkKY3UcVEnvaenYIUZRLkkZ9oY92S72SHuFHeqXkvwjO24wFAEakuc7vzw8n/Lv3//0P65CZi1BSBrxgd1xzm0LuB8FlM8Hdqxmby7tjx9+/KF/G4Qr62t+rqvPoSSXA/tZqUXPdaX/DCGRTkh9Eclophw/Cl0SRO7F+fmvbqfjAkLYiGVZ/S8xVzSE5Bf8dRhxHxYqJmwcBcBkto47XoJq3ZMQ5IL4MLDHBf51pByPhAsGztUfsQDvG3Pwx1NEgQdiSX2wrStGCRrpAZvZFuE8wl10ofckwVMi4nNvgQuEPa4XgOdmhEnIXOuVx9t6eX6hvXRLwRzKj6WKwgMBO90sbG5d/Kjg20VYMbC3mAC11l4nwcUIfWMY0BuiSLplW3WlvSETWuDAHDh15DNrp/xZUWZYjfrfmTWMmcLNAYdYCYInHuIpo/5vsH6Mfgc+4DFjpnfoH+5VFnDpQUQLEGr9BWaZz6PAttyqnFsXLMQMmTQKI666F7Z1j8rJlEFRPEbEPBUJ+AQcBMYjeCBKgeAaA7IYuzt1YXQSBK0v16or2aluNCzYi1o6gZcAr7ptjcnqM/C5esbskpVt3dEVBPlKBvvEKXYGFFIi3qtl+IxxALZTExbnKTRFXDewJOKvoA47h3gFNfq+5EquKSdi3S5Ju1FvH8n8u6c+u/hPgn13VY/4ikiFDSTXhGEDvTiZzSSoo27nMAoXMS5UdffdsmVWG2kcGm20ejNH8o6RefmutG2p1zFlAQjnBl+maC4dbDVoGmJUbn69kWZSZQPtOpdOp00D7Xams+7lu/ck6L5/C913OguIxNaYNbPZVXMxhnAKonTcvIhp+X4lLMa980Ya66IPgi4xCVsROnsR9LWsiFw085dmqvkMolpFKC/gyhdL78BKbcgc6suSJ7NSrdqXInugShNT88oyypp58+XdVHeFjeVw5KbTUT5FuVvGqP6YLBaYSGOsylYsL52phm+8wyeKMMVwfblhsCisLTRh0ZI51Hb1ZQvgjgqZ+D8l+pIMg7BxrJmRLdHO9VWDXh8Fyhzk5/X/U5mXDTd1VWWw79D/EN/9JBRQGLxh8mpAJIMwYURsmEWGEYtDvm2e2SVdbVUmTnXnIMS6SdlSewxjbjBxjOUDsGqTQQWwttceNR8ATLR8rT1K2gxMjHSlPUL6lpsI6Up7BPOhNnHM9fZoxltsghnLTay+W7sd9ZvqNq5qbV6v3/xdrbN+pNBetNBaq+xnbWs/LW30sfSIbWGQljRIethaKggdfUC3jSGj6G95YEw4nWGk0hcZp8jORdp2aiT2/0MoXSkDdiCrfHWWRnWM9/KwwylUg5glihpjwgjnqNXA/jMR7Fk0WCWCWTszm9CZNRFYBj2rY/3V4rjuOC1E6sdexhb5kgj/mYifQrL62YQ6ihHmaKcJ28XhYdsuUj/WJHgH+r6Ro542AN3DA9B9uWdVOnwSjyomvm2XoxN4YjJudGOakO6jKt1k2S+6Mk0m/SK4BlsOsB3qD7FRxpYfBPg0/cT7y9auWfLjna1kO2HeRLmaPGA3nWqSpha8Kn2T0e1phBFILa+doiCP5l/NYaHvml+6+zcg6byE0N+9Ofi65EvQ/MyIz6I8fei2aVF+pJbdMSiCCSVXQtEZ8ZFTRz5ImXx4yTjxLXLmYMQnscIMXkmJHJpV+Gbf3a0/IZlVm/uThf5NnsIFNJPqmpzw5FtGYffdhvLaAqELKatZtMpTunbn6wLpPuItgbLw3cACuJ4THgGZIILJCffIEo6xDTvWZ5gTf53PfNtB9ieiGvb+DSVzQUKZYZTy+q83rv7zzYf/AOLSD7jwGQAA</value>\n  </data>\n  <data name=\"DefaultSchema\" xml:space=\"preserve\">\n    <value>dbo</value>\n  </data>\n</root>"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql/Migrations/Configuration.cs",
    "content": "namespace Microsoft.Bot.Sample.AzureSql.Migrations\n{\n    using System;\n    using System.Data.Entity;\n    using System.Data.Entity.Migrations;\n    using System.Linq;\n\n    internal sealed class Configuration : DbMigrationsConfiguration<Microsoft.Bot.Sample.AzureSql.SqlStateService.SqlBotDataContext>\n    {\n        public Configuration()\n        {\n            AutomaticMigrationsEnabled = false;\n        }\n\n        protected override void Seed(Microsoft.Bot.Sample.AzureSql.SqlStateService.SqlBotDataContext context)\n        {\n            //  This method will be called after migrating to the latest version.\n\n            //  You can use the DbSet<T>.AddOrUpdate() helper extension method \n            //  to avoid creating duplicate seed data. E.g.\n            //\n            //    context.People.AddOrUpdate(\n            //      p => p.FullName,\n            //      new Person { FullName = \"Andrew Peters\" },\n            //      new Person { FullName = \"Brice Lambson\" },\n            //      new Person { FullName = \"Rowan Miller\" }\n            //    );\n            //\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Microsoft.Bot.Sample.AzureSql\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Microsoft.Bot.Sample.AzureSql\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"18c42588-d8f0-48a9-a7af-02a5bf8252a9\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Revision and Build Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql/SqlStateService/SqlBotDataContext.cs",
    "content": "﻿using System.Data.Entity;\n\n\nnamespace Microsoft.Bot.Sample.AzureSql.SqlStateService\n{\n    public class SqlBotDataContext : DbContext\n    {\n        public SqlBotDataContext()\n            : this(\"BotDataContextConnectionString\")\n        {\n        }\n        public SqlBotDataContext(string connectionStringName)\n            : base(connectionStringName)\n        {\n        }\n        public DbSet<SqlBotDataEntity> BotData { get; set; }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql/SqlStateService/SqlBotDataEntity.cs",
    "content": "﻿using Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Builder.Dialogs.Internals;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing System;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Linq;\n\n\nnamespace Microsoft.Bot.Sample.AzureSql.SqlStateService\n{\n    public class SqlBotDataEntity : IAddress\n    {\n        private static readonly JsonSerializerSettings serializationSettings = new JsonSerializerSettings()\n                                    {\n                                        Formatting = Formatting.None,\n                                        NullValueHandling = NullValueHandling.Ignore\n                                    };\n        internal SqlBotDataEntity() { }\n        internal SqlBotDataEntity(BotStoreType botStoreType, string botId, string channelId, string conversationId, string userId, object data)\n        {\n            this.BotStoreType = botStoreType;\n            this.BotId = botId;\n            this.ChannelId = channelId;\n            this.ConversationId = conversationId;\n            this.UserId = userId;\n            this.Data = Serialize(data);\n        }\n\n\n        #region Fields\n\n        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]\n        public int Id { get; set; }\n        [Index(\"idxStoreChannelUser\", 1)]\n        [Index(\"idxStoreChannelConversation\", 1)]\n        [Index(\"idxStoreChannelConversationUser\", 1)]\n        public BotStoreType BotStoreType { get; set; }\n        public string BotId { get; set; }\n        [Index(\"idxStoreChannelConversation\", 2)]\n        [Index(\"idxStoreChannelUser\", 2)]\n        [Index(\"idxStoreChannelConversationUser\", 2)]\n        [MaxLength(200)]\n        public string ChannelId { get; set; }\n        [Index(\"idxStoreChannelConversation\", 3)]\n        [Index(\"idxStoreChannelConversationUser\", 3)]\n        [MaxLength(200)]\n        public string ConversationId { get; set; }\n        [Index(\"idxStoreChannelUser\", 3)]\n        [Index(\"idxStoreChannelConversationUser\", 4)]\n        [MaxLength(200)]\n        public string UserId { get; set; }\n        public byte[] Data { get; set; }        \n        public string ETag { get; set; }\n        public string ServiceUrl { get; set; }\n        [Required, DatabaseGenerated(DatabaseGeneratedOption.Computed)]\n        public DateTimeOffset Timestamp { get; set; }\n\n        #endregion Fields\n\n        #region Methods\n\n        private static byte[] Serialize(object data)\n        {\n            using (var cmpStream = new MemoryStream())\n            using (var stream = new GZipStream(cmpStream, CompressionMode.Compress))\n            using (var streamWriter = new StreamWriter(stream))\n            {\n                var serializedJSon = JsonConvert.SerializeObject(data, serializationSettings);\n                streamWriter.Write(serializedJSon);\n                streamWriter.Close();\n                stream.Close();\n                return cmpStream.ToArray();\n            }\n        }\n\n        private static object Deserialize(byte[] bytes)\n        {\n            using (var stream = new MemoryStream(bytes))\n            using (var gz = new GZipStream(stream, CompressionMode.Decompress))\n            using (var streamReader = new StreamReader(gz))\n            {\n                return JsonConvert.DeserializeObject(streamReader.ReadToEnd());\n            }\n        }\n\n        internal ObjectT GetData<ObjectT>()\n        {\n            return ((JObject)Deserialize(this.Data)).ToObject<ObjectT>();\n        }\n\n        internal object GetData()\n        {\n            return Deserialize(this.Data);\n        }\n        internal static SqlBotDataEntity GetSqlBotDataEntity(IAddress key, BotStoreType botStoreType, SqlBotDataContext context)\n        {\n            SqlBotDataEntity entity = null;\n            var query = context.BotData.OrderByDescending(d => d.Timestamp);\n            switch (botStoreType)\n            {\n                case BotStoreType.BotConversationData:\n                    entity = query.FirstOrDefault(d => d.BotStoreType == botStoreType\n                                                    && d.ChannelId == key.ChannelId\n                                                    && d.ConversationId == key.ConversationId);\n                    break;\n                case BotStoreType.BotUserData:\n                    entity = query.FirstOrDefault(d => d.BotStoreType == botStoreType\n                                                    && d.ChannelId == key.ChannelId\n                                                    && d.UserId == key.UserId);\n                    break;\n                case BotStoreType.BotPrivateConversationData:\n                    entity = query.FirstOrDefault(d => d.BotStoreType == botStoreType\n                                                    && d.ChannelId == key.ChannelId\n                                                    && d.ConversationId == key.ConversationId\n                                                    && d.UserId == key.UserId);\n                    break;\n                default:\n                    throw new ArgumentException(\"Unsupported bot store type!\");\n            }\n\n            return entity;\n        }\n        #endregion\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql/SqlStateService/SqlBotDataStore.cs",
    "content": "﻿using Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Builder.Dialogs.Internals;\nusing Microsoft.Bot.Connector;\nusing System;\nusing System.Net;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Web;\n\nnamespace Microsoft.Bot.Sample.AzureSql.SqlStateService\n{\n    public class SqlBotDataStore : IBotDataStore<BotData>\n    {\n        string _connectionStringName { get; set; }\n        public SqlBotDataStore(string connectionStringName)\n        {\n            _connectionStringName = connectionStringName;\n        }\n\n        async Task<BotData> IBotDataStore<BotData>.LoadAsync(IAddress key, BotStoreType botStoreType, CancellationToken cancellationToken)\n        {\n            using (var context = new SqlBotDataContext(_connectionStringName))\n            {\n                try\n                {\n                    SqlBotDataEntity entity = SqlBotDataEntity.GetSqlBotDataEntity(key, botStoreType, context);\n\n                    if (entity == null)\n                        return new BotData(eTag: String.Empty, data: null);\n                    \n                    return new BotData(entity.ETag, entity.GetData());\n                }               \n                catch (Exception ex)\n                {\n                    throw new HttpException((int)HttpStatusCode.InternalServerError, ex.Message);\n                }\n            }\n        }\n\n        async Task IBotDataStore<BotData>.SaveAsync(IAddress key, BotStoreType botStoreType, BotData botData, CancellationToken cancellationToken)\n        {\n            SqlBotDataEntity entity = new SqlBotDataEntity(botStoreType, key.BotId, key.ChannelId, key.ConversationId, key.UserId, botData.Data)\n            {\n                ETag = botData.ETag,\n                ServiceUrl = key.ServiceUrl\n            };\n\n            using (var context = new SqlBotDataContext(_connectionStringName))\n            {\n                try\n                {\n                    if (String.IsNullOrEmpty(entity.ETag))\n                    {\n                        context.BotData.Add(entity);\n                    }\n                    else if (entity.ETag == \"*\")\n                    {\n                        var foundData = SqlBotDataEntity.GetSqlBotDataEntity(key, botStoreType, context);\n                        if (botData.Data != null)\n                        {\n                            if (foundData == null)\n                                context.BotData.Add(entity);\n                            else\n                            {\n                                foundData.Data = entity.Data;\n                                foundData.ServiceUrl = entity.ServiceUrl;\n                            }\n                        }\n                        else\n                        {\n                            if (foundData != null)\n                                context.BotData.Remove(foundData);\n                        }\n                    }\n                    else\n                    {\n                        var foundData = SqlBotDataEntity.GetSqlBotDataEntity(key, botStoreType, context);\n                        if (botData.Data != null)\n                        {\n                            if (foundData == null)\n                                context.BotData.Add(entity);\n                            else\n                            {\n                                foundData.Data = entity.Data;\n                                foundData.ServiceUrl = entity.ServiceUrl;\n                                foundData.ETag = entity.ETag;\n                            }\n                        }\n                        else\n                        {\n                            if (foundData != null)\n                                context.BotData.Remove(foundData);\n                        }\n                    }\n                    context.SaveChanges();\n                }\n                catch (System.Data.SqlClient.SqlException err)\n                {\n                    throw new HttpException((int)HttpStatusCode.InternalServerError, err.Message);\n                }\n            }\n        }\n\n        Task<bool> IBotDataStore<BotData>.FlushAsync(IAddress key, CancellationToken cancellationToken)\n        {\n            // Everything is saved. Flush is no-op\n            return Task.FromResult(true);\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql/Web.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql/Web.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql/Web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  For more information on how to configure your ASP.NET application, please visit\n  http://go.microsoft.com/fwlink/?LinkId=301879\n  -->\n<configuration>\n  <configSections>\n    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->\n    <section name=\"entityFramework\" type=\"System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" requirePermission=\"false\" />\n  </configSections>\n  <connectionStrings>\n    <add name=\"BotDataContextConnectionString\" providerName=\"System.Data.SqlClient\" connectionString=\"Server=tcp:[YourDatabaseServerName].database.windows.net,1433;Initial Catalog=[YourDatabaseName];Persist Security Info=False;User ID=[YourDatabaseUserId];Password=[YourDatabaseUserPassword];MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;\" />\n      \n  </connectionStrings>\n  \n  <appSettings>\n    <!-- update these with your BotId, Microsoft App Id and your Microsoft App Password-->\n    <add key=\"BotId\" value=\"\" />\n    <add key=\"MicrosoftAppId\" value=\"\" />\n    <add key=\"MicrosoftAppPassword\" value=\"\" />\n  </appSettings>\n  <!--\n    For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367.\n\n    The following attributes can be set on the <httpRuntime> tag.\n      <system.Web>\n        <httpRuntime targetFramework=\"4.6\" />\n      </system.Web>\n  -->\n  <system.web>\n    <customErrors mode=\"Off\" />\n    <compilation debug=\"true\" targetFramework=\"4.6\" />\n    <httpRuntime targetFramework=\"4.6\" />\n  </system.web>\n  <system.webServer>\n    <defaultDocument>\n      <files>\n        <clear />\n        <add value=\"default.htm\" />\n      </files>\n    </defaultDocument>\n    <handlers>\n      <remove name=\"ExtensionlessUrlHandler-Integrated-4.0\" />\n      <remove name=\"OPTIONSVerbHandler\" />\n      <remove name=\"TRACEVerbHandler\" />\n      <add name=\"ExtensionlessUrlHandler-Integrated-4.0\" path=\"*.\" verb=\"*\" type=\"System.Web.Handlers.TransferRequestHandler\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n    </handlers>\n  </system.webServer>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Helpers\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Mvc\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.WebPages\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" publicKeyToken=\"30ad4fe6b2a6aeed\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-8.0.0.0\" newVersion=\"8.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.29.0\" newVersion=\"4.2.29.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Formatting\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n  <entityFramework>\n    <defaultConnectionFactory type=\"System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework\">\n      <parameters>\n        <parameter value=\"mssqllocaldb\" />\n      </parameters>\n    </defaultConnectionFactory>\n    <providers>\n      <provider invariantName=\"System.Data.SqlClient\" type=\"System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer\" />\n    </providers>\n  </entityFramework>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql/default.htm",
    "content": "﻿<!DOCTYPE html>\n<html>\n<head>\n    <title></title>\n    <meta charset=\"utf-8\" />\n</head>\n<body style=\"font-family:'Segoe UI'\">\n    <div style=\"display:table; margin: 0 auto;\">\n        <iframe style=\"min-width:450px;min-height:600px;\" src=\"https://webchat.botframework.com/embed/[YourBotId]?s=[YourWebChatSecret]\"></iframe>\n\n     </div>\n</body>\n</html>\n"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Autofac\" version=\"3.5.2\" targetFramework=\"net46\" />\n  <package id=\"Chronic.Signed\" version=\"0.3.2\" targetFramework=\"net46\" />\n  <package id=\"EntityFramework\" version=\"6.1.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.Client\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.Core\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.WebHost\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Bot.Builder\" version=\"3.8.1.0\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.IdentityModel.Protocol.Extensions\" version=\"1.0.4.403061554\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Rest.ClientRuntime\" version=\"2.3.2\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.WindowsAzure.ConfigurationManager\" version=\"3.1.0\" targetFramework=\"net46\" />\n  <package id=\"Newtonsoft.Json\" version=\"8.0.3\" targetFramework=\"net46\" />\n  <package id=\"System.IdentityModel.Tokens.Jwt\" version=\"4.0.4.403061554\" targetFramework=\"net46\" />\n</packages>"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/Microsoft.Bot.Sample.AzureSql.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26430.6\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Microsoft.Bot.Sample.AzureSql\", \"Microsoft.Bot.Sample.AzureSql\\Microsoft.Bot.Sample.AzureSql.csproj\", \"{18C42588-D8F0-48A9-A7AF-02A5BF8252A9}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{18C42588-D8F0-48A9-A7AF-02A5BF8252A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{18C42588-D8F0-48A9-A7AF-02A5BF8252A9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{18C42588-D8F0-48A9-A7AF-02A5BF8252A9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{18C42588-D8F0-48A9-A7AF-02A5BF8252A9}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "blog-samples/CSharp/AzureSql-StateClient/README.md",
    "content": "# Explanation\n\nA example State Client using Sql Server for storage.\n\n# Setup\n\n1) Register a bot with the Bot Framework at http://dev.botframework.com/ and add the AppId and AppPassword to Microsoft.Bot.Sample.AzureSql\\Web.config.\n\n2) Retrieve a WebChat secret from https://dev.botframework.com/bots/channels?id=[YourBotId]&channelId=webchat and add it to Microsoft.Bot.Sample.AzureSql\\default.htm in place of [YourWebChatSecret].\n\n3) Create an Sql Server database and add the connection string to Microsoft.Bot.Sample.AzureSql\\Web.config, overwriting the current [BotDataContextConnectionString].\n\n4) Execute 'update-database' from the Nuget Package Manager Console.  This will create the SqlBotDataEntities table.\n\n5) Publish the Bot as an Azure App Service, and add the public endpoint (https://[YourHostUrl]/api/messages) to the Bot Framework portal settings page. Make sure to use https instead of http in the url.\n"
  },
  {
    "path": "blog-samples/CSharp/Bot-Feedback-Sample/Bot-Feedback-Sample/App_Start/WebApiConfig.cs",
    "content": "﻿using System.Web.Http;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\n\nnamespace Bot_Feedback_Sample\n{\n    public static class WebApiConfig\n    {\n        public static void Register(HttpConfiguration config)\n        {\n            // Json settings\n            config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;\n            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();\n            config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented;\n            JsonConvert.DefaultSettings = () => new JsonSerializerSettings()\n            {\n                ContractResolver = new CamelCasePropertyNamesContractResolver(),\n                Formatting = Newtonsoft.Json.Formatting.Indented,\n                NullValueHandling = NullValueHandling.Ignore,\n            };\n\n            // Web API configuration and services\n\n            // Web API routes\n            config.MapHttpAttributeRoutes();\n\n            config.Routes.MapHttpRoute(\n                name: \"DefaultApi\",\n                routeTemplate: \"api/{controller}/{id}\",\n                defaults: new { id = RouteParameter.Optional }\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/Bot-Feedback-Sample/Bot-Feedback-Sample/ApplicationInsights.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ApplicationInsights xmlns=\"http://schemas.microsoft.com/ApplicationInsights/2013/Settings\">\n  <TelemetryInitializers>\n    <Add Type=\"Microsoft.ApplicationInsights.DependencyCollector.HttpDependenciesParsingTelemetryInitializer, Microsoft.AI.DependencyCollector\" />\n    <Add Type=\"Microsoft.ApplicationInsights.WindowsServer.AzureRoleEnvironmentTelemetryInitializer, Microsoft.AI.WindowsServer\" />\n    <Add Type=\"Microsoft.ApplicationInsights.WindowsServer.AzureWebAppRoleEnvironmentTelemetryInitializer, Microsoft.AI.WindowsServer\" />\n    <Add Type=\"Microsoft.ApplicationInsights.WindowsServer.BuildInfoConfigComponentVersionTelemetryInitializer, Microsoft.AI.WindowsServer\" />\n    <Add Type=\"Microsoft.ApplicationInsights.Web.WebTestTelemetryInitializer, Microsoft.AI.Web\" />\n    <Add Type=\"Microsoft.ApplicationInsights.Web.SyntheticUserAgentTelemetryInitializer, Microsoft.AI.Web\">\n      <!-- Extended list of bots:\n            search|spider|crawl|Bot|Monitor|BrowserMob|BingPreview|PagePeeker|WebThumb|URL2PNG|ZooShot|GomezA|Google SketchUp|Read Later|KTXN|KHTE|Keynote|Pingdom|AlwaysOn|zao|borg|oegp|silk|Xenu|zeal|NING|htdig|lycos|slurp|teoma|voila|yahoo|Sogou|CiBra|Nutch|Java|JNLP|Daumoa|Genieo|ichiro|larbin|pompos|Scrapy|snappy|speedy|vortex|favicon|indexer|Riddler|scooter|scraper|scrubby|WhatWeb|WinHTTP|voyager|archiver|Icarus6j|mogimogi|Netvibes|altavista|charlotte|findlinks|Retreiver|TLSProber|WordPress|wsr-agent|http client|Python-urllib|AppEngine-Google|semanticdiscovery|facebookexternalhit|web/snippet|Google-HTTP-Java-Client-->\n      <Filters>search|spider|crawl|Bot|Monitor|AlwaysOn</Filters>\n    </Add>\n    <Add Type=\"Microsoft.ApplicationInsights.Web.ClientIpHeaderTelemetryInitializer, Microsoft.AI.Web\" />\n    <Add Type=\"Microsoft.ApplicationInsights.Web.OperationNameTelemetryInitializer, Microsoft.AI.Web\" />\n    <Add Type=\"Microsoft.ApplicationInsights.Web.OperationCorrelationTelemetryInitializer, Microsoft.AI.Web\" />\n    <Add Type=\"Microsoft.ApplicationInsights.Web.UserTelemetryInitializer, Microsoft.AI.Web\" />\n    <Add Type=\"Microsoft.ApplicationInsights.Web.AuthenticatedUserIdTelemetryInitializer, Microsoft.AI.Web\" />\n    <Add Type=\"Microsoft.ApplicationInsights.Web.AccountIdTelemetryInitializer, Microsoft.AI.Web\" />\n    <Add Type=\"Microsoft.ApplicationInsights.Web.SessionTelemetryInitializer, Microsoft.AI.Web\" />\n  </TelemetryInitializers>\n  <TelemetryModules>\n    <Add Type=\"Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule, Microsoft.AI.DependencyCollector\">\n      <ExcludeComponentCorrelationHttpHeadersOnDomains>\n        <!-- \n        Requests to the following hostnames will not be modified by adding correlation headers. \n        This is only applicable if Profiler is installed via either StatusMonitor or Azure Extension.\n        Add entries here to exclude additional hostnames.\n        NOTE: this configuration will be lost upon NuGet upgrade.\n        -->\n        <Add>core.windows.net</Add>\n        <Add>core.chinacloudapi.cn</Add>\n        <Add>core.cloudapi.de</Add>\n        <Add>core.usgovcloudapi.net</Add>\n        <Add>localhost</Add>\n        <Add>127.0.0.1</Add>\n      </ExcludeComponentCorrelationHttpHeadersOnDomains>\n    </Add>\n    <Add Type=\"Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule, Microsoft.AI.PerfCounterCollector\">\n      <!--\n      Use the following syntax here to collect additional performance counters:\n      \n      <Counters>\n        <Add PerformanceCounter=\"\\Process(??APP_WIN32_PROC??)\\Handle Count\" ReportAs=\"Process handle count\" />\n        ...\n      </Counters>\n      \n      PerformanceCounter must be either \\CategoryName(InstanceName)\\CounterName or \\CategoryName\\CounterName\n      \n      NOTE: performance counters configuration will be lost upon NuGet upgrade.\n      \n      The following placeholders are supported as InstanceName:\n        ??APP_WIN32_PROC?? - instance name of the application process  for Win32 counters.\n        ??APP_W3SVC_PROC?? - instance name of the application IIS worker process for IIS/ASP.NET counters.\n        ??APP_CLR_PROC?? - instance name of the application CLR process for .NET counters.\n      -->\n    </Add>\n    <Add Type=\"Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse.QuickPulseTelemetryModule, Microsoft.AI.PerfCounterCollector\" />\n    <Add Type=\"Microsoft.ApplicationInsights.WindowsServer.DeveloperModeWithDebuggerAttachedTelemetryModule, Microsoft.AI.WindowsServer\" />\n    <Add Type=\"Microsoft.ApplicationInsights.WindowsServer.UnhandledExceptionTelemetryModule, Microsoft.AI.WindowsServer\" />\n    <Add Type=\"Microsoft.ApplicationInsights.WindowsServer.UnobservedExceptionTelemetryModule, Microsoft.AI.WindowsServer\">\n      <!--</Add>\n    <Add Type=\"Microsoft.ApplicationInsights.WindowsServer.FirstChanceExceptionStatisticsTelemetryModule, Microsoft.AI.WindowsServer\">-->\n    </Add>\n    <Add Type=\"Microsoft.ApplicationInsights.Web.RequestTrackingTelemetryModule, Microsoft.AI.Web\">\n      <Handlers>\n        <!-- \n        Add entries here to filter out additional handlers: \n        \n        NOTE: handler configuration will be lost upon NuGet upgrade.\n        -->\n        <Add>System.Web.Handlers.TransferRequestHandler</Add>\n        <Add>Microsoft.VisualStudio.Web.PageInspector.Runtime.Tracing.RequestDataHttpHandler</Add>\n        <Add>System.Web.StaticFileHandler</Add>\n        <Add>System.Web.Handlers.AssemblyResourceLoader</Add>\n        <Add>System.Web.Optimization.BundleHandler</Add>\n        <Add>System.Web.Script.Services.ScriptHandlerFactory</Add>\n        <Add>System.Web.Handlers.TraceHandler</Add>\n        <Add>System.Web.Services.Discovery.DiscoveryRequestHandler</Add>\n        <Add>System.Web.HttpDebugHandler</Add>\n      </Handlers>\n    </Add>\n    <Add Type=\"Microsoft.ApplicationInsights.Web.ExceptionTrackingTelemetryModule, Microsoft.AI.Web\" />\n    <Add Type=\"Microsoft.ApplicationInsights.Web.AspNetDiagnosticTelemetryModule, Microsoft.AI.Web\" />\n  </TelemetryModules>\n  <TelemetryProcessors>\n    <Add Type=\"Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.QuickPulse.QuickPulseTelemetryProcessor, Microsoft.AI.PerfCounterCollector\" />\n    <Add Type=\"Microsoft.ApplicationInsights.Extensibility.AutocollectedMetricsExtractor, Microsoft.ApplicationInsights\" />\n    <Add Type=\"Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel\">\n      <MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>\n      <ExcludedTypes>Event</ExcludedTypes>\n    </Add>\n    <Add Type=\"Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.AdaptiveSamplingTelemetryProcessor, Microsoft.AI.ServerTelemetryChannel\">\n      <MaxTelemetryItemsPerSecond>5</MaxTelemetryItemsPerSecond>\n      <IncludedTypes>Event</IncludedTypes>\n    </Add>\n  </TelemetryProcessors>\n  <TelemetryChannel Type=\"Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel\" />\n  <!-- \n    Learn more about Application Insights configuration with ApplicationInsights.config here: \n    http://go.microsoft.com/fwlink/?LinkID=513840\n    \n    Note: If not present, please add <InstrumentationKey>Your Key</InstrumentationKey> to the top of this file.\n  -->\n  <InstrumentationKey>5728d8e7-0ce9-4571-b266-3a8a75cbb051</InstrumentationKey>\n</ApplicationInsights>"
  },
  {
    "path": "blog-samples/CSharp/Bot-Feedback-Sample/Bot-Feedback-Sample/Bot-Feedback-Sample.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Bot_Feedback_Sample</RootNamespace>\n    <AssemblyName>Bot Application</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <UseIISExpress>true</UseIISExpress>\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n    <TargetFrameworkProfile />\n    <Use64BitIISExpress />\n    <ApplicationInsightsResourceId>/subscriptions/3e2f81a1-d5b4-47c0-951e-5611a012e1a3/resourcegroups/Default-ApplicationInsights-EastUS/providers/microsoft.insights/components/Bot-Feedback-Sample</ApplicationInsightsResourceId>\n    <ApplicationInsightsAnnotationResourceId>/subscriptions/3e2f81a1-d5b4-47c0-951e-5611a012e1a3/resourcegroups/Default-ApplicationInsights-EastUS/providers/microsoft.insights/components/Bot-Feedback-Sample</ApplicationInsightsAnnotationResourceId>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Autofac, Version=3.5.0.0, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Autofac.3.5.2\\lib\\net40\\Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Chronic, Version=0.3.2.0, Culture=neutral, PublicKeyToken=3bd1f1ef638b0d3c, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Chronic.Signed.0.3.2\\lib\\net40\\Chronic.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AI.Agent.Intercept, Version=2.4.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.ApplicationInsights.Agent.Intercept.2.4.0\\lib\\net45\\Microsoft.AI.Agent.Intercept.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AI.DependencyCollector, Version=2.4.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.ApplicationInsights.DependencyCollector.2.4.1\\lib\\net45\\Microsoft.AI.DependencyCollector.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AI.PerfCounterCollector, Version=2.4.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.ApplicationInsights.PerfCounterCollector.2.4.1\\lib\\net45\\Microsoft.AI.PerfCounterCollector.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AI.ServerTelemetryChannel, Version=2.4.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.2.4.0\\lib\\net45\\Microsoft.AI.ServerTelemetryChannel.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AI.Web, Version=2.4.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.ApplicationInsights.Web.2.4.1\\lib\\net45\\Microsoft.AI.Web.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AI.WindowsServer, Version=2.4.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.ApplicationInsights.WindowsServer.2.4.1\\lib\\net45\\Microsoft.AI.WindowsServer.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.ApplicationInsights, Version=2.4.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.ApplicationInsights.2.4.0\\lib\\net46\\Microsoft.ApplicationInsights.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AspNet.TelemetryCorrelation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.AspNet.TelemetryCorrelation.1.0.0\\lib\\net45\\Microsoft.AspNet.TelemetryCorrelation.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder, Version=3.9.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.9.0.0\\lib\\net46\\Microsoft.Bot.Builder.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder.Autofac, Version=3.9.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.9.0.0\\lib\\net46\\Microsoft.Bot.Builder.Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder.CognitiveServices.QnAMaker, Version=1.1.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.CognitiveServices.1.1.1\\lib\\net46\\Microsoft.Bot.Builder.CognitiveServices.QnAMaker.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Connector, Version=3.9.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.9.0.0\\lib\\net46\\Microsoft.Bot.Connector.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"Microsoft.IdentityModel.Protocol.Extensions, Version=1.0.40306.1554, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Protocol.Extensions.1.0.4.403061554\\lib\\net45\\Microsoft.IdentityModel.Protocol.Extensions.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.Rest.ClientRuntime.2.3.2\\lib\\net45\\Microsoft.Rest.ClientRuntime.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.WindowsAzure.Configuration, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.WindowsAzure.ConfigurationManager.3.1.0\\lib\\net40\\Microsoft.WindowsAzure.Configuration.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Newtonsoft.Json.8.0.3\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Diagnostics.DiagnosticSource, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Diagnostics.DiagnosticSource.4.4.0\\lib\\net46\\System.Diagnostics.DiagnosticSource.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.IdentityModel.Tokens.Jwt, Version=4.0.40306.1554, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.IdentityModel.Tokens.Jwt.4.0.4.403061554\\lib\\net45\\System.IdentityModel.Tokens.Jwt.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.Client.5.2.3\\lib\\net45\\System.Net.Http.Formatting.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net.Http.WebRequest\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.Core.5.2.3\\lib\\net45\\System.Web.Http.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.Http.WebHost, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.WebHost.5.2.3\\lib\\net45\\System.Web.Http.WebHost.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n    <Reference Include=\"System.Xml.Linq\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"default.htm\" />\n    <Content Include=\"Global.asax\" />\n    <Content Include=\"Web.config\">\n      <SubType>Designer</SubType>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"App_Start\\WebApiConfig.cs\" />\n    <Compile Include=\"Controllers\\MessagesController.cs\" />\n    <Compile Include=\"Dialogs\\FeedbackDialog.cs\" />\n    <Compile Include=\"Dialogs\\QnADialog.cs\" />\n    <Compile Include=\"Dialogs\\RootDialog.cs\" />\n    <Compile Include=\"Global.asax.cs\">\n      <DependentUpon>Global.asax</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"packages.config\" />\n    <Content Include=\"ApplicationInsights.config\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"Connected Services\\Application Insights\\ConnectedService.json\" />\n    <None Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n    <None Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <WCFMetadata Include=\"Connected Services\\\" />\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <PropertyGroup>\n    <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>3979</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost:3979/</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "blog-samples/CSharp/Bot-Feedback-Sample/Bot-Feedback-Sample/Connected Services/Application Insights/ConnectedService.json",
    "content": "﻿{\n  \"ProviderId\": \"Microsoft.ApplicationInsights.ConnectedService.ConnectedServiceProvider\",\n  \"Version\": \"8.8.712.1\",\n  \"GettingStartedDocument\": {\n    \"Uri\": \"\"\n  }\n}"
  },
  {
    "path": "blog-samples/CSharp/Bot-Feedback-Sample/Bot-Feedback-Sample/Controllers/MessagesController.cs",
    "content": "﻿using System.Net;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing System.Web.Http;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\n\nnamespace Bot_Feedback_Sample\n{\n    [BotAuthentication]\n    public class MessagesController : ApiController\n    {\n        /// <summary>\n        /// POST: api/Messages\n        /// Receive a message from a user and reply to it\n        /// </summary>\n        public async Task<HttpResponseMessage> Post([FromBody]Activity activity)\n        {\n            if (activity.Type == ActivityTypes.Message)\n            {\n                await Conversation.SendAsync(activity, () => new Dialogs.QnaDialog());\n            }\n            else\n            {\n                HandleSystemMessage(activity);\n            }\n            var response = Request.CreateResponse(HttpStatusCode.OK);\n            return response;\n        }\n\n        private Activity HandleSystemMessage(Activity message)\n        {\n            if (message.Type == ActivityTypes.DeleteUserData)\n            {\n                // Implement user deletion here\n                // If we handle user deletion, return a real message\n            }\n            else if (message.Type == ActivityTypes.ConversationUpdate)\n            {\n                // Handle conversation state changes, like members being added and removed\n                // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info\n                // Not available in all channels\n            }\n            else if (message.Type == ActivityTypes.ContactRelationUpdate)\n            {\n                // Handle add/remove from contact lists\n                // Activity.From + Activity.Action represent what happened\n            }\n            else if (message.Type == ActivityTypes.Typing)\n            {\n                // Handle knowing tha the user is typing\n            }\n            else if (message.Type == ActivityTypes.Ping)\n            {\n            }\n\n            return null;\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/Bot-Feedback-Sample/Bot-Feedback-Sample/Dialogs/FeedbackDialog.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\nusing System.Threading.Tasks;\nusing Microsoft.ApplicationInsights;\n\nnamespace Bot_Feedback_Sample\n{\n    [Serializable]\n    public class FeedbackDialog : IDialog<IMessageActivity>\n    {\n        private string qnaURL;\n        private string userQuestion;\n\n        public FeedbackDialog(string url, string question)\n        {\n            // keep track of data associated with feedback\n            qnaURL = url;\n            userQuestion = question;\n        }\n\n        public async Task StartAsync(IDialogContext context)\n        {\n            var feedback = ((Activity)context.Activity).CreateReply(\"Did you find what you need?\");\n\n            feedback.SuggestedActions = new SuggestedActions()\n            {\n                Actions = new List<CardAction>()\n                {\n                    new CardAction(){ Title = \"👍\", Type=ActionTypes.PostBack, Value=$\"yes-positive-feedback\" },\n                    new CardAction(){ Title = \"👎\", Type=ActionTypes.PostBack, Value=$\"no-negative-feedback\" }\n                }\n            };\n\n            await context.PostAsync(feedback);\n\n            context.Wait(this.MessageReceivedAsync);\n        }\n\n        public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)\n        {\n            var userFeedback = await result;\n\n            if (userFeedback.Text.Contains(\"yes-positive-feedback\") || userFeedback.Text.Contains(\"no-negative-feedback\"))\n            {\n                // create telemetry client to post to Application Insights \n                TelemetryClient telemetry = new TelemetryClient();\n\n                if (userFeedback.Text.Contains(\"yes-positive-feedback\"))\n                {\n                    // post feedback to App Insights\n                    var properties = new Dictionary<string, string>\n                    {\n                        {\"Question\", userQuestion },\n                        {\"URL\", qnaURL },\n                        {\"Vote\", \"Yes\" }\n                        // add properties relevant to your bot \n                    };\n\n                    telemetry.TrackEvent(\"Yes-Vote\", properties);\n                }\n                else if (userFeedback.Text.Contains(\"no-negative-feedback\"))\n                {\n                    // post feedback to App Insights\n                }\n\n                await context.PostAsync(\"Thanks for your feedback!\");\n\n                context.Done<IMessageActivity>(null);\n            }\n            else\n            {\n                // no feedback, return to QnA dialog\n                context.Done<IMessageActivity>(userFeedback);\n            }\n        }\n    }\n}\n\n\n\n"
  },
  {
    "path": "blog-samples/CSharp/Bot-Feedback-Sample/Bot-Feedback-Sample/Dialogs/QnADialog.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Configuration;\nusing Microsoft.Bot.Connector;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Builder.CognitiveServices.QnAMaker;\nusing Newtonsoft.Json.Linq;\n\nnamespace Bot_Feedback_Sample.Dialogs\n{\n    [Serializable]\n    public class QnaDialog : QnAMakerDialog\n    {\n        public QnaDialog() : base(new QnAMakerService(new QnAMakerAttribute(ConfigurationManager.AppSettings[\"QnaSubscriptionKey\"], ConfigurationManager.AppSettings[\"QnaKnowledgebaseId\"], \"Sorry, I couldn't find an answer for that\", 0.5)))\n        {\n        }\n\n        protected override async Task RespondFromQnAMakerResultAsync(IDialogContext context, IMessageActivity message, QnAMakerResults result)\n        {\n            // answer is a string\n            var answer = result.Answers.First().Answer;\n\n            Activity reply = ((Activity)context.Activity).CreateReply();\n\n            string[] qnaAnswerData = answer.Split(';');\n            int dataSize = qnaAnswerData.Length;\n\n            string title = qnaAnswerData[0];\n            string description = qnaAnswerData[1];\n            string url = qnaAnswerData[2];\n            string imageURL = qnaAnswerData[3];\n\n            HeroCard card = new HeroCard\n            {\n                Title = title,\n                Subtitle = description,\n            };\n\n            card.Buttons = new List<CardAction>\n            {\n                new CardAction(ActionTypes.OpenUrl, \"Learn More\", value: url)\n            };\n\n            card.Images = new List<CardImage>\n            {\n                new CardImage( url = imageURL)\n            };\n\n            reply.Attachments.Add(card.ToAttachment());\n\n\n            await context.PostAsync(reply);\n        }\n\n        protected override async Task DefaultWaitNextMessageAsync(IDialogContext context, IMessageActivity message, QnAMakerResults result)\n        {\n                // get the URL\n                var answer = result.Answers.First().Answer;\n                string[] qnaAnswerData = answer.Split(';');\n                string qnaURL = qnaAnswerData[2];\n\n                // pass user's question\n                var userQuestion = (context.Activity as Activity).Text;\n\n                context.Call(new FeedbackDialog(qnaURL, userQuestion), ResumeAfterFeedback);\n            \n        }\n\n        private async Task ResumeAfterFeedback(IDialogContext context, IAwaitable<IMessageActivity> result)\n        {\n            if(await result != null)\n            {\n                await MessageReceivedAsync(context, result);\n            }\n            else\n            {\n                context.Done<IMessageActivity>(null);\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/Bot-Feedback-Sample/Bot-Feedback-Sample/Global.asax",
    "content": "﻿<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"Bot_Feedback_Sample.WebApiApplication\" Language=\"C#\" %>\n"
  },
  {
    "path": "blog-samples/CSharp/Bot-Feedback-Sample/Bot-Feedback-Sample/Global.asax.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Http;\nusing System.Web.Routing;\n\nnamespace Bot_Feedback_Sample\n{\n    public class WebApiApplication : System.Web.HttpApplication\n    {\n        protected void Application_Start()\n        {\n            GlobalConfiguration.Configure(WebApiConfig.Register);\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/Bot-Feedback-Sample/Bot-Feedback-Sample/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Bot_Feedback_Sample\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Bot_Feedback_Sample\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"2e57f6e6-e098-4456-aa2a-58ff8d7d8821\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Revision and Build Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "blog-samples/CSharp/Bot-Feedback-Sample/Bot-Feedback-Sample/Web.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/Bot-Feedback-Sample/Bot-Feedback-Sample/Web.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/Bot-Feedback-Sample/Bot-Feedback-Sample/Web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  For more information on how to configure your ASP.NET application, please visit\n  http://go.microsoft.com/fwlink/?LinkId=301879\n  -->\n<configuration>\n  <appSettings>\n    <!-- update these with your BotId, Microsoft App Id and your Microsoft App Password-->\n    <add key=\"BotId\" value=\"YourBotId\" />\n    <add key=\"MicrosoftAppId\" value=\"\" />\n    <add key=\"MicrosoftAppPassword\" value=\"\" />\n    <add key=\"QnaSubscriptionKey\" value=\"\" />\n    <add key=\"QnaKnowledgebaseId\" value=\"\" />\n  </appSettings>\n  <!--\n    For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367.\n\n    The following attributes can be set on the <httpRuntime> tag.\n      <system.Web>\n        <httpRuntime targetFramework=\"4.6\" />\n      </system.Web>\n  -->\n  <system.web>\n    <customErrors mode=\"Off\" /> \n    <compilation debug=\"true\" targetFramework=\"4.6\" />\n    <httpRuntime targetFramework=\"4.6\" />\n    <httpModules>\n      <add name=\"ApplicationInsightsWebTracking\" type=\"Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web\" />\n    </httpModules>\n  </system.web>\n  <system.webServer>\n    <defaultDocument>\n      <files>\n        <clear />\n        <add value=\"default.htm\" />\n      </files>\n    </defaultDocument>\n    \n  <handlers>\n      <remove name=\"ExtensionlessUrlHandler-Integrated-4.0\" />\n      <remove name=\"OPTIONSVerbHandler\" />\n      <remove name=\"TRACEVerbHandler\" />\n      <add name=\"ExtensionlessUrlHandler-Integrated-4.0\" path=\"*.\" verb=\"*\" type=\"System.Web.Handlers.TransferRequestHandler\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n    </handlers>\n  <modules>\n  <remove name=\"TelemetryCorrelationHttpModule\" />\n  <add name=\"TelemetryCorrelationHttpModule\" type=\"Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule, Microsoft.AspNet.TelemetryCorrelation\" preCondition=\"integratedMode,managedHandler\" />\n  <remove name=\"ApplicationInsightsWebTracking\" />\n  <add name=\"ApplicationInsightsWebTracking\" type=\"Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web\" preCondition=\"managedHandler\" />\n  </modules>\n  <validation validateIntegratedModeConfiguration=\"false\" />\n  </system.webServer>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Helpers\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Mvc\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.WebPages\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" publicKeyToken=\"30ad4fe6b2a6aeed\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-8.0.0.0\" newVersion=\"8.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.29.0\" newVersion=\"4.2.29.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Formatting\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/Bot-Feedback-Sample/Bot-Feedback-Sample/default.htm",
    "content": "﻿<!DOCTYPE html>\n<html>\n<head>\n    <title></title>\n    <meta charset=\"utf-8\" />\n</head>\n<body style=\"font-family:'Segoe UI'\">\n    <h1>Bot_Feedback_Sample</h1>\n    <p>Describe your bot here and your terms of use etc.</p>\n    <p>Visit <a href=\"https://www.botframework.com/\">Bot Framework</a> to register your bot. When you register it, remember to set your bot's endpoint to <pre>https://<i>your_bots_hostname</i>/api/messages</pre></p>\n</body>\n</html>\n"
  },
  {
    "path": "blog-samples/CSharp/Bot-Feedback-Sample/Bot-Feedback-Sample/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Autofac\" version=\"3.5.2\" targetFramework=\"net46\" />\n  <package id=\"Chronic.Signed\" version=\"0.3.2\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.ApplicationInsights\" version=\"2.4.0\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.ApplicationInsights.Agent.Intercept\" version=\"2.4.0\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.ApplicationInsights.DependencyCollector\" version=\"2.4.1\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.ApplicationInsights.PerfCounterCollector\" version=\"2.4.1\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.ApplicationInsights.Web\" version=\"2.4.1\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.ApplicationInsights.WindowsServer\" version=\"2.4.1\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel\" version=\"2.4.0\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.TelemetryCorrelation\" version=\"1.0.0\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.Client\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.Core\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.WebHost\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Bot.Builder\" version=\"3.9.0.0\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Bot.Builder.CognitiveServices\" version=\"1.1.1\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.IdentityModel.Protocol.Extensions\" version=\"1.0.4.403061554\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Rest.ClientRuntime\" version=\"2.3.2\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.WindowsAzure.ConfigurationManager\" version=\"3.1.0\" targetFramework=\"net46\" />\n  <package id=\"Newtonsoft.Json\" version=\"8.0.3\" targetFramework=\"net46\" />\n  <package id=\"System.Diagnostics.DiagnosticSource\" version=\"4.4.0\" targetFramework=\"net46\" />\n  <package id=\"System.IdentityModel.Tokens.Jwt\" version=\"4.0.4.403061554\" targetFramework=\"net46\" />\n</packages>"
  },
  {
    "path": "blog-samples/CSharp/Bot-Feedback-Sample/Bot-Feedback-Sample.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26730.15\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Bot-Feedback-Sample\", \"Bot-Feedback-Sample\\Bot-Feedback-Sample.csproj\", \"{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {F417B28C-F273-42B3-8A2F-01C59DCEB6B6}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "blog-samples/CSharp/Bot-Feedback-Sample/README.md",
    "content": "# QnA Bot sample - Suggested Actions to handle user feedback, with Azure Application Insights\n\nThis bot sample using the .NET SDK is a continuation of the ['QnA Rich Cards'](https://github.com/Microsoft/BotFramework-Samples/tree/master/blog-samples/CSharp/Qna-Rich-Cards) sample within this repo. This bot sample was developed to accompany the Bot Framework blog post - [QnA revisited, with Suggested Actions and App Insights](https://blog.botframework.com/2017/09/28/qna-maker-revisited-suggested-actions-app-insights/)\n\nThis sample aims to:\n\n1. Demonstrate ease and flexibility of [Suggested Actions](https://docs.microsoft.com/en-us/bot-framework/dotnet/bot-builder-dotnet-add-suggested-actions) within the Bot Builder SDK, using Suggested Actions to implement a user 'feedback' thumbs up/down feature. \n\n![Feedback with Suggested Actions][pic1]\n\n2. Demonstrate how to add [Application Insights](https://azure.microsoft.com/en-us/services/application-insights/) to a bot project, and track custom events. \n\n![App Insights Metrics][pic2]\n\n> **Note**: The application insights configuration for this sample is for demonstration only. Application Insights will not work on cloned/forked copies of this repo, and will need to be added to your own project. Don't worry, it's easy - just [click here](https://docs.microsoft.com/en-us/azure/application-insights/app-insights-asp-net) to read about how. \n\n## Prerequisites\n- [Visual Studio 2015 or 2017 Community](https://www.visualstudio.com/downloads/)\n- [Bot Application Template](http://aka.ms/bf-bc-vstemplate)\n- [BotBuilder-CognitiveServices](https://www.nuget.org/packages/Microsoft.Bot.Builder.CognitiveServices/) NuGet package \n- [Bot Framework Emulator](https://docs.microsoft.com/en-us/bot-framework/debug-bots-emulator)\n\n[pic1]: ../../images/suggested-actions-feedback.png\n[pic2]: ../../images/app-insights-metrics.png\n\n## Notes:\n- You will need to add Application Insights to your own project, [click here](https://docs.microsoft.com/en-us/azure/application-insights/app-insights-asp-net) to read how. \n\n- You will need to publish your own QnA knowledge base service - [click here](https://qnamaker.ai/Documentation/Quickstart) for the QnA maker overview, or you can review [this blog post](https://blog.botframework.com/2017/08/25/qna-maker-rich-card-attachments-net/) which walks you through how to setup and deploy your own QnA service. \n"
  },
  {
    "path": "blog-samples/CSharp/BotStateExport/.gitignore",
    "content": "# User-specific files\n*.suo\n*.user\n*.sln.docstates\n\n# Build results\n[Dd]ebug/\n[Rr]elease/\nx64/\n[Bb]in/\n[Oo]bj/\n# build folder is nowadays used for build scripts and should not be ignored\n#build/\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/packages/*\n# except build/, which is used as an MSBuild target.\n!**/packages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/packages/repositories.config\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n*_i.c\n*_p.c\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.log\n*.scc\n\n# OS generated files #\n.DS_Store*\nIcon?\n\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.Publish.xml\n\n# Windows Azure Build Output\ncsx\n*.build.csdef\n\n# Windows Store app package directory\nAppPackages/\n\n# Others\n*.Cache\nClientBin/\n[Ss]tyle[Cc]op.*\n~$*\n*~\n*.dbmdl\n*.[Pp]ublish.xml\n*.pfx\n*.publishsettings\nmodulesbin/\ntempbin/\n\n# EPiServer Site file (VPP)\nAppData/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file to a newer\n# Visual Studio version. Backup files are not needed, because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# vim\n*.txt~\n*.swp\n*.swo\n \n# svn\n.svn\n\n# Remainings from resolvings conflicts in Source Control\n*.orig\n\n# SQL Server files\n**/App_Data/*.mdf\n**/App_Data/*.ldf\n**/App_Data/*.sdf\n\n\n#LightSwitch generated files\nGeneratedArtifacts/\n_Pvt_Extensions/\nModelManifest.xml\n\n# =========================\n# Windows detritus\n# =========================\n\n# Windows image file caches\nThumbs.db\nehthumbs.db\n\n# Folder config file\nDesktop.ini\n\n# Recycle Bin used on file shares\n$RECYCLE.BIN/\n\n# Mac desktop service store files\n.DS_Store\n\n# SASS Compiler cache\n.sass-cache\n\n# Visual Studio 2014 CTP\n**/*.sln.ide\n\n# Visual Studio temp something\n.vs/\n\n# dotnet stuff\nproject.lock.json\n\n# VS 2015+\n*.vc.vc.opendb\n*.vc.db\n\n# Rider\n.idea/\n\n# Output folder used by Webpack or other FE stuff\n**/node_modules/*\n**/wwwroot/*\n\n# SpecFlow specific\n*.feature.cs\n*.feature.xlsx.*\n*.Specs_*.html\n\n#####\n# End of core ignore list, below put you custom 'per project' settings (patterns or path)\n#####"
  },
  {
    "path": "blog-samples/CSharp/BotStateExport/BotStateExport/BotStateExport/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.1\" />\n    </startup>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" publicKeyToken=\"30ad4fe6b2a6aeed\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-11.0.0.0\" newVersion=\"11.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Azure.Storage.Common\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-9.0.0.0\" newVersion=\"9.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Azure.Documents.Client\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.21.0.0\" newVersion=\"1.21.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/BotStateExport/BotStateExport/BotStateExport/BotStateExport.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{DA593586-7A94-43D4-8EF1-0474EFF6D2E0}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <RootNamespace>BotStateExport</RootNamespace>\n    <AssemblyName>BotStateExport</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Autofac\">\n      <HintPath>..\\packages\\Autofac.3.5.2\\lib\\net40\\Autofac.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Chronic, Version=0.3.2.0, Culture=neutral, PublicKeyToken=3bd1f1ef638b0d3c, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Chronic.Signed.0.3.2\\lib\\net40\\Chronic.dll</HintPath>\n    </Reference>\n    <Reference Include=\"CommandLine, Version=2.2.1.0, Culture=neutral, PublicKeyToken=de6f01bd326f8c32, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\CommandLineParser.2.2.1\\lib\\net45\\CommandLine.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Azure.CosmosDB.Table, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Azure.CosmosDB.Table.1.1.1\\lib\\net45\\Microsoft.Azure.CosmosDB.Table.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Azure.DocumentDB.Core, Version=1.9.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Azure.DocumentDB.Core.1.9.1\\lib\\netstandard1.6\\Microsoft.Azure.DocumentDB.Core.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Azure.KeyVault.Core\">\n      <HintPath>..\\packages\\Microsoft.Azure.KeyVault.Core.1.0.0\\lib\\net40\\Microsoft.Azure.KeyVault.Core.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.Azure.Storage.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Azure.Storage.Common.9.0.0.1-preview\\lib\\net45\\Microsoft.Azure.Storage.Common.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.15.0\\lib\\net46\\Microsoft.Bot.Builder.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder.Autofac\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.15.0\\lib\\net46\\Microsoft.Bot.Builder.Autofac.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Connector\">\n      <HintPath>..\\packages\\Microsoft.Bot.Connector.3.15.0\\lib\\net46\\Microsoft.Bot.Connector.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.Data.Edm\">\n      <HintPath>..\\packages\\Microsoft.Data.Edm.5.8.2\\lib\\net40\\Microsoft.Data.Edm.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.Data.OData\">\n      <HintPath>..\\packages\\Microsoft.Data.OData.5.8.2\\lib\\net40\\Microsoft.Data.OData.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.Data.Services.Client\">\n      <HintPath>..\\packages\\Microsoft.Data.Services.Client.5.8.2\\lib\\net40\\Microsoft.Data.Services.Client.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.IdentityModel.Logging\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Logging.1.1.4\\lib\\net451\\Microsoft.IdentityModel.Logging.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.IdentityModel.Protocols\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Protocols.2.1.4\\lib\\net451\\Microsoft.IdentityModel.Protocols.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.IdentityModel.Protocols.OpenIdConnect\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Protocols.OpenIdConnect.2.1.4\\lib\\net451\\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.IdentityModel.Tokens\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Tokens.5.1.4\\lib\\net451\\Microsoft.IdentityModel.Tokens.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.OData.Core\">\n      <HintPath>..\\packages\\Microsoft.OData.Core.7.2.0\\lib\\portable-net45+win8+wpa81\\Microsoft.OData.Core.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.OData.Edm\">\n      <HintPath>..\\packages\\Microsoft.OData.Edm.7.2.0\\lib\\portable-net45+win8+wpa81\\Microsoft.OData.Edm.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Rest.ClientRuntime.2.3.11\\lib\\net452\\Microsoft.Rest.ClientRuntime.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Spatial\">\n      <HintPath>..\\packages\\Microsoft.Spatial.7.2.0\\lib\\portable-net45+win8+wpa81\\Microsoft.Spatial.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.Win32.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Win32.Primitives.4.0.1\\lib\\net46\\Microsoft.Win32.Primitives.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.WindowsAzure.Configuration, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.WindowsAzure.ConfigurationManager.3.2.3\\lib\\net40\\Microsoft.WindowsAzure.Configuration.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.WindowsAzure.Storage\">\n      <HintPath>..\\packages\\WindowsAzure.Storage.9.1.0\\lib\\net45\\Microsoft.WindowsAzure.Storage.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Newtonsoft.Json.11.0.2\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.AppContext, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.AppContext.4.1.0\\lib\\net46\\System.AppContext.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Collections.NonGeneric, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Collections.NonGeneric.4.0.1\\lib\\net46\\System.Collections.NonGeneric.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Collections.Specialized, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Collections.Specialized.4.0.1\\lib\\net46\\System.Collections.Specialized.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.ComponentModel.Composition\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Console\">\n      <HintPath>..\\packages\\System.Console.4.0.0\\lib\\net46\\System.Console.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Diagnostics.DiagnosticSource, Version=4.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Diagnostics.DiagnosticSource.4.0.0\\lib\\net46\\System.Diagnostics.DiagnosticSource.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Diagnostics.TraceSource, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Diagnostics.TraceSource.4.0.0\\lib\\net46\\System.Diagnostics.TraceSource.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Globalization.Calendars, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Globalization.Calendars.4.0.1\\lib\\net46\\System.Globalization.Calendars.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.IdentityModel.Tokens.Jwt\">\n      <HintPath>..\\packages\\System.IdentityModel.Tokens.Jwt.5.1.4\\lib\\net451\\System.IdentityModel.Tokens.Jwt.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.IO.Compression, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.IO.Compression.4.1.0\\lib\\net46\\System.IO.Compression.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.IO.Compression.FileSystem\" />\n    <Reference Include=\"System.IO.Compression.ZipFile, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.IO.Compression.ZipFile.4.0.1\\lib\\net46\\System.IO.Compression.ZipFile.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.IO.FileSystem, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.IO.FileSystem.4.0.1\\lib\\net46\\System.IO.FileSystem.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.IO.FileSystem.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.IO.FileSystem.Primitives.4.0.1\\lib\\net46\\System.IO.FileSystem.Primitives.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net.Http, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Net.Http.4.1.0\\lib\\net46\\System.Net.Http.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net.Http.Formatting\">\n      <HintPath>..\\packages\\Microsoft.AspNet.WebApi.Client.5.2.3\\lib\\net45\\System.Net.Http.Formatting.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Net.NetworkInformation, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Net.NetworkInformation.4.1.0\\lib\\net46\\System.Net.NetworkInformation.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Net.Security.4.0.0\\lib\\net46\\System.Net.Security.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Net.Sockets, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Net.Sockets.4.1.0\\lib\\net46\\System.Net.Sockets.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Numerics\" />\n    <Reference Include=\"System.Reflection.TypeExtensions\">\n      <HintPath>..\\packages\\System.Reflection.TypeExtensions.4.1.0\\lib\\net46\\System.Reflection.TypeExtensions.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Runtime.InteropServices.RuntimeInformation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Runtime.InteropServices.RuntimeInformation.4.0.0\\lib\\net45\\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Runtime.Serialization.Primitives, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Runtime.Serialization.Primitives.4.1.1\\lib\\net46\\System.Runtime.Serialization.Primitives.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Security.Cryptography.Algorithms, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Security.Cryptography.Algorithms.4.2.0\\lib\\net461\\System.Security.Cryptography.Algorithms.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Security.Cryptography.Encoding, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Security.Cryptography.Encoding.4.0.0\\lib\\net46\\System.Security.Cryptography.Encoding.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Security.Cryptography.Primitives, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Security.Cryptography.Primitives.4.0.0\\lib\\net46\\System.Security.Cryptography.Primitives.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Security.Cryptography.X509Certificates, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Security.Cryptography.X509Certificates.4.1.0\\lib\\net461\\System.Security.Cryptography.X509Certificates.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Security.SecureString, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Security.SecureString.4.0.0\\lib\\net46\\System.Security.SecureString.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Spatial\">\n      <HintPath>..\\packages\\System.Spatial.5.8.2\\lib\\net40\\System.Spatial.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Web.Http\">\n      <HintPath>..\\packages\\Microsoft.AspNet.WebApi.Core.5.2.3\\lib\\net45\\System.Web.Http.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"DocumentDbBotDataStore.cs\" />\n    <Compile Include=\"Extensions.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"TableBotDataStore.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"..\\packages\\Microsoft.Azure.DocumentDB.1.21.1\\build\\Microsoft.Azure.DocumentDB.targets\" Condition=\"Exists('..\\packages\\Microsoft.Azure.DocumentDB.1.21.1\\build\\Microsoft.Azure.DocumentDB.targets')\" />\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\packages\\Microsoft.Azure.DocumentDB.1.21.1\\build\\Microsoft.Azure.DocumentDB.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Microsoft.Azure.DocumentDB.1.21.1\\build\\Microsoft.Azure.DocumentDB.targets'))\" />\n  </Target>\n</Project>"
  },
  {
    "path": "blog-samples/CSharp/BotStateExport/BotStateExport/BotStateExport/DocumentDbBotDataStore.cs",
    "content": "﻿// \n// Copyright (c) Microsoft. All rights reserved.\n// Licensed under the MIT license.\n// \n// Microsoft Bot Framework: http://botframework.com\n// \n// Bot Builder SDK Github:\n// https://github.com/Microsoft/BotBuilder\n// \n// Copyright (c) Microsoft Corporation\n// All rights reserved.\n// \n// MIT License:\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to\n// the following conditions:\n// \n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n// \n// THE SOFTWARE IS PROVIDED \"\"AS IS\"\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Net;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Web;\nusing Microsoft.Azure.Documents;\nusing Microsoft.Azure.Documents.Client;\nusing Microsoft.Azure.Documents.Linq;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Builder.Dialogs.Internals;\nusing Microsoft.Bot.Builder.Internals.Fibers;\nusing Microsoft.Bot.Connector;\nusing Newtonsoft.Json;\n\nnamespace Microsoft.Bot.Builder.Azure\n{\n\n    /// <summary>\n    /// <see cref=\"IBotDataStore{T}\"/> Implementation using Azure DocumentDb\n    /// </summary>\n    public class DocumentDbBotDataStore : IBotDataStore<BotData>\n    {\n       \n\n        private const string entityKeyParameterName = \"@entityKey\";\n\n        private static readonly TimeSpan MaxInitTime = TimeSpan.FromSeconds(5);\n\n        private readonly IDocumentClient documentClient;\n        private readonly string databaseId;\n        private readonly string collectionId;\n\n        /// <summary>\n        /// Creates an instance of the <see cref=\"IBotDataStore{T}\"/> that uses the Azure DocumentDb.\n        /// </summary>\n        /// <param name=\"documentClient\">The DocumentDb client to use.</param>\n        /// <param name=\"databaseId\">The name of the DocumentDb database to use.</param>\n        /// <param name=\"collectionId\">The name of the DocumentDb collection to use.</param>\n        public DocumentDbBotDataStore(IDocumentClient documentClient, string databaseId = \"botdb\", string collectionId = \"botcollection\")\n        {\n            SetField.NotNull(out this.databaseId, nameof(databaseId), databaseId);\n            SetField.NotNull(out this.collectionId, nameof(collectionId), collectionId);\n\n            this.documentClient = documentClient;\n            this.databaseId = databaseId;\n            this.collectionId = collectionId;\n\n            CreateDatabaseIfNotExistsAsync().GetAwaiter().GetResult();\n            CreateCollectionIfNotExistsAsync().GetAwaiter().GetResult();\n        }\n\n        /// <summary>\n        /// Creates an instance of the <see cref=\"IBotDataStore{T}\"/> that uses the Azure DocumentDb.\n        /// </summary>\n        /// <param name=\"serviceEndpoint\">The service endpoint to use to create the client.</param>\n        /// <param name=\"authKey\">The authorization key or resource token to use to create the client.</param>\n        /// <param name=\"databaseId\">The name of the DocumentDb database to use.</param>\n        /// <param name=\"collectionId\">The name of the DocumentDb collection to use.</param>\n        /// <remarks>The service endpoint can be obtained from the Azure Management Portal. If you\n        /// are connecting using one of the Master Keys, these can be obtained along with\n        /// the endpoint from the Azure Management Portal If however you are connecting as\n        /// a specific DocumentDB User, the value passed to authKeyOrResourceToken is the\n        /// ResourceToken obtained from the permission feed for the user.\n        /// Using Direct connectivity, wherever possible, is recommended.</remarks>\n        public DocumentDbBotDataStore(Uri serviceEndpoint, string authKey, string databaseId = \"botdb\", string collectionId = \"botcollection\")\n            : this(new DocumentClient(serviceEndpoint, authKey), databaseId, collectionId) { }\n\n        async Task<BotData> IBotDataStore<BotData>.LoadAsync(IAddress key, BotStoreType botStoreType,\n            CancellationToken cancellationToken)\n        {\n            try\n            {\n                var entityKey = DocDbBotDataEntity.GetEntityKey(key, botStoreType);\n\n                // query to retrieve the document if it exists\n                SqlQuerySpec querySpec = new SqlQuerySpec(\n                                                queryText: $\"SELECT * FROM {collectionId} b WHERE (b.id = {entityKeyParameterName})\",\n                                                parameters: new SqlParameterCollection()\n                                                {\n                                                    new SqlParameter(entityKeyParameterName, entityKey)\n                                                });\n                var collectionUri = UriFactory.CreateDocumentCollectionUri(databaseId, collectionId);\n                var query = documentClient.CreateDocumentQuery(collectionUri, querySpec)\n                                          .AsDocumentQuery();\n                var feedResponse = await query.ExecuteNextAsync<Document>(CancellationToken.None);\n                Document document = feedResponse.FirstOrDefault();\n\n                if (document != null)\n                {\n                    // The document, of type IDynamicMetaObjectProvider, has a dynamic nature, \n                    // similar to DynamicTableEntity in Azure storage. When casting to a static type, properties that exist in the static type will be \n                    // populated from the dynamic type.\n                    DocDbBotDataEntity entity = (dynamic)document;\n                    return new BotData(document?.ETag, entity?.Data);\n                }\n                else\n                {\n                    // the document does not exist in the database, return an empty BotData object\n                    return new BotData(string.Empty, null);\n                }\n            }\n            catch (DocumentClientException e)\n            {\n                if (e.StatusCode.HasValue && e.StatusCode.Value == HttpStatusCode.NotFound)\n                {\n                    return new BotData(string.Empty, null);\n                }\n\n                throw new HttpException(e.StatusCode.HasValue ? (int)e.StatusCode.Value : 0, e.Message, e);\n            }\n        }\n\n        async Task IBotDataStore<BotData>.SaveAsync(IAddress key, BotStoreType botStoreType, BotData botData,\n            CancellationToken cancellationToken)\n        {\n            try\n            {\n                var requestOptions = new RequestOptions()\n                {\n                    AccessCondition = new AccessCondition()\n                    {\n                        Type = AccessConditionType.IfMatch,\n                        Condition = botData.ETag\n                    }\n                };\n\n                var entity = new DocDbBotDataEntity(key, botStoreType, botData);\n                var entityKey = DocDbBotDataEntity.GetEntityKey(key, botStoreType);\n\n                if (string.IsNullOrEmpty(botData.ETag))\n                {\n                    await documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(databaseId, collectionId), entity, requestOptions);\n                }\n                else if (botData.ETag == \"*\")\n                {\n                    if (botData.Data != null)\n                    {\n                        await documentClient.UpsertDocumentAsync(UriFactory.CreateDocumentCollectionUri(databaseId, collectionId), entity, requestOptions);\n                    }\n                    else\n                    {\n                        await documentClient.DeleteDocumentAsync(UriFactory.CreateDocumentUri(databaseId, collectionId, entityKey), requestOptions);\n                    }\n                }\n                else\n                {\n                    if (botData.Data != null)\n                    {\n                        await documentClient.ReplaceDocumentAsync(UriFactory.CreateDocumentUri(databaseId, collectionId, entityKey), entity, requestOptions);\n                    }\n                    else\n                    {\n                        await documentClient.DeleteDocumentAsync(UriFactory.CreateDocumentUri(databaseId, collectionId, entityKey), requestOptions);\n                    }\n                }\n            }\n            catch (DocumentClientException e)\n            {\n                if (e.StatusCode.HasValue && e.StatusCode.Value == HttpStatusCode.Conflict)\n                {\n                    throw new HttpException((int)HttpStatusCode.PreconditionFailed, e.Message, e);\n                }\n\n                throw new HttpException(e.StatusCode.HasValue ? (int)e.StatusCode.Value : 0, e.Message, e);\n            }\n        }\n\n        Task<bool> IBotDataStore<BotData>.FlushAsync(IAddress key, CancellationToken cancellationToken)\n        {\n            // Everything is saved. Flush is no-op\n            return Task.FromResult(true);\n        }\n\n        private async Task CreateDatabaseIfNotExistsAsync()\n        {\n            try\n            {\n                await documentClient.ReadDatabaseAsync(UriFactory.CreateDatabaseUri(databaseId));\n            }\n            catch (DocumentClientException e)\n            {\n                if (e.StatusCode == HttpStatusCode.NotFound)\n                {\n                    await documentClient.CreateDatabaseAsync(new Database { Id = databaseId });\n                }\n                else\n                {\n                    throw;\n                }\n            }\n        }\n\n        private async Task CreateCollectionIfNotExistsAsync()\n        {\n            try\n            {\n                await documentClient.ReadDocumentCollectionAsync(UriFactory.CreateDocumentCollectionUri(databaseId, collectionId));\n            }\n            catch (DocumentClientException e)\n            {\n                if (e.StatusCode == System.Net.HttpStatusCode.NotFound)\n                {\n                    await documentClient.CreateDocumentCollectionAsync(\n                        UriFactory.CreateDatabaseUri(databaseId),\n                        new DocumentCollection { Id = collectionId });\n                }\n                else\n                {\n                    throw;\n                }\n            }\n        }\n    }\n\n    internal class BotDataDocDbKey\n    {\n        public BotDataDocDbKey(string partition, string row)\n        {\n            PartitionKey = partition;\n            RowKey = row;\n        }\n\n        public string PartitionKey { get; private set; }\n        public string RowKey { get; private set; }\n\n    }\n\n    internal class DocDbBotDataEntity\n    {\n        internal const int MAX_KEY_LENGTH = 254;\n        public DocDbBotDataEntity() { }\n\n        internal DocDbBotDataEntity(IAddress key, BotStoreType botStoreType, BotData botData)\n        {\n            this.Id = GetEntityKey(key, botStoreType);\n            this.BotId = key.BotId;\n            this.ChannelId = key.ChannelId;\n            this.ConversationId = key.ConversationId;\n            this.UserId = key.UserId;\n            this.Data = botData.Data;\n        }\n\n        public static string GetEntityKey(IAddress key, BotStoreType botStoreType)\n        {\n            string entityKey;\n            switch (botStoreType)\n            {\n                case BotStoreType.BotConversationData:\n                    entityKey = $\"{key.ChannelId}:conversation{key.ConversationId.SanitizeForAzureKeys()}\";\n                    return TruncateEntityKey(entityKey);\n\n                case BotStoreType.BotUserData:\n                    entityKey = $\"{key.ChannelId}:user{key.UserId.SanitizeForAzureKeys()}\";\n                    return TruncateEntityKey(entityKey);\n\n                case BotStoreType.BotPrivateConversationData:\n                    entityKey = $\"{key.ChannelId}:private{key.ConversationId.SanitizeForAzureKeys()}:{key.UserId.SanitizeForAzureKeys()}\";\n                    return TruncateEntityKey(entityKey);\n\n                default:\n                    throw new ArgumentException(\"Unsupported bot store type!\");\n            }\n        }\n\n        private static string TruncateEntityKey(string entityKey)\n        {\n            if (entityKey.Length > MAX_KEY_LENGTH)\n            {\n                var hash = entityKey.GetHashCode().ToString(\"x\");\n                entityKey = entityKey.Substring(0, MAX_KEY_LENGTH - hash.Length) + hash;\n            }\n\n            return entityKey;\n        }\n\n        internal static class StringExtensions\n        {\n           \n        }\n\n[JsonProperty(PropertyName = \"id\")]\n        public string Id { get; set; }\n\n        [JsonProperty(PropertyName = \"botId\")]\n        public string BotId { get; set; }\n\n        [JsonProperty(PropertyName = \"channelId\")]\n        public string ChannelId { get; set; }\n\n        [JsonProperty(PropertyName = \"conversationId\")]\n        public string ConversationId { get; set; }\n\n        [JsonProperty(PropertyName = \"userId\")]\n        public string UserId { get; set; }\n\n        [JsonProperty(PropertyName = \"data\")]\n        public object Data { get; set; }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/BotStateExport/BotStateExport/BotStateExport/Extensions.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Microsoft.Bot.Builder.Azure\n{\n    internal static class StringExtensions\n    {\n        private static readonly Dictionary<string, string> _DefaultReplacementsForCharactersDisallowedByAzure = new Dictionary<string, string>() { { \"/\", \"|s|\" }, { @\"\\\", \"|b|\" }, { \"#\", \"|h|\" }, { \"?\", \"|q|\" } };\n\n        internal static string SanitizeForAzureKeys(this string input, Dictionary<string, string> replacements = null)\n        {\n            var repmap = replacements ?? _DefaultReplacementsForCharactersDisallowedByAzure;\n            return input.Trim().Replace(\"/\", repmap[\"/\"]).Replace(@\"\\\", repmap[@\"\\\"]).Replace(\"#\", repmap[\"#\"]).Replace(\"?\", repmap[\"?\"]);\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/BotStateExport/BotStateExport/BotStateExport/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing CommandLine;\nusing Microsoft.Bot.Builder.Dialogs.Internals;\nusing Microsoft.Bot.Connector;\nusing Newtonsoft.Json;\n\nnamespace ConsoleApp1\n{\n    class Options\n    {\n        [Option('a', \"appId\", Required = true, HelpText = \"Microsoft Application Id for bot\")]\n        public string AppId { get; set; }\n\n        [Option('b', \"botId\", Required = true, HelpText = \"bot Id\")]\n        public string BotId { get; set; }\n\n        [Option('c', \"connectionString\", HelpText = \"set Azure Storage table connection string\")]\n        public string ConnectionString { get; set; }\n\n        [Option('d', \"destination\", HelpText = \"set 'cosmos', 'file', or 'table'\")]\n        public string Destination { get; set; }\n\n        [Option('f', \"fileName\", HelpText = \"file in which to write exported data\")]\n        public string FileName { get; set; }\n\n        [Option('k', \"key\", HelpText = \"Cosmos DB key\")]\n        public string CosmosDbKey { get; set; }\n\n        [Option('p', \"password\", Required = true, HelpText = \"Microsoft password for bot\")]\n        public string AppPassword { get; set; }\n\n        [Option('s', \"stateUrl\", Required = true, HelpText = \"Url for state store\", Default = \"https://connector-api-westus.azurewebsites.net\")]\n        public string StateUrl { get; set; }\n\n        [Option('u', \"url\",  HelpText = \"Cosmos DB Url\")]\n        public string CosmosDbUrl { get; set; }\n    }\n\n    class Program\n    {\n       \n        static void Main(string[] args)\n        {\n            bool result;\n            CommandLine.Parser.Default.ParseArguments<Options>(args)\n            .WithParsed<Options>(opts => result = DoExport(opts).Result)\n            .WithNotParsed<Options>((errs) =>\n            {\n                foreach (var err in errs)\n                {\n                    Console.WriteLine(err.ToString());\n                };\n            });\n        }\n\n        public static readonly HashSet<string> KnownChannelsIds = new HashSet<string>(new[]\n        {\n            \"bing\",\n            \"cortana\",\n            \"directline\",\n            \"email\",\n            \"facebook\",\n            \"groupme\",\n            \"kik\",\n            \"msteams\",\n            \"skype\",\n            \"skypeforbusiness\",\n            \"slack\",\n            \"sms\",\n            \"telegram\",\n            \"webchat\",\n            \"wechat\"\n        });\n\n        public static async Task<bool> DoExport(Options opts)\n        {\n            IBotDataStore<BotData> targetStore = null;\n            StreamWriter outputFile = null;\n            switch (opts.Destination.ToLower())\n            {\n                case \"cosmos\":\n                    if (string.IsNullOrEmpty(opts.CosmosDbKey) || string.IsNullOrEmpty(opts.CosmosDbUrl))\n                    {\n                        Console.WriteLine(\"Both CosmosDb Key and Url are required in order to copy to a new database\");\n                        return false;\n                    }\n                    try\n                    {\n                        targetStore = new Microsoft.Bot.Builder.Azure.DocumentDbBotDataStore(new Uri(opts.CosmosDbUrl), opts.CosmosDbKey);\n                    }\n                    catch (Exception e)\n                    {\n                        Console.WriteLine($\"Problem initializing cosmos DB: {e}\");\n                        throw;\n                    }\n                    break;\n                case \"file\":\n                    if (string.IsNullOrEmpty(opts.FileName))\n                    {\n                        Console.WriteLine(\"FileName must be specified.\");\n                        return false;\n                    }\n                    try\n                    {\n                        outputFile = new StreamWriter(opts.FileName);\n                    }\n                    catch\n                    {\n                        Console.WriteLine($\"Error creating output file {opts.FileName}.\");\n\n                    }\n                    outputFile.WriteLine(\"{\\r\\n\");\n                    break;\n                case \"table\":\n                    if (string.IsNullOrEmpty(opts.ConnectionString))\n                    {\n                        Console.WriteLine(\"ConnectionString must be set for Azure Storage Table\");\n                        return false;\n                    }\n\n                    try\n                    {\n                        targetStore = new Microsoft.Bot.Builder.Azure.TableBotDataStore(opts.ConnectionString);\n                    }\n                    catch (Exception e)\n                    {\n                        Console.WriteLine($\"Problem initializing Azure Storage Table: {e}\");\n                        throw;\n                    }\n                    break;\n                default:\n                    Console.WriteLine($\"undefined destination type: {opts.Destination}\");\n                    break;\n\n            }\n            if (opts.Destination.ToLower() == \"cosmos\")\n            {\n                if (string.IsNullOrEmpty(opts.CosmosDbKey) || string.IsNullOrEmpty(opts.CosmosDbUrl))\n                {\n                    Console.WriteLine(\"Both CosmosDb Key and Url are required in order to copy to a new database\");\n                    return false;     \n                }\n                try\n                {\n                    targetStore = new Microsoft.Bot.Builder.Azure.DocumentDbBotDataStore(new Uri(opts.CosmosDbUrl), opts.CosmosDbKey);\n                }\n                catch (Exception e)\n                {\n                    Console.WriteLine($\"Problem initializing cosmos DB: {e}\");\n                    throw; \n                }\n               \n            }\n            else if (opts.Destination.ToLower() == \"table\")\n            {\n                if (string.IsNullOrEmpty(opts.ConnectionString) )\n                {\n                    Console.WriteLine(\"ConnectionString must be set for Azure Storage Table\");\n                    return false;\n                }\n\n                try\n                {\n                    targetStore = new Microsoft.Bot.Builder.Azure.TableBotDataStore(opts.ConnectionString);\n                }\n                catch (Exception e)\n                {\n                    Console.WriteLine($\"Problem initializing Azure Storage Table: {e}\");\n                    throw;\n                }\n            }\n\n\n            var credentials = new MicrosoftAppCredentials(opts.AppId, opts.AppPassword);\n            var botId =opts.BotId;\n\n            var stateUrl = new Uri(opts.StateUrl);\n\n            var serviceUrl = \"https://store.botframework.com\";\n            MicrosoftAppCredentials.TrustServiceUrl(stateUrl.AbsoluteUri);\n            string continuationToken = \"\";\n\n            var client = new StateClient(stateUrl, credentials);\n            var state = client.BotState;\n            BotStateDataResult stateResult = null;\n            foreach (var channelId in KnownChannelsIds)\n            {\n                Console.WriteLine($\"***{channelId}***\");\n                continuationToken = \"\";\n                do\n                {\n                    try\n                    {                \n                        // should work with \"directline\", \"facebook\", or \"kik\"\n                        stateResult = await BotStateExtensions.ExportBotStateDataAsync(state, channelId, continuationToken).ConfigureAwait(false);\n                        foreach (var datum in stateResult.BotStateData)\n                        {\n                            if ((DateTime.UtcNow - datum.LastModified).HasValue && (DateTime.UtcNow - datum.LastModified).Value.Days < 1)\n                            {\n                                Console.WriteLine($\"LastModified: {datum.LastModified}, UsserId: {datum.UserId}\");\n                            }\n                            if (datum.Data != \"{}\")\n                            {\n                                Console.WriteLine($\"conversationID: {datum.ConversationId}\\tuserId: {datum.UserId}\\tdata:{datum.Data}\\n\");\n                                if (targetStore != null)\n                                {\n                                    var cancellationToken = new CancellationToken();\n                                    var address = new Microsoft.Bot.Builder.Dialogs.Address(botId, channelId, datum.UserId, datum.ConversationId, serviceUrl);\n                                    var botStoreType = string.IsNullOrEmpty(datum.ConversationId) ? BotStoreType.BotUserData : BotStoreType.BotPrivateConversationData;\n                                    var botData = new BotData\n                                    {\n                                        Data = datum.Data\n                                    };\n                                    await targetStore.SaveAsync(address, botStoreType, botData, cancellationToken);\n                                }\n                                else if (outputFile != null)\n                                {\n                                    var id = new StringBuilder();\n                                    id.Append($\"{channelId}:\");\n                                    if (!string.IsNullOrEmpty(datum.ConversationId))\n                                    {\n                                        id.Append($\"private{datum.ConversationId}:\");\n                                    }\n                                    id.Append(datum.UserId);\n                                    var serializedData = JsonConvert.SerializeObject(datum.Data);\n                                    var outputValue = $\"\\t{{\\r\\n\\t\\\"id\\\": \\\"{id.ToString()}\\\",\\r\\n\" + \n                                        $\"\\t\\t\\\"botId\\\": \\\"{botId}\\\",\\r\\n\" + \n                                        $\"\\t\\t\\\"channelId\\\": \\\"{channelId}\\\",\\r\\n\" + \n                                        $\"\\t\\t\\\"conversationId\\\": \\\"{datum.ConversationId}\\\",\\r\\n\" + \n                                        $\"\\t\\t\\\"userId\\\": \\\"{datum.UserId}\\\",\\r\\n\" + \n                                        $\"\\t\\t\\\"data\\\": {serializedData}\\r\\n\\t}},\\r\\n\";\n                                    outputFile.Write(outputValue);\n                                }\n                            }\n                        }\n                        continuationToken = stateResult.ContinuationToken;\n                    }\n                    catch (Exception e)\n                    {\n                        var errorException = e as ErrorResponseException;\n                        if (errorException?.Body?.Error?.Message?.ToLower() == \"channel not configured for bot\")\n                        {\n                            continue;\n                        }\n                        Console.WriteLine(e);\n                    }\n\n                } while (!string.IsNullOrEmpty(continuationToken));\n\n            }\n            Console.Write(\"Press Enter key to continue:\");\n            Console.Read();\n            if (outputFile != null)\n            {\n                outputFile.WriteLine(\"}\\r\\n\");\n                outputFile.Flush();\n                outputFile.Close();\n            }\n            // TODO: Do I need to flush the targetStore?  If so, what Address should I use?\n            return true;\n        }\n       \n\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/BotStateExport/BotStateExport/BotStateExport/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"GDPRExport\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"GDPRExport\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2018\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"da593586-7a94-43d4-8ef1-0474eff6d2e0\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "blog-samples/CSharp/BotStateExport/BotStateExport/BotStateExport/TableBotDataStore.cs",
    "content": "﻿// \n// Copyright (c) Microsoft. All rights reserved.\n// Licensed under the MIT license.\n// \n// Microsoft Bot Framework: http://botframework.com\n// \n// Bot Builder SDK Github:\n// https://github.com/Microsoft/BotBuilder\n// \n// Copyright (c) Microsoft Corporation\n// All rights reserved.\n// \n// MIT License:\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to\n// the following conditions:\n// \n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n// \n// THE SOFTWARE IS PROVIDED \"\"AS IS\"\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nusing System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Connector;\nusing Newtonsoft.Json;\nusing System.Net;\nusing System.Threading;\nusing System.Web;\nusing Microsoft.Bot.Builder.Dialogs.Internals;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.WindowsAzure.Storage.Table;\nusing Microsoft.WindowsAzure.Storage;\nusing System.IO;\nusing System.IO.Compression;\nusing Newtonsoft.Json.Linq;\n\nnamespace Microsoft.Bot.Builder.Azure\n{\n\n    /// <summary>\n    /// <see cref=\"IBotDataStore{T}\"/> Implementation using Azure Storage Table \n    /// </summary>\n    public class TableBotDataStore : IBotDataStore<BotData>\n    {\n        private static HashSet<string> checkedTables = new HashSet<string>();\n\n        /// <summary>\n        /// Creates an instance of the <see cref=\"IBotDataStore{T}\"/> that uses the azure table storage.\n        /// </summary>\n        /// <param name=\"connectionString\">The storage connection string.</param>\n        /// <param name=\"tableName\">The name of table.</param>\n        public TableBotDataStore(string connectionString, string tableName = \"botdata\")\n            : this(CloudStorageAccount.Parse(connectionString), tableName)\n        {\n        }\n\n        /// <summary>\n        /// Creates an instance of the <see cref=\"IBotDataStore{T}\"/> that uses the azure table storage.\n        /// </summary>\n        /// <param name=\"storageAccount\">The storage account.</param>\n        /// <param name=\"tableName\">The name of table.</param>\n        public TableBotDataStore(CloudStorageAccount storageAccount, string tableName = \"botdata\")\n        {\n            var tableClient = storageAccount.CreateCloudTableClient();\n            this.Table = tableClient.GetTableReference(tableName);\n\n            lock (checkedTables)\n            {\n                if (!checkedTables.Contains(tableName))\n                {\n                    this.Table.CreateIfNotExists();\n                    checkedTables.Add(tableName);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Creates an instance of the <see cref=\"IBotDataStore{T}\"/> that uses the azure table storage.\n        /// </summary>\n        /// <param name=\"table\">The cloud table.</param>\n        public TableBotDataStore(CloudTable table)\n        {\n            this.Table = table;\n        }\n\n        /// <summary>\n        /// The <see cref=\"CloudTable\"/>.\n        /// </summary>\n        public CloudTable Table { get; private set; }\n\n        async Task<BotData> IBotDataStore<BotData>.LoadAsync(IAddress key, BotStoreType botStoreType, CancellationToken cancellationToken)\n        {\n            var entityKey = BotDataEntity.GetEntityKey(key, botStoreType);\n            try\n            {\n                var result = await this.Table.ExecuteAsync(TableOperation.Retrieve<BotDataEntity>(entityKey.PartitionKey, entityKey.RowKey));\n                BotDataEntity entity = (BotDataEntity)result.Result;\n                if (entity == null)\n                    // empty record ready to be saved\n                    return new BotData(eTag: String.Empty, data: null);\n\n                // return botdata \n                return new BotData(entity.ETag, entity.GetData());\n            }\n            catch (StorageException err)\n            {\n                throw new HttpException(err.RequestInformation.HttpStatusCode, err.RequestInformation.HttpStatusMessage);\n            }\n        }\n\n        async Task IBotDataStore<BotData>.SaveAsync(IAddress key, BotStoreType botStoreType, BotData botData, CancellationToken cancellationToken)\n        {\n            var entityKey = BotDataEntity.GetEntityKey(key, botStoreType);\n            BotDataEntity entity = new BotDataEntity(key.BotId, key.ChannelId, key.ConversationId, key.UserId, botData.Data)\n            {\n                ETag = botData.ETag\n            };\n            entity.PartitionKey = entityKey.PartitionKey;\n            entity.RowKey = entityKey.RowKey;\n\n            try\n            {\n                if (String.IsNullOrEmpty(entity.ETag))\n                    await this.Table.ExecuteAsync(TableOperation.Insert(entity));\n                else if (entity.ETag == \"*\")\n                {\n                    if (botData.Data != null)\n                        await this.Table.ExecuteAsync(TableOperation.InsertOrReplace(entity));\n                    else\n                        await this.Table.ExecuteAsync(TableOperation.Delete(entity));\n                }\n                else\n                {\n                    if (botData.Data != null)\n                        await this.Table.ExecuteAsync(TableOperation.Replace(entity));\n                    else\n                        await this.Table.ExecuteAsync(TableOperation.Delete(entity));\n                }\n            }\n            catch (StorageException err)\n            {\n                if ((HttpStatusCode)err.RequestInformation.HttpStatusCode == HttpStatusCode.Conflict)\n                    throw new HttpException((int)HttpStatusCode.PreconditionFailed, err.RequestInformation.HttpStatusMessage);\n\n                throw new HttpException(err.RequestInformation.HttpStatusCode, err.RequestInformation.HttpStatusMessage);\n            }\n        }\n\n        Task<bool> IBotDataStore<BotData>.FlushAsync(IAddress key, CancellationToken cancellationToken)\n        {\n            // Everything is saved. Flush is no-op\n            return Task.FromResult(true);\n        }\n\n    }\n\n    internal class EntityKey\n    {\n        public EntityKey(string partition, string row)\n        {\n            PartitionKey = partition;\n            RowKey = row;\n        }\n\n        public string PartitionKey { get; private set; }\n        public string RowKey { get; private set; }\n\n    }\n\n    internal class BotDataEntity : TableEntity\n    {\n        private static readonly JsonSerializerSettings serializationSettings = new JsonSerializerSettings()\n        {\n            Formatting = Formatting.None,\n            NullValueHandling = NullValueHandling.Ignore\n        };\n\n        public BotDataEntity()\n        {\n        }\n\n        internal BotDataEntity(string botId, string channelId, string conversationId, string userId, object data)\n        {\n            this.BotId = botId;\n            this.ChannelId = channelId;\n            this.ConversationId = conversationId;\n            this.UserId = userId;\n            this.Data = Serialize(data);\n        }\n\n        private byte[] Serialize(object data)\n        {\n            using (var cmpStream = new MemoryStream())\n            using (var stream = new GZipStream(cmpStream, CompressionMode.Compress))\n            using (var streamWriter = new StreamWriter(stream))\n            {\n                var serializedJSon = JsonConvert.SerializeObject(data, serializationSettings);\n                streamWriter.Write(serializedJSon);\n                streamWriter.Close();\n                stream.Close();\n                return cmpStream.ToArray();\n            }\n        }\n\n        private object Deserialize(byte[] bytes)\n        {\n            using (var stream = new MemoryStream(bytes))\n            using (var gz = new GZipStream(stream, CompressionMode.Decompress))\n            using (var streamReader = new StreamReader(gz))\n            {\n                return JsonConvert.DeserializeObject(streamReader.ReadToEnd());\n            }\n        }\n\n\n        internal static EntityKey GetEntityKey(IAddress key, BotStoreType botStoreType)\n        {\n            switch (botStoreType)\n            {\n                case BotStoreType.BotConversationData:\n                    return new EntityKey($\"{key.ChannelId}:conversation\", key.ConversationId.SanitizeForAzureKeys());\n\n                case BotStoreType.BotUserData:\n                    return new EntityKey($\"{key.ChannelId}:user\", key.UserId.SanitizeForAzureKeys());\n\n                case BotStoreType.BotPrivateConversationData:\n                    return new EntityKey($\"{key.ChannelId}:private\", $\"{key.ConversationId.SanitizeForAzureKeys()}:{key.UserId.SanitizeForAzureKeys()}\");\n\n                default:\n                    throw new ArgumentException(\"Unsupported bot store type!\");\n            }\n        }\n\n        internal ObjectT GetData<ObjectT>()\n        {\n            return ((JObject)Deserialize(this.Data)).ToObject<ObjectT>();\n        }\n\n        internal object GetData()\n        {\n            return Deserialize(this.Data);\n        }\n\n        public string BotId { get; set; }\n\n        public string ChannelId { get; set; }\n\n        public string ConversationId { get; set; }\n\n        public string UserId { get; set; }\n\n        public byte[] Data { get; set; }\n    }\n\n}"
  },
  {
    "path": "blog-samples/CSharp/BotStateExport/BotStateExport/BotStateExport/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Autofac\" version=\"3.5.2\" targetFramework=\"net461\" />\n  <package id=\"Chronic.Signed\" version=\"0.3.2\" targetFramework=\"net461\" />\n  <package id=\"CommandLineParser\" version=\"2.2.1\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.AspNet.WebApi.Client\" version=\"5.2.3\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.AspNet.WebApi.Core\" version=\"5.2.3\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.Azure.CosmosDB.Table\" version=\"1.1.1\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.Azure.DocumentDB\" version=\"1.21.1\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.Azure.DocumentDB.Core\" version=\"1.9.1\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.Azure.KeyVault.Core\" version=\"1.0.0\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.Azure.Storage.Common\" version=\"9.0.0.1-preview\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.Bot.Builder\" version=\"3.15.0\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.Bot.Connector\" version=\"3.15.0\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.Data.Edm\" version=\"5.8.2\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.Data.OData\" version=\"5.8.2\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.Data.Services.Client\" version=\"5.8.2\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.IdentityModel.Logging\" version=\"1.1.4\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.IdentityModel.Protocols\" version=\"2.1.4\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.IdentityModel.Protocols.OpenIdConnect\" version=\"2.1.4\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.IdentityModel.Tokens\" version=\"5.1.4\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.NETCore.Platforms\" version=\"1.0.1\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.OData.Core\" version=\"7.2.0\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.OData.Edm\" version=\"7.2.0\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.Rest.ClientRuntime\" version=\"2.3.11\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.Spatial\" version=\"7.2.0\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.Win32.Primitives\" version=\"4.0.1\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.WindowsAzure.ConfigurationManager\" version=\"3.2.3\" targetFramework=\"net461\" />\n  <package id=\"NETStandard.Library\" version=\"1.6.0\" targetFramework=\"net461\" />\n  <package id=\"Newtonsoft.Json\" version=\"11.0.2\" targetFramework=\"net461\" />\n  <package id=\"System.AppContext\" version=\"4.1.0\" targetFramework=\"net461\" />\n  <package id=\"System.Collections\" version=\"4.0.11\" targetFramework=\"net461\" />\n  <package id=\"System.Collections.Concurrent\" version=\"4.0.12\" targetFramework=\"net461\" />\n  <package id=\"System.Collections.NonGeneric\" version=\"4.0.1\" targetFramework=\"net461\" />\n  <package id=\"System.Collections.Specialized\" version=\"4.0.1\" targetFramework=\"net461\" />\n  <package id=\"System.ComponentModel.EventBasedAsync\" version=\"4.0.11\" targetFramework=\"net461\" />\n  <package id=\"System.Console\" version=\"4.0.0\" targetFramework=\"net461\" />\n  <package id=\"System.Diagnostics.Debug\" version=\"4.0.11\" targetFramework=\"net461\" />\n  <package id=\"System.Diagnostics.DiagnosticSource\" version=\"4.0.0\" targetFramework=\"net461\" />\n  <package id=\"System.Diagnostics.Tools\" version=\"4.0.1\" targetFramework=\"net461\" />\n  <package id=\"System.Diagnostics.TraceSource\" version=\"4.0.0\" targetFramework=\"net461\" />\n  <package id=\"System.Diagnostics.Tracing\" version=\"4.1.0\" targetFramework=\"net461\" />\n  <package id=\"System.Dynamic.Runtime\" version=\"4.0.11\" targetFramework=\"net461\" />\n  <package id=\"System.Globalization\" version=\"4.0.11\" targetFramework=\"net461\" />\n  <package id=\"System.Globalization.Calendars\" version=\"4.0.1\" targetFramework=\"net461\" />\n  <package id=\"System.IdentityModel.Tokens.Jwt\" version=\"5.1.4\" targetFramework=\"net461\" />\n  <package id=\"System.IO\" version=\"4.1.0\" targetFramework=\"net461\" />\n  <package id=\"System.IO.Compression\" version=\"4.1.0\" targetFramework=\"net461\" />\n  <package id=\"System.IO.Compression.ZipFile\" version=\"4.0.1\" targetFramework=\"net461\" />\n  <package id=\"System.IO.FileSystem\" version=\"4.0.1\" targetFramework=\"net461\" />\n  <package id=\"System.IO.FileSystem.Primitives\" version=\"4.0.1\" targetFramework=\"net461\" />\n  <package id=\"System.Linq\" version=\"4.1.0\" targetFramework=\"net461\" />\n  <package id=\"System.Linq.Expressions\" version=\"4.1.0\" targetFramework=\"net461\" />\n  <package id=\"System.Linq.Queryable\" version=\"4.0.1\" targetFramework=\"net461\" />\n  <package id=\"System.Net.Http\" version=\"4.1.0\" targetFramework=\"net461\" />\n  <package id=\"System.Net.NetworkInformation\" version=\"4.1.0\" targetFramework=\"net461\" />\n  <package id=\"System.Net.Primitives\" version=\"4.0.11\" targetFramework=\"net461\" />\n  <package id=\"System.Net.Requests\" version=\"4.0.11\" targetFramework=\"net461\" />\n  <package id=\"System.Net.Security\" version=\"4.0.0\" targetFramework=\"net461\" />\n  <package id=\"System.Net.Sockets\" version=\"4.1.0\" targetFramework=\"net461\" />\n  <package id=\"System.Net.WebHeaderCollection\" version=\"4.0.1\" targetFramework=\"net461\" />\n  <package id=\"System.ObjectModel\" version=\"4.0.12\" targetFramework=\"net461\" />\n  <package id=\"System.Reflection\" version=\"4.1.0\" targetFramework=\"net461\" />\n  <package id=\"System.Reflection.Extensions\" version=\"4.0.1\" targetFramework=\"net461\" />\n  <package id=\"System.Reflection.Primitives\" version=\"4.0.1\" targetFramework=\"net461\" />\n  <package id=\"System.Reflection.TypeExtensions\" version=\"4.1.0\" targetFramework=\"net461\" />\n  <package id=\"System.Resources.ResourceManager\" version=\"4.0.1\" targetFramework=\"net461\" />\n  <package id=\"System.Runtime\" version=\"4.1.0\" targetFramework=\"net461\" />\n  <package id=\"System.Runtime.Extensions\" version=\"4.1.0\" targetFramework=\"net461\" />\n  <package id=\"System.Runtime.Handles\" version=\"4.0.1\" targetFramework=\"net461\" />\n  <package id=\"System.Runtime.InteropServices\" version=\"4.1.0\" targetFramework=\"net461\" />\n  <package id=\"System.Runtime.InteropServices.RuntimeInformation\" version=\"4.0.0\" targetFramework=\"net461\" />\n  <package id=\"System.Runtime.Numerics\" version=\"4.0.1\" targetFramework=\"net461\" />\n  <package id=\"System.Runtime.Serialization.Primitives\" version=\"4.1.1\" targetFramework=\"net461\" />\n  <package id=\"System.Security.Cryptography.Algorithms\" version=\"4.2.0\" targetFramework=\"net461\" />\n  <package id=\"System.Security.Cryptography.Encoding\" version=\"4.0.0\" targetFramework=\"net461\" />\n  <package id=\"System.Security.Cryptography.Primitives\" version=\"4.0.0\" targetFramework=\"net461\" />\n  <package id=\"System.Security.Cryptography.X509Certificates\" version=\"4.1.0\" targetFramework=\"net461\" />\n  <package id=\"System.Security.SecureString\" version=\"4.0.0\" targetFramework=\"net461\" />\n  <package id=\"System.Spatial\" version=\"5.8.2\" targetFramework=\"net461\" />\n  <package id=\"System.Text.Encoding\" version=\"4.0.11\" targetFramework=\"net461\" />\n  <package id=\"System.Text.Encoding.Extensions\" version=\"4.0.11\" targetFramework=\"net461\" />\n  <package id=\"System.Text.RegularExpressions\" version=\"4.1.0\" targetFramework=\"net461\" />\n  <package id=\"System.Threading\" version=\"4.0.11\" targetFramework=\"net461\" />\n  <package id=\"System.Threading.Tasks\" version=\"4.0.11\" targetFramework=\"net461\" />\n  <package id=\"System.Threading.Timer\" version=\"4.0.1\" targetFramework=\"net461\" />\n  <package id=\"System.Xml.ReaderWriter\" version=\"4.0.11\" targetFramework=\"net461\" />\n  <package id=\"System.Xml.XDocument\" version=\"4.0.11\" targetFramework=\"net461\" />\n  <package id=\"WindowsAzure.Storage\" version=\"9.1.0\" targetFramework=\"net461\" />\n</packages>"
  },
  {
    "path": "blog-samples/CSharp/BotStateExport/BotStateExport/BotStateExport.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27130.2027\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"BotStateExport\", \"BotStateExport\\BotStateExport.csproj\", \"{DA593586-7A94-43D4-8EF1-0474EFF6D2E0}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{DA593586-7A94-43D4-8EF1-0474EFF6D2E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{DA593586-7A94-43D4-8EF1-0474EFF6D2E0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{DA593586-7A94-43D4-8EF1-0474EFF6D2E0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{DA593586-7A94-43D4-8EF1-0474EFF6D2E0}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {2F9065FE-E24D-4377-AD1D-631E08ED7E57}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "blog-samples/CSharp/BotStateExport/README.md",
    "content": "This is some rough code for exporting an Azure Bot Service bot's bot state data.   This version just dumps it to the console. "
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-DocumentDB-Custom-State/App_Start/WebApiConfig.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web.Http;\n\nnamespace Azure_DocumentDB_Custom_State\n{\n    public static class WebApiConfig\n    {\n        public static void Register(HttpConfiguration config)\n        {\n            // Json settings\n            config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;\n            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();\n            config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented;\n            JsonConvert.DefaultSettings = () => new JsonSerializerSettings()\n            {\n                ContractResolver = new CamelCasePropertyNamesContractResolver(),\n                Formatting = Newtonsoft.Json.Formatting.Indented,\n                NullValueHandling = NullValueHandling.Ignore,\n            };\n\n            // Web API configuration and services\n\n            // Web API routes\n            config.MapHttpAttributeRoutes();\n\n            config.Routes.MapHttpRoute(\n                name: \"DefaultApi\",\n                routeTemplate: \"api/{controller}/{id}\",\n                defaults: new { id = RouteParameter.Optional }\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-DocumentDB-Custom-State/Azure-DocumentDB-Custom-State.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{FD99C7C4-DA5C-4527-B65D-00B29487E66F}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Azure_Blob_Custom_State</RootNamespace>\n    <AssemblyName>Bot Application</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <UseIISExpress>true</UseIISExpress>\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n    <TargetFrameworkProfile />\n    <Use64BitIISExpress />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Autofac, Version=4.6.2.0, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Autofac.4.6.2\\lib\\net45\\Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Chronic, Version=0.3.2.0, Culture=neutral, PublicKeyToken=3bd1f1ef638b0d3c, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Chronic.Signed.0.3.2\\lib\\net40\\Chronic.dll</HintPath>\n    </Reference>\n    <Reference Include=\"EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.6.2.0\\lib\\net45\\EntityFramework.dll</HintPath>\n    </Reference>\n    <Reference Include=\"EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.6.2.0\\lib\\net45\\EntityFramework.SqlServer.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Azure.Documents.Client, Version=1.19.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Azure.DocumentDB.1.19.1\\lib\\net45\\Microsoft.Azure.Documents.Client.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Azure.KeyVault.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Azure.KeyVault.Core.2.0.4\\lib\\net45\\Microsoft.Azure.KeyVault.Core.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder, Version=3.12.2.4, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.12.2.4\\lib\\net46\\Microsoft.Bot.Builder.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder.Autofac, Version=3.12.2.4, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.12.2.4\\lib\\net46\\Microsoft.Bot.Builder.Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder.Azure, Version=3.2.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.Azure.3.2.5\\lib\\net46\\Microsoft.Bot.Builder.Azure.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder.History, Version=3.12.2.4, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.History.3.12.2.4\\lib\\net46\\Microsoft.Bot.Builder.History.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Connector, Version=3.12.2.4, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Connector.3.12.2.4\\lib\\net46\\Microsoft.Bot.Connector.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"Microsoft.Data.Edm, Version=5.8.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Data.Edm.5.8.3\\lib\\net40\\Microsoft.Data.Edm.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Data.OData, Version=5.8.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Data.OData.5.8.3\\lib\\net40\\Microsoft.Data.OData.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Data.Services.Client, Version=5.8.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Data.Services.Client.5.8.3\\lib\\net40\\Microsoft.Data.Services.Client.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.IdentityModel.Logging, Version=1.1.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Logging.1.1.5\\lib\\net451\\Microsoft.IdentityModel.Logging.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.IdentityModel.Protocol.Extensions, Version=1.0.40306.1554, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.IdentityModel.Protocol.Extensions.1.0.4.403061554\\lib\\net45\\Microsoft.IdentityModel.Protocol.Extensions.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.IdentityModel.Protocols, Version=2.1.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Protocols.2.1.5\\lib\\net451\\Microsoft.IdentityModel.Protocols.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.IdentityModel.Protocols.OpenIdConnect, Version=2.1.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Protocols.OpenIdConnect.2.1.5\\lib\\net451\\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.IdentityModel.Tokens, Version=5.1.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Tokens.5.1.5\\lib\\net451\\Microsoft.IdentityModel.Tokens.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Rest.ClientRuntime.2.3.10\\lib\\net452\\Microsoft.Rest.ClientRuntime.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.WindowsAzure.Configuration, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.WindowsAzure.ConfigurationManager.3.2.3\\lib\\net40\\Microsoft.WindowsAzure.Configuration.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.WindowsAzure.Storage, Version=8.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\WindowsAzure.Storage.8.6.0\\lib\\net45\\Microsoft.WindowsAzure.Storage.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Newtonsoft.Json.10.0.3\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.IdentityModel.Tokens.Jwt, Version=5.1.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.IdentityModel.Tokens.Jwt.5.1.5\\lib\\net451\\System.IdentityModel.Tokens.Jwt.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.IO.Compression.FileSystem\" />\n    <Reference Include=\"System.Net\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.Client.5.2.3\\lib\\net45\\System.Net.Http.Formatting.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net.Http.WebRequest\" />\n    <Reference Include=\"System.Numerics\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Spatial, Version=5.8.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Spatial.5.8.3\\lib\\net40\\System.Spatial.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.Core.5.2.3\\lib\\net45\\System.Web.Http.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.Http.WebHost, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.WebHost.5.2.3\\lib\\net45\\System.Web.Http.WebHost.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n    <Reference Include=\"System.Xml.Linq\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"default.htm\" />\n    <Content Include=\"Global.asax\" />\n    <Content Include=\"Web.config\">\n      <SubType>Designer</SubType>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"App_Start\\WebApiConfig.cs\" />\n    <Compile Include=\"Controllers\\MessagesController.cs\" />\n    <Compile Include=\"Dialogs\\RootDialog.cs\" />\n    <Compile Include=\"Global.asax.cs\">\n      <DependentUpon>Global.asax</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"packages.config\">\n      <SubType>Designer</SubType>\n    </Content>\n    <None Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n    <None Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <PropertyGroup>\n    <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>3979</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost:3979/</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <Import Project=\"..\\packages\\Microsoft.Azure.DocumentDB.1.19.1\\build\\Microsoft.Azure.DocumentDB.targets\" Condition=\"Exists('..\\packages\\Microsoft.Azure.DocumentDB.1.19.1\\build\\Microsoft.Azure.DocumentDB.targets')\" />\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\packages\\Microsoft.Azure.DocumentDB.1.19.1\\build\\Microsoft.Azure.DocumentDB.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Microsoft.Azure.DocumentDB.1.19.1\\build\\Microsoft.Azure.DocumentDB.targets'))\" />\n  </Target>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-DocumentDB-Custom-State/Controllers/MessagesController.cs",
    "content": "﻿using System.Net;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing System.Web.Http;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\n\nnamespace Azure_Blob_Custom_State\n{\n    [BotAuthentication]\n    public class MessagesController : ApiController\n    {\n        /// <summary>\n        /// POST: api/Messages\n        /// Receive a message from a user and reply to it\n        /// </summary>\n        public async Task<HttpResponseMessage> Post([FromBody]Activity activity)\n        {\n            if (activity.Type == ActivityTypes.Message)\n            {\n                await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());\n            }\n            else\n            {\n                HandleSystemMessage(activity);\n            }\n            var response = Request.CreateResponse(HttpStatusCode.OK);\n            return response;\n        }\n\n        private Activity HandleSystemMessage(Activity message)\n        {\n            if (message.Type == ActivityTypes.DeleteUserData)\n            {\n                // Implement user deletion here\n                // If we handle user deletion, return a real message\n            }\n            else if (message.Type == ActivityTypes.ConversationUpdate)\n            {\n                // Handle conversation state changes, like members being added and removed\n                // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info\n                // Not available in all channels\n            }\n            else if (message.Type == ActivityTypes.ContactRelationUpdate)\n            {\n                // Handle add/remove from contact lists\n                // Activity.From + Activity.Action represent what happened\n            }\n            else if (message.Type == ActivityTypes.Typing)\n            {\n                // Handle knowing tha the user is typing\n            }\n            else if (message.Type == ActivityTypes.Ping)\n            {\n            }\n\n            return null;\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-DocumentDB-Custom-State/Dialogs/RootDialog.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\n\nnamespace Azure_Blob_Custom_State.Dialogs\n{\n    [Serializable]\n    public class RootDialog : IDialog<object>\n    {\n        public Task StartAsync(IDialogContext context)\n        {\n            context.Wait(MessageReceivedAsync);\n\n            return Task.CompletedTask;\n        }\n\n        private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)\n        {\n            var activity = await result as Activity;\n\n            await context.PostAsync($\"You said {activity.Text}\");\n\n            context.Wait(MessageReceivedAsync);\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-DocumentDB-Custom-State/Global.asax",
    "content": "﻿<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"Azure_Blob_Custom_State.WebApiApplication\" Language=\"C#\" %>\n"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-DocumentDB-Custom-State/Global.asax.cs",
    "content": "﻿using System.Reflection;\nusing System.Web.Http;\nusing Autofac;\nusing Microsoft.Bot.Builder.Azure;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Builder.Dialogs.Internals;\nusing Microsoft.Bot.Connector;\nusing System.Configuration;\nusing System;\n\nnamespace Azure_DocumentDB_Custom_State\n{\n    public class WebApiApplication : System.Web.HttpApplication\n    {\n        protected void Application_Start()\n        {\n            Conversation.UpdateContainer(\n                builder =>\n                {\n                    builder.RegisterModule(new AzureModule(Assembly.GetExecutingAssembly()));\n\n                    // Bot Storage: register state storage for your bot\n                    // Default store: volatile in-memory store - Only for prototyping!\n                    // var store = new InMemoryDataStore();\n\n                    var uri = new Uri(ConfigurationManager.AppSettings[\"DocumentDBUri\"]);\n                    var key = ConfigurationManager.AppSettings[\"DocumentDBKey\"];\n\n                    var store = new DocumentDbBotDataStore(uri, key);\n\n                    builder.Register(c => store)\n                        .Keyed<IBotDataStore<BotData>>(AzureModule.Key_DataStore)\n                        .AsSelf()\n                        .SingleInstance();\n                });\n                \n            GlobalConfiguration.Configure(WebApiConfig.Register);\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-DocumentDB-Custom-State/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Azure_Blob_Custom_State\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Azure_Blob_Custom_State\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"fd99c7c4-da5c-4527-b65d-00b29487e66f\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Revision and Build Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-DocumentDB-Custom-State/README.md",
    "content": "# Azure DocumentDB Sample\n\nThis simple echo bots illustrates how to use your own Azure Table Storage to store the bot state.\n\nTo use Azure Table Store, we configure the Autofac Dependency Injection in [Global.asax](Global.asax.cs). Particularly the following is the piece of code that configures injection of Azure DocumentDB (CosmosDB) Storage:\n\n>Note: DocumentDB was rebranded as CosmosDB - [see here](https://buildazure.com/2017/05/10/cosmosdb-the-new-documentdb-nosql-database-in-microsoft-azure/) for details\n\n```csharp\nvar store = new TableBotDataStore(ConfigurationManager.ConnectionStrings[\"StorageConnectionString\"].ConnectionString);\nbuilder.Register(c => store)\n    .Keyed<IBotDataStore<BotData>>(AzureModule.Key_DataStore)\n    .AsSelf()\n    .SingleInstance();\n```\n\n## References\n- Documentation - [State Data for Bots in .NET](https://docs.microsoft.com/en-us/bot-framework/dotnet/bot-builder-dotnet-state) \n- Source code for [BotBuilder-Azure on GitHub](https://github.com/Microsoft/BotBuilder-Azure)\n- Nuget packaget for .NET [Microsoft.Bot.Builder.Azure](https://www.nuget.org/packages/Microsoft.Bot.Builder.Azure/)\n- Get started with [Azure DocumentDB](https://docs.microsoft.com/en-us/azure/cosmos-db/create-documentdb-dotnet)\n\n"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-DocumentDB-Custom-State/Web.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-DocumentDB-Custom-State/Web.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-DocumentDB-Custom-State/Web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  For more information on how to configure your ASP.NET application, please visit\n  http://go.microsoft.com/fwlink/?LinkId=301879\n  -->\n<configuration>\n  <configSections>\n    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->\n    <section name=\"entityFramework\" type=\"System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" requirePermission=\"false\" />\n  </configSections>\n  <appSettings>\n    <!-- update these with your BotId, Microsoft App Id and your Microsoft App Password-->\n    <add key=\"BotId\" value=\"YourBotId\" />\n    <add key=\"MicrosoftAppId\" value=\"\" />\n    <add key=\"MicrosoftAppPassword\" value=\"\" />\n    <add key=\"DocumentDbUrl\" value=\"Your DocumentDB URI\" />\n    <add key=\"DocumentDbKey\" value=\"Your DocumentDB Key\" />\n  </appSettings>\n  <!--\n    For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367.\n\n    The following attributes can be set on the <httpRuntime> tag.\n      <system.Web>\n        <httpRuntime targetFramework=\"4.6\" />\n      </system.Web>\n  -->\n  <system.web>\n    <customErrors mode=\"Off\" />\n    <compilation debug=\"true\" targetFramework=\"4.6\" />\n    <httpRuntime targetFramework=\"4.6\" />\n  </system.web>\n  <system.webServer>\n    <defaultDocument>\n      <files>\n        <clear />\n        <add value=\"default.htm\" />\n      </files>\n    </defaultDocument>\n    <handlers>\n      <remove name=\"ExtensionlessUrlHandler-Integrated-4.0\" />\n      <remove name=\"OPTIONSVerbHandler\" />\n      <remove name=\"TRACEVerbHandler\" />\n      <add name=\"ExtensionlessUrlHandler-Integrated-4.0\" path=\"*.\" verb=\"*\" type=\"System.Web.Handlers.TransferRequestHandler\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n    </handlers>\n  </system.webServer>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Helpers\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Mvc\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.WebPages\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" publicKeyToken=\"30ad4fe6b2a6aeed\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-10.0.0.0\" newVersion=\"10.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.29.0\" newVersion=\"4.2.29.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Formatting\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IdentityModel.Tokens.Jwt\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.1.5.0\" newVersion=\"5.1.5.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Azure.Documents.Client\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.19.0.0\" newVersion=\"1.19.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.IdentityModel.Tokens\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.1.5.0\" newVersion=\"5.1.5.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.IdentityModel.Protocols\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-2.1.5.0\" newVersion=\"2.1.5.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.IdentityModel.Protocols.OpenIdConnect\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-2.1.5.0\" newVersion=\"2.1.5.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Autofac\" publicKeyToken=\"17863af14b0044da\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.6.2.0\" newVersion=\"4.6.2.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.WindowsAzure.Storage\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-8.6.0.0\" newVersion=\"8.6.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Data.Services.Client\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.8.3.0\" newVersion=\"5.8.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Data.OData\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.8.3.0\" newVersion=\"5.8.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Data.Edm\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.8.3.0\" newVersion=\"5.8.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Azure.KeyVault.Core\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-2.0.0.0\" newVersion=\"2.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n  <entityFramework>\n    <defaultConnectionFactory type=\"System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework\">\n      <parameters>\n        <parameter value=\"mssqllocaldb\" />\n      </parameters>\n    </defaultConnectionFactory>\n    <providers>\n      <provider invariantName=\"System.Data.SqlClient\" type=\"System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer\" />\n    </providers>\n  </entityFramework>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-DocumentDB-Custom-State/default.htm",
    "content": "﻿<!DOCTYPE html>\n<html>\n<head>\n    <title></title>\n    <meta charset=\"utf-8\" />\n</head>\n<body style=\"font-family:'Segoe UI'\">\n    <h1>Azure_Blob_Custom_State</h1>\n    <p>Describe your bot here and your terms of use etc.</p>\n    <p>Visit <a href=\"https://www.botframework.com/\">Bot Framework</a> to register your bot. When you register it, remember to set your bot's endpoint to <pre>https://<i>your_bots_hostname</i>/api/messages</pre></p>\n</body>\n</html>\n"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-DocumentDB-Custom-State/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Autofac\" version=\"4.6.2\" targetFramework=\"net46\" />\n  <package id=\"Chronic.Signed\" version=\"0.3.2\" targetFramework=\"net46\" />\n  <package id=\"EntityFramework\" version=\"6.2.0\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.Client\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.Core\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.WebHost\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Azure.DocumentDB\" version=\"1.19.1\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Azure.KeyVault.Core\" version=\"2.0.4\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Bot.Builder\" version=\"3.12.2.4\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Bot.Builder.Azure\" version=\"3.2.5\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Bot.Builder.History\" version=\"3.12.2.4\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Bot.Connector\" version=\"3.12.2.4\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Data.Edm\" version=\"5.8.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Data.OData\" version=\"5.8.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Data.Services.Client\" version=\"5.8.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.IdentityModel.Logging\" version=\"1.1.5\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.IdentityModel.Protocol.Extensions\" version=\"1.0.4.403061554\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.IdentityModel.Protocols\" version=\"2.1.5\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.IdentityModel.Protocols.OpenIdConnect\" version=\"2.1.5\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.IdentityModel.Tokens\" version=\"5.1.5\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Rest.ClientRuntime\" version=\"2.3.10\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.WindowsAzure.ConfigurationManager\" version=\"3.2.3\" targetFramework=\"net46\" />\n  <package id=\"Newtonsoft.Json\" version=\"10.0.3\" targetFramework=\"net46\" />\n  <package id=\"System.IdentityModel.Tokens.Jwt\" version=\"5.1.5\" targetFramework=\"net46\" />\n  <package id=\"System.Spatial\" version=\"5.8.3\" targetFramework=\"net46\" />\n  <package id=\"WindowsAzure.Storage\" version=\"8.6.0\" targetFramework=\"net46\" />\n</packages>"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-Table-Custom-State/App_Start/WebApiConfig.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web.Http;\n\nnamespace Azure_Table_Custom_State\n{\n    public static class WebApiConfig\n    {\n        public static void Register(HttpConfiguration config)\n        {\n            // Json settings\n            config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;\n            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();\n            config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented;\n            JsonConvert.DefaultSettings = () => new JsonSerializerSettings()\n            {\n                ContractResolver = new CamelCasePropertyNamesContractResolver(),\n                Formatting = Newtonsoft.Json.Formatting.Indented,\n                NullValueHandling = NullValueHandling.Ignore,\n            };\n\n            // Web API configuration and services\n\n            // Web API routes\n            config.MapHttpAttributeRoutes();\n\n            config.Routes.MapHttpRoute(\n                name: \"DefaultApi\",\n                routeTemplate: \"api/{controller}/{id}\",\n                defaults: new { id = RouteParameter.Optional }\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-Table-Custom-State/Azure-Table-Custom-State.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{B665E69D-98E2-47A7-AF4D-3EAA9D8E1439}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Custom_State_Sample</RootNamespace>\n    <AssemblyName>Bot Application</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <UseIISExpress>true</UseIISExpress>\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n    <TargetFrameworkProfile />\n    <Use64BitIISExpress />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Autofac, Version=4.6.2.0, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Autofac.4.6.2\\lib\\net45\\Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Chronic, Version=0.3.2.0, Culture=neutral, PublicKeyToken=3bd1f1ef638b0d3c, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Chronic.Signed.0.3.2\\lib\\net40\\Chronic.dll</HintPath>\n    </Reference>\n    <Reference Include=\"EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.6.2.0\\lib\\net45\\EntityFramework.dll</HintPath>\n    </Reference>\n    <Reference Include=\"EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\EntityFramework.6.2.0\\lib\\net45\\EntityFramework.SqlServer.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Azure.Documents.Client, Version=1.19.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Azure.DocumentDB.1.19.1\\lib\\net45\\Microsoft.Azure.Documents.Client.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Azure.KeyVault.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Azure.KeyVault.Core.2.0.4\\lib\\net45\\Microsoft.Azure.KeyVault.Core.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder, Version=3.12.2.4, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.12.2.4\\lib\\net46\\Microsoft.Bot.Builder.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder.Autofac, Version=3.12.2.4, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.12.2.4\\lib\\net46\\Microsoft.Bot.Builder.Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder.Azure, Version=3.2.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.Azure.3.2.5\\lib\\net46\\Microsoft.Bot.Builder.Azure.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder.History, Version=3.12.2.4, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.History.3.12.2.4\\lib\\net46\\Microsoft.Bot.Builder.History.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Connector, Version=3.12.2.4, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Connector.3.12.2.4\\lib\\net46\\Microsoft.Bot.Connector.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"Microsoft.Data.Edm, Version=5.8.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Data.Edm.5.8.3\\lib\\net40\\Microsoft.Data.Edm.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Data.OData, Version=5.8.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Data.OData.5.8.3\\lib\\net40\\Microsoft.Data.OData.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Data.Services.Client, Version=5.8.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Data.Services.Client.5.8.3\\lib\\net40\\Microsoft.Data.Services.Client.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.IdentityModel.Logging, Version=1.1.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Logging.1.1.5\\lib\\net451\\Microsoft.IdentityModel.Logging.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.IdentityModel.Protocol.Extensions, Version=1.0.40306.1554, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.IdentityModel.Protocol.Extensions.1.0.4.403061554\\lib\\net45\\Microsoft.IdentityModel.Protocol.Extensions.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.IdentityModel.Protocols, Version=2.1.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Protocols.2.1.5\\lib\\net451\\Microsoft.IdentityModel.Protocols.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.IdentityModel.Protocols.OpenIdConnect, Version=2.1.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Protocols.OpenIdConnect.2.1.5\\lib\\net451\\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.IdentityModel.Tokens, Version=5.1.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Tokens.5.1.5\\lib\\net451\\Microsoft.IdentityModel.Tokens.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Rest.ClientRuntime.2.3.10\\lib\\net452\\Microsoft.Rest.ClientRuntime.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.WindowsAzure.Configuration, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.WindowsAzure.ConfigurationManager.3.2.3\\lib\\net40\\Microsoft.WindowsAzure.Configuration.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.WindowsAzure.Storage, Version=8.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\WindowsAzure.Storage.8.6.0\\lib\\net45\\Microsoft.WindowsAzure.Storage.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Newtonsoft.Json.10.0.3\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.IdentityModel.Tokens.Jwt, Version=5.1.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.IdentityModel.Tokens.Jwt.5.1.5\\lib\\net451\\System.IdentityModel.Tokens.Jwt.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.IO.Compression.FileSystem\" />\n    <Reference Include=\"System.Net\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.Client.5.2.3\\lib\\net45\\System.Net.Http.Formatting.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net.Http.WebRequest\" />\n    <Reference Include=\"System.Numerics\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Spatial, Version=5.8.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Spatial.5.8.3\\lib\\net40\\System.Spatial.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.Core.5.2.3\\lib\\net45\\System.Web.Http.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.Http.WebHost, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.WebHost.5.2.3\\lib\\net45\\System.Web.Http.WebHost.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n    <Reference Include=\"System.Xml.Linq\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"default.htm\" />\n    <Content Include=\"Global.asax\" />\n    <Content Include=\"Web.config\">\n      <SubType>Designer</SubType>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"App_Start\\WebApiConfig.cs\" />\n    <Compile Include=\"Controllers\\MessagesController.cs\" />\n    <Compile Include=\"Dialogs\\RootDialog.cs\" />\n    <Compile Include=\"Global.asax.cs\">\n      <DependentUpon>Global.asax</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"packages.config\">\n      <SubType>Designer</SubType>\n    </Content>\n    <None Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n    <None Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <PropertyGroup>\n    <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>3979</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost:3979/</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <Import Project=\"..\\packages\\Microsoft.Azure.DocumentDB.1.19.1\\build\\Microsoft.Azure.DocumentDB.targets\" Condition=\"Exists('..\\packages\\Microsoft.Azure.DocumentDB.1.19.1\\build\\Microsoft.Azure.DocumentDB.targets')\" />\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\packages\\Microsoft.Azure.DocumentDB.1.19.1\\build\\Microsoft.Azure.DocumentDB.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Microsoft.Azure.DocumentDB.1.19.1\\build\\Microsoft.Azure.DocumentDB.targets'))\" />\n  </Target>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-Table-Custom-State/Controllers/MessagesController.cs",
    "content": "﻿using System.Net;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing System.Web.Http;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\n\nnamespace Custom_State_Sample\n{\n    [BotAuthentication]\n    public class MessagesController : ApiController\n    {\n        /// <summary>\n        /// POST: api/Messages\n        /// Receive a message from a user and reply to it\n        /// </summary>\n        public async Task<HttpResponseMessage> Post([FromBody]Activity activity)\n        {\n            if (activity.Type == ActivityTypes.Message)\n            {\n                await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());\n            }\n            else\n            {\n                HandleSystemMessage(activity);\n            }\n            var response = Request.CreateResponse(HttpStatusCode.OK);\n            return response;\n        }\n\n        private Activity HandleSystemMessage(Activity message)\n        {\n            if (message.Type == ActivityTypes.DeleteUserData)\n            {\n                // Implement user deletion here\n                // If we handle user deletion, return a real message\n            }\n            else if (message.Type == ActivityTypes.ConversationUpdate)\n            {\n                // Handle conversation state changes, like members being added and removed\n                // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info\n                // Not available in all channels\n            }\n            else if (message.Type == ActivityTypes.ContactRelationUpdate)\n            {\n                // Handle add/remove from contact lists\n                // Activity.From + Activity.Action represent what happened\n            }\n            else if (message.Type == ActivityTypes.Typing)\n            {\n                // Handle knowing tha the user is typing\n            }\n            else if (message.Type == ActivityTypes.Ping)\n            {\n            }\n\n            return null;\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-Table-Custom-State/Dialogs/RootDialog.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\n\nnamespace Custom_State_Sample.Dialogs\n{\n    [Serializable]\n    public class RootDialog : IDialog<object>\n    {\n        public Task StartAsync(IDialogContext context)\n        {\n            context.Wait(MessageReceivedAsync);\n\n            return Task.CompletedTask;\n        }\n\n        private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)\n        {\n            var activity = await result as Activity;\n\n            await context.PostAsync($\"You said {activity.Text}\");\n\n            context.Wait(MessageReceivedAsync);\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-Table-Custom-State/Global.asax",
    "content": "﻿<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"Custom_State_Sample.WebApiApplication\" Language=\"C#\" %>\n"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-Table-Custom-State/Global.asax.cs",
    "content": "﻿using System.Reflection;\nusing System.Web.Http;\nusing Autofac;\nusing Microsoft.Bot.Builder.Azure;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Builder.Dialogs.Internals;\nusing Microsoft.Bot.Connector;\nusing System.Configuration;\n\nnamespace Azure_Table_Custom_State\n{\n    public class WebApiApplication : System.Web.HttpApplication\n    {\n        protected void Application_Start()\n        {\n            Conversation.UpdateContainer(\n                builder =>\n                {\n                    builder.RegisterModule(new AzureModule(Assembly.GetExecutingAssembly()));\n\n                    // Bot Storage: register state storage for your bot\n                    // Default store: volatile in-memory store - Only for prototyping!\n                    // var store = new InMemoryDataStore();\n\n                    // This sample will use Azure Table \n                    var store = new TableBotDataStore(ConfigurationManager.ConnectionStrings[\"StorageConnectionString\"].ConnectionString);\n          \n                    builder.Register(c => store)\n                        .Keyed<IBotDataStore<BotData>>(AzureModule.Key_DataStore)\n                        .AsSelf()\n                        .SingleInstance();                 \n                });\n\n            GlobalConfiguration.Configure(WebApiConfig.Register);\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-Table-Custom-State/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Custom_State_Sample\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Custom_State_Sample\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"b665e69d-98e2-47a7-af4d-3eaa9d8e1439\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Revision and Build Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-Table-Custom-State/README.md",
    "content": "# Azure Table Sample\n\nThis simple echo bots illustrates how to use your own Azure Table Storage to store the bot state.\n\nTo use Azure Table Store, we configure the Autofac Dependency Injection in [Global.asax](Global.asax.cs). Particularly the following is the piece of code that configures injection of Azure Table Storage:\n\n```csharp\nvar store = new TableBotDataStore(ConfigurationManager.ConnectionStrings[\"StorageConnectionString\"].ConnectionString);\nbuilder.Register(c => store)\n    .Keyed<IBotDataStore<BotData>>(AzureModule.Key_DataStore)\n    .AsSelf()\n    .SingleInstance();\n```\n\n## References\n- Documentation - [State Data for Bots in .NET](https://docs.microsoft.com/en-us/bot-framework/dotnet/bot-builder-dotnet-state) \n- Source code for [BotBuilder-Azure on GitHub](https://github.com/Microsoft/BotBuilder-Azure)\n- Nuget packaget for .NET [Microsoft.Bot.Builder.Azure](https://www.nuget.org/packages/Microsoft.Bot.Builder.Azure/)\n- Get started with [Azure Table Storage](https://docs.microsoft.com/en-us/azure/cosmos-db/table-storage-how-to-use-dotnet)"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-Table-Custom-State/Web.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-Table-Custom-State/Web.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-Table-Custom-State/Web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  For more information on how to configure your ASP.NET application, please visit\n  http://go.microsoft.com/fwlink/?LinkId=301879\n  -->\n<configuration>\n  <configSections>\n    \n    <section name=\"entityFramework\" type=\"System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" requirePermission=\"false\" />\n  <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections>\n  <appSettings>\n    <!-- update these with your BotId, Microsoft App Id and your Microsoft App Password-->\n    <add key=\"BotId\" value=\"YourBotId\" />\n    <add key=\"MicrosoftAppId\" value=\"\" />\n    <add key=\"MicrosoftAppPassword\" value=\"\" />\n  </appSettings>\n  <connectionStrings>\n    <add name=\"StorageConnectionString\" connectionString=\"DefaultEndpointsProtocol=https;AccountName={$Your-Account-Name};AccountKey={$Your-Account-Key};EndpointSuffix=core.windows.net\" />\n  </connectionStrings>\n  <!--\n    For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367.\n\n    The following attributes can be set on the <httpRuntime> tag.\n      <system.Web>\n        <httpRuntime targetFramework=\"4.6\" />\n      </system.Web>\n  -->\n  <system.web>\n    <customErrors mode=\"Off\" />\n    <compilation debug=\"true\" targetFramework=\"4.6\" />\n    <httpRuntime targetFramework=\"4.6\" />\n  </system.web>\n  <system.webServer>\n    <defaultDocument>\n      <files>\n        <clear />\n        <add value=\"default.htm\" />\n      </files>\n    </defaultDocument>\n    <handlers>\n      <remove name=\"ExtensionlessUrlHandler-Integrated-4.0\" />\n      <remove name=\"OPTIONSVerbHandler\" />\n      <remove name=\"TRACEVerbHandler\" />\n      <add name=\"ExtensionlessUrlHandler-Integrated-4.0\" path=\"*.\" verb=\"*\" type=\"System.Web.Handlers.TransferRequestHandler\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n    </handlers>\n  </system.webServer>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Helpers\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Mvc\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.WebPages\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" publicKeyToken=\"30ad4fe6b2a6aeed\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-10.0.0.0\" newVersion=\"10.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.29.0\" newVersion=\"4.2.29.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Formatting\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.IdentityModel.Tokens.Jwt\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.1.5.0\" newVersion=\"5.1.5.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Azure.Documents.Client\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.19.0.0\" newVersion=\"1.19.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.WindowsAzure.Storage\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-8.6.0.0\" newVersion=\"8.6.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.IdentityModel.Tokens\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.1.5.0\" newVersion=\"5.1.5.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.IdentityModel.Protocols\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-2.1.5.0\" newVersion=\"2.1.5.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.IdentityModel.Protocols.OpenIdConnect\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-2.1.5.0\" newVersion=\"2.1.5.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Autofac\" publicKeyToken=\"17863af14b0044da\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.6.2.0\" newVersion=\"4.6.2.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Data.Services.Client\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.8.3.0\" newVersion=\"5.8.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Data.OData\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.8.3.0\" newVersion=\"5.8.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Data.Edm\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.8.3.0\" newVersion=\"5.8.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Azure.KeyVault.Core\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-2.0.0.0\" newVersion=\"2.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n  <entityFramework>\n    <defaultConnectionFactory type=\"System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework\">\n      <parameters>\n        <parameter value=\"mssqllocaldb\" />\n      </parameters>\n    </defaultConnectionFactory>\n    <providers>\n      <provider invariantName=\"System.Data.SqlClient\" type=\"System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer\" />\n    </providers>\n  </entityFramework>\n</configuration>\n"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-Table-Custom-State/default.htm",
    "content": "﻿<!DOCTYPE html>\n<html>\n<head>\n    <title></title>\n    <meta charset=\"utf-8\" />\n</head>\n<body style=\"font-family:'Segoe UI'\">\n    <h1>Custom_State_Sample</h1>\n    <p>Describe your bot here and your terms of use etc.</p>\n    <p>Visit <a href=\"https://www.botframework.com/\">Bot Framework</a> to register your bot. When you register it, remember to set your bot's endpoint to <pre>https://<i>your_bots_hostname</i>/api/messages</pre></p>\n</body>\n</html>\n"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Azure-Table-Custom-State/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Autofac\" version=\"4.6.2\" targetFramework=\"net46\" />\n  <package id=\"Chronic.Signed\" version=\"0.3.2\" targetFramework=\"net46\" />\n  <package id=\"EntityFramework\" version=\"6.2.0\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.Client\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.Core\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.WebHost\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Azure.DocumentDB\" version=\"1.19.1\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Azure.KeyVault.Core\" version=\"2.0.4\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Bot.Builder\" version=\"3.12.2.4\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Bot.Builder.Azure\" version=\"3.2.5\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Bot.Builder.History\" version=\"3.12.2.4\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Bot.Connector\" version=\"3.12.2.4\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Data.Edm\" version=\"5.8.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Data.OData\" version=\"5.8.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Data.Services.Client\" version=\"5.8.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.IdentityModel.Logging\" version=\"1.1.5\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.IdentityModel.Protocol.Extensions\" version=\"1.0.4.403061554\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.IdentityModel.Protocols\" version=\"2.1.5\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.IdentityModel.Protocols.OpenIdConnect\" version=\"2.1.5\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.IdentityModel.Tokens\" version=\"5.1.5\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Rest.ClientRuntime\" version=\"2.3.10\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.WindowsAzure.ConfigurationManager\" version=\"3.2.3\" targetFramework=\"net46\" />\n  <package id=\"Newtonsoft.Json\" version=\"10.0.3\" targetFramework=\"net46\" />\n  <package id=\"System.ComponentModel.EventBasedAsync\" version=\"4.3.0\" targetFramework=\"net46\" />\n  <package id=\"System.Dynamic.Runtime\" version=\"4.3.0\" targetFramework=\"net46\" />\n  <package id=\"System.IdentityModel.Tokens.Jwt\" version=\"5.1.5\" targetFramework=\"net46\" />\n  <package id=\"System.Linq.Queryable\" version=\"4.3.0\" targetFramework=\"net46\" />\n  <package id=\"System.Net.Requests\" version=\"4.3.0\" targetFramework=\"net46\" />\n  <package id=\"System.Spatial\" version=\"5.8.3\" targetFramework=\"net46\" />\n  <package id=\"WindowsAzure.Storage\" version=\"8.6.0\" targetFramework=\"net46\" />\n</packages>"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/Custom-State-Sample.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27004.2002\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Azure-Table-Custom-State\", \"Custom-State-Sample\\Azure-Table-Custom-State.csproj\", \"{B665E69D-98E2-47A7-AF4D-3EAA9D8E1439}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Azure-DocumentDB-Custom-State\", \"Azure-Blob-Custom-State\\Azure-DocumentDB-Custom-State.csproj\", \"{FD99C7C4-DA5C-4527-B65D-00B29487E66F}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{B665E69D-98E2-47A7-AF4D-3EAA9D8E1439}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B665E69D-98E2-47A7-AF4D-3EAA9D8E1439}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B665E69D-98E2-47A7-AF4D-3EAA9D8E1439}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B665E69D-98E2-47A7-AF4D-3EAA9D8E1439}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{FD99C7C4-DA5C-4527-B65D-00B29487E66F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{FD99C7C4-DA5C-4527-B65D-00B29487E66F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{FD99C7C4-DA5C-4527-B65D-00B29487E66F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{FD99C7C4-DA5C-4527-B65D-00B29487E66F}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {9593BDCF-32D9-4BA4-9BFD-BF7E43B74DCF}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "blog-samples/CSharp/Custom-State-BotBuilder-Azure-Sample/README.md",
    "content": "# Custom state data for your Bots\n\nThe [Bot Framework State Service](https://docs.microsoft.com/en-us/bot-framework/dotnet/bot-builder-dotnet-state) API is not recommended for production environments. Currently, every bot built with the SDK comes with this setting by default, but it is only meant for prototyping. \n\nThese samples are simple echo bots which leverage the [Microsoft.Bot.Builder.Azure](https://www.nuget.org/packages/Microsoft.Bot.Builder.Azure/) Nuget package to easily create a custom state data store for your bots. Currently, the package supports seamless integration with [Azure Table storage](https://docs.microsoft.com/en-us/azure/cosmos-db/table-storage-how-to-use-dotnet) and [Azure DocumentDB](https://docs.microsoft.com/en-us/azure/cosmos-db/create-documentdb-dotnet). \n\nCreating a custom state store for your bot provides several benefits:\n- Improved latency for your Bot\n- Direct control over your bot's state data, which includes information about your users, conversation state, and conversation context. \n\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/FacebookHandover.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.28803.452\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Primary\", \"Primary\\Primary.csproj\", \"{065B80D0-7968-4E61-B0F6-D04165912FF6}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Secondary\", \"Secondary\\Secondary.csproj\", \"{57786F2D-4C81-4FDF-9011-55652A78DF0B}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{065B80D0-7968-4E61-B0F6-D04165912FF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{065B80D0-7968-4E61-B0F6-D04165912FF6}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{065B80D0-7968-4E61-B0F6-D04165912FF6}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{065B80D0-7968-4E61-B0F6-D04165912FF6}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{57786F2D-4C81-4FDF-9011-55652A78DF0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{57786F2D-4C81-4FDF-9011-55652A78DF0B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{57786F2D-4C81-4FDF-9011-55652A78DF0B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{57786F2D-4C81-4FDF-9011-55652A78DF0B}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {6876B9B2-5C7C-41B7-A624-EFB8D070BD4A}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/FacebookModel/FacebookPassThreadControl.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Newtonsoft.Json;\n\nnamespace FacebookModel\n{\n    /// <summary>\n    /// A Facebook thread control message, including appid of the new thread owner and an optional message to sent with the request\n    /// <see cref=\"FacebookRequestThreadControl.Metadata\"/>\n    /// </summary>\n    public class FacebookPassThreadControl\n    {\n        /// <summary>\n        /// The app id of the new owner.\n        /// </summary>\n        /// <remarks>\n        /// 263902037430900 for the page inbox.\n        /// </remarks>\n        [JsonProperty(\"new_owner_app_id\")]\n        public string NewOwnerAppId;\n\n        /// <summary>\n        /// Message sent from the requester.\n        /// </summary>\n        /// <remarks>\n        /// Example: \"i want the control!\"\n        /// </remarks>\n        [JsonProperty(\"metadata\")]\n        public string Metadata;\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/FacebookModel/FacebookPayload.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing Newtonsoft.Json;\n\nnamespace FacebookModel\n{\n    /// <summary>\n    /// Simple version of the payload received from the Facebook channel.\n    /// </summary>\n    public class FacebookPayload\n    {\n        /// <summary>\n        /// Gets or sets the sender of the message.\n        /// </summary>\n        [JsonProperty(\"sender\")]\n        public FacebookPsid Sender { get; set; }\n\n        /// <summary>\n        /// Gets or sets the recipient of the message.\n        /// </summary>\n        [JsonProperty(\"recipient\")]\n        public FacebookPsid Recipient { get; set; }\n\n        /// <summary>\n        /// Gets or sets the request_thread_control of the control request.\n        /// </summary>\n        [JsonProperty(\"request_thread_control\")]\n        public FacebookRequestThreadControl RequestThreadControl;\n\n        /// <summary>\n        /// Gets or sets the pass_thread_control of the control request.\n        /// </summary>\n        [JsonProperty(\"pass_thread_control\")]\n        public FacebookPassThreadControl PassThreadControl;\n\n        /// <summary>\n        /// Gets or sets the take_thread_control of the control request.\n        /// </summary>\n        [JsonProperty(\"take_thread_control\")]\n        public FacebookTakeThreadControl TakeThreadControl;\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/FacebookModel/FacebookPsid.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing Newtonsoft.Json;\n\nnamespace FacebookModel\n{\n    /// <summary>\n    /// Defines a Facebook PSID.\n    /// </summary>\n    public class FacebookPsid\n    {\n        /// <summary>\n        /// A Facebook page-scoped ID.\n        /// </summary>\n        [JsonProperty(\"id\")]\n        public string Id { get; set; }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/FacebookModel/FacebookRequestThreadControl.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Newtonsoft.Json;\n\nnamespace FacebookModel\n{\n    /// <summary>\n    /// A Facebook thread control message, including appid of requested thread owner and an optional message to send with the request\n    /// <see cref=\"Metadata\"/>\n    /// </summary>\n    public class FacebookRequestThreadControl\n    {\n        /// <summary>\n        /// The app id of the requested owner.\n        /// </summary>\n        /// <remarks>\n        /// 263902037430900 for the page inbox.\n        /// </remarks>\n        [JsonProperty(\"requested_owner_app_id\")]\n        public string RequestedOwnerAppId; // 263902037430900 for page\n\n        /// <summary>\n        /// Message sent from the requester.\n        /// </summary>\n        /// <remarks>\n        /// Example: \"i want the control!\"\n        /// </remarks>\n        [JsonProperty(\"metadata\")]\n        public string Metadata;\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/FacebookModel/FacebookStandby.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing Newtonsoft.Json;\n\nnamespace FacebookModel\n{\n    /// <summary>\n    /// A Facebook stanby event payload definition.\n    /// </summary>\n    /// <remarks>See <see cref=\"https://developers.facebook.com/docs/messenger-platform/reference/webhook-events/standby/\"> messaging standby Facebook documentation</see>\n    /// for more information on standby.</remarks>\n    public class FacebookStandbys\n    {\n        [JsonProperty(\"id\")]\n        public string Id;\n        [JsonProperty(\"time\")]\n        public long Time;\n        [JsonProperty(\"standBy\")]\n        public FacebookStandby[] Standbys;\n    }\n\n    public class FacebookStandby\n    {\n        [JsonProperty(\"sender\")]\n        public FacebookPsid Sender;\n        [JsonProperty(\"recipient\")]\n        public FacebookPsid Recipient;\n        [JsonProperty(\"timestamp\")]\n        public long Timestamp;\n        [JsonProperty(\"message\")]\n        public FacebookStandByMessage Message;\n    }\n    \n    public class FacebookStandByMessage\n    {\n        [JsonProperty(\"mid\")]\n        public string MId;\n        [JsonProperty(\"seq\")]\n        public long Seq;\n        [JsonProperty(\"text\")]\n        public string Text;\n    }\n\n}\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/FacebookModel/FacebookTakeThreadControl.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Newtonsoft.Json;\n\nnamespace FacebookModel\n{\n    /// <summary>\n    /// A Facebook thread control message, including appid of the previous thread owner and an optional message sent with the request\n    /// <see cref=\"FacebookRequestThreadControl.Metadata\"/>\n    /// </summary>\n    public class FacebookTakeThreadControl\n    {\n        /// <summary>\n        /// The app id of the previous owner.\n        /// </summary>\n        /// <remarks>\n        /// 263902037430900 for the page inbox.\n        /// </remarks>\n        [JsonProperty(\"previous_owner_app_id\")]\n        public string PreviousOwnerAppId;\n\n        /// <summary>\n        /// Message sent from the requester.\n        /// </summary>\n        /// <remarks>\n        /// Example: \"All yours!\"\n        /// </remarks>\n        [JsonProperty(\"metadata\")]\n        public string Metadata;\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/FacebookModel/FacebookThreadControlHelper.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Net.Http;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Schema;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\n\nnamespace FacebookModel\n{\n    public static class FacebookThreadControlHelper\n    {\n        public const string GRAPH_API_BASE_URL = \"https://graph.facebook.com/v3.3/me/{0}?access_token={1}\";\n\n        private static readonly HttpClient _httpClient = new HttpClient();\n\n        private static async Task<bool> PostToFacebookAPIAsync(string postType, string pageToken, string content)\n        {\n            var requestPath = string.Format(GRAPH_API_BASE_URL, postType, pageToken);\n            var stringContent = new StringContent(content, Encoding.UTF8, \"application/json\");\n\n            // Create HTTP transport objects\n            using (var requestMessage = new HttpRequestMessage())\n            {\n                requestMessage.Method = new HttpMethod(\"POST\");\n                requestMessage.RequestUri = new Uri(requestPath);\n                requestMessage.Content = stringContent;\n                requestMessage.Content.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse(\"application/json; charset=utf-8\");\n\n                // Make the Http call\n                using (var response = await _httpClient.SendAsync(requestMessage, CancellationToken.None).ConfigureAwait(false))\n                {\n                    // Return true if the call was successfull\n                    Debug.Print(await response.Content.ReadAsStringAsync().ConfigureAwait(false));\n                    return response.IsSuccessStatusCode;\n                }\n            }\n        }\n\n        public static async Task<List<string>> GetSecondaryReceiversAsync(string pageToken)\n        {\n            var requestPath = string.Format(GRAPH_API_BASE_URL, \"secondary_receivers\", pageToken);\n\n            // Create HTTP transport objects\n            using (var requestMessage = new HttpRequestMessage())\n            {\n                requestMessage.Method = new HttpMethod(\"GET\");\n                requestMessage.RequestUri = new Uri(requestPath);\n\n                // Make the Http call\n                using (var response = await _httpClient.SendAsync(requestMessage, CancellationToken.None).ConfigureAwait(false))\n                {\n                    // Interpret response\n                    var responseString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);\n                    var responseObject = JObject.Parse(responseString);\n                    var responseData = responseObject[\"data\"] as JArray;\n\n                    return responseData.Select(receiver => receiver[\"id\"].ToString()).ToList();\n                }\n            }\n        }\n\n        public static async Task<bool> RequestThreadControlAsync(string pageToken, string userId, string message)\n        {\n            var content = new { recipient = new { id = userId }, metadata = message };\n            return await PostToFacebookAPIAsync(\"request_thread_control\", pageToken, JsonConvert.SerializeObject(content)).ConfigureAwait(false);\n        }\n        \n        public static async Task<bool> TakeThreadControlAsync(string pageToken, string userId, string message)\n        {\n            var content = new { recipient = new { id = userId }, metadata = message };\n            return await PostToFacebookAPIAsync(\"take_thread_control\", pageToken, JsonConvert.SerializeObject(content)).ConfigureAwait(false);\n        }\n\n        public static async Task<bool> PassThreadControlAsync(string pageToken, string targetAppId, string userId, string message)\n        {\n            var content = new { recipient = new { id = userId }, target_app_id = targetAppId, metadata = message };\n            return await PostToFacebookAPIAsync(\"pass_thread_control\", pageToken, JsonConvert.SerializeObject(content)).ConfigureAwait(false);\n        }\n\n        /// <summary>\n        /// This extension method populates a turn context's activity with conversation and user information from a Facebook payload.\n        /// This is necessary because a turn context needs that information to send messages to a conversation,\n        /// and event activities don't necessarily come with that information already in place.\n        /// </summary>\n        public static void ApplyFacebookPayload(this ITurnContext turnContext, FacebookPayload facebookPayload)\n        {\n            var userId = facebookPayload.Sender.Id;\n            var pageId = facebookPayload.Recipient.Id;\n            var conversationId = string.Format(\"{0}-{1}\", userId, pageId);\n\n            turnContext.Activity.From = new ChannelAccount(userId);\n            turnContext.Activity.Recipient = new ChannelAccount(pageId);\n            turnContext.Activity.Conversation = new ConversationAccount(id: conversationId);\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Primary/Bots/PrimaryBot.cs",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n//\n// Generated with Bot Builder V4 SDK Template for Visual Studio EchoBot v4.3.0\n\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.Dialogs.Choices;\nusing Microsoft.Bot.Schema;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.Logging;\nusing Newtonsoft.Json.Linq;\nusing FacebookModel;\nusing System;\nusing Newtonsoft.Json;\nusing Microsoft.Bot.Connector;\n\nnamespace Primary.Bots\n{\n    /// <summary>\n    /// This is based on Eric Dahlvang's FacebookEventsBotExpanded: https://github.com/EricDahlvang/FacebookEventsBotExpanded\n    /// </summary>\n    public class PrimaryBot : ActivityHandler\n    {\n        /// <summary>\n        /// This option passes thread control from the primary receiver to the page inbox.\n        /// </summary>\n        private const string OPTION_PASS_PAGE_INBOX = \"Pass to page inbox\";\n        /// <summary>\n        /// This option passes thread control from the primary receiver to a secondary receiver.\n        /// </summary>\n        private const string OPTION_PASS_SECONDARY_BOT = \"Pass to secondary\";\n        /// <summary>\n        /// This option is ignored by this bot.\n        /// The secondary bot is meant to be listening for this phrase as a standby event\n        /// and respond to it by requesting thread control.\n        /// </summary>\n        private const string OPTION_REQUEST_THREAD_CONTROL = \"Receive request\";\n        /// <summary>\n        /// This option is ignored by this bot.\n        /// The secondary bot is meant to be listening for this phrase as a standby event\n        /// and respond to it by requesting thread control with \"polite\" metadata.\n        /// </summary>\n        private const string OPTION_REQUEST_THREAD_CONTROL_NICELY = \"Receive nice request\";\n        /// <summary>\n        /// This is not an option for this bot,\n        /// but this bot is meant to recognize the phrase in a standby event while the secondary bot has thread control\n        /// and respond to it by taking thread control from the secondary bot.\n        /// </summary>\n        private const string OPTION_TAKE_THREAD_CONTROL = \"Have control taken\";\n        /// <summary>\n        /// The constant ID representing the page inbox\n        /// </summary>\n        private const string PAGE_INBOX_ID = \"263902037430900\";\n\n        private static readonly List<Choice> _options = new[] {\n            OPTION_PASS_PAGE_INBOX,\n            OPTION_PASS_SECONDARY_BOT,\n            OPTION_REQUEST_THREAD_CONTROL,\n            OPTION_REQUEST_THREAD_CONTROL_NICELY,\n        }.Select(option => new Choice(option)).ToList();\n\n        private readonly ILogger _logger;\n        private readonly IConfiguration _configuration;\n\n        public PrimaryBot(ILogger<PrimaryBot> logger, IConfiguration configuration)\n        {\n            _logger = logger;\n            _configuration = configuration;\n        }\n\n        protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)\n        {\n            var text = turnContext.Activity.Text;\n\n            switch (text)\n            {\n                case OPTION_PASS_PAGE_INBOX:\n                    await turnContext.SendActivityAsync(\"Primary Bot: Passing thread control to the page inbox...\");\n                    await FacebookThreadControlHelper.PassThreadControlAsync(_configuration[\"FacebookPageToken\"], PAGE_INBOX_ID, turnContext.Activity.From.Id, text);\n                    break;\n\n                case OPTION_PASS_SECONDARY_BOT:\n\n                    var secondaryReceivers = await FacebookThreadControlHelper.GetSecondaryReceiversAsync(_configuration[\"FacebookPageToken\"]);\n\n                    foreach (var receiver in secondaryReceivers)\n                    {\n                        if (receiver != PAGE_INBOX_ID)\n                        {\n                            await turnContext.SendActivityAsync($\"Primary Bot: Passing thread control to {receiver}...\");\n                            await FacebookThreadControlHelper.PassThreadControlAsync(_configuration[\"FacebookPageToken\"], receiver, turnContext.Activity.From.Id, text);\n                            break;\n                        }\n                    }\n\n                    break;\n\n                case OPTION_REQUEST_THREAD_CONTROL:\n                case OPTION_REQUEST_THREAD_CONTROL_NICELY:\n                    // Do nothing because the secondary receiver should react to these instead\n                    break;\n\n                default:\n                    await ShowChoices(turnContext, cancellationToken);\n                    break;\n            }\n        }\n\n        protected override async Task OnConversationUpdateActivityAsync(ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)\n        {\n            _logger.LogInformation(\"PrimaryBot - Processing a ConversationUpdate Activity.\");\n\n            var facebookPayload = (turnContext.Activity.ChannelData as JObject)?.ToObject<FacebookPayload>();\n\n            if (facebookPayload != null)\n            {\n                if (facebookPayload.PassThreadControl != null)\n                {\n                    await turnContext.SendActivityAsync($\"Primary Bot: Thread control is now passed to {facebookPayload.PassThreadControl.NewOwnerAppId} with the message \\\"{facebookPayload.PassThreadControl.Metadata}\\\"\");\n                    await ShowChoices(turnContext, cancellationToken);\n                }\n            }\n\n            await base.OnConversationUpdateActivityAsync(turnContext, cancellationToken);\n        }\n        protected override async Task OnEventActivityAsync(ITurnContext<IEventActivity> turnContext, CancellationToken cancellationToken)\n        {\n            _logger.LogInformation(\"PrimaryBot - Processing an Event Activity.\");\n\n            // Analyze Facebook payload from EventActivity.Value\n            await ProcessFacebookMessage(turnContext, turnContext.Activity.Value, cancellationToken);\n        }\n\n        private async Task<bool> ProcessFacebookMessage(ITurnContext turnContext, object data, CancellationToken cancellationToken)\n        {\n            return await ProcessStandbyPayload(turnContext, data, cancellationToken)\n                || await ProcessFacebookPayload(turnContext, data, cancellationToken);\n        }\n\n        private async Task<bool> ProcessStandbyPayload(ITurnContext turnContext, object data, CancellationToken cancellationToken)\n        {\n            if (turnContext.Activity.Name?.Equals(\"standby\", StringComparison.InvariantCultureIgnoreCase) == true)\n            {\n                var standbys = (data as JObject)?.ToObject<FacebookStandbys>();\n                if (standbys != null)\n                {\n                    foreach (var standby in standbys.Standbys)\n                    {\n                        await OnFacebookStandby(turnContext, standby, cancellationToken);\n                    }\n\n                    return true;\n                }\n            }\n\n            return false;\n        }\n\n        protected virtual async Task OnFacebookStandby(ITurnContext turnContext, FacebookStandby facebookStandby, CancellationToken cancellationToken)\n        {\n            _logger.LogInformation(\"PrimaryBot - Standby message received.\");\n\n            var text = facebookStandby?.Message?.Text;\n\n            if (text?.Equals(OPTION_TAKE_THREAD_CONTROL, StringComparison.InvariantCultureIgnoreCase) == true)\n            {\n                await FacebookThreadControlHelper.TakeThreadControlAsync(_configuration[\"FacebookPageToken\"], facebookStandby.Sender.Id, text);\n            }\n        }\n\n        private async Task<bool> ProcessFacebookPayload(ITurnContext turnContext, object data, CancellationToken cancellationToken)\n        {\n            try\n            {\n                var facebookPayload = (data as JObject)?.ToObject<FacebookPayload>();\n                if (facebookPayload != null)\n                {\n                    // At this point we know we are on Facebook channel, and can consume the Facebook custom payload\n                    // present in channelData.\n\n                    turnContext.ApplyFacebookPayload(facebookPayload);\n\n                    // Thread Control Request\n                    if (facebookPayload.RequestThreadControl != null)\n                    {\n                        await OnFacebookThreadControlRequest(turnContext, facebookPayload, cancellationToken);\n                        return true;\n                    }\n                }\n            }\n            catch (JsonSerializationException)\n            {\n                if (turnContext.Activity.ChannelId != Channels.Facebook)\n                {\n                    await turnContext.SendActivityAsync(\"Primary Bot: This sample is intended to be used with a Facebook bot.\");\n                }\n            }\n\n            return false;\n        }\n\n        protected virtual async Task OnFacebookThreadControlRequest(ITurnContext turnContext, FacebookPayload facebookPayload, CancellationToken cancellationToken)\n        {\n            _logger.LogInformation(\"PrimaryBot - Thread Control Request message received.\");\n\n            string requestedOwnerAppId = facebookPayload.RequestThreadControl.RequestedOwnerAppId;\n\n            if (facebookPayload.RequestThreadControl.Metadata == \"please\")\n            {\n                await turnContext.SendActivityAsync($\"Primary Bot: {requestedOwnerAppId} requested thread control nicely. Passing thread control...\");\n\n                var success = await FacebookThreadControlHelper.PassThreadControlAsync(\n                    _configuration[\"FacebookPageToken\"],\n                    requestedOwnerAppId,\n                    facebookPayload.Sender.Id,\n                    \"allowing thread control\");\n\n                if (!success)\n                {\n                    // Account for situations when the primary receiver doesn't have thread control\n                    await turnContext.SendActivityAsync(\"Primary Bot: Thread control could not be passed.\");\n                }\n            }\n            else\n            {\n                await turnContext.SendActivityAsync($\"Primary Bot: {requestedOwnerAppId} requested thread control but did not ask nicely.\"\n                    + \" Thread control will not be passed.\"\n                    + \" Send any message to continue.\");\n            }\n        }\n\n        private static async Task ShowChoices(ITurnContext turnContext, CancellationToken cancellationToken)\n        {\n            // Create the message\n            var message = ChoiceFactory.ForChannel(turnContext.Activity.ChannelId, _options, \"Primary Bot: Please type a message or choose an option\");\n            await turnContext.SendActivityAsync(message, cancellationToken);\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Primary/Controllers/BotController.cs",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n//\n// Generated with Bot Builder V4 SDK Template for Visual Studio EchoBot v4.3.0\n\nusing System.Threading.Tasks;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.Integration.AspNet.Core;\n\nnamespace Primary.Controllers\n{\n\t// This ASP Controller is created to handle a request. Dependency Injection will provide the Adapter and IBot\n\t// implementation at runtime. Multiple different IBot implementations running at different endpoints can be\n\t// achieved by specifying a more specific type for the bot constructor argument.\n\t[Route(\"api/messages\")]\n\t[ApiController]\n\tpublic class BotController : ControllerBase\n\t{\n\t\tprivate readonly IBotFrameworkHttpAdapter Adapter;\n\t\tprivate readonly IBot Bot;\n\n\t\tpublic BotController(IBotFrameworkHttpAdapter adapter, IBot bot)\n\t\t{\n\t\t\tAdapter = adapter;\n\t\t\tBot = bot;\n\t\t}\n\n\t\t[HttpPost]\n\t\tpublic async Task PostAsync()\n\t\t{\n\t\t\t// Delegate the processing of the HTTP POST to the adapter.\n\t\t\t// The adapter will invoke the bot.\n\t\t\tawait Adapter.ProcessAsync(Request, Response, Bot);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Primary/DeploymentTemplates/template-with-new-rg.json",
    "content": "{\n    \"$schema\": \"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#\",\n    \"contentVersion\": \"1.0.0.0\",\n    \"parameters\": {\n        \"groupLocation\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"Specifies the location of the Resource Group.\"\n            }\n        },\n        \"groupName\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"Specifies the name of the Resource Group.\"\n            }\n        },\n        \"appId\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"Active Directory App ID, set as MicrosoftAppId in the Web App's Application Settings.\"\n            }\n        },\n        \"appSecret\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"Active Directory App Password, set as MicrosoftAppPassword in the Web App's Application Settings.\"\n            }\n        },\n        \"botId\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"The globally unique and immutable bot ID. Also used to configure the displayName of the bot, which is mutable.\"\n            }\n        },\n        \"botSku\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"The pricing tier of the Bot Service Registration. Acceptable values are F0 and S1.\"\n            }\n        },\n        \"newAppServicePlanName\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"The name of the App Service Plan.\"\n            }\n        },\n        \"newAppServicePlanSku\": {\n            \"type\": \"object\",\n            \"defaultValue\": {\n                \"name\": \"S1\",\n                \"tier\": \"Standard\",\n                \"size\": \"S1\",\n                \"family\": \"S\",\n                \"capacity\": 1\n            },\n            \"metadata\": {\n                \"description\": \"The SKU of the App Service Plan. Defaults to Standard values.\"\n            }\n        },\n        \"newAppServicePlanLocation\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"The location of the App Service Plan. Defaults to \\\"westus\\\".\"\n            }\n        },\n        \"newWebAppName\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"\",\n            \"metadata\": {\n                \"description\": \"The globally unique name of the Web App. Defaults to the value passed in for \\\"botId\\\".\"\n            }\n        }\n    },\n    \"variables\": {\n        \"appServicePlanName\": \"[parameters('newAppServicePlanName')]\",\n        \"resourcesLocation\": \"[parameters('newAppServicePlanLocation')]\",\n        \"webAppName\": \"[if(empty(parameters('newWebAppName')), parameters('botId'), parameters('newWebAppName'))]\",\n        \"siteHost\": \"[concat(variables('webAppName'), '.azurewebsites.net')]\",\n        \"botEndpoint\": \"[concat('https://', variables('siteHost'), '/api/messages')]\"\n    },\n    \"resources\": [\n        {\n            \"name\": \"[parameters('groupName')]\",\n            \"type\": \"Microsoft.Resources/resourceGroups\",\n            \"apiVersion\": \"2018-05-01\",\n            \"location\": \"[parameters('groupLocation')]\",\n            \"properties\": {\n            }\n        },\n        {\n            \"type\": \"Microsoft.Resources/deployments\",\n            \"apiVersion\": \"2018-05-01\",\n            \"name\": \"storageDeployment\",\n            \"resourceGroup\": \"[parameters('groupName')]\",\n            \"dependsOn\": [\n                \"[resourceId('Microsoft.Resources/resourceGroups/', parameters('groupName'))]\"\n            ],\n            \"properties\": {\n                \"mode\": \"Incremental\",\n                \"template\": {\n                    \"$schema\": \"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#\",\n                    \"contentVersion\": \"1.0.0.0\",\n                    \"parameters\": {},\n                    \"variables\": {},\n                    \"resources\": [\n                        {\n                            \"comments\": \"Create a new App Service Plan\",\n                            \"type\": \"Microsoft.Web/serverfarms\",\n                            \"name\": \"[variables('appServicePlanName')]\",\n                            \"apiVersion\": \"2018-02-01\",\n                            \"location\": \"[variables('resourcesLocation')]\",\n                            \"sku\": \"[parameters('newAppServicePlanSku')]\",\n                            \"properties\": {\n                                \"name\": \"[variables('appServicePlanName')]\"\n                            }\n                        },\n                        {\n                            \"comments\": \"Create a Web App using the new App Service Plan\",\n                            \"type\": \"Microsoft.Web/sites\",\n                            \"apiVersion\": \"2015-08-01\",\n                            \"location\": \"[variables('resourcesLocation')]\",\n                            \"kind\": \"app\",\n                            \"dependsOn\": [\n                                \"[resourceId('Microsoft.Web/serverfarms/', variables('appServicePlanName'))]\"\n                            ],\n                            \"name\": \"[variables('webAppName')]\",\n                            \"properties\": {\n                                \"name\": \"[variables('webAppName')]\",\n                                \"serverFarmId\": \"[variables('appServicePlanName')]\",\n                                \"siteConfig\": {\n                                    \"appSettings\": [\n                                        {\n                                            \"name\": \"WEBSITE_NODE_DEFAULT_VERSION\",\n                                            \"value\": \"10.14.1\"\n                                        },\n                                        {\n                                            \"name\": \"MicrosoftAppId\",\n                                            \"value\": \"[parameters('appId')]\"\n                                        },\n                                        {\n                                            \"name\": \"MicrosoftAppPassword\",\n                                            \"value\": \"[parameters('appSecret')]\"\n                                        }\n                                    ],\n                                    \"cors\": {\n                                        \"allowedOrigins\": [\n                                            \"https://botservice.hosting.portal.azure.net\",\n                                            \"https://hosting.onecloud.azure-test.net/\"\n                                        ]\n                                    }\n                                }\n                            }\n                        },\n                        {\n                            \"apiVersion\": \"2017-12-01\",\n                            \"type\": \"Microsoft.BotService/botServices\",\n                            \"name\": \"[parameters('botId')]\",\n                            \"location\": \"global\",\n                            \"kind\": \"bot\",\n                            \"sku\": {\n                                \"name\": \"[parameters('botSku')]\"\n                            },\n                            \"properties\": {\n                                \"name\": \"[parameters('botId')]\",\n                                \"displayName\": \"[parameters('botId')]\",\n                                \"endpoint\": \"[variables('botEndpoint')]\",\n                                \"msaAppId\": \"[parameters('appId')]\",\n                                \"developerAppInsightsApplicationId\": null,\n                                \"developerAppInsightKey\": null,\n                                \"publishingCredentials\": null,\n                                \"storageResourceId\": null\n                            },\n                            \"dependsOn\": [\n                                \"[resourceId('Microsoft.Web/sites/', variables('webAppName'))]\"\n                            ]\n                        }\n                    ],\n                    \"outputs\": {}\n                }\n            }\n        }\n    ]\n}"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Primary/DeploymentTemplates/template-with-preexisting-rg.json",
    "content": "{\n    \"$schema\": \"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#\",\n    \"contentVersion\": \"1.0.0.0\",\n    \"parameters\": {\n        \"appId\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"Active Directory App ID, set as MicrosoftAppId in the Web App's Application Settings.\"\n            }\n        },\n        \"appSecret\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"Active Directory App Password, set as MicrosoftAppPassword in the Web App's Application Settings. Defaults to \\\"\\\".\"\n            }\n        },\n        \"botId\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"The globally unique and immutable bot ID. Also used to configure the displayName of the bot, which is mutable.\"\n            }\n        },\n        \"botSku\": {\n            \"defaultValue\": \"F0\",\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"The pricing tier of the Bot Service Registration. Acceptable values are F0 and S1.\"\n            }\n        },\n        \"newAppServicePlanName\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"\",\n            \"metadata\": {\n                \"description\": \"The name of the new App Service Plan.\"\n            }\n        },\n        \"newAppServicePlanSku\": {\n            \"type\": \"object\",\n            \"defaultValue\": {\n                \"name\": \"S1\",\n                \"tier\": \"Standard\",\n                \"size\": \"S1\",\n                \"family\": \"S\",\n                \"capacity\": 1\n            },\n            \"metadata\": {\n                \"description\": \"The SKU of the App Service Plan. Defaults to Standard values.\"\n            }\n        },\n        \"appServicePlanLocation\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"The location of the App Service Plan.\"\n            }\n        },\n        \"existingAppServicePlan\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"\",\n            \"metadata\": {\n                \"description\": \"Name of the existing App Service Plan used to create the Web App for the bot.\"\n            }\n        },\n        \"newWebAppName\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"\",\n            \"metadata\": {\n                \"description\": \"The globally unique name of the Web App. Defaults to the value passed in for \\\"botId\\\".\"\n            }\n        }\n    },\n    \"variables\": {\n        \"defaultAppServicePlanName\": \"[if(empty(parameters('existingAppServicePlan')), 'createNewAppServicePlan', parameters('existingAppServicePlan'))]\",\n        \"useExistingAppServicePlan\": \"[not(equals(variables('defaultAppServicePlanName'), 'createNewAppServicePlan'))]\",\n        \"servicePlanName\": \"[if(variables('useExistingAppServicePlan'), parameters('existingAppServicePlan'), parameters('newAppServicePlanName'))]\",\n        \"resourcesLocation\": \"[parameters('appServicePlanLocation')]\",\n        \"webAppName\": \"[if(empty(parameters('newWebAppName')), parameters('botId'), parameters('newWebAppName'))]\",\n        \"siteHost\": \"[concat(variables('webAppName'), '.azurewebsites.net')]\",\n        \"botEndpoint\": \"[concat('https://', variables('siteHost'), '/api/messages')]\"\n    },\n    \"resources\": [\n        {\n            \"comments\": \"Create a new App Service Plan if no existing App Service Plan name was passed in.\",\n            \"type\": \"Microsoft.Web/serverfarms\",\n            \"condition\": \"[not(variables('useExistingAppServicePlan'))]\",\n            \"name\": \"[variables('servicePlanName')]\",\n            \"apiVersion\": \"2018-02-01\",\n            \"location\": \"[variables('resourcesLocation')]\",\n            \"sku\": \"[parameters('newAppServicePlanSku')]\",\n            \"properties\": {\n                \"name\": \"[variables('servicePlanName')]\"\n            }\n        },\n        {\n            \"comments\": \"Create a Web App using an App Service Plan\",\n            \"type\": \"Microsoft.Web/sites\",\n            \"apiVersion\": \"2015-08-01\",\n            \"location\": \"[variables('resourcesLocation')]\",\n            \"kind\": \"app\",\n            \"dependsOn\": [\n                \"[resourceId('Microsoft.Web/serverfarms/', variables('servicePlanName'))]\"\n            ],\n            \"name\": \"[variables('webAppName')]\",\n            \"properties\": {\n                \"name\": \"[variables('webAppName')]\",\n                \"serverFarmId\": \"[variables('servicePlanName')]\",\n                \"siteConfig\": {\n                    \"appSettings\": [\n                        {\n                            \"name\": \"WEBSITE_NODE_DEFAULT_VERSION\",\n                            \"value\": \"10.14.1\"\n                        },\n                        {\n                            \"name\": \"MicrosoftAppId\",\n                            \"value\": \"[parameters('appId')]\"\n                        },\n                        {\n                            \"name\": \"MicrosoftAppPassword\",\n                            \"value\": \"[parameters('appSecret')]\"\n                        }\n                    ],\n                    \"cors\": {\n                        \"allowedOrigins\": [\n                            \"https://botservice.hosting.portal.azure.net\",\n                            \"https://hosting.onecloud.azure-test.net/\"\n                        ]\n                    }\n                }\n            }\n        },\n        {\n            \"apiVersion\": \"2017-12-01\",\n            \"type\": \"Microsoft.BotService/botServices\",\n            \"name\": \"[parameters('botId')]\",\n            \"location\": \"global\",\n            \"kind\": \"bot\",\n            \"sku\": {\n                \"name\": \"[parameters('botSku')]\"\n            },\n            \"properties\": {\n                \"name\": \"[parameters('botId')]\",\n                \"displayName\": \"[parameters('botId')]\",\n                \"endpoint\": \"[variables('botEndpoint')]\",\n                \"msaAppId\": \"[parameters('appId')]\",\n                \"developerAppInsightsApplicationId\": null,\n                \"developerAppInsightKey\": null,\n                \"publishingCredentials\": null,\n                \"storageResourceId\": null\n            },\n            \"dependsOn\": [\n                \"[resourceId('Microsoft.Web/sites/', variables('webAppName'))]\"\n            ]\n        }\n    ]\n}"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Primary/Primary.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"..\\FacebookModel\\FacebookPassThreadControl.cs\" Link=\"FacebookModel\\FacebookPassThreadControl.cs\" />\n    <Compile Include=\"..\\FacebookModel\\FacebookPayload.cs\" Link=\"FacebookModel\\FacebookPayload.cs\" />\n    <Compile Include=\"..\\FacebookModel\\FacebookPsid.cs\" Link=\"FacebookModel\\FacebookPsid.cs\" />\n    <Compile Include=\"..\\FacebookModel\\FacebookRequestThreadControl.cs\" Link=\"FacebookModel\\FacebookRequestThreadControl.cs\" />\n    <Compile Include=\"..\\FacebookModel\\FacebookStandby.cs\" Link=\"FacebookModel\\FacebookStandby.cs\" />\n    <Compile Include=\"..\\FacebookModel\\FacebookTakeThreadControl.cs\" Link=\"FacebookModel\\FacebookTakeThreadControl.cs\" />\n    <Compile Include=\"..\\FacebookModel\\FacebookThreadControlHelper.cs\" Link=\"FacebookModel\\FacebookThreadControlHelper.cs\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.AspNetCore.App\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder.Dialogs\" Version=\"4.4.4\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder.Integration.AspNet.Core\" Version=\"4.4.3\" />\n  </ItemGroup>\n\n    <ItemGroup>\n    <Content Update=\"appsettings.json\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Primary/Program.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n//\n// Generated with Bot Builder V4 SDK Template for Visual Studio EchoBot v4.3.0\n\nusing Microsoft.AspNetCore;\nusing Microsoft.AspNetCore.Hosting;\n\nnamespace Primary\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            CreateWebHostBuilder(args).Build().Run();\n        }\n\n        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>\n            WebHost.CreateDefaultBuilder(args)\n                .UseStartup<Startup>();\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Primary/Properties/launchSettings.json",
    "content": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:3978/\",\n      \"sslPort\": 0\n    }\n  },\n  \"profiles\": {\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"Primary\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      },\n      \"applicationUrl\": \"http://localhost:3978/\"\n    }\n  }\n}"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Primary/Startup.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n//\n// Generated with Bot Builder V4 SDK Template for Visual Studio EchoBot v4.3.0\n\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.BotFramework;\nusing Microsoft.Bot.Builder.Integration.AspNet.Core;\nusing Microsoft.Bot.Connector.Authentication;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.DependencyInjection;\n\nusing Primary.Bots;\n\nnamespace Primary\n{\n    public class Startup\n    {\n        public Startup(IConfiguration configuration)\n        {\n            Configuration = configuration;\n        }\n\n        public IConfiguration Configuration { get; }\n\n        // This method gets called by the runtime. Use this method to add services to the container.\n        public void ConfigureServices(IServiceCollection services)\n        {\n            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);\n\n            // Create the credential provider to be used with the Bot Framework Adapter.\n            services.AddSingleton<ICredentialProvider, ConfigurationCredentialProvider>();\n\n            // Create the Bot Framework Adapter.\n            services.AddSingleton<IBotFrameworkHttpAdapter, BotFrameworkHttpAdapter>();\n\n            // Create the bot as a transient. In this case the ASP Controller is expecting an IBot.\n            services.AddTransient<IBot, PrimaryBot>();\n        }\n\n        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env)\n        {\n            if (env.IsDevelopment())\n            {\n                app.UseDeveloperExceptionPage();\n            }\n            else\n            {\n                app.UseHsts();\n            }\n\n            app.UseDefaultFiles();\n            app.UseStaticFiles();\n\n            //app.UseHttpsRedirection();\n            app.UseMvc();\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Primary/appsettings.Development.json",
    "content": "{\n    \"Logging\": {\n      \"LogLevel\": {\n        \"Default\": \"Debug\",\n        \"System\": \"Information\",\n        \"Microsoft\": \"Information\"\n      }\n    }\n  }\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Primary/appsettings.json",
    "content": "{\n\t\"MicrosoftAppId\": \"\",\n\t\"MicrosoftAppPassword\": \"\",\n\t\"FacebookPageToken\": \"\"\n}\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Primary/wwwroot/default.htm",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>Primary</title>\n    <style>\n        body {\n            margin: 0px;\n            padding: 0px;\n            font-family: Segoe UI;\n        }\n\n        html,\n        body {\n            height: 100%;\n        }\n\n        header {\n            background-image: url(\"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 4638.9 651.6' style='enable-background:new 0 0 4638.9 651.6;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%2355A0E0;%7D .st1%7Bfill:none;%7D .st2%7Bfill:%230058A8;%7D .st3%7Bfill:%23328BD8;%7D .st4%7Bfill:%23B6DCF1;%7D .st5%7Bopacity:0.2;fill:url(%23SVGID_1_);enable-background:new ;%7D%0A%3C/style%3E%3Crect y='1.1' class='st0' width='4640' height='646.3'/%3E%3Cpath class='st1' d='M3987.8,323.6L4310.3,1.1h-65.6l-460.1,460.1c-17.5,17.5-46.1,17.5-63.6,0L3260.9,1.1H0v646.3h3660.3 L3889,418.7c17.5-17.5,46.1-17.5,63.6,0l228.7,228.7h66.6l-260.2-260.2C3970.3,369.8,3970.3,341.1,3987.8,323.6z'/%3E%3Cpath class='st2' d='M3784.6,461.2L4244.7,1.1h-983.9l460.1,460.1C3738.4,478.7,3767.1,478.7,3784.6,461.2z'/%3E%3Cpath class='st3' d='M4640,1.1h-329.8l-322.5,322.5c-17.5,17.5-17.5,46.1,0,63.6l260.2,260.2H4640L4640,1.1L4640,1.1z'/%3E%3Cpath class='st4' d='M3889,418.8l-228.7,228.7h521.1l-228.7-228.7C3935.2,401.3,3906.5,401.3,3889,418.8z'/%3E%3ClinearGradient id='SVGID_1_' gradientUnits='userSpaceOnUse' x1='3713.7576' y1='438.1175' x2='3911.4084' y2='14.2535' gradientTransform='matrix(1 0 0 -1 0 641.3969)'%3E%3Cstop offset='0' style='stop-color:%23FFFFFF;stop-opacity:0.5'/%3E%3Cstop offset='1' style='stop-color:%23FFFFFF'/%3E%3C/linearGradient%3E%3Cpath class='st5' d='M3952.7,124.5c-17.5-17.5-46.1-17.5-63.6,0l-523,523h1109.6L3952.7,124.5z'/%3E%3C/svg%3E%0A\");\n            background-repeat: no-repeat;\n            background-size: 100%;\n            background-position: right;\n            background-color: #55A0E0;\n            width: 100%;\n            font-size: 44px;\n            height: 120px;\n            color: white;\n            padding: 30px 0 40px 0px;\n            display: inline-block;\n        }\n\n        .header-icon {\n            background-image: url(\"data:image/svg+xml;utf8,%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20150.2%20125%22%20style%3D%22enable-background%3Anew%200%200%20150.2%20125%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23FFFFFF%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.5%22%20class%3D%22st0%22%20width%3D%22149.7%22%20height%3D%22125%22/%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M59%2C102.9L21.8%2C66c-3.5-3.5-3.5-9.1%2C0-12.5l37-36.5l2.9%2C3l-37%2C36.4c-1.8%2C1.8-1.8%2C4.7%2C0%2C6.6l37.2%2C37L59%2C102.9z%22%0A%09%09/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M92.5%2C102.9l-3-3l37.2-37c0.9-0.9%2C1.4-2%2C1.4-3.3c0-1.2-0.5-2.4-1.4-3.3L89.5%2C20l2.9-3l37.2%2C36.4%0A%09%09c1.7%2C1.7%2C2.6%2C3.9%2C2.6%2C6.3s-0.9%2C4.6-2.6%2C6.3L92.5%2C102.9z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M90.1%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C98.1%2C64.7%2C94.4%2C68.4%2C90.1%2C68.4z%0A%09%09%20M90.1%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S91.9%2C56.5%2C90.1%2C56.5z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M61.4%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C69.5%2C64.7%2C65.8%2C68.4%2C61.4%2C68.4z%0A%09%09%20M61.4%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S63.3%2C56.5%2C61.4%2C56.5z%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A\");\n            background-repeat: no-repeat;\n            float: left;\n            height: 140px;\n            width: 140px;\n            display: inline-block;\n            vertical-align: middle;\n        }\n\n        .header-text {\n            padding-left: 1%;\n            color: #FFFFFF;\n            font-family: \"Segoe UI\";\n            font-size: 72px;\n            font-weight: 300;\n            letter-spacing: 0.35px;\n            line-height: 96px;\n            display: inline-block;\n            vertical-align: middle;\n        }\n\n        .header-inner-container {\n            min-width: 480px;\n            max-width: 1366px;\n            margin-left: auto;\n            margin-right: auto;\n            vertical-align: middle;\n        }\n\n        .header-inner-container::after {\n            content: \"\";\n            clear: both;\n            display: table;\n        }\n\n        .main-content-area {\n            padding-left: 30px;\n        }\n\n        .content-title {\n            color: #000000;\n            font-family: \"Segoe UI\";\n            font-size: 46px;\n            font-weight: 300;\n            line-height: 62px;\n        }\n\n        .main-text {\n            color: #808080;\n            font-size: 24px;\n            font-family: \"Segoe UI\";\n            font-size: 24px;\n            font-weight: 200;\n            line-height: 32px;\n        }\n\n        .main-text-p1 {\n            padding-top: 48px;\n            padding-bottom: 28px;\n        }\n\n        .endpoint {\n            height: 32px;\n            width: 571px;\n            color: #808080;\n            font-family: \"Segoe UI\";\n            font-size: 24px;\n            font-weight: 200;\n            line-height: 32px;\n            padding-top: 28px;\n        }\n\n        .how-to-build-section {\n            padding-top: 20px;\n            padding-left: 30px;\n        }\n\n        .how-to-build-section>h3 {\n            font-size: 16px;\n            font-weight: 600;\n            letter-spacing: 0.35px;\n            line-height: 22px;\n            margin: 0 0 24px 0;\n            text-transform: uppercase;\n        }\n\n        .step-container {\n            display: flex;\n            align-items: stretch;\n            position: relative;\n        }\n\n        .step-container dl {\n            border-left: 1px solid #A0A0A0;\n            display: block;\n            padding: 0 24px;\n            margin: 0;\n        }\n\n        .step-container dl>dt::before {\n            background-color: white;\n            border: 1px solid #A0A0A0;\n            border-radius: 100%;\n            content: '';\n            left: 47px;\n            height: 11px;\n            position: absolute;\n            width: 11px;\n        }\n\n        .step-container dl>.test-bullet::before {\n            background-color: blue;\n        }\n\n        .step-container dl>dt {\n            display: block;\n            font-size: inherit;\n            font-weight: bold;\n            line-height: 20px;\n        }\n\n        .step-container dl>dd {\n            font-size: inherit;\n            line-height: 20px;\n            margin-left: 0;\n            padding-bottom: 32px;\n        }\n\n        .step-container:last-child dl {\n            border-left: 1px solid transparent;\n        }\n\n        .ctaLink {\n            background-color: transparent;\n            border: 1px solid transparent;\n            color: #006AB1;\n            cursor: pointer;\n            font-weight: 600;\n            padding: 0;\n            white-space: normal;\n        }\n\n        .ctaLink:focus {\n            outline: 1px solid #00bcf2;\n        }\n\n        .ctaLink:hover {\n            text-decoration: underline;\n        }\n\n        .step-icon {\n            display: flex;\n            height: 38px;\n            margin-right: 15px;\n            width: 38px;\n        }\n\n        .step-icon>div {\n            height: 30px;\n            width: 30px;\n            background-repeat: no-repeat;\n        }\n\n        .ms-logo-container {\n            min-width: 580px;\n            max-width: 980px;\n            margin-left: auto;\n            margin-right: auto;\n            left: 0;\n            right: 0;\n            transition: bottom 400ms;\n        }\n\n        .ms-logo {\n            float: right;\n            background-image: url(\"data:image/svg+xml;utf8,%0A%3Csvg%20version%3D%221.1%22%20id%3D%22MS-symbol%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20400%20120%22%20style%3D%22enable-background%3Anew%200%200%20400%20120%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23737474%3B%7D%0A%09.st2%7Bfill%3A%23D63F26%3B%7D%0A%09.st3%7Bfill%3A%23167D3E%3B%7D%0A%09.st4%7Bfill%3A%232E76BC%3B%7D%0A%09.st5%7Bfill%3A%23FDB813%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.6%22%20class%3D%22st0%22%20width%3D%22398.7%22%20height%3D%22119%22/%3E%0A%3Cpath%20class%3D%22st1%22%20d%3D%22M171.3%2C38.4v43.2h-7.5V47.7h-0.1l-13.4%2C33.9h-5l-13.7-33.9h-0.1v33.9h-6.9V38.4h10.8l12.4%2C32h0.2l13.1-32H171.3%0A%09z%20M177.6%2C41.7c0-1.2%2C0.4-2.2%2C1.3-3c0.9-0.8%2C1.9-1.2%2C3.1-1.2c1.3%2C0%2C2.4%2C0.4%2C3.2%2C1.3c0.8%2C0.8%2C1.3%2C1.8%2C1.3%2C3c0%2C1.2-0.4%2C2.2-1.3%2C3%0A%09c-0.9%2C0.8-1.9%2C1.2-3.2%2C1.2s-2.3-0.4-3.1-1.2C178%2C43.8%2C177.6%2C42.8%2C177.6%2C41.7z%20M185.7%2C50.6v31h-7.3v-31H185.7z%20M207.8%2C76.3%0A%09c1.1%2C0%2C2.3-0.3%2C3.6-0.8c1.3-0.5%2C2.5-1.2%2C3.6-2v6.8c-1.2%2C0.7-2.5%2C1.2-4%2C1.5c-1.5%2C0.3-3.1%2C0.5-4.9%2C0.5c-4.6%2C0-8.3-1.4-11.1-4.3%0A%09c-2.9-2.9-4.3-6.6-4.3-11c0-5%2C1.5-9.1%2C4.4-12.3c2.9-3.2%2C7-4.8%2C12.4-4.8c1.4%2C0%2C2.7%2C0.2%2C4.1%2C0.5c1.4%2C0.4%2C2.5%2C0.8%2C3.3%2C1.2v7%0A%09c-1.1-0.8-2.3-1.5-3.4-1.9c-1.2-0.5-2.4-0.7-3.6-0.7c-2.9%2C0-5.2%2C0.9-7%2C2.8c-1.8%2C1.9-2.7%2C4.4-2.7%2C7.6c0%2C3.1%2C0.8%2C5.6%2C2.5%2C7.3%0A%09C202.6%2C75.4%2C204.9%2C76.3%2C207.8%2C76.3z%20M235.7%2C50.1c0.6%2C0%2C1.1%2C0%2C1.6%2C0.1s0.9%2C0.2%2C1.2%2C0.3v7.4c-0.4-0.3-0.9-0.5-1.7-0.8%0A%09c-0.7-0.3-1.6-0.4-2.7-0.4c-1.8%2C0-3.3%2C0.8-4.5%2C2.3c-1.2%2C1.5-1.9%2C3.8-1.9%2C7v15.6h-7.3v-31h7.3v4.9h0.1c0.7-1.7%2C1.7-3%2C3-4%0A%09C232.2%2C50.6%2C233.8%2C50.1%2C235.7%2C50.1z%20M238.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3%0A%09c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5c-4.8%2C0-8.6-1.4-11.4-4.2C240.3%2C75.3%2C238.9%2C71.4%2C238.9%2C66.6z%0A%09%20M246.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5%0A%09c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7C247.2%2C60.5%2C246.5%2C63%2C246.5%2C66.3z%20M281.5%2C58.8c0%2C1%2C0.3%2C1.9%2C1%2C2.5%0A%09c0.7%2C0.6%2C2.1%2C1.3%2C4.4%2C2.2c2.9%2C1.2%2C5%2C2.5%2C6.1%2C3.9c1.2%2C1.5%2C1.8%2C3.2%2C1.8%2C5.3c0%2C2.9-1.1%2C5.3-3.4%2C7c-2.2%2C1.8-5.3%2C2.7-9.1%2C2.7%0A%09c-1.3%2C0-2.7-0.2-4.3-0.5c-1.6-0.3-2.9-0.7-4-1.2v-7.2c1.3%2C0.9%2C2.8%2C1.7%2C4.3%2C2.2c1.5%2C0.5%2C2.9%2C0.8%2C4.2%2C0.8c1.6%2C0%2C2.9-0.2%2C3.6-0.7%0A%09c0.8-0.5%2C1.2-1.2%2C1.2-2.3c0-1-0.4-1.9-1.2-2.5c-0.8-0.7-2.4-1.5-4.6-2.4c-2.7-1.1-4.6-2.4-5.7-3.8c-1.1-1.4-1.7-3.2-1.7-5.4%0A%09c0-2.8%2C1.1-5.1%2C3.3-6.9c2.2-1.8%2C5.1-2.7%2C8.6-2.7c1.1%2C0%2C2.3%2C0.1%2C3.6%2C0.4c1.3%2C0.2%2C2.5%2C0.6%2C3.4%2C0.9v6.9c-1-0.6-2.1-1.2-3.4-1.7%0A%09c-1.3-0.5-2.6-0.7-3.8-0.7c-1.4%2C0-2.5%2C0.3-3.2%2C0.8C281.9%2C57.1%2C281.5%2C57.8%2C281.5%2C58.8z%20M297.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2%0A%09c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5%0A%09c-4.8%2C0-8.6-1.4-11.4-4.2C299.4%2C75.3%2C297.9%2C71.4%2C297.9%2C66.6z%20M305.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6%0A%09c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7%0A%09C306.3%2C60.5%2C305.5%2C63%2C305.5%2C66.3z%20M353.9%2C56.6h-10.9v25h-7.4v-25h-5.2v-6h5.2v-4.3c0-3.3%2C1.1-5.9%2C3.2-8c2.1-2.1%2C4.8-3.1%2C8.1-3.1%0A%09c0.9%2C0%2C1.7%2C0%2C2.4%2C0.1c0.7%2C0.1%2C1.3%2C0.2%2C1.8%2C0.4V42c-0.2-0.1-0.7-0.3-1.3-0.5c-0.6-0.2-1.3-0.3-2.1-0.3c-1.5%2C0-2.7%2C0.5-3.5%2C1.4%0A%09s-1.2%2C2.4-1.2%2C4.2v3.7h10.9v-7l7.3-2.2v9.2h7.4v6h-7.4v14.5c0%2C1.9%2C0.3%2C3.3%2C1%2C4c0.7%2C0.8%2C1.8%2C1.2%2C3.3%2C1.2c0.4%2C0%2C0.9-0.1%2C1.5-0.3%0A%09c0.6-0.2%2C1.1-0.4%2C1.6-0.7v6c-0.5%2C0.3-1.2%2C0.5-2.3%2C0.7c-1.1%2C0.2-2.1%2C0.3-3.2%2C0.3c-3.1%2C0-5.4-0.8-6.9-2.5c-1.5-1.6-2.3-4.1-2.3-7.4%0A%09V56.6z%22/%3E%0A%3Cg%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2224%22%20class%3D%22st2%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2224%22%20class%3D%22st3%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2261.8%22%20class%3D%22st4%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2261.8%22%20class%3D%22st5%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A\");\n        }\n\n        .ms-logo-container>div {\n            min-height: 60px;\n            width: 150px;\n            background-repeat: no-repeat;\n        }\n\n        .row {\n            padding: 90px 0px 0 20px;\n            min-width: 480px;\n            max-width: 1366px;\n            margin-left: auto;\n            margin-right: auto;\n        }\n\n        .column {\n            float: left;\n            width: 45%;\n            padding-right: 20px;\n        }\n\n        .row:after {\n            content: \"\";\n            display: table;\n            clear: both;\n        }\n\n        a {\n            text-decoration: none;\n        }\n\n        .download-the-emulator {\n            height: 20px;\n            color: #0063B1;\n            font-size: 15px;\n            line-height: 20px;\n            padding-bottom: 70px;\n        }\n\n        .how-to-iframe {\n            max-width: 700px !important;\n            min-width: 650px !important;\n            height: 700px !important;\n        }\n\n        .remove-frame-height {\n            height: 10px;\n        }\n\n        @media only screen and (max-width: 1300px) {\n            .ms-logo {\n                padding-top: 30px;\n            }\n\n            .header-text {\n                font-size: 40x;\n            }\n\n            .column {\n                float: none;\n                padding-top: 30px;\n                width: 100%;\n            }\n\n            .ms-logo-container {\n                padding-top: 30px;\n                min-width: 480px;\n                max-width: 650px;\n                margin-left: auto;\n                margin-right: auto;\n            }\n\n            .row {\n                padding: 20px 0px 0 20px;\n                min-width: 480px;\n                max-width: 650px;\n                margin-left: auto;\n                margin-right: auto;\n            }\n        }\n\n        @media only screen and (max-width: 1370px) {\n            header {\n                background-color: #55A0E0;\n                background-size: auto 200px;\n            }\n        }\n\n        @media only screen and (max-width: 1230px) {\n            header {\n                background-color: #55A0E0;\n                background-size: auto 200px;\n            }\n\n            .header-text {\n                font-size: 44px;\n            }\n\n            .header-icon {\n                height: 120px;\n                width: 120px;\n            }\n        }\n\n        @media only screen and (max-width: 1000px) {\n            header {\n                background-color: #55A0E0;\n                background-image: none;\n            }\n        }\n\n        @media only screen and (max-width: 632px) {\n            .header-text {\n                font-size: 32px;\n            }\n\n            .row {\n                padding: 10px 0px 0 10px;\n                max-width: 490px !important;\n                min-width: 410px !important;\n            }\n\n            .endpoint {\n                font-size: 25px;\n            }\n\n            .main-text {\n                font-size: 20px;\n            }\n\n            .step-container dl>dd {\n                font-size: 14px;\n            }\n\n            .column {\n                padding-right: 5px;\n            }\n\n            .header-icon {\n                height: 110px;\n                width: 110px;\n            }\n\n            .how-to-iframe {\n                max-width: 480px !important;\n                min-width: 400px !important;\n                height: 650px !important;\n                overflow: hidden;\n            }\n        }\n\n        .remove-frame-height {\n            max-height: 10px;\n        }\n    </style>\n    <script>\n        document.addEventListener('DOMContentLoaded', function () {\n            loadFrame();\n        });\n        var loadFrame = function () {\n            var iframe = document.createElement('iframe');\n            iframe.setAttribute(\"id\", \"iframe\");\n            var offLineHTMLContent = \"\";\n            var frameElement = document.getElementById(\"how-to-iframe\");\n            if (window.navigator.onLine) {\n                iframe.src = 'https://docs.botframework.com/static/abs/pages/f5.htm';\n                iframe.setAttribute(\"scrolling\", \"no\");\n                iframe.setAttribute(\"frameborder\", \"0\");\n                iframe.setAttribute(\"width\", \"100%\");\n                iframe.setAttribute(\"height\", \"100%\");\n                var frameDiv = document.getElementById(\"how-to-iframe\");\n                frameDiv.appendChild(iframe);\n            } else {\n                frameElement.classList.add(\"remove-frame-height\");\n            }\n        };\n    </script>\n</head>\n\n<body>\n    <header class=\"header\">\n        <div class=\"header-inner-container\">\n            <div class=\"header-icon\" style=\"display: inline-block\"></div>\n            <div class=\"header-text\" style=\"display: inline-block\">Primary Bot</div>\n        </div>\n    </header>\n    <div class=\"row\">\n        <div class=\"column\" class=\"main-content-area\">\n            <div class=\"content-title\">Your bot is ready!</div>\n            <div class=\"main-text main-text-p1\">You can test your bot in the Bot Framework Emulator<br />\n                by connecting to http://localhost:3978/api/messages.</div>\n            <div class=\"main-text download-the-emulator\"><a class=\"ctaLink\"\n                    href=\"https://aka.ms/bot-framework-F5-download-emulator\" target=\"_blank\">Download the Emulator</a>\n            </div>\n            <div class=\"main-text\">Visit <a class=\"ctaLink\" href=\"https://aka.ms/bot-framework-F5-abs-home\"\n                    target=\"_blank\">Azure\n                    Bot Service</a> to register your bot and add it to<br />\n                various channels. The bot's endpoint URL typically looks\n                like this:</div>\n            <div class=\"endpoint\">https://<i>your_bots_hostname</i>/api/messages</div>\n        </div>\n        <div class=\"column how-to-iframe\" id=\"how-to-iframe\"></div>\n    </div>\n    <div class=\"ms-logo-container\">\n        <div class=\"ms-logo\"></div>\n    </div>\n</body>\n\n</html>"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/README.md",
    "content": "# Facebook Handovers\n\nThis is the sample code for the handover protocol blog post. These two bots are meant to be running simultaneously, while each is connected to its own Facebook app."
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Secondary/Bots/SecondaryBot.cs",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n//\n// Generated with Bot Builder V4 SDK Template for Visual Studio EchoBot v4.3.0\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing FacebookModel;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.Dialogs.Choices;\nusing Microsoft.Bot.Schema;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.Logging;\nusing Newtonsoft.Json.Linq;\n\nnamespace Secondary.Bots\n{\n    public class SecondaryBot : ActivityHandler\n    {\n        /// <summary>\n        /// This option passes thread control from the secondary receiver to a primary receiver.\n        /// </summary>\n        private const string OPTION_PASS_PRIMARY_BOT = \"Pass to primary\";\n        /// <summary>\n        /// This option is ignored by this bot.\n        /// The primary bot is meant to be listening for this phrase as a standby event\n        /// and respond to it by taking thread control.\n        /// </summary>\n        private const string OPTION_TAKE_THREAD_CONTROL = \"Have control taken\";\n        /// <summary>\n        /// This is not an option for this bot,\n        /// but this bot is meant to recognize the phrase in a standby event while the primary bot has thread control\n        /// and respond to it by requesting thread control from the primary bot.\n        /// </summary>\n        private const string OPTION_REQUEST_THREAD_CONTROL = \"Receive request\";\n        /// <summary>\n        /// This is not an option for this bot,\n        /// but this bot is meant to recognize the phrase in a standby event while the primary bot has thread control\n        /// and respond to it by requesting thread control from the primary bot with \"polite\" metadata.\n        /// </summary>\n        private const string OPTION_REQUEST_THREAD_CONTROL_NICELY = \"Receive nice request\";\n\n        private static readonly List<Choice> _options = new[] {\n            OPTION_PASS_PRIMARY_BOT,\n            OPTION_TAKE_THREAD_CONTROL,\n        }.Select(option => new Choice(option)).ToList();\n\n        private readonly ILogger _logger;\n        private readonly IConfiguration _configuration;\n\n        public SecondaryBot(ILogger<SecondaryBot> logger, IConfiguration configuration)\n        {\n            _logger = logger;\n            _configuration = configuration;\n        }\n\n        protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)\n        {\n            var text = turnContext.Activity.Text;\n\n            switch (text)\n            {\n                case OPTION_PASS_PRIMARY_BOT:\n                    await turnContext.SendActivityAsync(\"Secondary Bot: Passing thread control to the primary receiver...\");\n                    // A null target app ID will automatically pass control to the primary receiver\n                    await FacebookThreadControlHelper.PassThreadControlAsync(_configuration[\"FacebookPageToken\"], null, turnContext.Activity.From.Id, text);\n                    break;\n\n                case OPTION_TAKE_THREAD_CONTROL:\n                    // Do nothing because the primary receiver should react to this instead\n                    break;\n\n                default:\n                    await ShowChoices(turnContext, cancellationToken);\n                    break;\n            }\n        }\n\n        protected override async Task OnConversationUpdateActivityAsync(ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)\n        {\n            _logger.LogInformation(\"SecondaryBot - Processing a ConversationUpdate Activity.\");\n\n            var facebookPayload = (turnContext.Activity.ChannelData as JObject)?.ToObject<FacebookPayload>();\n\n            if (facebookPayload != null)\n            {\n                if (facebookPayload.PassThreadControl != null)\n                {\n                    await turnContext.SendActivityAsync($\"Secondary Bot: Thread control is now passed to {facebookPayload.PassThreadControl.NewOwnerAppId} with the message \\\"{facebookPayload.PassThreadControl.Metadata}\\\"\");\n                    await ShowChoices(turnContext, cancellationToken);\n                }\n                else if (facebookPayload.TakeThreadControl != null)\n                {\n                    await turnContext.SendActivityAsync($\"Secondary Bot: Thread control was taken by the primary receiver with the message \\\"{facebookPayload.TakeThreadControl.Metadata}\\\".\"\n                        + $\" The previous thread owner was {facebookPayload.TakeThreadControl.PreviousOwnerAppId}.\"\n                        + $\" Send any message to continue.\");\n                }\n            }\n\n            await base.OnConversationUpdateActivityAsync(turnContext, cancellationToken);\n        }\n        protected override async Task OnEventActivityAsync(ITurnContext<IEventActivity> turnContext, CancellationToken cancellationToken)\n        {\n            _logger.LogInformation(\"SecondaryBot - Processing an Event Activity.\");\n\n            // Analyze Facebook payload from EventActivity.Value\n            await ProcessStandbyPayload(turnContext, turnContext.Activity.Value, cancellationToken);\n        }\n\n        private async Task ProcessStandbyPayload(ITurnContext turnContext, object data, CancellationToken cancellationToken)\n        {\n            if (turnContext.Activity.Name?.Equals(\"standby\", StringComparison.InvariantCultureIgnoreCase) == true)\n            {\n                var standbys = (data as JObject)?.ToObject<FacebookStandbys>();\n                if (standbys != null)\n                {\n                    foreach (var standby in standbys.Standbys)\n                    {\n                        await OnFacebookStandby(turnContext, standby, cancellationToken);\n                    }\n                }\n            }\n        }\n\n        protected virtual async Task OnFacebookStandby(ITurnContext turnContext, FacebookStandby facebookStandby, CancellationToken cancellationToken)\n        {\n            _logger.LogInformation(\"SecondaryBot - Standby message received.\");\n\n            var text = facebookStandby?.Message?.Text;\n\n            if (text?.Equals(OPTION_REQUEST_THREAD_CONTROL, StringComparison.InvariantCultureIgnoreCase) == true)\n            {\n                await FacebookThreadControlHelper.RequestThreadControlAsync(_configuration[\"FacebookPageToken\"], facebookStandby.Sender.Id, \"give me control\");\n            }\n            else if (text?.Equals(OPTION_REQUEST_THREAD_CONTROL_NICELY, StringComparison.InvariantCultureIgnoreCase) == true)\n            {\n                await FacebookThreadControlHelper.RequestThreadControlAsync(_configuration[\"FacebookPageToken\"], facebookStandby.Sender.Id, \"please\");\n            }\n        }\n\n        private static async Task ShowChoices(ITurnContext turnContext, CancellationToken cancellationToken)\n        {\n            // Create the message\n            var message = ChoiceFactory.ForChannel(turnContext.Activity.ChannelId, _options, \"Secondary Bot: Please type a message or choose an option\");\n            await turnContext.SendActivityAsync(message, cancellationToken);\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Secondary/Controllers/BotController.cs",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n//\n// Generated with Bot Builder V4 SDK Template for Visual Studio EchoBot v4.3.0\n\nusing System.Threading.Tasks;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.Integration.AspNet.Core;\n\nnamespace Secondary.Controllers\n{\n\t// This ASP Controller is created to handle a request. Dependency Injection will provide the Adapter and IBot\n\t// implementation at runtime. Multiple different IBot implementations running at different endpoints can be\n\t// achieved by specifying a more specific type for the bot constructor argument.\n\t[Route(\"api/messages\")]\n\t[ApiController]\n\tpublic class BotController : ControllerBase\n\t{\n\t\tprivate readonly IBotFrameworkHttpAdapter Adapter;\n\t\tprivate readonly IBot Bot;\n\n\t\tpublic BotController(IBotFrameworkHttpAdapter adapter, IBot bot)\n\t\t{\n\t\t\tAdapter = adapter;\n\t\t\tBot = bot;\n\t\t}\n\n\t\t[HttpPost]\n\t\tpublic async Task PostAsync()\n\t\t{\n\t\t\t// Delegate the processing of the HTTP POST to the adapter.\n\t\t\t// The adapter will invoke the bot.\n\t\t\tawait Adapter.ProcessAsync(Request, Response, Bot);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Secondary/DeploymentTemplates/template-with-new-rg.json",
    "content": "{\n    \"$schema\": \"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#\",\n    \"contentVersion\": \"1.0.0.0\",\n    \"parameters\": {\n        \"groupLocation\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"Specifies the location of the Resource Group.\"\n            }\n        },\n        \"groupName\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"Specifies the name of the Resource Group.\"\n            }\n        },\n        \"appId\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"Active Directory App ID, set as MicrosoftAppId in the Web App's Application Settings.\"\n            }\n        },\n        \"appSecret\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"Active Directory App Password, set as MicrosoftAppPassword in the Web App's Application Settings.\"\n            }\n        },\n        \"botId\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"The globally unique and immutable bot ID. Also used to configure the displayName of the bot, which is mutable.\"\n            }\n        },\n        \"botSku\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"The pricing tier of the Bot Service Registration. Acceptable values are F0 and S1.\"\n            }\n        },\n        \"newAppServicePlanName\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"The name of the App Service Plan.\"\n            }\n        },\n        \"newAppServicePlanSku\": {\n            \"type\": \"object\",\n            \"defaultValue\": {\n                \"name\": \"S1\",\n                \"tier\": \"Standard\",\n                \"size\": \"S1\",\n                \"family\": \"S\",\n                \"capacity\": 1\n            },\n            \"metadata\": {\n                \"description\": \"The SKU of the App Service Plan. Defaults to Standard values.\"\n            }\n        },\n        \"newAppServicePlanLocation\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"The location of the App Service Plan. Defaults to \\\"westus\\\".\"\n            }\n        },\n        \"newWebAppName\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"\",\n            \"metadata\": {\n                \"description\": \"The globally unique name of the Web App. Defaults to the value passed in for \\\"botId\\\".\"\n            }\n        }\n    },\n    \"variables\": {\n        \"appServicePlanName\": \"[parameters('newAppServicePlanName')]\",\n        \"resourcesLocation\": \"[parameters('newAppServicePlanLocation')]\",\n        \"webAppName\": \"[if(empty(parameters('newWebAppName')), parameters('botId'), parameters('newWebAppName'))]\",\n        \"siteHost\": \"[concat(variables('webAppName'), '.azurewebsites.net')]\",\n        \"botEndpoint\": \"[concat('https://', variables('siteHost'), '/api/messages')]\"\n    },\n    \"resources\": [\n        {\n            \"name\": \"[parameters('groupName')]\",\n            \"type\": \"Microsoft.Resources/resourceGroups\",\n            \"apiVersion\": \"2018-05-01\",\n            \"location\": \"[parameters('groupLocation')]\",\n            \"properties\": {\n            }\n        },\n        {\n            \"type\": \"Microsoft.Resources/deployments\",\n            \"apiVersion\": \"2018-05-01\",\n            \"name\": \"storageDeployment\",\n            \"resourceGroup\": \"[parameters('groupName')]\",\n            \"dependsOn\": [\n                \"[resourceId('Microsoft.Resources/resourceGroups/', parameters('groupName'))]\"\n            ],\n            \"properties\": {\n                \"mode\": \"Incremental\",\n                \"template\": {\n                    \"$schema\": \"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#\",\n                    \"contentVersion\": \"1.0.0.0\",\n                    \"parameters\": {},\n                    \"variables\": {},\n                    \"resources\": [\n                        {\n                            \"comments\": \"Create a new App Service Plan\",\n                            \"type\": \"Microsoft.Web/serverfarms\",\n                            \"name\": \"[variables('appServicePlanName')]\",\n                            \"apiVersion\": \"2018-02-01\",\n                            \"location\": \"[variables('resourcesLocation')]\",\n                            \"sku\": \"[parameters('newAppServicePlanSku')]\",\n                            \"properties\": {\n                                \"name\": \"[variables('appServicePlanName')]\"\n                            }\n                        },\n                        {\n                            \"comments\": \"Create a Web App using the new App Service Plan\",\n                            \"type\": \"Microsoft.Web/sites\",\n                            \"apiVersion\": \"2015-08-01\",\n                            \"location\": \"[variables('resourcesLocation')]\",\n                            \"kind\": \"app\",\n                            \"dependsOn\": [\n                                \"[resourceId('Microsoft.Web/serverfarms/', variables('appServicePlanName'))]\"\n                            ],\n                            \"name\": \"[variables('webAppName')]\",\n                            \"properties\": {\n                                \"name\": \"[variables('webAppName')]\",\n                                \"serverFarmId\": \"[variables('appServicePlanName')]\",\n                                \"siteConfig\": {\n                                    \"appSettings\": [\n                                        {\n                                            \"name\": \"WEBSITE_NODE_DEFAULT_VERSION\",\n                                            \"value\": \"10.14.1\"\n                                        },\n                                        {\n                                            \"name\": \"MicrosoftAppId\",\n                                            \"value\": \"[parameters('appId')]\"\n                                        },\n                                        {\n                                            \"name\": \"MicrosoftAppPassword\",\n                                            \"value\": \"[parameters('appSecret')]\"\n                                        }\n                                    ],\n                                    \"cors\": {\n                                        \"allowedOrigins\": [\n                                            \"https://botservice.hosting.portal.azure.net\",\n                                            \"https://hosting.onecloud.azure-test.net/\"\n                                        ]\n                                    }\n                                }\n                            }\n                        },\n                        {\n                            \"apiVersion\": \"2017-12-01\",\n                            \"type\": \"Microsoft.BotService/botServices\",\n                            \"name\": \"[parameters('botId')]\",\n                            \"location\": \"global\",\n                            \"kind\": \"bot\",\n                            \"sku\": {\n                                \"name\": \"[parameters('botSku')]\"\n                            },\n                            \"properties\": {\n                                \"name\": \"[parameters('botId')]\",\n                                \"displayName\": \"[parameters('botId')]\",\n                                \"endpoint\": \"[variables('botEndpoint')]\",\n                                \"msaAppId\": \"[parameters('appId')]\",\n                                \"developerAppInsightsApplicationId\": null,\n                                \"developerAppInsightKey\": null,\n                                \"publishingCredentials\": null,\n                                \"storageResourceId\": null\n                            },\n                            \"dependsOn\": [\n                                \"[resourceId('Microsoft.Web/sites/', variables('webAppName'))]\"\n                            ]\n                        }\n                    ],\n                    \"outputs\": {}\n                }\n            }\n        }\n    ]\n}"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Secondary/DeploymentTemplates/template-with-preexisting-rg.json",
    "content": "{\n    \"$schema\": \"https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#\",\n    \"contentVersion\": \"1.0.0.0\",\n    \"parameters\": {\n        \"appId\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"Active Directory App ID, set as MicrosoftAppId in the Web App's Application Settings.\"\n            }\n        },\n        \"appSecret\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"Active Directory App Password, set as MicrosoftAppPassword in the Web App's Application Settings. Defaults to \\\"\\\".\"\n            }\n        },\n        \"botId\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"The globally unique and immutable bot ID. Also used to configure the displayName of the bot, which is mutable.\"\n            }\n        },\n        \"botSku\": {\n            \"defaultValue\": \"F0\",\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"The pricing tier of the Bot Service Registration. Acceptable values are F0 and S1.\"\n            }\n        },\n        \"newAppServicePlanName\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"\",\n            \"metadata\": {\n                \"description\": \"The name of the new App Service Plan.\"\n            }\n        },\n        \"newAppServicePlanSku\": {\n            \"type\": \"object\",\n            \"defaultValue\": {\n                \"name\": \"S1\",\n                \"tier\": \"Standard\",\n                \"size\": \"S1\",\n                \"family\": \"S\",\n                \"capacity\": 1\n            },\n            \"metadata\": {\n                \"description\": \"The SKU of the App Service Plan. Defaults to Standard values.\"\n            }\n        },\n        \"appServicePlanLocation\": {\n            \"type\": \"string\",\n            \"metadata\": {\n                \"description\": \"The location of the App Service Plan.\"\n            }\n        },\n        \"existingAppServicePlan\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"\",\n            \"metadata\": {\n                \"description\": \"Name of the existing App Service Plan used to create the Web App for the bot.\"\n            }\n        },\n        \"newWebAppName\": {\n            \"type\": \"string\",\n            \"defaultValue\": \"\",\n            \"metadata\": {\n                \"description\": \"The globally unique name of the Web App. Defaults to the value passed in for \\\"botId\\\".\"\n            }\n        }\n    },\n    \"variables\": {\n        \"defaultAppServicePlanName\": \"[if(empty(parameters('existingAppServicePlan')), 'createNewAppServicePlan', parameters('existingAppServicePlan'))]\",\n        \"useExistingAppServicePlan\": \"[not(equals(variables('defaultAppServicePlanName'), 'createNewAppServicePlan'))]\",\n        \"servicePlanName\": \"[if(variables('useExistingAppServicePlan'), parameters('existingAppServicePlan'), parameters('newAppServicePlanName'))]\",\n        \"resourcesLocation\": \"[parameters('appServicePlanLocation')]\",\n        \"webAppName\": \"[if(empty(parameters('newWebAppName')), parameters('botId'), parameters('newWebAppName'))]\",\n        \"siteHost\": \"[concat(variables('webAppName'), '.azurewebsites.net')]\",\n        \"botEndpoint\": \"[concat('https://', variables('siteHost'), '/api/messages')]\"\n    },\n    \"resources\": [\n        {\n            \"comments\": \"Create a new App Service Plan if no existing App Service Plan name was passed in.\",\n            \"type\": \"Microsoft.Web/serverfarms\",\n            \"condition\": \"[not(variables('useExistingAppServicePlan'))]\",\n            \"name\": \"[variables('servicePlanName')]\",\n            \"apiVersion\": \"2018-02-01\",\n            \"location\": \"[variables('resourcesLocation')]\",\n            \"sku\": \"[parameters('newAppServicePlanSku')]\",\n            \"properties\": {\n                \"name\": \"[variables('servicePlanName')]\"\n            }\n        },\n        {\n            \"comments\": \"Create a Web App using an App Service Plan\",\n            \"type\": \"Microsoft.Web/sites\",\n            \"apiVersion\": \"2015-08-01\",\n            \"location\": \"[variables('resourcesLocation')]\",\n            \"kind\": \"app\",\n            \"dependsOn\": [\n                \"[resourceId('Microsoft.Web/serverfarms/', variables('servicePlanName'))]\"\n            ],\n            \"name\": \"[variables('webAppName')]\",\n            \"properties\": {\n                \"name\": \"[variables('webAppName')]\",\n                \"serverFarmId\": \"[variables('servicePlanName')]\",\n                \"siteConfig\": {\n                    \"appSettings\": [\n                        {\n                            \"name\": \"WEBSITE_NODE_DEFAULT_VERSION\",\n                            \"value\": \"10.14.1\"\n                        },\n                        {\n                            \"name\": \"MicrosoftAppId\",\n                            \"value\": \"[parameters('appId')]\"\n                        },\n                        {\n                            \"name\": \"MicrosoftAppPassword\",\n                            \"value\": \"[parameters('appSecret')]\"\n                        }\n                    ],\n                    \"cors\": {\n                        \"allowedOrigins\": [\n                            \"https://botservice.hosting.portal.azure.net\",\n                            \"https://hosting.onecloud.azure-test.net/\"\n                        ]\n                    }\n                }\n            }\n        },\n        {\n            \"apiVersion\": \"2017-12-01\",\n            \"type\": \"Microsoft.BotService/botServices\",\n            \"name\": \"[parameters('botId')]\",\n            \"location\": \"global\",\n            \"kind\": \"bot\",\n            \"sku\": {\n                \"name\": \"[parameters('botSku')]\"\n            },\n            \"properties\": {\n                \"name\": \"[parameters('botId')]\",\n                \"displayName\": \"[parameters('botId')]\",\n                \"endpoint\": \"[variables('botEndpoint')]\",\n                \"msaAppId\": \"[parameters('appId')]\",\n                \"developerAppInsightsApplicationId\": null,\n                \"developerAppInsightKey\": null,\n                \"publishingCredentials\": null,\n                \"storageResourceId\": null\n            },\n            \"dependsOn\": [\n                \"[resourceId('Microsoft.Web/sites/', variables('webAppName'))]\"\n            ]\n        }\n    ]\n}"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Secondary/Program.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n//\n// Generated with Bot Builder V4 SDK Template for Visual Studio EchoBot v4.3.0\n\nusing Microsoft.AspNetCore;\nusing Microsoft.AspNetCore.Hosting;\n\nnamespace Secondary\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            CreateWebHostBuilder(args).Build().Run();\n        }\n\n        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>\n            WebHost.CreateDefaultBuilder(args)\n                .UseStartup<Startup>();\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Secondary/Properties/launchSettings.json",
    "content": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:3979/\",\n      \"sslPort\": 0\n    }\n  },\n  \"profiles\": {\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"Secondary\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      },\n      \"applicationUrl\": \"http://localhost:3979/\"\n    }\n  }\n}"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Secondary/Secondary.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"..\\FacebookModel\\FacebookPassThreadControl.cs\" Link=\"FacebookModel\\FacebookPassThreadControl.cs\" />\n    <Compile Include=\"..\\FacebookModel\\FacebookPayload.cs\" Link=\"FacebookModel\\FacebookPayload.cs\" />\n    <Compile Include=\"..\\FacebookModel\\FacebookPsid.cs\" Link=\"FacebookModel\\FacebookPsid.cs\" />\n    <Compile Include=\"..\\FacebookModel\\FacebookRequestThreadControl.cs\" Link=\"FacebookModel\\FacebookRequestThreadControl.cs\" />\n    <Compile Include=\"..\\FacebookModel\\FacebookStandby.cs\" Link=\"FacebookModel\\FacebookStandby.cs\" />\n    <Compile Include=\"..\\FacebookModel\\FacebookTakeThreadControl.cs\" Link=\"FacebookModel\\FacebookTakeThreadControl.cs\" />\n    <Compile Include=\"..\\FacebookModel\\FacebookThreadControlHelper.cs\" Link=\"FacebookModel\\FacebookThreadControlHelper.cs\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.AspNetCore.App\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder.Dialogs\" Version=\"4.4.4\" />\n    <PackageReference Include=\"Microsoft.Bot.Builder.Integration.AspNet.Core\" Version=\"4.4.3\" />\n  </ItemGroup>\n\n    <ItemGroup>\n    <Content Update=\"appsettings.json\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n\n    <ItemGroup>\n      <Folder Include=\"FacebookModel\\\" />\n    </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Secondary/Startup.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n//\n// Generated with Bot Builder V4 SDK Template for Visual Studio EchoBot v4.3.0\n\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Bot.Builder;\nusing Microsoft.Bot.Builder.BotFramework;\nusing Microsoft.Bot.Builder.Integration.AspNet.Core;\nusing Microsoft.Bot.Connector.Authentication;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.DependencyInjection;\n\nusing Secondary.Bots;\n\nnamespace Secondary\n{\n    public class Startup\n    {\n        public Startup(IConfiguration configuration)\n        {\n            Configuration = configuration;\n        }\n\n        public IConfiguration Configuration { get; }\n\n        // This method gets called by the runtime. Use this method to add services to the container.\n        public void ConfigureServices(IServiceCollection services)\n        {\n            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);\n\n            // Create the credential provider to be used with the Bot Framework Adapter.\n            services.AddSingleton<ICredentialProvider, ConfigurationCredentialProvider>();\n\n            // Create the Bot Framework Adapter.\n            services.AddSingleton<IBotFrameworkHttpAdapter, BotFrameworkHttpAdapter>();\n\n            // Create the bot as a transient. In this case the ASP Controller is expecting an IBot.\n            services.AddTransient<IBot, SecondaryBot>();\n        }\n\n        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env)\n        {\n            if (env.IsDevelopment())\n            {\n                app.UseDeveloperExceptionPage();\n            }\n            else\n            {\n                app.UseHsts();\n            }\n\n            app.UseDefaultFiles();\n            app.UseStaticFiles();\n\n            //app.UseHttpsRedirection();\n            app.UseMvc();\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Secondary/appsettings.Development.json",
    "content": "{\n    \"Logging\": {\n      \"LogLevel\": {\n        \"Default\": \"Debug\",\n        \"System\": \"Information\",\n        \"Microsoft\": \"Information\"\n      }\n    }\n  }\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Secondary/appsettings.json",
    "content": "{\n\t\"MicrosoftAppId\": \"\",\n\t\"MicrosoftAppPassword\": \"\",\n\t\"FacebookPageToken\": \"\"\n}\n"
  },
  {
    "path": "blog-samples/CSharp/FacebookHandover/Secondary/wwwroot/default.htm",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>Secondary</title>\n    <style>\n        body {\n            margin: 0px;\n            padding: 0px;\n            font-family: Segoe UI;\n        }\n\n        html,\n        body {\n            height: 100%;\n        }\n\n        header {\n            background-image: url(\"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 4638.9 651.6' style='enable-background:new 0 0 4638.9 651.6;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%2355A0E0;%7D .st1%7Bfill:none;%7D .st2%7Bfill:%230058A8;%7D .st3%7Bfill:%23328BD8;%7D .st4%7Bfill:%23B6DCF1;%7D .st5%7Bopacity:0.2;fill:url(%23SVGID_1_);enable-background:new ;%7D%0A%3C/style%3E%3Crect y='1.1' class='st0' width='4640' height='646.3'/%3E%3Cpath class='st1' d='M3987.8,323.6L4310.3,1.1h-65.6l-460.1,460.1c-17.5,17.5-46.1,17.5-63.6,0L3260.9,1.1H0v646.3h3660.3 L3889,418.7c17.5-17.5,46.1-17.5,63.6,0l228.7,228.7h66.6l-260.2-260.2C3970.3,369.8,3970.3,341.1,3987.8,323.6z'/%3E%3Cpath class='st2' d='M3784.6,461.2L4244.7,1.1h-983.9l460.1,460.1C3738.4,478.7,3767.1,478.7,3784.6,461.2z'/%3E%3Cpath class='st3' d='M4640,1.1h-329.8l-322.5,322.5c-17.5,17.5-17.5,46.1,0,63.6l260.2,260.2H4640L4640,1.1L4640,1.1z'/%3E%3Cpath class='st4' d='M3889,418.8l-228.7,228.7h521.1l-228.7-228.7C3935.2,401.3,3906.5,401.3,3889,418.8z'/%3E%3ClinearGradient id='SVGID_1_' gradientUnits='userSpaceOnUse' x1='3713.7576' y1='438.1175' x2='3911.4084' y2='14.2535' gradientTransform='matrix(1 0 0 -1 0 641.3969)'%3E%3Cstop offset='0' style='stop-color:%23FFFFFF;stop-opacity:0.5'/%3E%3Cstop offset='1' style='stop-color:%23FFFFFF'/%3E%3C/linearGradient%3E%3Cpath class='st5' d='M3952.7,124.5c-17.5-17.5-46.1-17.5-63.6,0l-523,523h1109.6L3952.7,124.5z'/%3E%3C/svg%3E%0A\");\n            background-repeat: no-repeat;\n            background-size: 100%;\n            background-position: right;\n            background-color: #55A0E0;\n            width: 100%;\n            font-size: 44px;\n            height: 120px;\n            color: white;\n            padding: 30px 0 40px 0px;\n            display: inline-block;\n        }\n\n        .header-icon {\n            background-image: url(\"data:image/svg+xml;utf8,%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20150.2%20125%22%20style%3D%22enable-background%3Anew%200%200%20150.2%20125%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23FFFFFF%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.5%22%20class%3D%22st0%22%20width%3D%22149.7%22%20height%3D%22125%22/%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M59%2C102.9L21.8%2C66c-3.5-3.5-3.5-9.1%2C0-12.5l37-36.5l2.9%2C3l-37%2C36.4c-1.8%2C1.8-1.8%2C4.7%2C0%2C6.6l37.2%2C37L59%2C102.9z%22%0A%09%09/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M92.5%2C102.9l-3-3l37.2-37c0.9-0.9%2C1.4-2%2C1.4-3.3c0-1.2-0.5-2.4-1.4-3.3L89.5%2C20l2.9-3l37.2%2C36.4%0A%09%09c1.7%2C1.7%2C2.6%2C3.9%2C2.6%2C6.3s-0.9%2C4.6-2.6%2C6.3L92.5%2C102.9z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M90.1%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C98.1%2C64.7%2C94.4%2C68.4%2C90.1%2C68.4z%0A%09%09%20M90.1%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S91.9%2C56.5%2C90.1%2C56.5z%22/%3E%0A%3C/g%3E%0A%3Cg%3E%0A%09%3Cpath%20class%3D%22st1%22%20d%3D%22M61.4%2C68.4c-4.5%2C0-8-3.5-8-8.1c0-4.5%2C3.5-8.1%2C8-8.1c4.4%2C0%2C8%2C3.7%2C8%2C8.1C69.5%2C64.7%2C65.8%2C68.4%2C61.4%2C68.4z%0A%09%09%20M61.4%2C56.5c-2.2%2C0-3.8%2C1.7-3.8%2C3.9c0%2C2.2%2C1.7%2C3.9%2C3.8%2C3.9c1.9%2C0%2C3.8-1.6%2C3.8-3.9S63.3%2C56.5%2C61.4%2C56.5z%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A\");\n            background-repeat: no-repeat;\n            float: left;\n            height: 140px;\n            width: 140px;\n            display: inline-block;\n            vertical-align: middle;\n        }\n\n        .header-text {\n            padding-left: 1%;\n            color: #FFFFFF;\n            font-family: \"Segoe UI\";\n            font-size: 72px;\n            font-weight: 300;\n            letter-spacing: 0.35px;\n            line-height: 96px;\n            display: inline-block;\n            vertical-align: middle;\n        }\n\n        .header-inner-container {\n            min-width: 480px;\n            max-width: 1366px;\n            margin-left: auto;\n            margin-right: auto;\n            vertical-align: middle;\n        }\n\n        .header-inner-container::after {\n            content: \"\";\n            clear: both;\n            display: table;\n        }\n\n        .main-content-area {\n            padding-left: 30px;\n        }\n\n        .content-title {\n            color: #000000;\n            font-family: \"Segoe UI\";\n            font-size: 46px;\n            font-weight: 300;\n            line-height: 62px;\n        }\n\n        .main-text {\n            color: #808080;\n            font-size: 24px;\n            font-family: \"Segoe UI\";\n            font-size: 24px;\n            font-weight: 200;\n            line-height: 32px;\n        }\n\n        .main-text-p1 {\n            padding-top: 48px;\n            padding-bottom: 28px;\n        }\n\n        .endpoint {\n            height: 32px;\n            width: 571px;\n            color: #808080;\n            font-family: \"Segoe UI\";\n            font-size: 24px;\n            font-weight: 200;\n            line-height: 32px;\n            padding-top: 28px;\n        }\n\n        .how-to-build-section {\n            padding-top: 20px;\n            padding-left: 30px;\n        }\n\n        .how-to-build-section>h3 {\n            font-size: 16px;\n            font-weight: 600;\n            letter-spacing: 0.35px;\n            line-height: 22px;\n            margin: 0 0 24px 0;\n            text-transform: uppercase;\n        }\n\n        .step-container {\n            display: flex;\n            align-items: stretch;\n            position: relative;\n        }\n\n        .step-container dl {\n            border-left: 1px solid #A0A0A0;\n            display: block;\n            padding: 0 24px;\n            margin: 0;\n        }\n\n        .step-container dl>dt::before {\n            background-color: white;\n            border: 1px solid #A0A0A0;\n            border-radius: 100%;\n            content: '';\n            left: 47px;\n            height: 11px;\n            position: absolute;\n            width: 11px;\n        }\n\n        .step-container dl>.test-bullet::before {\n            background-color: blue;\n        }\n\n        .step-container dl>dt {\n            display: block;\n            font-size: inherit;\n            font-weight: bold;\n            line-height: 20px;\n        }\n\n        .step-container dl>dd {\n            font-size: inherit;\n            line-height: 20px;\n            margin-left: 0;\n            padding-bottom: 32px;\n        }\n\n        .step-container:last-child dl {\n            border-left: 1px solid transparent;\n        }\n\n        .ctaLink {\n            background-color: transparent;\n            border: 1px solid transparent;\n            color: #006AB1;\n            cursor: pointer;\n            font-weight: 600;\n            padding: 0;\n            white-space: normal;\n        }\n\n        .ctaLink:focus {\n            outline: 1px solid #00bcf2;\n        }\n\n        .ctaLink:hover {\n            text-decoration: underline;\n        }\n\n        .step-icon {\n            display: flex;\n            height: 38px;\n            margin-right: 15px;\n            width: 38px;\n        }\n\n        .step-icon>div {\n            height: 30px;\n            width: 30px;\n            background-repeat: no-repeat;\n        }\n\n        .ms-logo-container {\n            min-width: 580px;\n            max-width: 980px;\n            margin-left: auto;\n            margin-right: auto;\n            left: 0;\n            right: 0;\n            transition: bottom 400ms;\n        }\n\n        .ms-logo {\n            float: right;\n            background-image: url(\"data:image/svg+xml;utf8,%0A%3Csvg%20version%3D%221.1%22%20id%3D%22MS-symbol%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20viewBox%3D%220%200%20400%20120%22%20style%3D%22enable-background%3Anew%200%200%20400%20120%3B%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cstyle%20type%3D%22text/css%22%3E%0A%09.st0%7Bfill%3Anone%3B%7D%0A%09.st1%7Bfill%3A%23737474%3B%7D%0A%09.st2%7Bfill%3A%23D63F26%3B%7D%0A%09.st3%7Bfill%3A%23167D3E%3B%7D%0A%09.st4%7Bfill%3A%232E76BC%3B%7D%0A%09.st5%7Bfill%3A%23FDB813%3B%7D%0A%3C/style%3E%0A%3Crect%20x%3D%220.6%22%20class%3D%22st0%22%20width%3D%22398.7%22%20height%3D%22119%22/%3E%0A%3Cpath%20class%3D%22st1%22%20d%3D%22M171.3%2C38.4v43.2h-7.5V47.7h-0.1l-13.4%2C33.9h-5l-13.7-33.9h-0.1v33.9h-6.9V38.4h10.8l12.4%2C32h0.2l13.1-32H171.3%0A%09z%20M177.6%2C41.7c0-1.2%2C0.4-2.2%2C1.3-3c0.9-0.8%2C1.9-1.2%2C3.1-1.2c1.3%2C0%2C2.4%2C0.4%2C3.2%2C1.3c0.8%2C0.8%2C1.3%2C1.8%2C1.3%2C3c0%2C1.2-0.4%2C2.2-1.3%2C3%0A%09c-0.9%2C0.8-1.9%2C1.2-3.2%2C1.2s-2.3-0.4-3.1-1.2C178%2C43.8%2C177.6%2C42.8%2C177.6%2C41.7z%20M185.7%2C50.6v31h-7.3v-31H185.7z%20M207.8%2C76.3%0A%09c1.1%2C0%2C2.3-0.3%2C3.6-0.8c1.3-0.5%2C2.5-1.2%2C3.6-2v6.8c-1.2%2C0.7-2.5%2C1.2-4%2C1.5c-1.5%2C0.3-3.1%2C0.5-4.9%2C0.5c-4.6%2C0-8.3-1.4-11.1-4.3%0A%09c-2.9-2.9-4.3-6.6-4.3-11c0-5%2C1.5-9.1%2C4.4-12.3c2.9-3.2%2C7-4.8%2C12.4-4.8c1.4%2C0%2C2.7%2C0.2%2C4.1%2C0.5c1.4%2C0.4%2C2.5%2C0.8%2C3.3%2C1.2v7%0A%09c-1.1-0.8-2.3-1.5-3.4-1.9c-1.2-0.5-2.4-0.7-3.6-0.7c-2.9%2C0-5.2%2C0.9-7%2C2.8c-1.8%2C1.9-2.7%2C4.4-2.7%2C7.6c0%2C3.1%2C0.8%2C5.6%2C2.5%2C7.3%0A%09C202.6%2C75.4%2C204.9%2C76.3%2C207.8%2C76.3z%20M235.7%2C50.1c0.6%2C0%2C1.1%2C0%2C1.6%2C0.1s0.9%2C0.2%2C1.2%2C0.3v7.4c-0.4-0.3-0.9-0.5-1.7-0.8%0A%09c-0.7-0.3-1.6-0.4-2.7-0.4c-1.8%2C0-3.3%2C0.8-4.5%2C2.3c-1.2%2C1.5-1.9%2C3.8-1.9%2C7v15.6h-7.3v-31h7.3v4.9h0.1c0.7-1.7%2C1.7-3%2C3-4%0A%09C232.2%2C50.6%2C233.8%2C50.1%2C235.7%2C50.1z%20M238.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3%0A%09c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5c-4.8%2C0-8.6-1.4-11.4-4.2C240.3%2C75.3%2C238.9%2C71.4%2C238.9%2C66.6z%0A%09%20M246.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5%0A%09c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7C247.2%2C60.5%2C246.5%2C63%2C246.5%2C66.3z%20M281.5%2C58.8c0%2C1%2C0.3%2C1.9%2C1%2C2.5%0A%09c0.7%2C0.6%2C2.1%2C1.3%2C4.4%2C2.2c2.9%2C1.2%2C5%2C2.5%2C6.1%2C3.9c1.2%2C1.5%2C1.8%2C3.2%2C1.8%2C5.3c0%2C2.9-1.1%2C5.3-3.4%2C7c-2.2%2C1.8-5.3%2C2.7-9.1%2C2.7%0A%09c-1.3%2C0-2.7-0.2-4.3-0.5c-1.6-0.3-2.9-0.7-4-1.2v-7.2c1.3%2C0.9%2C2.8%2C1.7%2C4.3%2C2.2c1.5%2C0.5%2C2.9%2C0.8%2C4.2%2C0.8c1.6%2C0%2C2.9-0.2%2C3.6-0.7%0A%09c0.8-0.5%2C1.2-1.2%2C1.2-2.3c0-1-0.4-1.9-1.2-2.5c-0.8-0.7-2.4-1.5-4.6-2.4c-2.7-1.1-4.6-2.4-5.7-3.8c-1.1-1.4-1.7-3.2-1.7-5.4%0A%09c0-2.8%2C1.1-5.1%2C3.3-6.9c2.2-1.8%2C5.1-2.7%2C8.6-2.7c1.1%2C0%2C2.3%2C0.1%2C3.6%2C0.4c1.3%2C0.2%2C2.5%2C0.6%2C3.4%2C0.9v6.9c-1-0.6-2.1-1.2-3.4-1.7%0A%09c-1.3-0.5-2.6-0.7-3.8-0.7c-1.4%2C0-2.5%2C0.3-3.2%2C0.8C281.9%2C57.1%2C281.5%2C57.8%2C281.5%2C58.8z%20M297.9%2C66.6c0-5.1%2C1.4-9.2%2C4.3-12.2%0A%09c2.9-3%2C6.9-4.5%2C12.1-4.5c4.8%2C0%2C8.6%2C1.4%2C11.3%2C4.3c2.7%2C2.9%2C4.1%2C6.8%2C4.1%2C11.7c0%2C5-1.4%2C9-4.3%2C12c-2.9%2C3-6.8%2C4.5-11.8%2C4.5%0A%09c-4.8%2C0-8.6-1.4-11.4-4.2C299.4%2C75.3%2C297.9%2C71.4%2C297.9%2C66.6z%20M305.5%2C66.3c0%2C3.2%2C0.7%2C5.7%2C2.2%2C7.4c1.5%2C1.7%2C3.6%2C2.6%2C6.3%2C2.6%0A%09c2.7%2C0%2C4.7-0.9%2C6.1-2.6c1.4-1.7%2C2.1-4.2%2C2.1-7.6c0-3.3-0.7-5.8-2.2-7.5c-1.4-1.7-3.4-2.5-6-2.5c-2.7%2C0-4.7%2C0.9-6.2%2C2.7%0A%09C306.3%2C60.5%2C305.5%2C63%2C305.5%2C66.3z%20M353.9%2C56.6h-10.9v25h-7.4v-25h-5.2v-6h5.2v-4.3c0-3.3%2C1.1-5.9%2C3.2-8c2.1-2.1%2C4.8-3.1%2C8.1-3.1%0A%09c0.9%2C0%2C1.7%2C0%2C2.4%2C0.1c0.7%2C0.1%2C1.3%2C0.2%2C1.8%2C0.4V42c-0.2-0.1-0.7-0.3-1.3-0.5c-0.6-0.2-1.3-0.3-2.1-0.3c-1.5%2C0-2.7%2C0.5-3.5%2C1.4%0A%09s-1.2%2C2.4-1.2%2C4.2v3.7h10.9v-7l7.3-2.2v9.2h7.4v6h-7.4v14.5c0%2C1.9%2C0.3%2C3.3%2C1%2C4c0.7%2C0.8%2C1.8%2C1.2%2C3.3%2C1.2c0.4%2C0%2C0.9-0.1%2C1.5-0.3%0A%09c0.6-0.2%2C1.1-0.4%2C1.6-0.7v6c-0.5%2C0.3-1.2%2C0.5-2.3%2C0.7c-1.1%2C0.2-2.1%2C0.3-3.2%2C0.3c-3.1%2C0-5.4-0.8-6.9-2.5c-1.5-1.6-2.3-4.1-2.3-7.4%0A%09V56.6z%22/%3E%0A%3Cg%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2224%22%20class%3D%22st2%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2224%22%20class%3D%22st3%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2231%22%20y%3D%2261.8%22%20class%3D%22st4%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%09%3Crect%20x%3D%2268.8%22%20y%3D%2261.8%22%20class%3D%22st5%22%20width%3D%2234.2%22%20height%3D%2234.2%22/%3E%0A%3C/g%3E%0A%3C/svg%3E%0A\");\n        }\n\n        .ms-logo-container>div {\n            min-height: 60px;\n            width: 150px;\n            background-repeat: no-repeat;\n        }\n\n        .row {\n            padding: 90px 0px 0 20px;\n            min-width: 480px;\n            max-width: 1366px;\n            margin-left: auto;\n            margin-right: auto;\n        }\n\n        .column {\n            float: left;\n            width: 45%;\n            padding-right: 20px;\n        }\n\n        .row:after {\n            content: \"\";\n            display: table;\n            clear: both;\n        }\n\n        a {\n            text-decoration: none;\n        }\n\n        .download-the-emulator {\n            height: 20px;\n            color: #0063B1;\n            font-size: 15px;\n            line-height: 20px;\n            padding-bottom: 70px;\n        }\n\n        .how-to-iframe {\n            max-width: 700px !important;\n            min-width: 650px !important;\n            height: 700px !important;\n        }\n\n        .remove-frame-height {\n            height: 10px;\n        }\n\n        @media only screen and (max-width: 1300px) {\n            .ms-logo {\n                padding-top: 30px;\n            }\n\n            .header-text {\n                font-size: 40x;\n            }\n\n            .column {\n                float: none;\n                padding-top: 30px;\n                width: 100%;\n            }\n\n            .ms-logo-container {\n                padding-top: 30px;\n                min-width: 480px;\n                max-width: 650px;\n                margin-left: auto;\n                margin-right: auto;\n            }\n\n            .row {\n                padding: 20px 0px 0 20px;\n                min-width: 480px;\n                max-width: 650px;\n                margin-left: auto;\n                margin-right: auto;\n            }\n        }\n\n        @media only screen and (max-width: 1370px) {\n            header {\n                background-color: #55A0E0;\n                background-size: auto 200px;\n            }\n        }\n\n        @media only screen and (max-width: 1230px) {\n            header {\n                background-color: #55A0E0;\n                background-size: auto 200px;\n            }\n\n            .header-text {\n                font-size: 44px;\n            }\n\n            .header-icon {\n                height: 120px;\n                width: 120px;\n            }\n        }\n\n        @media only screen and (max-width: 1000px) {\n            header {\n                background-color: #55A0E0;\n                background-image: none;\n            }\n        }\n\n        @media only screen and (max-width: 632px) {\n            .header-text {\n                font-size: 32px;\n            }\n\n            .row {\n                padding: 10px 0px 0 10px;\n                max-width: 490px !important;\n                min-width: 410px !important;\n            }\n\n            .endpoint {\n                font-size: 25px;\n            }\n\n            .main-text {\n                font-size: 20px;\n            }\n\n            .step-container dl>dd {\n                font-size: 14px;\n            }\n\n            .column {\n                padding-right: 5px;\n            }\n\n            .header-icon {\n                height: 110px;\n                width: 110px;\n            }\n\n            .how-to-iframe {\n                max-width: 480px !important;\n                min-width: 400px !important;\n                height: 650px !important;\n                overflow: hidden;\n            }\n        }\n\n        .remove-frame-height {\n            max-height: 10px;\n        }\n    </style>\n    <script>\n        document.addEventListener('DOMContentLoaded', function () {\n            loadFrame();\n        });\n        var loadFrame = function () {\n            var iframe = document.createElement('iframe');\n            iframe.setAttribute(\"id\", \"iframe\");\n            var offLineHTMLContent = \"\";\n            var frameElement = document.getElementById(\"how-to-iframe\");\n            if (window.navigator.onLine) {\n                iframe.src = 'https://docs.botframework.com/static/abs/pages/f5.htm';\n                iframe.setAttribute(\"scrolling\", \"no\");\n                iframe.setAttribute(\"frameborder\", \"0\");\n                iframe.setAttribute(\"width\", \"100%\");\n                iframe.setAttribute(\"height\", \"100%\");\n                var frameDiv = document.getElementById(\"how-to-iframe\");\n                frameDiv.appendChild(iframe);\n            } else {\n                frameElement.classList.add(\"remove-frame-height\");\n            }\n        };\n    </script>\n</head>\n\n<body>\n    <header class=\"header\">\n        <div class=\"header-inner-container\">\n            <div class=\"header-icon\" style=\"display: inline-block\"></div>\n            <div class=\"header-text\" style=\"display: inline-block\">Secondary Bot</div>\n        </div>\n    </header>\n    <div class=\"row\">\n        <div class=\"column\" class=\"main-content-area\">\n            <div class=\"content-title\">Your bot is ready!</div>\n            <div class=\"main-text main-text-p1\">You can test your bot in the Bot Framework Emulator<br />\n                by connecting to http://localhost:3979/api/messages.</div>\n            <div class=\"main-text download-the-emulator\"><a class=\"ctaLink\"\n                    href=\"https://aka.ms/bot-framework-F5-download-emulator\" target=\"_blank\">Download the Emulator</a>\n            </div>\n            <div class=\"main-text\">Visit <a class=\"ctaLink\" href=\"https://aka.ms/bot-framework-F5-abs-home\"\n                    target=\"_blank\">Azure\n                    Bot Service</a> to register your bot and add it to<br />\n                various channels. The bot's endpoint URL typically looks\n                like this:</div>\n            <div class=\"endpoint\">https://<i>your_bots_hostname</i>/api/messages</div>\n        </div>\n        <div class=\"column how-to-iframe\" id=\"how-to-iframe\"></div>\n    </div>\n    <div class=\"ms-logo-container\">\n        <div class=\"ms-logo\"></div>\n    </div>\n</body>\n\n</html>"
  },
  {
    "path": "blog-samples/CSharp/Luis-Scorable-QnA/.gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n**/Properties/launchSettings.json\n\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# TODO: Comment the next line if you want to checkin your web deploy settings\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/packages/*\n# except build/, which is used as an MSBuild target.\n!**/packages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/packages/repositories.config\n# NuGet v3's project.json files produces more ignorable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\norleans.codegen.cs\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\n*.mdf\n*.ldf\n*.ndf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\nnode_modules/\n\n# Typescript v1 declaration files\ntypings/\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n\n# CodeRush\n.cr/\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/**\n# !tools/packages.config\n\n# Telerik's JustMock configuration file\n*.jmconfig\n\n# BizTalk build output\n*.btp.cs\n*.btm.cs\n*.odx.cs\n*.xsd.cs\n"
  },
  {
    "path": "blog-samples/CSharp/Luis-Scorable-QnA/Luis-Scorable-Qna/App_Start/WebApiConfig.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web.Http;\n\nnamespace Scorable\n{\n    public static class WebApiConfig\n    {\n        public static void Register(HttpConfiguration config)\n        {\n            // Json settings\n            config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;\n            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();\n            config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented;\n            JsonConvert.DefaultSettings = () => new JsonSerializerSettings()\n            {\n                ContractResolver = new CamelCasePropertyNamesContractResolver(),\n                Formatting = Newtonsoft.Json.Formatting.Indented,\n                NullValueHandling = NullValueHandling.Ignore,\n            };\n\n            // Web API configuration and services\n\n            // Web API routes\n            config.MapHttpAttributeRoutes();\n\n            config.Routes.MapHttpRoute(\n                name: \"DefaultApi\",\n                routeTemplate: \"api/{controller}/{id}\",\n                defaults: new { id = RouteParameter.Optional }\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/Luis-Scorable-QnA/Luis-Scorable-Qna/Controllers/MessagesController.cs",
    "content": "﻿using System.Net;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing System.Web.Http;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\n\nnamespace Scorable\n{\n    [BotAuthentication]\n    public class MessagesController : ApiController\n    {\n        /// <summary>\n        /// POST: api/Messages\n        /// Receive a message from a user and reply to it\n        /// </summary>\n        public async Task<HttpResponseMessage> Post([FromBody]Activity activity)\n        {\n            if (activity.Type == ActivityTypes.Message)\n            {\n                await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());\n            }\n            else\n            {\n                HandleSystemMessage(activity);\n            }\n            var response = Request.CreateResponse(HttpStatusCode.OK);\n            return response;\n        }\n\n        private Activity HandleSystemMessage(Activity message)\n        {\n            if (message.Type == ActivityTypes.DeleteUserData)\n            {\n                // Implement user deletion here\n                // If we handle user deletion, return a real message\n            }\n            else if (message.Type == ActivityTypes.ConversationUpdate)\n            {\n                // Handle conversation state changes, like members being added and removed\n                // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info\n                // Not available in all channels\n            }\n            else if (message.Type == ActivityTypes.ContactRelationUpdate)\n            {\n                // Handle add/remove from contact lists\n                // Activity.From + Activity.Action represent what happened\n            }\n            else if (message.Type == ActivityTypes.Typing)\n            {\n                // Handle knowing tha the user is typing\n            }\n            else if (message.Type == ActivityTypes.Ping)\n            {\n            }\n\n            return null;\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/Luis-Scorable-QnA/Luis-Scorable-Qna/Dialogs/CommonResponsesDialog.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Web;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\n\nnamespace Scorable.Dialogs\n{\n    public class CommonResponsesDialog : IDialog<object>\n    {\n        private readonly string _messageToSend;\n        private Activity _activity;\n\n        public CommonResponsesDialog(string message)\n        {\n            _messageToSend = message;\n        }\n\n        // overload constructor to handle activities (card attachments)\n        public CommonResponsesDialog(Activity activity)\n        {\n            var heroCard = new HeroCard\n            {\n                Title = \"Help\",\n                Text = \"Need assisstance?\",\n                Buttons = new List<CardAction> {\n                    new CardAction(ActionTypes.OpenUrl, \"Contact Us\", value: \"https://stackoverflow.com/questions/tagged/botframework\"),\n                    new CardAction(ActionTypes.OpenUrl, \"FAQ\", value: \"https://docs.microsoft.com/bot-framework\")\n                }\n            };\n            var reply = activity.CreateReply();\n\n            reply.Attachments.Add(heroCard.ToAttachment());\n\n            _activity = reply;\n        }\n\n        public async Task StartAsync(IDialogContext context)\n        {\n            if (string.IsNullOrEmpty(_messageToSend))\n            {\n                await context.PostAsync(_activity);\n            }\n            else\n            {\n                await context.PostAsync(_messageToSend);\n            }\n            context.Done<object>(null);\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/Luis-Scorable-QnA/Luis-Scorable-Qna/Dialogs/CommonResponsesScorable.cs",
    "content": "﻿using System.Threading;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Builder.Dialogs.Internals;\nusing Microsoft.Bot.Builder.Internals.Fibers;\nusing Microsoft.Bot.Builder.Scorables.Internals;\nusing Microsoft.Bot.Connector;\n\nnamespace Scorable.Dialogs\n{\n    public partial class CommonResponsesScorable : ScorableBase<IActivity, string, double>\n    {\n        private readonly IDialogTask task;\n\n        public CommonResponsesScorable(IDialogTask task)\n        {\n            SetField.NotNull(out this.task, nameof(task), task);\n        }\n\n        protected override async Task<string> PrepareAsync(IActivity activity, CancellationToken token)\n        {\n            var message = activity as IMessageActivity;\n\n            if (message != null && !string.IsNullOrWhiteSpace(message.Text))\n            {\n                var msg = message.Text.ToLowerInvariant();\n\n                if (msg == \"hello\" || msg == \"thank you\" || msg == \"goodbye\")\n                {\n                    return message.Text;\n                }\n                else if (msg.Contains(\"help\"))\n                {\n                    return message.Text;\n                }\n                else\n                {\n                    //call another dialog\n                }\n            }\n\n            return null;\n        }\n\n        protected override bool HasScore(IActivity item, string state)\n        {\n            return state != null;\n        }\n\n        protected override double GetScore(IActivity item, string state)\n        {\n            return 1.0;\n        }\n\n        protected override async Task PostAsync(IActivity item, string state, CancellationToken token)\n        {\n            var message = item as IMessageActivity;\n            IDialog<IMessageActivity> interruption = null;\n            if (message != null)\n            {\n                var incomingMessage = message.Text.ToLowerInvariant();\n                var messageToSend = string.Empty;\n\n                if (incomingMessage.Contains(\"help\"))\n                {\n                    var commonResponsesDialog = new CommonResponsesDialog((Activity)message);\n                    interruption = commonResponsesDialog.Void<object, IMessageActivity>();\n                }\n                else\n                {\n                    if (incomingMessage == \"hello\")\n                        messageToSend = \"Hi! I am a bot\";\n\n                    if (incomingMessage == \"thank you\")\n                        messageToSend = \"You are welcome!\";\n\n                    if (incomingMessage == \"goodbye\")\n                        messageToSend = \"See you later\";\n                    var commonResponsesDialog = new CommonResponsesDialog(messageToSend);\n                     interruption = commonResponsesDialog.Void<object, IMessageActivity>();\n                }\n                this.task.Call(interruption, null);\n                await this.task.PollAsync(token);\n            }\n        }\n\n        protected override Task DoneAsync(IActivity item, string state, CancellationToken token)\n        {\n            return Task.CompletedTask;\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/Luis-Scorable-QnA/Luis-Scorable-Qna/Dialogs/JokeDialog.cs",
    "content": "﻿using System;\nusing System.Net;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\n\nnamespace Scorable.Dialogs\n{\n    [Serializable]\n    public class JokeDialog : IDialog<object>\n    {\n        public Task StartAsync(IDialogContext context)\n        {\n            // Confirmation that we're in the JokeDialog, forwarded from the LUIS dialog\n            string response = \"What time does the duck wake up? At the quack of dawn!\";\n\n            context.PostAsync(response);\n\n            return Task.CompletedTask;\n        }\n\n        private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)\n        {\n            var activity = await result as Activity;\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/Luis-Scorable-QnA/Luis-Scorable-Qna/Dialogs/LuisDialog.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Builder.Luis;\nusing Microsoft.Bot.Builder.Luis.Models;\nusing Microsoft.Bot.Connector;\nusing System.Threading;\n\nnamespace Scorable.Dialogs\n{\n    [Serializable]\n    [LuisModel(\"YourLuisAppID\", \"YourLuisAppPassword\")]\n    public class LuisDialog : LuisDialog<object>\n    {\n        [LuisIntent(\"\")]\n        [LuisIntent(\"None\")]\n        public async Task None(IDialogContext context, LuisResult result)\n        {\n            string message = $\"Sorry, I did not understand '{result.Query}'. Type 'help' if you need assistance.\";\n\n            // alternatively, you could forward to QnA Dialog if no intent is found\n\n            await context.PostAsync(message);\n\n            context.Wait(this.MessageReceived);\n        }\n\n        [LuisIntent(\"greeting\")]\n        public async Task Greeting(IDialogContext context, LuisResult result)\n        {\n            string message = $\"Hello there\";\n\n            await context.PostAsync(message);\n\n            context.Wait(this.MessageReceived);\n        }\n\n        private ResumeAfter<object> after()\n        {\n            return null;\n        }\n\n        [LuisIntent(\"weather\")]\n        public async Task Middle(IDialogContext context, LuisResult result)\n        {\n            // confirm we hit weather intent\n            string message = $\"Weather forecast is...\";\n\n            await context.PostAsync(message);\n\n            context.Wait(this.MessageReceived);\n        }\n\n        [LuisIntent(\"joke\")]\n        public async Task Joke(IDialogContext context, LuisResult result)\n        {\n            // confirm we hit joke intent\n            string message = $\"Let's see...I know a good joke...\";\n\n            await context.PostAsync(message);\n\n            await context.Forward(new JokeDialog(), ResumeAfterJokeDialog, context.Activity, CancellationToken.None);\n        }\n\n        [LuisIntent(\"question\")]\n        public async Task QnA(IDialogContext context, LuisResult result)\n        {\n            // confirm we hit QnA\n            string message = $\"Routing to QnA... \";\n            await context.PostAsync(message);\n\n            var userQuestion = (context.Activity as Activity).Text;\n            await context.Forward(new QnaDialog(), ResumeAfterQnA, context.Activity, CancellationToken.None);       \n        }\n\n        private async Task ResumeAfterQnA(IDialogContext context, IAwaitable<object> result)\n        {\n            context.Done<object>(null);\n        }\n\n        private async Task ResumeAfterJokeDialog(IDialogContext context, IAwaitable<object> result)\n        {\n            context.Done<object>(null);\n        }\n\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/Luis-Scorable-QnA/Luis-Scorable-Qna/Dialogs/QnaDialog.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Connector;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Builder.CognitiveServices.QnAMaker;\nusing System.Configuration;\nusing System.Net;\n\nnamespace Scorable.Dialogs\n{\n    public class QnaDialog : QnAMakerDialog\n    {\n        public QnaDialog(): base(\n            new QnAMakerService(new QnAMakerAttribute(ConfigurationManager.AppSettings[\"QnaSubscriptionKey\"], \n            ConfigurationManager.AppSettings[\"QnaKnowledgebaseId\"], \"Hmm, I wasn't able to find an article about that. Can you try asking in a different way?\", 0.5)))\n        {\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/Luis-Scorable-QnA/Luis-Scorable-Qna/Dialogs/RootDialog.cs",
    "content": "﻿using System;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\n\nnamespace Scorable.Dialogs\n{\n    [Serializable]\n    public class RootDialog : IDialog<object>\n    {\n        public Task StartAsync(IDialogContext context)\n        {\n            context.Wait(MessageReceivedAsync);\n\n            return Task.CompletedTask;\n        }\n\n        private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)\n        {\n            var activity = await result as Activity;\n            await context.Forward(new LuisDialog(), ResumeAftelLuisDialog, activity, CancellationToken.None);\n        }\n\n        private async Task ResumeAftelLuisDialog(IDialogContext context, IAwaitable<object> result)\n        {\n            context.Wait(MessageReceivedAsync);\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/Luis-Scorable-QnA/Luis-Scorable-Qna/Global.asax",
    "content": "﻿<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"Scorable.WebApiApplication\" Language=\"C#\" %>\n"
  },
  {
    "path": "blog-samples/CSharp/Luis-Scorable-QnA/Luis-Scorable-Qna/Global.asax.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Web;\nusing System.Web.Http;\nusing System.Web.Routing;\nusing Autofac;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Builder.Dialogs.Internals;\nusing Microsoft.Bot.Builder.Internals.Fibers;\nusing Microsoft.Bot.Builder.Scorables;\nusing Microsoft.Bot.Connector;\nusing Scorable.Dialogs;\n\nnamespace Scorable\n{\n\n    public class WebApiApplication : System.Web.HttpApplication\n    {\n        protected void Application_Start()\n        {\n            this.RegisterBotModules();\n\n            GlobalConfiguration.Configure(WebApiConfig.Register);\n        }\n\n        private void RegisterBotModules()\n        {\n            var builder = new ContainerBuilder();\n\n            builder.RegisterModule(new ReflectionSurrogateModule());\n\n            builder.RegisterModule<GlobalMessageHandlersBotModule>();\n\n            builder.Update(Conversation.Container);\n        }\n    }\n\n    public class GlobalMessageHandlersBotModule : Module\n    {\n        protected override void Load(ContainerBuilder builder)\n        {\n            base.Load(builder);\n\n            builder\n                .Register(c => new CommonResponsesScorable(c.Resolve<IDialogTask>()))\n                .As<IScorable<IActivity, double>>()\n                .InstancePerLifetimeScope();\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/Luis-Scorable-QnA/Luis-Scorable-Qna/Luis-Scorable-Qna-Demo.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{9CB693F7-95B3-4055-955D-BC75BC2D706B}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Scorable</RootNamespace>\n    <AssemblyName>Bot Application</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <UseIISExpress>true</UseIISExpress>\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n    <TargetFrameworkProfile />\n    <Use64BitIISExpress />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Autofac, Version=3.5.0.0, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Autofac.3.5.2\\lib\\net40\\Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Chronic, Version=0.3.2.0, Culture=neutral, PublicKeyToken=3bd1f1ef638b0d3c, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Chronic.Signed.0.3.2\\lib\\net40\\Chronic.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder, Version=3.11.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.11.0\\lib\\net46\\Microsoft.Bot.Builder.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder.Autofac, Version=3.10.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.11.0\\lib\\net46\\Microsoft.Bot.Builder.Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder.CognitiveServices.QnAMaker, Version=1.1.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.CognitiveServices.1.1.1\\lib\\net46\\Microsoft.Bot.Builder.CognitiveServices.QnAMaker.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Connector, Version=3.11.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Connector.3.11.1\\lib\\net45\\Microsoft.Bot.Connector.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"Microsoft.IdentityModel.Protocol.Extensions, Version=1.0.40306.1554, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.IdentityModel.Protocol.Extensions.1.0.4.403061554\\lib\\net45\\Microsoft.IdentityModel.Protocol.Extensions.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.Rest.ClientRuntime.2.3.2\\lib\\net45\\Microsoft.Rest.ClientRuntime.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.WindowsAzure.Configuration, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.WindowsAzure.ConfigurationManager.3.1.0\\lib\\net40\\Microsoft.WindowsAzure.Configuration.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Newtonsoft.Json.8.0.3\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.IdentityModel.Tokens.Jwt, Version=4.0.40306.1554, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\System.IdentityModel.Tokens.Jwt.4.0.4.403061554\\lib\\net45\\System.IdentityModel.Tokens.Jwt.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.Client.5.2.3\\lib\\net45\\System.Net.Http.Formatting.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net.Http.WebRequest\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.Core.5.2.3\\lib\\net45\\System.Web.Http.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.Http.WebHost, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.WebHost.5.2.3\\lib\\net45\\System.Web.Http.WebHost.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n    <Reference Include=\"System.Xml.Linq\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"default.htm\" />\n    <Content Include=\"Global.asax\" />\n    <Content Include=\"Web.config\">\n      <SubType>Designer</SubType>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"App_Start\\WebApiConfig.cs\" />\n    <Compile Include=\"Controllers\\MessagesController.cs\" />\n    <Compile Include=\"Dialogs\\CommonResponsesDialog.cs\" />\n    <Compile Include=\"Dialogs\\CommonResponsesScorable.cs\" />\n    <Compile Include=\"Dialogs\\JokeDialog.cs\" />\n    <Compile Include=\"Dialogs\\LuisDialog.cs\" />\n    <Compile Include=\"Dialogs\\QnaDialog.cs\" />\n    <Compile Include=\"Dialogs\\RootDialog.cs\" />\n    <Compile Include=\"Global.asax.cs\">\n      <DependentUpon>Global.asax</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"packages.config\">\n      <SubType>Designer</SubType>\n    </Content>\n    <None Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n    <None Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <PropertyGroup>\n    <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>3979</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost:3980/</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "blog-samples/CSharp/Luis-Scorable-QnA/Luis-Scorable-Qna/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Scorable\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Scorable\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"350db888-cab7-4454-99db-c928c7832920\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Revision and Build Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "blog-samples/CSharp/Luis-Scorable-QnA/Luis-Scorable-Qna/Web.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/Luis-Scorable-QnA/Luis-Scorable-Qna/Web.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/Luis-Scorable-QnA/Luis-Scorable-Qna/Web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  For more information on how to configure your ASP.NET application, please visit\n  http://go.microsoft.com/fwlink/?LinkId=301879\n  -->\n<configuration>\n  <appSettings>\n    <!-- update these with your BotId, Microsoft App Id and your Microsoft App Password-->\n    <add key=\"BotId\" value=\"YourBotId\" />\n    <add key=\"MicrosoftAppId\" value=\"\" />\n    <add key=\"MicrosoftAppPassword\" value=\"\" />\n    <add key=\"QnaKnowledgebaseId\" value=\"a5012468-3ada-45e9-b0c2-4bcb4c733548\" />\n    <add key=\"QnaSubscriptionKey\" value=\"f0f0ff1755524b3c8b045522129e4234\" />\n  </appSettings>\n  <!--\n    For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367.\n\n    The following attributes can be set on the <httpRuntime> tag.\n      <system.Web>\n        <httpRuntime targetFramework=\"4.6\" />\n      </system.Web>\n  -->\n  <system.web>\n    <customErrors mode=\"Off\" /> \n    <compilation debug=\"true\" targetFramework=\"4.6\" />\n    <httpRuntime targetFramework=\"4.6\" />\n  </system.web>\n  <system.webServer>\n    <defaultDocument>\n      <files>\n        <clear />\n        <add value=\"default.htm\" />\n      </files>\n    </defaultDocument>\n    \n  <handlers>\n      <remove name=\"ExtensionlessUrlHandler-Integrated-4.0\" />\n      <remove name=\"OPTIONSVerbHandler\" />\n      <remove name=\"TRACEVerbHandler\" />\n      <add name=\"ExtensionlessUrlHandler-Integrated-4.0\" path=\"*.\" verb=\"*\" type=\"System.Web.Handlers.TransferRequestHandler\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n    </handlers></system.webServer>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Helpers\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Mvc\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.WebPages\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" publicKeyToken=\"30ad4fe6b2a6aeed\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-8.0.0.0\" newVersion=\"8.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.29.0\" newVersion=\"4.2.29.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Formatting\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Bot.Connector\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-3.11.1.0\" newVersion=\"3.11.1.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Bot.Builder\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-3.11.0.0\" newVersion=\"3.11.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Bot.Builder.Autofac\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-3.10.5.0\" newVersion=\"3.10.5.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/Luis-Scorable-QnA/Luis-Scorable-Qna/default.htm",
    "content": "﻿<!DOCTYPE html>\n<html>\n<head>\n    <title></title>\n    <meta charset=\"utf-8\" />\n</head>\n<body style=\"font-family:'Segoe UI'\">\n    <h1>Luis Scorable Qna Demo Bot</h1>\n    <p>Describe your bot here and your terms of use etc.</p>\n    <p>Visit <a href=\"https://www.botframework.com/\">Bot Framework</a> to register your bot. When you register it, remember to set your bot's endpoint to <pre>https://<i>your_bots_hostname</i>/api/messages</pre></p>\n</body>\n</html>\n"
  },
  {
    "path": "blog-samples/CSharp/Luis-Scorable-QnA/Luis-Scorable-Qna/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Autofac\" version=\"3.5.2\" targetFramework=\"net46\" />\n  <package id=\"Chronic.Signed\" version=\"0.3.2\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.Client\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.Core\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.WebHost\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Bot.Builder\" version=\"3.11.0\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Bot.Builder.CognitiveServices\" version=\"1.1.1\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Bot.Connector\" version=\"3.11.1\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.IdentityModel.Protocol.Extensions\" version=\"1.0.4.403061554\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Rest.ClientRuntime\" version=\"2.3.2\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.WindowsAzure.ConfigurationManager\" version=\"3.1.0\" targetFramework=\"net46\" />\n  <package id=\"Newtonsoft.Json\" version=\"8.0.3\" targetFramework=\"net46\" />\n  <package id=\"System.IdentityModel.Tokens.Jwt\" version=\"4.0.4.403061554\" targetFramework=\"net46\" />\n</packages>"
  },
  {
    "path": "blog-samples/CSharp/Luis-Scorable-QnA/Luis-Scorable-Qna.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27004.2002\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Luis-Scorable-Qna-Demo\", \"Luis-Scorable-Qna\\Luis-Scorable-Qna-Demo.csproj\", \"{9CB693F7-95B3-4055-955D-BC75BC2D706B}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{9CB693F7-95B3-4055-955D-BC75BC2D706B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9CB693F7-95B3-4055-955D-BC75BC2D706B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{9CB693F7-95B3-4055-955D-BC75BC2D706B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9CB693F7-95B3-4055-955D-BC75BC2D706B}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {76AE3092-2BB0-4A8C-9E81-A15B8E9D662E}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "blog-samples/CSharp/MockChannel/App_Start/WebApiConfig.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web.Http;\n\nnamespace MockChannel\n{\n    public static class WebApiConfig\n    {\n        public static void Register(HttpConfiguration config)\n        {\n            // Web API configuration and services\n\n            // Web API routes\n            config.MapHttpAttributeRoutes();\n\n            config.Routes.MapHttpRoute(\n                name: \"DefaultApi\",\n                routeTemplate: \"api/{controller}/{id}\",\n                defaults: new { id = RouteParameter.Optional }\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/MockChannel/Controllers/MockChannelController.cs",
    "content": "﻿using Microsoft.Bot.Connector;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Net;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing System.Web.Http;\nusing System.Web.Http.Description;\n\nnamespace MockChannel.Controllers\n{\n    [RoutePrefix(\"v3/conversations\")]\n    public class MockChannelController : ApiController\n    {\n        /// <summary>\n        /// CreateConversation\n        /// </summary>\n        /// <remarks>\n        /// Markdown=Content\\Methods\\CreateConversation.md\n        /// </remarks>\n        /// <param name=\"parameters\">Parameters to create the conversation from</param>\n        [HttpPost]\n        [Route(\"\")]\n        public HttpResponseMessage CreateConversation([FromBody]ConversationParameters parameters)\n        {\n            Uri uri = new Uri(Request.RequestUri, \"/\");\n            var id = Guid.NewGuid().ToString(\"n\");\n            return Request.CreateResponse(HttpStatusCode.Created, new ConversationResourceResponse(id: id, serviceUrl: uri.ToString()));\n        }\n\n        /// <summary>\n        /// SendToConversation\n        /// </summary>\n        /// <remarks>\n        /// Markdown=Content\\Methods\\SendToConversation.md\n        /// </remarks>\n        /// <param name=\"conversationId\">Conversation ID</param>\n        /// <param name=\"activity\">Activity to send</param>\n        [HttpPost]\n        [Route(\"{conversationId}/activities\")]\n        public HttpResponseMessage SendToConversation(string conversationId, [FromBody]Activity activity)\n        {\n            var id = Guid.NewGuid().ToString(\"n\");\n            return Request.CreateResponse(HttpStatusCode.OK, new ResourceResponse(id: id));\n        }\n\n        /// <summary>\n        /// ReplyToActivity\n        /// </summary>\n        /// <remarks>\n        /// Markdown=Content\\Methods\\ReplyToActivity.md\n        /// </remarks>\n        /// <param name=\"activity\">Activity to send</param>\n        /// <param name=\"conversationId\">Conversation ID</param>\n        /// <param name=\"activityId\">activityId the reply is to (OPTIONAL)</param>\n        [HttpPost]\n        [Route(\"{conversationId}/activities/{activityId}\")]\n        public HttpResponseMessage ReplyToActivity(string conversationId, string activityId, [FromBody]Activity activity)\n        {\n            var id = Guid.NewGuid().ToString(\"n\");\n            return Request.CreateResponse(HttpStatusCode.OK, new ResourceResponse(id: id));\n        }\n\n        /// <summary>\n        /// UpdateActivity\n        /// </summary>\n        /// <remarks>\n        /// Markdown=Content\\Methods\\UpdateActivity.md\n        /// </remarks>\n        /// <param name=\"conversationId\">Conversation ID</param>\n        /// <param name=\"activityId\">activityId to update</param>\n        /// <param name=\"activity\">replacement Activity</param>\n        [HttpPut]\n        [Route(\"{conversationId}/activities/{activityId}\")]\n        public HttpResponseMessage UpdateActivity(string conversationId, string activityId, [FromBody]Activity activity)\n        {\n            return Request.CreateResponse(HttpStatusCode.OK, new ResourceResponse(id: activity.Id));\n        }\n\n        /// <summary>\n        /// DeleteActivity\n        /// </summary>\n        /// <remarks>\n        /// Markdown=Content\\Methods\\DeleteActivity.md\n        /// </remarks>\n        /// <param name=\"conversationId\">Conversation ID</param>\n        /// <param name=\"activityId\">activityId to delete</param>\n        [HttpDelete]\n        [Route(\"{conversationId}/activities/{activityId}\")]\n        public HttpResponseMessage DeleteActivity(string conversationId, string activityId)\n        {\n            return Request.CreateResponse(HttpStatusCode.OK);\n        }\n\n        /// <summary>\n        /// GetConversationMembers\n        /// </summary>\n        /// <remarks>\n        /// Markdown=Content\\Methods\\GetConversationMembers.md\n        /// </remarks>\n        /// <param name=\"conversationId\">Conversation ID</param>\n        [HttpGet]\n        [Route(\"{conversationId}/members\")]\n        public HttpResponseMessage GetConversationMembers(string conversationId)\n        {\n            return Request.CreateResponse(HttpStatusCode.OK, new ChannelAccount[0]);\n        }\n\n        /// <summary>\n        /// GetActivityMembers\n        /// </summary>\n        /// <remarks>\n        /// Markdown=Content\\Methods\\GetActivityMembers.md\n        /// </remarks>\n        /// <param name=\"conversationId\">Conversation ID</param>\n        /// <param name=\"activityId\">Activity ID</param>\n        [HttpGet]\n        [Route(\"{conversationId}/activities/{activityId}/members\")]\n        public HttpResponseMessage GetActivityMembers(string conversationId, string activityId)\n        {\n            return Request.CreateResponse(HttpStatusCode.OK, new ChannelAccount[0]);\n        }\n\n        /// <summary>\n        /// UploadAttachment\n        /// </summary>\n        /// <remarks>\n        /// Markdown=Content\\Methods\\UploadAttachment.md\n        /// </remarks>\n        /// <param name=\"conversationId\">Conversation ID</param>\n        /// <param name=\"attachmentUpload\">Attachment data</param>\n        [HttpPost]\n        [Route(\"{conversationId}/attachments\")]\n        public HttpResponseMessage UploadAttachment(string conversationId, [FromBody]AttachmentData attachmentUpload)\n        {\n            var id = Guid.NewGuid().ToString(\"n\");\n            return Request.CreateResponse(HttpStatusCode.OK, new ResourceResponse(id: id));\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/MockChannel/Global.asax",
    "content": "﻿<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"MockChannel.WebApiApplication\" Language=\"C#\" %>\n"
  },
  {
    "path": "blog-samples/CSharp/MockChannel/Global.asax.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Http;\nusing System.Web.Routing;\n\nnamespace MockChannel\n{\n    public class WebApiApplication : System.Web.HttpApplication\n    {\n        protected void Application_Start()\n        {\n            GlobalConfiguration.Configure(WebApiConfig.Register);\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/MockChannel/MockChannel.csproj",
    "content": "﻿<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"..\\packages\\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.7\\build\\net45\\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props\" Condition=\"Exists('..\\packages\\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.7\\build\\net45\\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')\" />\n  <Import Project=\"..\\packages\\Microsoft.Net.Compilers.2.1.0\\build\\Microsoft.Net.Compilers.props\" Condition=\"Exists('..\\packages\\Microsoft.Net.Compilers.2.1.0\\build\\Microsoft.Net.Compilers.props')\" />\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{5BC119EB-69F3-45BE-A394-5AAD86D3D355}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>MockChannel</RootNamespace>\n    <AssemblyName>MockChannel</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <UseIISExpress>true</UseIISExpress>\n    <Use64BitIISExpress />\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Microsoft.Bot.Connector, Version=3.14.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Connector.3.14.0\\lib\\net46\\Microsoft.Bot.Connector.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.7\\lib\\net45\\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"Microsoft.IdentityModel.Logging, Version=1.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Logging.1.1.4\\lib\\net451\\Microsoft.IdentityModel.Logging.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.IdentityModel.Protocols, Version=2.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Protocols.2.1.4\\lib\\net451\\Microsoft.IdentityModel.Protocols.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.IdentityModel.Protocols.OpenIdConnect, Version=2.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Protocols.OpenIdConnect.2.1.4\\lib\\net451\\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.IdentityModel.Tokens, Version=5.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Tokens.5.1.4\\lib\\net451\\Microsoft.IdentityModel.Tokens.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Rest.ClientRuntime.2.3.2\\lib\\net45\\Microsoft.Rest.ClientRuntime.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Newtonsoft.Json.9.0.1\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.IdentityModel.Tokens.Jwt, Version=5.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.IdentityModel.Tokens.Jwt.5.1.4\\lib\\net451\\System.IdentityModel.Tokens.Jwt.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Net.Http.WebRequest\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Reference Include=\"System.Net.Http.Formatting\">\n      <HintPath>..\\packages\\Microsoft.AspNet.WebApi.Client.5.2.3\\lib\\net45\\System.Net.Http.Formatting.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.Http\">\n      <HintPath>..\\packages\\Microsoft.AspNet.WebApi.Core.5.2.3\\lib\\net45\\System.Web.Http.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.Http.WebHost\">\n      <HintPath>..\\packages\\Microsoft.AspNet.WebApi.WebHost.5.2.3\\lib\\net45\\System.Web.Http.WebHost.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Global.asax\" />\n    <Content Include=\"Web.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"App_Start\\WebApiConfig.cs\" />\n    <Compile Include=\"Controllers\\MockChannelController.cs\" />\n    <Compile Include=\"Global.asax.cs\">\n      <DependentUpon>Global.asax</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n    <None Include=\"Properties\\PublishProfiles\\MockChannel - Web Deploy.pubxml\" />\n    <None Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n    <None Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <Folder Include=\"App_Data\\\" />\n    <Folder Include=\"Models\\\" />\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>51753</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost:51753/</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\packages\\Microsoft.Net.Compilers.2.1.0\\build\\Microsoft.Net.Compilers.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Microsoft.Net.Compilers.2.1.0\\build\\Microsoft.Net.Compilers.props'))\" />\n    <Error Condition=\"!Exists('..\\packages\\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.7\\build\\net45\\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.7\\build\\net45\\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props'))\" />\n  </Target>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "blog-samples/CSharp/MockChannel/MockChannel.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27130.2036\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"MockChannel\", \"MockChannel.csproj\", \"{5BC119EB-69F3-45BE-A394-5AAD86D3D355}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{5BC119EB-69F3-45BE-A394-5AAD86D3D355}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5BC119EB-69F3-45BE-A394-5AAD86D3D355}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5BC119EB-69F3-45BE-A394-5AAD86D3D355}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5BC119EB-69F3-45BE-A394-5AAD86D3D355}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {AD9C2B50-4B24-45F5-A73F-A1DF4FCF1AC8}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "blog-samples/CSharp/MockChannel/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"MockChannel\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"MockChannel\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2018\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"5bc119eb-69f3-45be-a394-5aad86d3d355\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Revision and Build Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "blog-samples/CSharp/MockChannel/README.md",
    "content": "# MockChannel\nWhen creating load tests as described in [Load testing a Bot](https://blog.botframework.com/2017/06/19/Load-Testing-A-Bot/) you need \na service to pass as the activity.ServiceUrl.\n\nThis is a sample implementation of that callback service.\n\nTo use:\n* build and deploy (say http://yourmockservice.azurewebsites.net)\n* When posting an activity to your bot from your webTest, set the activity.ServiceUrl = \"http://yourmockservice.azurewebsites.net\" \n\nWhen you run your load test generating requests to your bot, when the bot posts back it will post back to the ServiceUrl \nin the activity which is this mock service.\n"
  },
  {
    "path": "blog-samples/CSharp/MockChannel/Web.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit https://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/MockChannel/Web.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit https://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/MockChannel/Web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  For more information on how to configure your ASP.NET application, please visit\n  https://go.microsoft.com/fwlink/?LinkId=301879\n  -->\n<configuration>\n  <appSettings></appSettings>\n  <system.web>\n    <compilation debug=\"true\" targetFramework=\"4.6.1\" />\n    <httpRuntime targetFramework=\"4.6.1\" />\n  </system.web>\n  <system.webServer>\n    <handlers>\n      <remove name=\"ExtensionlessUrlHandler-Integrated-4.0\" />\n      <remove name=\"OPTIONSVerbHandler\" />\n      <remove name=\"TRACEVerbHandler\" />\n      <add name=\"ExtensionlessUrlHandler-Integrated-4.0\" path=\"*.\" verb=\"*\" type=\"System.Web.Handlers.TransferRequestHandler\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n    </handlers>\n  </system.webServer>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Helpers\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Mvc\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.WebPages\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" publicKeyToken=\"30ad4fe6b2a6aeed\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-9.0.0.0\" newVersion=\"9.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n  <system.codedom>\n    <compilers>\n      <compiler language=\"c#;cs;csharp\" extension=\".cs\" type=\"Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\" warningLevel=\"4\" compilerOptions=\"/langversion:default /nowarn:1659;1699;1701\" />\n      <compiler language=\"vb;vbs;visualbasic;vbscript\" extension=\".vb\" type=\"Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\" warningLevel=\"4\" compilerOptions=\"/langversion:default /nowarn:41008 /define:_MYTYPE=\\&quot;Web\\&quot; /optionInfer+\" />\n    </compilers>\n  </system.codedom>\n</configuration>\n"
  },
  {
    "path": "blog-samples/CSharp/MockChannel/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Microsoft.AspNet.WebApi\" version=\"5.2.3\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.AspNet.WebApi.Client\" version=\"5.2.3\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.AspNet.WebApi.Core\" version=\"5.2.3\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.AspNet.WebApi.WebHost\" version=\"5.2.3\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.Bot.Connector\" version=\"3.14.0\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.CodeDom.Providers.DotNetCompilerPlatform\" version=\"1.0.7\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.IdentityModel.Logging\" version=\"1.1.4\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.IdentityModel.Protocols\" version=\"2.1.4\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.IdentityModel.Protocols.OpenIdConnect\" version=\"2.1.4\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.IdentityModel.Tokens\" version=\"5.1.4\" targetFramework=\"net461\" />\n  <package id=\"Microsoft.Net.Compilers\" version=\"2.1.0\" targetFramework=\"net461\" developmentDependency=\"true\" />\n  <package id=\"Microsoft.Rest.ClientRuntime\" version=\"2.3.2\" targetFramework=\"net461\" />\n  <package id=\"Newtonsoft.Json\" version=\"9.0.1\" targetFramework=\"net461\" />\n  <package id=\"System.IdentityModel.Tokens.Jwt\" version=\"5.1.4\" targetFramework=\"net461\" />\n</packages>"
  },
  {
    "path": "blog-samples/CSharp/Qna-Rich-Cards/Qna-Rich-Cards/AnswerFormats/JsonQnaAnswer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\n\nnamespace Qna_Rich_Cards.AnswerFormats\n{\n    public class JsonQnaAnswer\n    {\n        public string title { get; set; }\n        public string desc { get; set; }\n        public string url { get; set; }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/Qna-Rich-Cards/Qna-Rich-Cards/App_Start/WebApiConfig.cs",
    "content": "﻿using System.Web.Http;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\n\nnamespace Qna_Rich_Cards\n{\n    public static class WebApiConfig\n    {\n        public static void Register(HttpConfiguration config)\n        {\n            // Json settings\n            config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;\n            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();\n            config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented;\n            JsonConvert.DefaultSettings = () => new JsonSerializerSettings()\n            {\n                ContractResolver = new CamelCasePropertyNamesContractResolver(),\n                Formatting = Newtonsoft.Json.Formatting.Indented,\n                NullValueHandling = NullValueHandling.Ignore,\n            };\n\n            // Web API configuration and services\n\n            // Web API routes\n            config.MapHttpAttributeRoutes();\n\n            config.Routes.MapHttpRoute(\n                name: \"DefaultApi\",\n                routeTemplate: \"api/{controller}/{id}\",\n                defaults: new { id = RouteParameter.Optional }\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/Qna-Rich-Cards/Qna-Rich-Cards/Controllers/MessagesController.cs",
    "content": "﻿using System.Net;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing System.Web.Http;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\n\nnamespace Qna_Rich_Cards\n{\n    [BotAuthentication]\n    public class MessagesController : ApiController\n    {\n        /// <summary>\n        /// POST: api/Messages\n        /// Receive a message from a user and reply to it\n        /// </summary>\n        public async Task<HttpResponseMessage> Post([FromBody]Activity activity)\n        {\n            if (activity.Type == ActivityTypes.Message)\n            {\n                await Conversation.SendAsync(activity, () => new Dialogs.QnaDialog());\n                //  await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());\n            }\n            else\n            {\n                HandleSystemMessage(activity);\n            }\n            var response = Request.CreateResponse(HttpStatusCode.OK);\n            return response;\n        }\n\n        private Activity HandleSystemMessage(Activity message)\n        {\n            if (message.Type == ActivityTypes.DeleteUserData)\n            {\n                // Implement user deletion here\n                // If we handle user deletion, return a real message\n            }\n            else if (message.Type == ActivityTypes.ConversationUpdate)\n            {\n                // Handle conversation state changes, like members being added and removed\n                // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info\n                // Not available in all channels\n            }\n            else if (message.Type == ActivityTypes.ContactRelationUpdate)\n            {\n                // Handle add/remove from contact lists\n                // Activity.From + Activity.Action represent what happened\n            }\n            else if (message.Type == ActivityTypes.Typing)\n            {\n                // Handle knowing tha the user is typing\n            }\n            else if (message.Type == ActivityTypes.Ping)\n            {\n            }\n\n            return null;\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/Qna-Rich-Cards/Qna-Rich-Cards/Dialogs/QnaDialog.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Configuration;\nusing Microsoft.Bot.Connector;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Builder.CognitiveServices.QnAMaker;\nusing Qna_Rich_Cards.AnswerFormats;\nusing Newtonsoft.Json.Linq;\n\nnamespace Qna_Rich_Cards.Dialogs\n{\n    [Serializable]\n    public class QnaDialog : QnAMakerDialog\n    {\n        public QnaDialog() : base(new QnAMakerService(new QnAMakerAttribute(ConfigurationManager.AppSettings[\"QnaSubscriptionKey\"], ConfigurationManager.AppSettings[\"QnaKnowledgebaseId\"], \"Sorry, I couldn't find an answer for that\", 0.5)))\n        {\n        }\n\n        protected override async Task RespondFromQnAMakerResultAsync(IDialogContext context, IMessageActivity message, QnAMakerResults result)\n        {\n            // answer is a string\n            var answer = result.Answers.First().Answer;\n\n            Activity reply = ((Activity)context.Activity).CreateReply();\n\n            string[] qnaAnswerData = answer.Split(';');\n            int dataSize = qnaAnswerData.Length;\n\n            string title = qnaAnswerData[0];\n            string description = qnaAnswerData[1];\n            string url = qnaAnswerData[2];\n            string imageURL = qnaAnswerData[3];\n\n            HeroCard card = new HeroCard\n            {\n                Title = title,\n                Subtitle = description,\n            };\n\n            card.Buttons = new List<CardAction>\n            {\n                new CardAction(ActionTypes.OpenUrl, \"Learn More\", value: url)\n            };\n\n            card.Images = new List<CardImage>\n            {\n                new CardImage( url = imageURL)\n            };\n\n            reply.Attachments.Add(card.ToAttachment());\n\n            // TODO: Refactor sample \n\n            // ***********************************************************************************\n            // Example using JSON formatted answer from QnA, using model from JsonQnaAnswer.cs\n            //********************************************************************************\n\n            // JsonQnaAnswer qnaAnswer = new JsonQnaAnswer();\n            // Activity reply = ((Activity)context.Activity).CreateReply();\n            // var response = JObject.Parse(answer);\n\n            // qnaAnswer.title = response.Value<string>(\"title\");\n            // qnaAnswer.desc = response.Value<string>(\"desc\");\n            // qnaAnswer.url = response.Value<string>(\"url\");\n\n            // ThumbnailCard card = new ThumbnailCard()\n            // {\n            //     Title = qnaAnswer.title,\n            //     Subtitle = qnaAnswer.desc,\n            //     Buttons = new List<CardAction>\n            //     {\n            //         new CardAction(ActionTypes.OpenUrl, \"Click Here\", value: qnaAnswer.url)\n            //     }\n            // };\n\n            // reply.Attachments.Add(card.ToAttachment());\n\n            await context.PostAsync(reply);\n        }\n    }   \n}"
  },
  {
    "path": "blog-samples/CSharp/Qna-Rich-Cards/Qna-Rich-Cards/Dialogs/RootDialog.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\n\nnamespace Qna_Rich_Cards.Dialogs\n{\n    [Serializable]\n    public class RootDialog : IDialog<object>\n    {\n        public Task StartAsync(IDialogContext context)\n        {\n            context.Wait(MessageReceivedAsync);\n\n            return Task.CompletedTask;\n        }\n\n        private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)\n        {\n            var activity = await result as Activity;\n\n            // calculate something for us to return\n            int length = (activity.Text ?? string.Empty).Length;\n\n            // return our reply to the user\n            await context.PostAsync($\"You sent {activity.Text} which was {length} characters\");\n\n            context.Wait(MessageReceivedAsync);\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/Qna-Rich-Cards/Qna-Rich-Cards/Global.asax",
    "content": "﻿<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"Qna_Rich_Cards.WebApiApplication\" Language=\"C#\" %>\n"
  },
  {
    "path": "blog-samples/CSharp/Qna-Rich-Cards/Qna-Rich-Cards/Global.asax.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Http;\nusing System.Web.Routing;\n\nnamespace Qna_Rich_Cards\n{\n    public class WebApiApplication : System.Web.HttpApplication\n    {\n        protected void Application_Start()\n        {\n            GlobalConfiguration.Configure(WebApiConfig.Register);\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/Qna-Rich-Cards/Qna-Rich-Cards/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Qna_Rich_Cards\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Qna_Rich_Cards\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"2fcba77f-8cc4-4ad2-b8e8-b41984905ac9\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Revision and Build Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "blog-samples/CSharp/Qna-Rich-Cards/Qna-Rich-Cards/Qna-Rich-Cards.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Qna_Rich_Cards</RootNamespace>\n    <AssemblyName>Bot Application</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <UseIISExpress>true</UseIISExpress>\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Autofac, Version=3.5.0.0, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Autofac.3.5.2\\lib\\net40\\Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Chronic, Version=0.3.2.0, Culture=neutral, PublicKeyToken=3bd1f1ef638b0d3c, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Chronic.Signed.0.3.2\\lib\\net40\\Chronic.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder, Version=3.5.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.Bot.Builder.3.5.5\\lib\\net46\\Microsoft.Bot.Builder.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder.Autofac, Version=3.5.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.Bot.Builder.3.5.5\\lib\\net46\\Microsoft.Bot.Builder.Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder.CognitiveServices.QnAMaker, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.CognitiveServices.1.1.0\\lib\\net46\\Microsoft.Bot.Builder.CognitiveServices.QnAMaker.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Connector, Version=3.5.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.Bot.Builder.3.5.5\\lib\\net46\\Microsoft.Bot.Connector.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"Microsoft.IdentityModel.Protocol.Extensions, Version=1.0.2.33, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.IdentityModel.Protocol.Extensions.1.0.2.206221351\\lib\\net45\\Microsoft.IdentityModel.Protocol.Extensions.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.Rest.ClientRuntime.2.3.2\\lib\\net45\\Microsoft.Rest.ClientRuntime.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.WindowsAzure.Configuration, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.WindowsAzure.ConfigurationManager.3.1.0\\lib\\net40\\Microsoft.WindowsAzure.Configuration.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Newtonsoft.Json.8.0.3\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.IdentityModel.Tokens.Jwt, Version=4.0.20622.1351, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\System.IdentityModel.Tokens.Jwt.4.0.2.206221351\\lib\\net45\\System.IdentityModel.Tokens.Jwt.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.Client.5.2.3\\lib\\net45\\System.Net.Http.Formatting.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net.Http.WebRequest\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.Core.5.2.3\\lib\\net45\\System.Web.Http.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.Http.WebHost, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.WebHost.5.2.3\\lib\\net45\\System.Web.Http.WebHost.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n    <Reference Include=\"System.Xml.Linq\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"default.htm\" />\n    <Content Include=\"Global.asax\" />\n    <Content Include=\"Web.config\">\n      <SubType>Designer</SubType>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"AnswerFormats\\JsonQnaAnswer.cs\" />\n    <Compile Include=\"App_Start\\WebApiConfig.cs\" />\n    <Compile Include=\"Controllers\\MessagesController.cs\" />\n    <Compile Include=\"Dialogs\\QnaDialog.cs\" />\n    <Compile Include=\"Dialogs\\RootDialog.cs\" />\n    <Compile Include=\"Global.asax.cs\">\n      <DependentUpon>Global.asax</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"packages.config\" />\n    <None Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n    <None Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <PropertyGroup>\n    <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>3979</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost:3979/</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "blog-samples/CSharp/Qna-Rich-Cards/Qna-Rich-Cards/Web.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/Qna-Rich-Cards/Qna-Rich-Cards/Web.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/Qna-Rich-Cards/Qna-Rich-Cards/Web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  For more information on how to configure your ASP.NET application, please visit\n  http://go.microsoft.com/fwlink/?LinkId=301879\n  -->\n<configuration>\n  <appSettings>\n    <!-- update these with your BotId, Microsoft App Id and your Microsoft App Password-->\n    <add key=\"BotId\" value=\"\" />\n    <add key=\"MicrosoftAppId\" value=\"\" />\n    <add key=\"MicrosoftAppPassword\" value=\"\" />\n    <add key=\"QnaSubscriptionKey\" value = \"f0f0ff1755524b3c8b045522129e4234\"/>\n    <add key=\"QnaKnowledgebaseId\" value = \"a5012468-3ada-45e9-b0c2-4bcb4c733548\"/>\n  </appSettings>\n  <!--\n    For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367.\n\n    The following attributes can be set on the <httpRuntime> tag.\n      <system.Web>\n        <httpRuntime targetFramework=\"4.6\" />\n      </system.Web>\n  -->\n  <system.web>\n    <customErrors mode=\"Off\" /> \n    <compilation debug=\"true\" targetFramework=\"4.6\" />\n    <httpRuntime targetFramework=\"4.6\" />\n  </system.web>\n  <system.webServer>\n    <defaultDocument>\n      <files>\n        <clear />\n        <add value=\"default.htm\" />\n      </files>\n    </defaultDocument>\n    \n  <handlers>\n      <remove name=\"ExtensionlessUrlHandler-Integrated-4.0\" />\n      <remove name=\"OPTIONSVerbHandler\" />\n      <remove name=\"TRACEVerbHandler\" />\n      <add name=\"ExtensionlessUrlHandler-Integrated-4.0\" path=\"*.\" verb=\"*\" type=\"System.Web.Handlers.TransferRequestHandler\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n    </handlers></system.webServer>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Helpers\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Mvc\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.WebPages\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" publicKeyToken=\"30ad4fe6b2a6aeed\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-8.0.0.0\" newVersion=\"8.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.29.0\" newVersion=\"4.2.29.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Formatting\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/Qna-Rich-Cards/Qna-Rich-Cards/default.htm",
    "content": "﻿<!DOCTYPE html>\n<html>\n<head>\n    <title></title>\n    <meta charset=\"utf-8\" />\n</head>\n<body style=\"font-family:'Segoe UI'\">\n    <h1>Qna_Rich_Cards</h1>\n    <p>Describe your bot here and your terms of use etc.</p>\n    <p>Visit <a href=\"https://www.botframework.com/\">Bot Framework</a> to register your bot. When you register it, remember to set your bot's endpoint to <pre>https://<i>your_bots_hostname</i>/api/messages</pre></p>\n</body>\n</html>\n"
  },
  {
    "path": "blog-samples/CSharp/Qna-Rich-Cards/Qna-Rich-Cards/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Autofac\" version=\"3.5.2\" targetFramework=\"net46\" />\n  <package id=\"Chronic.Signed\" version=\"0.3.2\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.Client\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.Core\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.WebHost\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Bot.Builder\" version=\"3.5.5\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Bot.Builder.CognitiveServices\" version=\"1.1.0\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.IdentityModel.Protocol.Extensions\" version=\"1.0.2.206221351\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Rest.ClientRuntime\" version=\"2.3.2\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.WindowsAzure.ConfigurationManager\" version=\"3.1.0\" targetFramework=\"net46\" />\n  <package id=\"Newtonsoft.Json\" version=\"8.0.3\" targetFramework=\"net46\" />\n  <package id=\"System.IdentityModel.Tokens.Jwt\" version=\"4.0.2.206221351\" targetFramework=\"net46\" />\n</packages>"
  },
  {
    "path": "blog-samples/CSharp/Qna-Rich-Cards/Qna-Rich-Cards.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26430.14\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Qna-Rich-Cards\", \"Qna-Rich-Cards\\Qna-Rich-Cards.csproj\", \"{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "blog-samples/CSharp/Qna-Rich-Cards/README.md",
    "content": "# QnA Rich Cards Bot Sample\n\nThis bot sample using the .NET SDK is to demonstrate two things:\n\n1. How to connect a bot to a QnA service using the [Bot Builder Cognitive Services](https://www.nuget.org/packages/Microsoft.Bot.Builder.CognitiveServices/) NuGet package, open source on Github [here](https://github.com/Microsoft/BotBuilder-CognitiveServices). \n\n2. How to implement overrides to the default QnAMakerDialog implementation such that a developer can 'intercept' the response activity from the QnA service and customize the reply to be posted back to a user. In this sample bot, we format the response from the QnA service into [rich card attachments](https://docs.microsoft.com/en-us/bot-framework/dotnet/bot-builder-dotnet-add-rich-card-attachments).\n\n![Qna Rich Card response][pic1]\n\n## QnA Maker overview\n\n[Click here for the QnA Maker portal](https://qnamaker.ai/)\n\n![QnA Portal][pic2]\n\nOne of the basic requirements in writing your own Bot service is to seed it with questions and answers. In many cases, the questions and answers already exist in content like FAQ URLs/documents, etc.\n\nMicrosoft QnA Maker is a free, easy-to-use, REST API and web-based service that trains AI to respond to user's questions in a more natural, conversational way. Compatible across development platforms, hosting services, and channels, QnA Maker is the only question and answer service with a graphical user interface—meaning you don’t need to be a developer to train, manage, and use it for a wide range of solutions.\n\nWith optimized machine learning logic and the ability to integrate industry-leading language processing with ease, QnA Maker distills masses of information into distinct, helpful answers.\n\n\n## Prerequisites\n\n- [Visual Studio 2015 or 2017 Community](https://www.visualstudio.com/downloads/)\n- [Bot Application Template](http://aka.ms/bf-bc-vstemplate)\n- [BotBuilder-CognitiveServices](https://www.nuget.org/packages/Microsoft.Bot.Builder.CognitiveServices/) NuGet package \n- [Bot Framework Emulator](https://docs.microsoft.com/en-us/bot-framework/debug-bots-emulator)\n\n[pic1]: ../../images/qna-rich-cards.png\n[pic2]: ../../images/qna-portal.png\n"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/.gitattributes",
    "content": "###############################################################################\n# Set default behavior to automatically normalize line endings.\n###############################################################################\n* text=auto\n\n###############################################################################\n# Set default behavior for command prompt diff.\n#\n# This is need for earlier builds of msysgit that does not have it on by\n# default for csharp files.\n# Note: This is only used by command line\n###############################################################################\n#*.cs     diff=csharp\n\n###############################################################################\n# Set the merge driver for project and solution files\n#\n# Merging from the command prompt will add diff markers to the files if there\n# are conflicts (Merging from VS is not affected by the settings below, in VS\n# the diff markers are never inserted). Diff markers may cause the following \n# file extensions to fail to load in VS. An alternative would be to treat\n# these files as binary and thus will always conflict and require user\n# intervention with every merge. To do so, just uncomment the entries below\n###############################################################################\n#*.sln       merge=binary\n#*.csproj    merge=binary\n#*.vbproj    merge=binary\n#*.vcxproj   merge=binary\n#*.vcproj    merge=binary\n#*.dbproj    merge=binary\n#*.fsproj    merge=binary\n#*.lsproj    merge=binary\n#*.wixproj   merge=binary\n#*.modelproj merge=binary\n#*.sqlproj   merge=binary\n#*.wwaproj   merge=binary\n\n###############################################################################\n# behavior for image files\n#\n# image files are treated as binary by default.\n###############################################################################\n#*.jpg   binary\n#*.png   binary\n#*.gif   binary\n\n###############################################################################\n# diff behavior for common document formats\n# \n# Convert binary document formats to text before diffing them. This feature\n# is only available from the command line. Turn it on by uncommenting the \n# entries below.\n###############################################################################\n#*.doc   diff=astextplain\n#*.DOC   diff=astextplain\n#*.docx  diff=astextplain\n#*.DOCX  diff=astextplain\n#*.dot   diff=astextplain\n#*.DOT   diff=astextplain\n#*.pdf   diff=astextplain\n#*.PDF   diff=astextplain\n#*.rtf   diff=astextplain\n#*.RTF   diff=astextplain\n"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/.gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# DNX\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# TODO: Comment the next line if you want to checkin your web deploy settings\n# but database connection strings (with potential passwords) will be unencrypted\n#*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/packages/*\n# except build/, which is used as an MSBuild target.\n!**/packages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/packages/repositories.config\n# NuGet v3's project.json files produces more ignoreable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\nnode_modules/\norleans.codegen.cs\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\n*.mdf\n*.ldf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n\n# CodeRush\n.cr/\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/README.md",
    "content": "# ScorableBot\n\nOne of the features of using Dialogs is that it encourages developers to define a conversational hierarchy.  \nThis makes sense in some user scenarios where it is important to progress through a certain set of steps before reaching an outcome. \nIt does, however have some limitations in that being explicit about the conversation hierarchy results in a conversation which \nis inflexible and often does not respond to the whim of the user. \n\nScorables are a Bot Framework mechanism by which you can compose different parts of conversations without hardcoding the hierarchy.  \nThis composition allows a fluid user experience which is akin to a natural conversation\n\nThe benefits of composing chatbot conversations in this way are:\n- Users can access different parts of the conversation without knowing the route to get there.\n- Users do not have to 'back track' conversations.\n\nThis example demonstrates this using a 'Banking Bot' scenario, where a user may issue the command 'make payment' or 'check balance' at any\npoint in the conversation.\n\nA developer wishing to implement scorable conversations should,\n\n1. Provide 1 or more implementations of Microsoft.Bot.Builder.Scorables.Internals.ScorableBase.  See ScorableCheckBalance.cs and ScorableMakePayment.cs for examples of this.\n2. Make the Autofac IOC container aware of our scorable implementations.  See Global.asax.cs for this.\n\nIn practice, the Bot Framework runtime will:\n\n1. For each scorable implementation:\n  - Call HasScore()\n  - If HasScore() is true, then call GetScore()\n2. Compare the results of GetScore() from each scorable implementation\n3. Call PostAsync() on highest scorable \n4. Call DoneAsync() on all scorables\n"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/ScorableBot/App_Start/WebApiConfig.cs",
    "content": "﻿using System.Web.Http;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\n\nnamespace ScorableTest\n{\n    public static class WebApiConfig\n    {\n        public static void Register(HttpConfiguration config)\n        {\n            // Json settings\n            config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;\n            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();\n            config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented;\n            JsonConvert.DefaultSettings = () => new JsonSerializerSettings()\n            {\n                ContractResolver = new CamelCasePropertyNamesContractResolver(),\n                Formatting = Newtonsoft.Json.Formatting.Indented,\n                NullValueHandling = NullValueHandling.Ignore,\n            };\n\n            // Web API configuration and services\n\n            // Web API routes\n            config.MapHttpAttributeRoutes();\n\n            config.Routes.MapHttpRoute(\n                name: \"DefaultApi\",\n                routeTemplate: \"api/{controller}/{id}\",\n                defaults: new { id = RouteParameter.Optional }\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/ScorableBot/Controllers/MessagesController.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Net;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing System.Web.Http;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\nusing ScorableTest.Dialogs;\n\nnamespace ScorableTest.Controllers\n{\n    [BotAuthentication]\n    public class MessagesController : ApiController\n    {\n        public async Task<HttpResponseMessage> Post([FromBody] Activity activity)\n        {\n            if (activity.Type == ActivityTypes.ConversationUpdate &&\n                activity.MembersAdded.Any(m => m.Id == activity.Recipient.Id))\n            {\n                var connector = new ConnectorClient(new Uri(activity.ServiceUrl));\n                var reply = activity.CreateReply($\"[MessagesController] You can interrupt me with IScorable by saying 'check balance' or 'make payment' at any point.  Otherwise, I will just echo back what you say to me!\");\n                await connector.Conversations.ReplyToActivityAsync(reply);\n            }\n            else if (activity.Type == ActivityTypes.Message)\n            {\n                await Conversation.SendAsync(activity, () => new RootDialog());\n            }\n\n            return Request.CreateResponse(HttpStatusCode.OK);\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/ScorableBot/Dialogs/Balance/Current/CheckBalanceCurrentDialog.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Web;\nusing Microsoft.Bot.Builder.Dialogs;\n\nnamespace ScorableTest.Dialogs.Balance.Current\n{\n    [Serializable]\n    public class CheckBalanceCurrentDialog : IDialog<object>\n    {\n        // Entry point to the Dialog\n        public async Task StartAsync(IDialogContext context)\n        {\n            await context.PostAsync(\"[CheckBalanceCurrentDialog] Your current account balance is £2000\");\n\n            // State transition - complete this Dialog and remove it from the stack\n            context.Done<object>(new object());\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/ScorableBot/Dialogs/Balance/Savings/CheckBalanceSavingsDialog.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Web;\nusing Microsoft.Bot.Builder.Dialogs;\n\nnamespace ScorableTest.Dialogs.Balance.Savings\n{\n    [Serializable]\n    public class CheckBalanceSavingsDialog : IDialog<object>\n    {        // Entry point to the Dialog\n        public async Task StartAsync(IDialogContext context)\n        {\n            await context.PostAsync(\"[CheckBalanceSavingsDialog] Your savings account balance is £5000\");\n\n            // State transition - complete this Dialog and remove it from the stack\n            context.Done<object>(new object());\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/ScorableBot/Dialogs/Balance/ScorableCheckBalance.cs",
    "content": "﻿using System.Threading;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Builder.Dialogs.Internals;\nusing Microsoft.Bot.Builder.Internals.Fibers;\nusing Microsoft.Bot.Builder.Scorables.Internals;\nusing Microsoft.Bot.Connector;\n\nnamespace ScorableTest.Dialogs.Balance\n{\n    public class ScorableCheckBalance : ScorableBase<IActivity, string, double>\n    {\n        private readonly IDialogStack stack;\n\n        public ScorableCheckBalance(IDialogStack stack)\n        {\n            SetField.NotNull(out this.stack, nameof(stack), stack);\n        }\n\n        protected override Task DoneAsync(IActivity item, string state, CancellationToken token)\n        {\n            return Task.CompletedTask;\n        }\n\n        protected override double GetScore(IActivity item, string state)\n        {\n            return state != null && state == \"scorable2-triggered\" ? 1 : 0;\n        }\n\n        protected override bool HasScore(IActivity item, string state)\n        {\n            return state != null && state == \"scorable2-triggered\";\n        }\n\n        protected override Task PostAsync(IActivity item, string state, CancellationToken token)\n        {\n            var message = item as IMessageActivity;\n            var dialog = new ScorableCheckBalanceDialog();\n            var interruption = dialog.Void(stack);\n            stack.Call(interruption, null);\n            return Task.CompletedTask;\n        }\n\n        protected override async Task<string> PrepareAsync(IActivity item, CancellationToken token)\n        {\n            var message = item.AsMessageActivity();\n            if (message == null)\n                return null;\n\n            var messageText = message.Text;\n\n            return messageText == \"check balance\" ? \"scorable2-triggered\" : null; // this value is passed to GetScore/HasScore/PostAsync and can be anything meaningful to the scoring\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/ScorableBot/Dialogs/Balance/ScorableCheckBalanceDialog.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\nusing ScorableTest.Dialogs.Balance.Current;\nusing ScorableTest.Dialogs.Balance.Savings;\n\nnamespace ScorableTest.Dialogs.Balance\n{\n    [Serializable]\n    public class ScorableCheckBalanceDialog : IDialog<object>\n    {\n        // Entry point to the Dialog\n        public async Task StartAsync(IDialogContext context)\n        {\n            await context.PostAsync(\"[ScorableCheckBalanceDialog] Which account - Current or Savings?\");\n\n            context.Wait(MessageReceivedOperationChoice);\n        }\n\n        public async Task MessageReceivedOperationChoice(IDialogContext context, IAwaitable<IMessageActivity> argument)\n        {\n            var message = await argument;\n\n            if (message.Text.Equals(\"current\", StringComparison.InvariantCultureIgnoreCase))\n            {\n                // State transition - add 'current account' Dialog to the stack, when done call AfterChildDialogIsDone callback\n                context.Call<object>(new CheckBalanceCurrentDialog(), AfterChildDialogIsDone);\n            }\n            else if (message.Text.Equals(\"savings\", StringComparison.InvariantCultureIgnoreCase))\n            {\n                // State transition - add 'savings account' Dialog to the stack, when done call AfterChildDialogIsDone callback\n                context.Call<object>(new CheckBalanceSavingsDialog(), AfterChildDialogIsDone);\n            }\n            else\n            {\n                await context.PostAsync(\"[ScorableCheckBalanceDialog] Please repeat, which account - Current or Savings?\");\n\n                // State transition - wait for 'operation choice' message from user (loop back)\n                context.Wait(MessageReceivedOperationChoice);\n            }\n        }\n\n        private async Task AfterChildDialogIsDone(IDialogContext context, IAwaitable<object> result)\n        {\n            // State transition - complete this Dialog and remove it from the stack\n            context.Done<object>(new object());\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/ScorableBot/Dialogs/MakePayment/ScorableMakePayment.cs",
    "content": "﻿using System.Threading;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Builder.Dialogs.Internals;\nusing Microsoft.Bot.Builder.Internals.Fibers;\nusing Microsoft.Bot.Builder.Scorables.Internals;\nusing Microsoft.Bot.Connector;\n\nnamespace ScorableTest.Dialogs.MakePayment\n{\n    public class ScorableMakePayment : ScorableBase<IActivity, string, double>\n    {\n        private readonly IDialogStack stack;\n\n        public ScorableMakePayment(IDialogStack stack)\n        {\n            SetField.NotNull(out this.stack, nameof(stack), stack);\n        }\n\n        protected override Task DoneAsync(IActivity item, string state, CancellationToken token)\n        {\n            return Task.CompletedTask;\n        }\n\n        protected override double GetScore(IActivity item, string state)\n        {\n            return state != null && state == \"scorable1-triggered\" ? 1 : 0;\n        }\n\n        protected override bool HasScore(IActivity item, string state)\n        {\n            return state != null && state == \"scorable1-triggered\";\n        }\n\n        protected override Task PostAsync(IActivity item, string state, CancellationToken token)\n        {\n            var message = item as IMessageActivity;\n            var dialog = new ScorableMakePaymentDialog();\n            var interruption = dialog.Void(stack);\n            stack.Call(interruption, null);\n            return Task.CompletedTask;\n        }\n\n        protected override async Task<string> PrepareAsync(IActivity item, CancellationToken token)\n        {\n            var message = item.AsMessageActivity();\n            if (message == null)\n                return null;\n\n            var messageText = message.Text;\n\n            return messageText == \"make payment\" ? \"scorable1-triggered\" : null; // this value is passed to GetScore/HasScore/PostAsync and can be anything meaningful to the scoring\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/ScorableBot/Dialogs/MakePayment/ScorableMakePaymentDialog.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\n\nnamespace ScorableTest.Dialogs\n{\n    [Serializable]\n    public class ScorableMakePaymentDialog : IDialog<object>\n    {\n        protected string payee;\n        protected string amount;\n\n        // Entry point to the Dialog\n        public async Task StartAsync(IDialogContext context)\n        {\n            await context.PostAsync($\"[ScorableMakePaymentDialog] Who would you like to pay?\");\n\n            // State transition - wait for 'payee' message from user\n            context.Wait(MessageReceivedPayee);\n        }\n\n        public async Task MessageReceivedPayee(IDialogContext context, IAwaitable<IMessageActivity> argument)\n        {\n            var message = await argument;\n            this.payee = message.Text;\n\n            await context.PostAsync($\"[ScorableMakePaymentDialog] {this.payee}, got it{Environment.NewLine}How much should I pay?\");\n\n            // State transition - wait for 'amount' message from user\n            context.Wait(MessageReceivedAmount);\n        }\n\n        public async Task MessageReceivedAmount(IDialogContext context, IAwaitable<IMessageActivity> argument)\n        {\n            var message = await argument;\n            this.amount = message.Text;\n\n            await context.PostAsync($\"[ScorableMakePaymentDialog] Thank you, I've paid {this.amount} to {this.payee} 💸\");\n\n            // State transition - complete this Dialog and remove it from the stack\n            context.Done<object>(new object());\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/ScorableBot/Dialogs/RootDialog.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\n\nnamespace ScorableTest.Dialogs\n{\n    [Serializable]\n    public class RootDialog : IDialog<object>\n    {\n        public Task StartAsync(IDialogContext context)\n        {\n            context.PostAsync($\"[RootDialog] I am the root dialog.\");\n\n            context.Wait(MessageReceivedAsync);\n\n            return Task.CompletedTask;\n        }\n\n        private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)\n        {\n            var activity = await result as IMessageActivity;\n            if (activity != null && activity.Type == ActivityTypes.Message)\n            {\n                int length = (activity.Text ?? string.Empty).Length;\n                await context.PostAsync($\"[RootDialog] You sent {activity.Text} which was {length} characters\");\n            }\n            context.Wait(MessageReceivedAsync);\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/ScorableBot/Global.asax",
    "content": "﻿<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"ScorableTest.WebApiApplication\" Language=\"C#\" %>\n"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/ScorableBot/Global.asax.cs",
    "content": "﻿using System.Web;\nusing System.Web.Http;\nusing Autofac;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Builder.Scorables;\nusing Microsoft.Bot.Connector;\nusing ScorableTest.Dialogs.Balance;\nusing ScorableTest.Dialogs.MakePayment;\n\nnamespace ScorableTest\n{\n    public class WebApiApplication : HttpApplication\n    {\n        protected void Application_Start()\n        {\n            GlobalConfiguration.Configure(WebApiConfig.Register);\n\n            // register our scorables\n            var builder = new ContainerBuilder();\n\n            builder.RegisterType<ScorableMakePayment>()\n                .As<IScorable<IActivity, double>>()\n                .InstancePerLifetimeScope();\n\n            builder.RegisterType<ScorableCheckBalance>()\n                .As<IScorable<IActivity, double>>()\n                .InstancePerLifetimeScope();\n\n            builder.Update(Conversation.Container);\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/ScorableBot/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ScorableTest\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ScorableTest\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"f082bcd0-6b15-4f7a-b77d-21b1146734b0\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Revision and Build Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/ScorableBot/ScorableBot.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ScorableTest</RootNamespace>\n    <AssemblyName>Bot Application</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <UseIISExpress>true</UseIISExpress>\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Autofac, Version=3.5.0.0, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Autofac.3.5.2\\lib\\net40\\Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Chronic, Version=0.3.2.0, Culture=neutral, PublicKeyToken=3bd1f1ef638b0d3c, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Chronic.Signed.0.3.2\\lib\\net40\\Chronic.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder, Version=3.8.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.8.3.0\\lib\\net46\\Microsoft.Bot.Builder.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder.Autofac, Version=3.8.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.8.3.0\\lib\\net46\\Microsoft.Bot.Builder.Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Connector, Version=3.8.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.8.3.0\\lib\\net46\\Microsoft.Bot.Connector.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"Microsoft.IdentityModel.Protocol.Extensions, Version=1.0.40306.1554, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Protocol.Extensions.1.0.4.403061554\\lib\\net45\\Microsoft.IdentityModel.Protocol.Extensions.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.Rest.ClientRuntime.2.3.2\\lib\\net45\\Microsoft.Rest.ClientRuntime.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.WindowsAzure.Configuration, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.WindowsAzure.ConfigurationManager.3.1.0\\lib\\net40\\Microsoft.WindowsAzure.Configuration.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Newtonsoft.Json.8.0.3\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.IdentityModel.Tokens.Jwt, Version=4.0.40306.1554, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.IdentityModel.Tokens.Jwt.4.0.4.403061554\\lib\\net45\\System.IdentityModel.Tokens.Jwt.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.Client.5.2.3\\lib\\net45\\System.Net.Http.Formatting.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net.Http.WebRequest\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.Core.5.2.3\\lib\\net45\\System.Web.Http.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.Http.WebHost, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.WebHost.5.2.3\\lib\\net45\\System.Web.Http.WebHost.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n    <Reference Include=\"System.Xml.Linq\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"default.htm\" />\n    <Content Include=\"Global.asax\" />\n    <Content Include=\"Web.config\">\n      <SubType>Designer</SubType>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"App_Start\\WebApiConfig.cs\" />\n    <Compile Include=\"Controllers\\MessagesController.cs\" />\n    <Compile Include=\"Dialogs\\Balance\\Current\\CheckBalanceCurrentDialog.cs\" />\n    <Compile Include=\"Dialogs\\Balance\\Savings\\CheckBalanceSavingsDialog.cs\" />\n    <Compile Include=\"Dialogs\\MakePayment\\ScorableMakePaymentDialog.cs\" />\n    <Compile Include=\"Dialogs\\MakePayment\\ScorableMakePayment.cs\" />\n    <Compile Include=\"Dialogs\\RootDialog.cs\" />\n    <Compile Include=\"Dialogs\\Balance\\ScorableCheckBalance.cs\" />\n    <Compile Include=\"Dialogs\\Balance\\ScorableCheckBalanceDialog.cs\" />\n    <Compile Include=\"Global.asax.cs\">\n      <DependentUpon>Global.asax</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"packages.config\" />\n    <None Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n    <None Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n  </ItemGroup>\n  <ItemGroup />\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <PropertyGroup>\n    <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>3979</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost:3979/</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/ScorableBot/Web.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/ScorableBot/Web.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/ScorableBot/Web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  For more information on how to configure your ASP.NET application, please visit\n  http://go.microsoft.com/fwlink/?LinkId=301879\n  -->\n<configuration>\n  <appSettings>\n    <!-- update these with your BotId, Microsoft App Id and your Microsoft App Password-->\n    <add key=\"BotId\" value=\"YourBotId\" />\n    <add key=\"MicrosoftAppId\" value=\"\" />\n    <add key=\"MicrosoftAppPassword\" value=\"\" />\n  </appSettings>\n  <!--\n    For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367.\n\n    The following attributes can be set on the <httpRuntime> tag.\n      <system.Web>\n        <httpRuntime targetFramework=\"4.6\" />\n      </system.Web>\n  -->\n  <system.web>\n    <customErrors mode=\"Off\" /> \n    <compilation debug=\"true\" targetFramework=\"4.6\" />\n    <httpRuntime targetFramework=\"4.6\" />\n  </system.web>\n  <system.webServer>\n    <defaultDocument>\n      <files>\n        <clear />\n        <add value=\"default.htm\" />\n      </files>\n    </defaultDocument>\n    \n  <handlers>\n      <remove name=\"ExtensionlessUrlHandler-Integrated-4.0\" />\n      <remove name=\"OPTIONSVerbHandler\" />\n      <remove name=\"TRACEVerbHandler\" />\n      <add name=\"ExtensionlessUrlHandler-Integrated-4.0\" path=\"*.\" verb=\"*\" type=\"System.Web.Handlers.TransferRequestHandler\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n    </handlers></system.webServer>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Helpers\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Mvc\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.WebPages\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" publicKeyToken=\"30ad4fe6b2a6aeed\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-8.0.0.0\" newVersion=\"8.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.29.0\" newVersion=\"4.2.29.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Formatting\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/ScorableBot/default.htm",
    "content": "﻿<!DOCTYPE html>\n<html>\n<head>\n    <title></title>\n    <meta charset=\"utf-8\" />\n</head>\n<body style=\"font-family:'Segoe UI'\">\n    <h1>ScorableTest</h1>\n    <p>Describe your bot here and your terms of use etc.</p>\n    <p>Visit <a href=\"https://www.botframework.com/\">Bot Framework</a> to register your bot. When you register it, remember to set your bot's endpoint to <pre>https://<i>your_bots_hostname</i>/api/messages</pre></p>\n</body>\n</html>\n"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/ScorableBot/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Autofac\" version=\"3.5.2\" targetFramework=\"net46\" />\n  <package id=\"Chronic.Signed\" version=\"0.3.2\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.Client\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.Core\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.WebHost\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Bot.Builder\" version=\"3.8.3.0\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.IdentityModel.Protocol.Extensions\" version=\"1.0.4.403061554\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Rest.ClientRuntime\" version=\"2.3.2\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.WindowsAzure.ConfigurationManager\" version=\"3.1.0\" targetFramework=\"net46\" />\n  <package id=\"Newtonsoft.Json\" version=\"8.0.3\" targetFramework=\"net46\" />\n  <package id=\"System.IdentityModel.Tokens.Jwt\" version=\"4.0.4.403061554\" targetFramework=\"net46\" />\n</packages>"
  },
  {
    "path": "blog-samples/CSharp/ScorableBotSample/ScorableBotSample.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26403.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ScorableBot\", \"ScorableBot\\ScorableBot.csproj\", \"{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/.gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\n[Xx]64/\n[Xx]86/\n[Bb]uild/\nbld/\n[Bb]in/\n[Oo]bj/\nGenerated Files/\n\n# Visual Studio 2015 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# DNX\n*project.lock.json\nartifacts/\n\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n\n# TODO: Un-comment the next line if you do not want to checkin \n# your web deploy settings because they may include unencrypted\n# passwords\n#*.pubxml\n*.publishproj\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/packages/*\n# except build/, which is used as an MSBuild target.\n!**/packages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/packages/repositories.config\n# NuGet v3's project.json files produces more ignoreable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directory\nAppPackages/\nBundleArtifacts/\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.pfx\n*.publishsettings\nnode_modules/\norleans.codegen.cs\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\n*.mdf\n*.ldf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# LightSwitch generated files\nGeneratedArtifacts/\nModelManifest.xml\n\n# Paket dependency manager\n.paket/paket.exe\n\n# FAKE - F# Make\n.fake/\n/BotFrameworkHost/Properties/PublishProfiles/Bot-33A768ED-4803-44E6-814B-9DDC90FCECF3 - Web Deploy.pubxml\n/CafeBotv2/BotData\n/RadeAgent2RTree\n\n# BingSpeechBindings downloaded native code\nSpeechSDK.framework/\nSpeechSDK.framework*\nlibandroid_platform.so"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017 Maxwell Miller\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/README.md",
    "content": "# TriviaBotSpeechSample\nA sample trivia bot, leveraging the Microsoft Bot Framework and https://opentdb.com/ that showcases the use of the new speech-enabled Microsoft.Bot.Client NuGet package and Microsoft Bot Framework C# Builder SDK features.\n\nThis sample contains two projects, a trivia bot built on top of the Microsoft Bot Framework C# Builder SDK, and a UWP app that talks to the bot using the Microsoft.Bot.Client NuGet package.\n\nAs this is a combined client/sample demo, there is a bit of setup required.\n\nSetup:\n1) Register a bot with the Bot Framework at http://dev.botframework.com/ and add the AppId and AppPassword to TriviaBot\\Web.config.\n2) Enable the Direct Line channel in the bot settings page, Add a new site and paste a Direct Line secret in TriviaApp\\BotConnection.cs.\n3) Create a LUIS app on http://luis.ai/ and import TriviaBotLU.json as a new app. Train and publish the model, and add the app id and subscription key in TriviaBot\\TriviaDialog.cs (there is an error pointing to the location).\n    The LUIS app id and subscription key can be extracted from the Endpoint Url provided on the \"Publish App\" page at http://luis.ai/\n    The link format is: https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/yourappid?subscription-key=yoursubscriptionkey&verbose=true&q=.\n4) Publish the Bot as an Azure App Service, and add the public endpoint (yourhosturl/api/messages) to the Bot Framework portal settings page. Make sure to use https instead of http in the url.\n5) [Optional] To improve speech recognition for your bot: On  http://dev.botframework.com/ go to the bot's settings. In the \"Speech recognition priming with LUIS\" section you should see a list of LUIS apps associated with the account you are logged in with. Check the new LUIS app you created for this bot and hit save. This information is used to improve speech recognition when you speak to this bot and uses the Cognitive Speech apis for speech recognition. Speech recognition priming improves the recognition accuracy for the utterances and entities defined in your LUIS app for this bot.\n\nTo start a conversation with this bot, you can say something like \"let's play trivia\" or \"let's play geography trivia\"\n\nYou can talk to your new bot in multiple ways. Here are some options to try, all of which support speech input and output:\n1) Using the TriviaApp included in this sample. Simply hit F5 in Visual Studio \n2) Using the bot framework emulator https://docs.microsoft.com/en-us/bot-framework/debug-bots-emulator.\n2) Host your own instance of the Bot Framework WebChat client:  https://aka.ms/BfWebChat    \n3) Enabled your bot as a Cortana Skill. Simply enable the Cortana channel and provide an invocation phrase. Then make sure you are logged in to cortana using the same microsoft account, and say \"Ask <invocation name> to start a game of trivia\". Cortana should trigger your bot!\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaApp/App.xaml",
    "content": "﻿<Application\n    x:Class=\"TrivaApp.App\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:local=\"using:TrivaApp\"\n    RequestedTheme=\"Dark\"\n    xmlns:converters=\"using:TrivaApp.Converters\">\n\n    <Application.Resources>\n\n        <converters:BoolToVisibilityConverter x:Key=\"BoolToVisibilityConverter\"/>\n\n    </Application.Resources>\n    \n</Application>\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaApp/App.xaml.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing Windows.ApplicationModel;\nusing Windows.ApplicationModel.Activation;\nusing Windows.UI.Xaml;\nusing Windows.UI.Xaml.Controls;\nusing Windows.UI.Xaml.Navigation;\n\nnamespace TrivaApp\n{\n    /// <summary>\n    /// Provides application-specific behavior to supplement the default Application class.\n    /// </summary>\n    sealed partial class App : Application\n    {\n        /// <summary>\n        /// Initializes the singleton application object.  This is the first line of authored code\n        /// executed, and as such is the logical equivalent of main() or WinMain().\n        /// </summary>\n        public App()\n        {\n            this.InitializeComponent();\n            this.Suspending += OnSuspending;\n        }\n\n        private Frame HandleCommonActivation(IActivatedEventArgs args)\n        {\n            Frame rootFrame = Window.Current.Content as Frame;\n\n            // Do not repeat app initialization when the Window already has content,\n            // just ensure that the window is active\n            if (rootFrame == null)\n            {\n                // Create a Frame to act as the navigation context and navigate to the first page\n                rootFrame = new Frame();\n\n                rootFrame.NavigationFailed += OnNavigationFailed;\n\n                if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)\n                {\n                    //TODO: Load state from previously suspended application\n                }\n\n                // Place the frame in the current Window\n                Window.Current.Content = rootFrame;\n            }\n\n            return rootFrame;\n        }\n\n        /// <summary>\n        /// Invoked when the application is launched normally by the end user.  Other entry points\n        /// will be used such as when the application is launched to open a specific file.\n        /// </summary>\n        /// <param name=\"args\">Details about the launch request and process.</param>\n        protected override void OnLaunched(LaunchActivatedEventArgs args)\n        {\n#if DEBUG\n            if (System.Diagnostics.Debugger.IsAttached)\n            {\n                this.DebugSettings.EnableFrameRateCounter = true;\n            }\n#endif\n\n            var rootFrame = HandleCommonActivation(args);\n\n            if (args.PrelaunchActivated == false)\n            {\n                if (rootFrame.Content == null)\n                {\n                    // When the navigation stack isn't restored navigate to the first page,\n                    // configuring the new page by passing required information as a navigation\n                    // parameter\n                    rootFrame.Navigate(typeof(MainPage), args.Arguments);\n                }\n\n                // TODO: If you want to launch fullscreen, uncomment this line.\n                //ApplicationView.PreferredLaunchWindowingMode = ApplicationViewWindowingMode.FullScreen;\n\n                // Ensure the current window is active\n                Window.Current.Activate();\n            }\n\n            base.OnLaunched(args);\n        }\n\n        protected override void OnActivated(IActivatedEventArgs args)\n        {\n#if DEBUG\n            if (System.Diagnostics.Debugger.IsAttached)\n            {\n                this.DebugSettings.EnableFrameRateCounter = true;\n            }\n#endif\n            if (args.Kind == ActivationKind.Protocol)\n            {\n                var rootFrame = HandleCommonActivation(args);\n\n                var eventArgs = (ProtocolActivatedEventArgs)args;\n                var uri = eventArgs.Uri;\n                var linkData = uri.AbsolutePath.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);\n                if (linkData.Count() > 0 && uri.Host == \"play\" && linkData[0] == \"gameshow\")\n                {\n                    rootFrame.Navigate(typeof(MainPage), \"gameshow-start\");\n                }\n\n                // Ensure the current window is active\n                Window.Current.Activate();\n            }\n        }\n\n        /// <summary>\n        /// Invoked when Navigation to a certain page fails\n        /// </summary>\n        /// <param name=\"sender\">The Frame which failed navigation</param>\n        /// <param name=\"e\">Details about the navigation failure</param>\n        void OnNavigationFailed(object sender, NavigationFailedEventArgs e)\n        {\n            throw new Exception(\"Failed to load Page \" + e.SourcePageType.FullName);\n        }\n\n        /// <summary>\n        /// Invoked when application execution is being suspended.  Application state is saved\n        /// without knowing whether the application will be terminated or resumed with the contents\n        /// of memory still intact.\n        /// </summary>\n        /// <param name=\"sender\">The source of the suspend request.</param>\n        /// <param name=\"e\">Details about the suspend request.</param>\n        private void OnSuspending(object sender, SuspendingEventArgs e)\n        {\n            var deferral = e.SuspendingOperation.GetDeferral();\n            //TODO: Save application state and stop any background activity\n            deferral.Complete();\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaApp/BotConnection.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nnamespace TrivaApp\n{\n    public static class BotConnection\n    {\n        #error You must specify the direct line secret of the bot to talk to\n        #error This requires first publishing the TriviaBot project and configuring it on https://dev.botframework.com/\n        public static string DirectLineSecret { get; } = \"Your DirectLine secret here\";\n\n        #error Please provide a Bing Speech API key, if the Cognitive Services speech recognizer or synthesizer are used.\"\n        public static string BingSpeechKey { get; } = \"Your Bing Speech API key here\";\n\n        public static string ApplicationName { get; }  = \"TriviaApp\";\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaApp/Converters/BoolToVisibilityConverter.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nusing System;\nusing Windows.UI.Xaml;\nusing Windows.UI.Xaml.Data;\n\nnamespace TrivaApp.Converters\n{\n    public class BoolToVisibilityConverter : IValueConverter\n    {\n        public object Convert(object value, Type targetType, object parameter, string language)\n        {\n            if (parameter is string && (parameter as string).Equals(\"invert\", StringComparison.CurrentCultureIgnoreCase))\n            {\n                if (value is bool)\n                {\n                    value = !(bool)value;\n                }\n            }\n\n            if (value is bool && (bool)value)\n            {\n                return Visibility.Visible;\n            }\n\n            return Visibility.Collapsed;\n        }\n\n        public object ConvertBack(object value, Type targetType, object parameter, string language)\n        {\n            throw new NotImplementedException();\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaApp/MainPage.xaml",
    "content": "﻿<Page x:Class=\"TrivaApp.MainPage\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n      xmlns:local=\"using:TrivaApp\"\n      xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n      xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n      DataContext=\"{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}\"\n      mc:Ignorable=\"d\">\n    <Viewbox Stretch=\"Uniform\">\n        <Pivot x:Name=\"ViewPivot\"\n               SelectedIndex=\"{Binding GameFormat}\" \n               SelectionChanged=\"Pivot_SelectionChanged\"\n               Width=\"1920\"\n               Height=\"1080\"\n           >\n            <Pivot.Background>\n                <ImageBrush Stretch=\"None\"\n                            ImageSource=\"Assets/BG.png\"/>\n            </Pivot.Background>\n            <PivotItem Header=\"GAMESHOW\" >\n                <Canvas>\n                    <Canvas x:Name=\"Questions\"\n                            Width=\"1922\"\n                            Height=\"1081\"\n                            Canvas.Top=\"73\"\n                            Canvas.Left=\"0\"\n                            Visibility=\"{Binding ShowAnswerCards, Converter={StaticResource BoolToVisibilityConverter}}\" d:IsLocked=\"True\">\n                        <Canvas.Background>\n                            <ImageBrush Stretch=\"None\"\n                                        ImageSource=\"Assets/Answer_3.png\"/>\n                        </Canvas.Background>\n                    </Canvas>\n                    <Canvas x:Name=\"GotItRight\"\n                            Width=\"886\"\n                            Height=\"586\"\n                            Canvas.Left=\"420\"\n                            Canvas.Top=\"150\"\n                            Visibility=\"{Binding ShowGotItRight, Converter={StaticResource BoolToVisibilityConverter}}\" d:IsLocked=\"True\">\n                        <Canvas.Background>\n                            <ImageBrush Stretch=\"None\"\n                                        ImageSource=\"Assets/Check_Right.png\"/>\n                        </Canvas.Background>\n                    </Canvas>\n                    <Canvas x:Name=\"GotItWrong\"\n                            Width=\"254\"\n                            Height=\"586\"\n                            Canvas.Left=\"456\"\n                            Canvas.Top=\"208\"\n                            Visibility=\"{Binding ShowGotItWrong, Converter={StaticResource BoolToVisibilityConverter}}\" d:IsLocked=\"True\">\n                        <Canvas.Background>\n                            <ImageBrush Stretch=\"None\"\n                                        ImageSource=\"Assets/X_Left.png\"/>\n                        </Canvas.Background>\n                    </Canvas>\n                    <!-- TODO: Remove transparent top half of this image and fix height so it isn't either squished or covering the pivot header -->\n                    <Canvas x:Name=\"Dash\"\n                            HorizontalAlignment=\"Center\"\n                            VerticalAlignment=\"Bottom\"\n                            Width=\"1922\"\n                            Height=\"1035\">\n                        <Canvas.Background>\n                            <ImageBrush Stretch=\"Fill\"\n                                        ImageSource=\"Assets/Dash_with_Labels.png\"/>\n                        </Canvas.Background>\n                    </Canvas>\n                    <!-- Scoreboard -->\n                    <TextBlock x:Name=\"Score0\"\n                               TextAlignment=\"Center\"\n                               FontSize=\"50\"\n                               FontWeight=\"Bold\"\n                               Height=\"80\"\n                               Width=\"160\"\n                               Canvas.Left=\"540\"\n                               Canvas.Top=\"725\"\n                               Text=\"{Binding Score0}\"/>\n                    <TextBlock x:Name=\"Score0Label\"\n                               TextAlignment=\"Center\"\n                               FontSize=\"20\"\n                               Height=\"50\"\n                               Width=\"160\"\n                               Canvas.Left=\"540\"\n                               Canvas.Top=\"787\"\n                               Text=\"{Binding Score0Label}\"/>\n                    <TextBlock x:Name=\"Score1\"\n                               TextAlignment=\"Center\"\n                               FontSize=\"50\"\n                               FontWeight=\"Bold\"\n                               Height=\"80\"\n                               Width=\"160\"\n                               Canvas.Left=\"1220\"\n                               Canvas.Top=\"725\"\n                               Text=\"{Binding Score1}\"/>\n                    <TextBlock x:Name=\"Score1Label\"\n                               TextAlignment=\"Center\"\n                               FontSize=\"20\"\n                               Height=\"50\"\n                               Width=\"160\"\n                               Canvas.Left=\"1220\"\n                               Canvas.Top=\"787\"\n                               Text=\"{Binding Score1Label}\"/>\n                    <!-- Countdown timer -->\n                    <Button x:Name=\"LightningModeButton\"\n                            Canvas.Left=\"863\"\n                            Canvas.Top=\"697\"\n                            Width=\"194\"\n                            Height=\"84\"\n                            BorderThickness=\"0\"\n                            Background=\"Transparent\"\n                            Click=\"LightningModeButton_Click\" >\n                        <TextBlock x:Name=\"CountdownTimer\"\n                                   TextAlignment=\"Center\"\n                                   Height=\"84\"\n                                   Width=\"194\"\n                                   FontSize=\"60\"\n                                   FontWeight=\"Bold\"\n                                   Foreground=\"White\"\n                                   Canvas.Left=\"863\"\n                                   Canvas.Top=\"697\"\n                                   Text=\"{Binding RemainingTime}\"/>\n                    </Button>\n                    <!-- Mic button -->\n                    <Button x:Name=\"Mic\"\n                            Canvas.Left=\"1584\"\n                            Canvas.Top=\"763\"\n                            Width=\"82\"\n                            Height=\"146\"\n                            Background=\"Transparent\"\n                            Click=\"MicButton_Click\" />\n                    <!-- Bot message -->\n                    <Border Background=\"#B7190530\"\n                                   Canvas.Left=\"40\"\n                            BorderThickness=\"0\">\n                        <TextBlock x:Name=\"QuestionText\"\n                                   Width=\"1800\"\n                                   Height=\"147\"\n                                   FontSize=\"45\"\n                                   TextWrapping=\"Wrap\"\n                                   Foreground=\"AliceBlue\"\n                                   Text=\"{Binding LastBotMessage}\"\n                                   Canvas.Top=\"6\"/>\n                    </Border>\n                    <!-- List of answers -->\n                    <!--\n                        TODO: Make this 4 separate controls\n                        that are aligned with the projector rectangles\n                        and the one that's chosen stays around when the\n                        check or X shows up while the others disappear\n                        TODO: Add a second projector rectangles canvas\n                        for the 2-question case.\n                    -->\n                    <ListView x:Name=\"AnswerOptions\"\n                              BorderBrush=\"Black\"\n                              Width=\"839\"\n                              Height=\"528\"\n                              ItemsSource=\"{Binding AnswerCards}\"\n                              SelectionChanged=\"AnswerOptions_SelectionChanged\"\n                              Canvas.Left=\"182\"\n                              Canvas.Top=\"169\" >\n                        <ListView.ItemContainerStyle>\n                            <Style TargetType=\"ListViewItem\">\n                                <Setter Property=\"HorizontalContentAlignment\"\n                                        Value=\"Stretch\" />\n                                <Setter Property=\"Margin\"\n                                        Value=\"4\" />\n                            </Style>\n                        </ListView.ItemContainerStyle>\n                        <ListView.ItemTemplate>\n                            <DataTemplate>\n                                <StackPanel Margin=\"4\"\n                                            Height=\"116\"\n                                            Orientation=\"Horizontal\"\n                                            >\n                                    <TextBlock Padding=\"4\"\n                                               FontSize=\"42\"\n                                               FontWeight=\"ExtraBold\"\n                                               Foreground=\"Black\"\n                                               Text=\"{Binding Path=Index}\" />\n                                    <TextBlock Padding=\"4\"\n                                               FontSize=\"50\"\n                                               TextWrapping=\"NoWrap\"\n                                               Foreground=\"Black\"\n                                               Text=\"{Binding Path=AnswerText}\" />\n                                </StackPanel>\n                            </DataTemplate>\n                        </ListView.ItemTemplate>\n                    </ListView>\n                    <!-- User's response -->\n                    <Border x:Name=\"HypothesisText\"\n                            Width=\"542\"\n                            Height=\"418\"\n                            Canvas.Left=\"1285\"\n                            Canvas.Top=\"247\"\n                            Background=\"#B7190530\"\n                            Visibility=\"{Binding ShowHypothesisText, Converter={StaticResource BoolToVisibilityConverter}}\">\n                        <TextBlock\n                        Margin=\"20\"\n                        FontSize=\"55\"\n                        FontStyle=\"Italic\"\n                        TextWrapping=\"Wrap\"\n                        Text=\"{Binding HypothesisText}\"/>\n                    </Border>\n                    <!-- Category buttons -->\n                    <Button x:Name=\"CategoryFilm\"\n                            Canvas.Left=\"431\"\n                            Canvas.Top=\"846\"\n                            Width=\"147\"\n                            Height=\"86\"\n                            BorderThickness=\"0\"\n                            Background=\"Transparent\"\n                            Click=\"CategoryFilm_Click\"\n                        >\n                        <Image\n                        Width=\"147\"\n                        Height=\"86\"\n                        Visibility=\"{Binding ShowCategoryFilm, Converter={StaticResource BoolToVisibilityConverter}}\"\n                        Source=\"Assets/ON_Film.png\"\n                       />\n                    </Button>\n                    <Button x:Name=\"CategoryAnimals\"\n                            Canvas.Left=\"576\"\n                            Canvas.Top=\"848\"\n                            Width=\"148\"\n                            Height=\"85\"\n                            BorderThickness=\"0\"\n                            Background=\"Transparent\"\n                            Click=\"CategoryAnimals_Click\"\n                        >\n                        <Image\n                        Width=\"148\"\n                        Height=\"85\"\n                        Visibility=\"{Binding ShowCategoryAnimals, Converter={StaticResource BoolToVisibilityConverter}}\"\n                        Source=\"Assets/ON_Animals.png\"\n                       />\n                    </Button>\n                    <Button x:Name=\"CategoryScience\"\n                            Canvas.Left=\"719\"\n                            Canvas.Top=\"848\"\n                            Width=\"147\"\n                            Height=\"85\"\n                            BorderThickness=\"0\"\n                            Background=\"Transparent\"\n                            Click=\"CategoryScience_Click\">\n                        <Image\n                            Width=\"147\"\n                            Height=\"85\"\n                            Visibility=\"{Binding ShowCategoryScience, Converter={StaticResource BoolToVisibilityConverter}}\"\n                            Source=\"Assets/ON_Science.png\"\n                       />\n                    </Button>\n                    <Button x:Name=\"CategoryAll\"\n                           Canvas.Left=\"863\"\n                           Canvas.Top=\"838\"\n                            Width=\"192\"\n                            Height=\"100\"\n                            BorderThickness=\"0\"\n                            Background=\"Transparent\"\n                            Click=\"CategoryAll_Click\">\n                        <Image\n                           Width=\"192\"\n                           Height=\"100\"\n                           Visibility=\"{Binding ShowCategoryAll, Converter={StaticResource BoolToVisibilityConverter}}\"\n                           Source=\"Assets/ON_All.png\"\n                        />\n                    </Button>\n                    <Button x:Name=\"CategoryGeography\"\n                            Canvas.Left=\"1046\"\n                            Canvas.Top=\"846\"\n                            Width=\"147\"\n                            Height=\"85\"\n                            BorderThickness=\"0\"\n                            Background=\"Transparent\"\n                            Click=\"CategoryGeography_Click\">\n                        <Image\n                            Width=\"147\"\n                            Height=\"85\"\n                            Visibility=\"{Binding ShowCategoryGeography, Converter={StaticResource BoolToVisibilityConverter}}\"\n                            Source=\"Assets/ON_Geography.png\"\n                       />\n                    </Button>\n                    <Button x:Name=\"CategoryMusic\"\n                            Canvas.Left=\"1189\"\n                            Canvas.Top=\"846\"\n                            Width=\"148\"\n                            Height=\"85\"\n                            BorderThickness=\"0\"\n                            Background=\"Transparent\"\n                            Click=\"CategoryMusic_Click\">\n                        <Image\n                            Width=\"148\"\n                            Height=\"85\"\n                            Visibility=\"{Binding ShowCategoryMusic, Converter={StaticResource BoolToVisibilityConverter}}\"\n                            Source=\"Assets/ON_Music.png\"\n                       />\n                    </Button>\n                    <Button x:Name=\"CategoryArt\"\n                            Canvas.Left=\"1336\"\n                            Canvas.Top=\"846\"\n                            Width=\"147\"\n                            Height=\"85\"\n                            BorderThickness=\"0\"\n                            Background=\"Transparent\"\n                            Click=\"CategoryArt_Click\">\n                        <Image\n                            Width=\"147\"\n                            Height=\"85\"\n                            Visibility=\"{Binding ShowCategoryArt, Converter={StaticResource BoolToVisibilityConverter}}\"\n                            Source=\"Assets/ON_Art.png\"\n                       />\n                    </Button>\n\n                </Canvas>\n            </PivotItem>\n            <PivotItem Header=\"CHAT\">\n                <Grid Padding=\"400, 10, 400, 10\" >\n                    <Grid.RowDefinitions>\n                        <RowDefinition Height=\"*\"/>\n                        <RowDefinition Height=\"Auto\"/>\n                    </Grid.RowDefinitions>\n                    <!-- Scrolling chat messages go here -->\n                    <ScrollViewer Grid.Row=\"0\"\n                                  x:Name=\"ScrollView\"\n                                  HorizontalScrollBarVisibility=\"Disabled\"\n                                  VerticalScrollBarVisibility=\"Hidden\" >\n                        <StackPanel Name=\"stackPanel\"\n                                    BorderThickness=\"0\"\n                                    Orientation=\"Vertical\"\n                                    LayoutUpdated=\"StackPanel_LayoutUpdated\"\n                                    IsDoubleTapEnabled=\"False\"\n                                    IsHitTestVisible=\"False\"\n                                    IsHoldingEnabled=\"False\"\n                                    IsRightTapEnabled=\"False\"\n                                    IsTapEnabled=\"False\" >\n                            <ItemsControl ItemsSource=\"{Binding ChatCards}\">\n                                <ItemsControl.ItemTemplate>\n                                    <DataTemplate>\n                                        <Border Margin=\"5, 10, 5, 10\"\n                                                HorizontalAlignment=\"{Binding Path=BorderAlignment}\"\n                                                Background=\"#B7190530\"\n                                                >\n                                            <TextBlock Padding=\"15, 10, 15, 10\"\n                                                     FontSize=\"30\"\n                                                     TextWrapping=\"Wrap\"\n                                                     Text=\"{Binding Path=Message}\"\n                                                     />\n                                        </Border>\n                                    </DataTemplate>\n                                </ItemsControl.ItemTemplate>\n                            </ItemsControl>\n                        </StackPanel>\n                    </ScrollViewer>\n                    <!-- Chat typing/speech input area -->\n                    <Grid Grid.Row=\"1\"\n                          HorizontalAlignment=\"Stretch\"\n                          Margin=\"2\" >\n                        <Grid.ColumnDefinitions>\n                            <ColumnDefinition Width=\"*\"/>\n                            <ColumnDefinition Width=\"Auto\"/>\n                        </Grid.ColumnDefinitions>\n                        <TextBox Grid.Column=\"0\"\n                                 x:Name=\"textBox\"\n                                 FontSize=\"36\"\n                                 TextWrapping=\"Wrap\"\n                                 IsEnabled=\"{Binding EnableUserInput,FallbackValue=false}\"\n                                 PlaceholderText=\"{Binding SuggestionText}\"\n                                 Text=\"{Binding HypothesisText}\"\n                                 KeyUp=\"TextBox_KeyPressedEventHandler\" />\n                        <Button Grid.Column=\"1\"\n                                Margin=\"4\"\n                                x:Name=\"MicButton\"\n                                IsEnabled=\"{Binding EnableUserInput, FallbackValue=false}\"\n                                Click=\"MicButton_Click\" >\n                            <Image Source=\"Assets/Icon_Mic.png\"/>\n                        </Button>\n                    </Grid>\n                </Grid>\n            </PivotItem>\n        </Pivot>\n    </Viewbox>\n</Page>"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaApp/MainPage.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.ComponentModel;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Client.SpeechRecognition;\nusing Microsoft.Bot.Client.SpeechSynthesis;\nusing Microsoft.Bot.Connector.DirectLine;\nusing TrivaApp.ViewModels;\nusing TriviaBot.Shared;\nusing Windows.Foundation;\nusing Windows.UI.Xaml;\nusing Windows.UI.Xaml.Controls;\nusing Windows.UI.Xaml.Input;\nusing Windows.UI.Xaml.Navigation;\n\nnamespace TrivaApp\n{\n    /// <summary>\n    /// An empty page that can be used on its own or navigated to within a Frame.\n    /// </summary>\n    public sealed partial class MainPage : Page\n    {\n        private const string IdleSuggestionText = \"Type or tap mic and speak.\";\n\n        private const string ListeningText = \"Listening...\";\n\n        private const string SpeechRecognitionTriggerPhrase = \"hey trivia bot\";\n\n        private const string BotNameTag = \"🤖\";\n\n        private const string UserNameTag = \"👤\";\n\n        private Microsoft.Bot.Client.BotClient _botClient = null;\n\n        private bool _isListening;\n\n        private bool _textAddedToBottom;\n\n        private Task _startConversationTask;\n\n        private ObservableCollection<ChatCard> _chatCards = new ObservableCollection<ChatCard>();\n\n        private ObservableCollection<AnswerCard> _answerCards = new ObservableCollection<AnswerCard>();\n\n        private CountdownTimer _countdownTimer = new CountdownTimer();\n\n        private bool _startCountdownTimer;\n\n        private int _wrongAnswers;\n\n        private int _rightAnswers;\n\n        private bool _lightningMode = false;\n\n        public MainPage()\n        {\n            this.InitializeComponent();\n\n            var windowsSpeechRecognizer = new WindowsSpeechRecognizer();\n\n            // Create the client. By default, it will poll the REST endpoint provided by the direct line, but optionally, we can give it a websocket implementation to use\n            _botClient = new Microsoft.Bot.Client.BotClient(BotConnection.DirectLineSecret, BotConnection.ApplicationName)\n            {\n                // Use the speech synthesizer implementation in the WinRT Windows.Media.SpeechSynthesis namespace\n                // Any voice supported by the API can be used. See this page as a reference: https://docs.microsoft.com/en-us/azure/cognitive-services/speech/api-reference-rest/bingvoiceoutput\n                // The Built-in Windows speech synthesizer can be used here as an alternative, for a free solution:\n                // SpeechSynthesizer = new WindowsSpeechSynthesizer(),\n                SpeechSynthesizer = new CognitiveServicesSpeechSynthesizer(BotConnection.BingSpeechKey, Microsoft.Bot.Client.SpeechSynthesis.CognitiveServices.VoiceNames.Jessa_EnUs),\n\n                // Use the Cognitive Services Speech-To-Text API, with speech priming support, as the speech recognizer\n                // The Built-in WindowsSpeechRecognizer can be used here as an alternative, for a free solution:\n                // SpeechRecognizer = windowsSpeechRecognizer,\n                SpeechRecognizer = new CognitiveServicesSpeechRecognizer(BotConnection.BingSpeechKey),\n\n                // Give us the ability to trigger speech recognition on keywords\n                // The WindowsMediaSpeechRecognizer can also be used as the primary speech recognizer, instead of CognitiveServicesSpeechRecognizer (above)\n                // for a free solution.\n                TriggerRecognizer = windowsSpeechRecognizer\n            };\n\n            // Attach to the callbacks the client provides for observing the state of the bot\n            // This will be called every time the bot sends down an activity\n            _botClient.ConversationUpdated += OnConversationUpdated;\n\n            // Speech-related events\n            _botClient.SpeechRecognitionStarted += OnSpeechRecognitionStarted;\n            _botClient.IntermediateSpeechRecognitionResultReceived += OnIntermediateSpeechRecognitionResultReceived;\n            _botClient.SpeechRecognitionEnded += OnSpeechRecognitionEnded;\n            _botClient.FinalSpeechRecognitionResultReceived += OnFinalSpeechRecognitionResultReceived;\n            _botClient.SpeechSynthesisEnded += OnSpeechSynthesisEnded;\n\n            // Set triggers, so that, when the user says \"listen\" or \"what is\" the bot client will start speech recognition\n            _botClient.SetStartSpeechRecognitionTriggers(new string[] { \"listen\", \"trivia bot\" });\n\n            _countdownTimer.PropertyChanged += UpdateCountdown;\n\n            // Kick off the conversation\n            _startConversationTask = _botClient.StartConversation();\n        }\n\n        protected override async void OnNavigatedTo(NavigationEventArgs e)\n        {\n            if (e.Parameter is string && (string)e.Parameter == \"gameshow-start\")\n            {\n                _model[\"GameFormat\"] = 0;\n\n                var entities = new List<Microsoft.Bot.Connector.DirectLine.Entity> { new Microsoft.Bot.Connector.DirectLine.Entity(\"skipIntro\") };\n                await _botClient.SendMessageToBot(\"play in lightning mode\", entities);\n            }\n        }\n\n        private ObservableDictionary _model = new ObservableDictionary\n        {\n            { \"GameFormat\", 1 },\n            { \"HypothesisText\", \"play trivia\" },\n            { \"SuggestionText\", IdleSuggestionText },\n            { \"LastBotMessage\", string.Empty },\n            { \"RemainingTime\", \"∞\" },\n            { \"EnableUserInput\", true },\n            { \"Score0\", \"0\" },\n            { \"Score0Label\", \"INCORRECT\" },\n            { \"Score1\", \"0\" },\n            { \"Score1Label\", \"CORRECT\" },\n            { \"ShowHypothesisText\", false },\n            { \"ShowGotItRight\", false },\n            { \"ShowGotItWrong\", false },\n            { \"ShowCategoryAll\", true },\n            { \"ShowCategoryFilm\", false },\n            { \"ShowCategoryAnimals\", false },\n            { \"ShowCategoryScience\", false },\n            { \"ShowCategoryGeography\", false },\n            { \"ShowCategoryMusic\", false },\n            { \"ShowCategoryArt\", false }\n        };\n\n        private readonly string[] _categories = new string[]\n        {\n            \"All\",\n            \"Film\",\n            \"Animals\",\n            \"Science\",\n            \"Geography\",\n            \"Music\",\n            \"Art\"\n        };\n\n        public ObservableDictionary DefaultViewModel\n        {\n            get\n            {\n                return _model;\n            }\n        }\n\n        private enum MessageSource\n        {\n            User,\n            Bot\n        }\n\n        private IAsyncAction RunOnUi(Windows.UI.Core.DispatchedHandler action)\n        {\n            return Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, action);\n        }\n\n        private async void OnSpeechRecognitionStarted(object sender, EventArgs e) => await RunOnUi(async () =>\n        {\n            await _botClient.SpeechSynthesizer.StopSpeakingAsync();\n            _isListening = true;\n            _model[\"HypothesisText\"] = string.Empty;\n            _model[\"SuggestionText\"] = ListeningText;\n            _model[\"ShowHypothesisText\"] = true;\n        });\n\n        private async void OnIntermediateSpeechRecognitionResultReceived(object sender, SpeechRecognitionResultEventArgs e) => await RunOnUi(() =>\n        {\n            if (e.Result.Status == SpeechRecognitionStatus.Success)\n            {\n                _model[\"HypothesisText\"] = e?.Result?.Text ?? string.Empty;\n            }\n        });\n\n        private async void OnSpeechRecognitionEnded(object sender, EventArgs e) => await RunOnUi(() =>\n        {\n            _model[\"HypothesisText\"] = string.Empty;\n            _model[\"SuggestionText\"] = IdleSuggestionText;\n            _model[\"ShowHypothesisText\"] = false;\n            _isListening = false;\n        });\n\n        private async void OnFinalSpeechRecognitionResultReceived(object sender, SpeechRecognitionResultEventArgs e) => await RunOnUi(async () =>\n        {\n            if (e.Result.Status == SpeechRecognitionStatus.Success && e.Result.Text?.Length > 0)\n            {\n                AddChatMessage(MessageSource.User, e.Result.Text);\n                await _botClient.SendMessageToBot(e.Result.Text);\n            }\n        });\n\n        private async void OnConversationUpdated(object sender, Activity e) => await RunOnUi(() =>\n        {\n            var appEntities = (AppEntities)null;\n\n            // Don't do anything for messages this client sent\n            if (e.From.Id == _botClient.ClientID)\n            {\n                return;\n            }\n\n            if (e.Entities != null)\n            {\n                appEntities =\n                    (from entity in e.Entities\n                     where entity.Type == \"AppEntities\"\n                     select entity).FirstOrDefault()?.GetAs<AppEntities>();\n\n                if (appEntities != null)\n                {\n                    // Parse message type\n                    if (appEntities.MessageType != null)\n                    {\n                        var messageType = appEntities.MessageType;\n\n                        _model[\"ShowGotItRight\"] = false;\n                        _model[\"ShowGotItWrong\"] = false;\n\n                        if (messageType != MessageType.Question)\n                        {\n                            _answerCards.Clear();\n                            UpdateAnswerCards();\n                            _countdownTimer.Reset();\n                            _model[\"RemainingTime\"] = \"∞\";\n\n                            switch (messageType)\n                            {\n                                case MessageType.Statement:\n                                    break;\n                                case MessageType.GotItRight:\n                                    ++_rightAnswers;\n                                    _model[\"Score1\"] = _rightAnswers;\n                                    _model[\"ShowGotItRight\"] = true;\n                                    break;\n                                case MessageType.GotItWrong:\n                                    ++_wrongAnswers;\n                                    _model[\"Score0\"] = _wrongAnswers;\n                                    _model[\"ShowGotItWrong\"] = true;\n                                    break;\n                                case MessageType.StartLightningMode:\n                                    _lightningMode = true;\n                                    break;\n                                case MessageType.StopLightningMode:\n                                    _lightningMode = false;\n                                    break;\n                            }\n                        }\n                    }\n                }\n            }\n\n            if (!string.IsNullOrEmpty(e.Text))\n            {\n                var choicesMessage = string.Empty;\n\n                // Parse choices\n                if (appEntities?.MessageType == MessageType.Question)\n                {\n                    // We've received a question from the bot. Tell the bot client that the user is likely to say one of\n                    // these options, so it can specifically listen for them (supported in the Microsoft.Bot.Client.Universal.WindowsMediaSpeechRecognizer)\n                    _botClient.ListenFor(appEntities.TriviaAnswerOptions);\n\n                    _answerCards.Clear();\n                    var index = 1;\n                    foreach (var option in appEntities.TriviaAnswerOptions ?? Enumerable.Empty<string>())\n                    {\n                        _answerCards.Add(new AnswerCard { Index = $\"{index}.\", AnswerText = $\" {option}\" });\n                        choicesMessage += $\"\\n    {index}. {option}\";\n                        ++index;\n                    }\n                    UpdateAnswerCards();\n\n                    _startCountdownTimer = true;\n                }\n\n                _model[\"LastBotMessage\"] = e.Text;\n\n                AddChatMessage(MessageSource.Bot, e.Text + choicesMessage);\n            }\n        });\n\n        private void UpdateAnswerCards()\n        {\n            _model[\"AnswerCards\"] = _answerCards;\n            _model[\"ShowAnswerCards\"] = _answerCards.Count > 0;\n        }\n\n        private async void OnSpeechSynthesisEnded(object sender, EventArgs e) => await RunOnUi(() =>\n        {\n            if (_startCountdownTimer)\n            {\n                if (_lightningMode)\n                {\n                    _countdownTimer.Start(TimeSpan.FromSeconds(10));\n                }\n                _startCountdownTimer = false;\n            }\n        });\n\n        private async void UpdateCountdown(object sender, PropertyChangedEventArgs e)\n        {\n            var timeLeft = _countdownTimer.RemainingTime;\n            if (timeLeft.TotalMilliseconds == 0)\n            {\n                _countdownTimer.Reset();\n                _model[\"RemainingTime\"] = \"∞\";\n\n                var appEntities = new AppEntities\n                {\n                    MessageType = MessageType.OutOfTime\n                };\n\n                var dlEntity = new Microsoft.Bot.Connector.DirectLine.Entity();\n                dlEntity.SetAs(appEntities);\n\n                // Send an entity to the bot to tell it that the user has run out of time.\n                await _botClient.SendMessageToBot(null, new[] { dlEntity });\n            }\n            else\n            {\n                _model[\"RemainingTime\"] = timeLeft.TotalSeconds.ToString(\"0.00\");\n            }\n        }\n\n        private void AddChatMessage(MessageSource messageSource, string message)\n        {\n            _textAddedToBottom = true;\n\n            var newCard = new ChatCard();\n\n            if (messageSource == MessageSource.Bot)\n            {\n                newCard.Message = BotNameTag + \"\\n\" + message;\n                newCard.BorderAlignment = HorizontalAlignment.Left;\n            }\n            else if (messageSource == MessageSource.User)\n            {\n                newCard.Message = UserNameTag + \"\\n\" + message;\n                newCard.BorderAlignment = HorizontalAlignment.Right;\n            }\n\n            _chatCards.Add(newCard);\n\n            _model[\"ChatCards\"] = _chatCards;\n        }\n\n        private async void TextBox_KeyPressedEventHandler(object sender, KeyRoutedEventArgs e)\n        {\n            if (e.Key == Windows.System.VirtualKey.Enter)\n            {\n                string s = textBox.Text;\n                textBox.Text = string.Empty;\n                _model[\"HypothesisText\"] = string.Empty;\n\n                if (!string.IsNullOrWhiteSpace(s))\n                {\n                    AddChatMessage(MessageSource.User, s);\n\n                    // Send the user's message to the bot\n                    await _botClient.SendMessageToBot(s);\n                }\n            }\n        }\n\n        private void StackPanel_LayoutUpdated(object sender, object e)\n        {\n            if (_textAddedToBottom)\n            {\n                ScrollView.ChangeView(null, double.MaxValue, null);\n\n                _textAddedToBottom = false;\n            }\n        }\n\n        private void MicButton_Click(object sender, RoutedEventArgs e)\n        {\n            if (_isListening)\n            {\n                _botClient.AutoSpeechRecognition = false;\n                _botClient.CancelSpeechRecognition();\n            }\n            else\n            {\n                _botClient.StartSpeechRecognition();\n                _botClient.AutoSpeechRecognition = true;\n            }\n        }\n\n        private async void AnswerOptions_SelectionChanged(object sender, SelectionChangedEventArgs e)\n        {\n            var selectedIndex = AnswerOptions.SelectedIndex;\n            if (selectedIndex >= 0 && selectedIndex < _answerCards.Count)\n            {\n                _botClient.AutoSpeechRecognition = false;\n                await _botClient.CancelSpeechSynthesis();\n\n                var choice = _answerCards[selectedIndex].AnswerText;\n                _answerCards.Clear();\n                _model[\"AnswerCards\"] = _answerCards;\n\n                AddChatMessage(MessageSource.User, choice);\n                await _botClient.SendMessageToBot(choice);\n            }\n        }\n\n        private async Task SetCategory(string category)\n        {\n            // If the user clicked a category, stop any kind of speech input/output and just send the\n            // category to the bot.\n            await _botClient.SpeechRecognizer.CancelRecognitionAsync();\n            await _botClient.SpeechSynthesizer.StopSpeakingAsync();\n\n            await _botClient.SendMessageToBot(\"switch to category \" + category);\n\n            foreach (var c in _categories)\n            {\n                var visibilityFlag = \"ShowCategory\" + c;\n                var visibility = c == category;\n                if (!_model.ContainsKey(visibilityFlag)\n                    || (bool)_model[visibilityFlag] != visibility)\n                {\n                    _model[visibilityFlag] = visibility;\n                }\n            }\n        }\n\n        private async void CategoryFilm_Click(object sender, RoutedEventArgs e)\n        {\n            await SetCategory(\"Film\");\n        }\n\n        private async void CategoryAnimals_Click(object sender, RoutedEventArgs e)\n        {\n            await SetCategory(\"Animals\");\n        }\n\n        private async void CategoryScience_Click(object sender, RoutedEventArgs e)\n        {\n            await SetCategory(\"Science\");\n        }\n\n        private async void CategoryAll_Click(object sender, RoutedEventArgs e)\n        {\n            await SetCategory(\"All\");\n        }\n\n        private async void CategoryGeography_Click(object sender, RoutedEventArgs e)\n        {\n            await SetCategory(\"Geography\");\n        }\n\n        private async void CategoryMusic_Click(object sender, RoutedEventArgs e)\n        {\n            await SetCategory(\"Music\");\n        }\n\n        private async void CategoryArt_Click(object sender, RoutedEventArgs e)\n        {\n            await SetCategory(\"Art\");\n        }\n\n        private void LightningModeButton_Click(object sender, RoutedEventArgs e)\n        {\n            _botClient.CancelSpeechSynthesis();\n            _botClient.CancelSpeechRecognition();\n\n            if (_lightningMode)\n            {\n                _botClient?.SendMessageToBot(\"stop lightning mode\");\n            }\n            else\n            {\n                _botClient?.SendMessageToBot(\"start lightning mode\");\n            }\n        }\n\n        private void Pivot_SelectionChanged(object sender, SelectionChangedEventArgs e)\n        {\n            // The gameshow view showcases speech input and output,\n            // while the chat view showcases a simple chat control.\n            // Enable automatic speech interactions only when on the\n            // gameshow view.\n            UpdateAnswerCards();\n            if (ViewPivot.SelectedIndex == 0)\n            {\n                _botClient.AutoSpeechRecognition = true;\n                _botClient.AutoSpeechSynthesis = true;\n            }\n            else\n            {\n                _botClient.AutoSpeechRecognition = false;\n                _botClient.AutoSpeechSynthesis = false;\n                _botClient.CancelSpeechSynthesis();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaApp/Package.appxmanifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Package xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10\" xmlns:mp=\"http://schemas.microsoft.com/appx/2014/phone/manifest\" xmlns:uap=\"http://schemas.microsoft.com/appx/manifest/uap/windows10\" IgnorableNamespaces=\"uap mp\">\n  <Identity Name=\"e30a4ced-6294-4f80-9da4-9d87a9365578\" Publisher=\"CN=Microsoft\" Version=\"1.0.3.0\" />\n  <mp:PhoneIdentity PhoneProductId=\"e30a4ced-6294-4f80-9da4-9d87a9365578\" PhonePublisherId=\"00000000-0000-0000-0000-000000000000\" />\n  <Properties>\n    <DisplayName>TriviaBotApp</DisplayName>\n    <PublisherDisplayName>Microsoft</PublisherDisplayName>\n    <Logo>Assets\\StoreLogo.png</Logo>\n  </Properties>\n  <Dependencies>\n    <TargetDeviceFamily Name=\"Windows.Universal\" MinVersion=\"10.0.0.0\" MaxVersionTested=\"10.0.0.0\" />\n  </Dependencies>\n  <Resources>\n    <Resource Language=\"x-generate\" />\n  </Resources>\n  <Applications>\n    <Application Id=\"App\" Executable=\"$targetnametoken$.exe\" EntryPoint=\"TriviaApp.App\">\n      <uap:VisualElements DisplayName=\"TriviaApp\" Square150x150Logo=\"Assets\\Square150x150Logo.png\" Square44x44Logo=\"Assets\\Square44x44Logo.png\" Description=\"A client app frontend for a speech-enabled bot framework bot.\" BackgroundColor=\"transparent\">\n        <uap:DefaultTile Wide310x150Logo=\"Assets\\Wide310x150Logo.png\" Square310x310Logo=\"Assets\\LargeTile.png\" Square71x71Logo=\"Assets\\SmallTile.png\">\n        </uap:DefaultTile>\n        <uap:SplashScreen Image=\"Assets\\SplashScreen.png\" />\n        <uap:InitialRotationPreference>\n          <uap:Rotation Preference=\"landscape\" />\n        </uap:InitialRotationPreference>\n      </uap:VisualElements>\n      <Extensions>\n        <uap:Extension Category=\"windows.protocol\">\n          <uap:Protocol Name=\"triviaapp\">\n            <uap:DisplayName>Trivia App</uap:DisplayName>\n          </uap:Protocol>\n        </uap:Extension>\n      </Extensions>\n    </Application>\n  </Applications>\n  <Capabilities>\n    <Capability Name=\"internetClient\" />\n    <DeviceCapability Name=\"microphone\" />\n  </Capabilities>\n</Package>"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaApp/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"TrivaApp\")]\n[assembly: AssemblyDescription(\"A speech-enabled trivia client app that is driven by a bot.\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"TriviaApp\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n[assembly: ComVisible(false)]"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaApp/Properties/Default.rd.xml",
    "content": "<!--\n    This file contains Runtime Directives used by .NET Native. The defaults here are suitable for most\n    developers. However, you can modify these parameters to modify the behavior of the .NET Native\n    optimizer.\n\n    Runtime Directives are documented at http://go.microsoft.com/fwlink/?LinkID=391919\n\n    To fully enable reflection for App1.MyClass and all of its public/private members\n    <Type Name=\"App1.MyClass\" Dynamic=\"Required All\"/>\n\n    To enable dynamic creation of the specific instantiation of AppClass<T> over System.Int32\n    <TypeInstantiation Name=\"App1.AppClass\" Arguments=\"System.Int32\" Activate=\"Required Public\" />\n\n    Using the Namespace directive to apply reflection policy to all the types in a particular namespace\n    <Namespace Name=\"DataClasses.ViewModels\" Seralize=\"All\" />\n-->\n\n<Directives xmlns=\"http://schemas.microsoft.com/netfx/2013/01/metadata\">\n  <Application>\n    <!--\n      An Assembly element with Name=\"*Application*\" applies to all assemblies in\n      the application package. The asterisks are not wildcards.\n    -->\n    <Assembly Name=\"*Application*\" Dynamic=\"Required All\" />\n    \n    \n    <!-- Add your application specific runtime directives here. -->\n\n\n  </Application>\n</Directives>"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaApp/TriviaApp.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">x86</Platform>\n    <ProjectGuid>{59DCDA8D-3407-4585-9B70-BBAD7DA51694}</ProjectGuid>\n    <OutputType>AppContainerExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>TriviaBotApp</RootNamespace>\n    <AssemblyName>TriviaBotApp</AssemblyName>\n    <DefaultLanguage>en-US</DefaultLanguage>\n    <TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>\n    <TargetPlatformVersion>10.0.14393.0</TargetPlatformVersion>\n    <TargetPlatformMinVersion>10.0.10586.0</TargetPlatformMinVersion>\n    <MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <PackageCertificateKeyFile>TriviaBotApp_TemporaryKey.pfx</PackageCertificateKeyFile>\n    <AppxAutoIncrementPackageRevision>True</AppxAutoIncrementPackageRevision>\n    <AppxBundle>Always</AppxBundle>\n    <AppxBundlePlatforms>x86|x64|arm</AppxBundlePlatforms>\n    <PackageCertificateThumbprint>9D2C610F90B8324AC7A66E9C602E25CAD0D678C1</PackageCertificateThumbprint>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x86'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x86'\">\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|ARM'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\ARM\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|ARM'\">\n    <OutputPath>bin\\ARM\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <ItemGroup>\n    <!-- A reference to the entire .Net Framework and Windows SDK are automatically included -->\n    <None Include=\"packages.config\">\n      <SubType>Designer</SubType>\n    </None>\n    <None Include=\"project.json\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\TriviaBot\\Shared\\AppEntities.cs\">\n      <Link>Shared\\AppEntities.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\TriviaBot\\Shared\\MessageType.cs\">\n      <Link>Shared\\MessageType.cs</Link>\n    </Compile>\n    <Compile Include=\"App.xaml.cs\">\n      <DependentUpon>App.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"BotConnection.cs\" />\n    <Compile Include=\"Converters\\BoolToVisibilityConverter.cs\" />\n    <Compile Include=\"MainPage.xaml.cs\">\n      <DependentUpon>MainPage.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"ViewModels\\AnswerCard.cs\" />\n    <Compile Include=\"ViewModels\\ChatCard.cs\" />\n    <Compile Include=\"ViewModels\\CountdownTimer.cs\" />\n    <Compile Include=\"ViewModels\\ObservableDictionary.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <AppxManifest Include=\"Package.appxmanifest\">\n      <SubType>Designer</SubType>\n    </AppxManifest>\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Assets\\Answer_2.png\" />\n    <Content Include=\"Assets\\Answer_3.png\" />\n    <Content Include=\"Assets\\Answer_4.png\" />\n    <Content Include=\"Assets\\BG.png\" />\n    <Content Include=\"Assets\\Chat_Categories.png\" />\n    <Content Include=\"Assets\\Check_Left_2_Player_Only.png\" />\n    <Content Include=\"Assets\\Check_Right.png\" />\n    <Content Include=\"Assets\\Dash_No_Labels.png\" />\n    <Content Include=\"Assets\\Dash_with_Labels.png\" />\n    <Content Include=\"Assets\\Icon_Bot.png\" />\n    <Content Include=\"Assets\\Icon_Mic.png\" />\n    <Content Include=\"Assets\\Icon_User.png\" />\n    <Content Include=\"Assets\\LargeTile.scale-100.png\" />\n    <Content Include=\"Assets\\LargeTile.scale-125.png\" />\n    <Content Include=\"Assets\\LargeTile.scale-150.png\" />\n    <Content Include=\"Assets\\LargeTile.scale-200.png\" />\n    <Content Include=\"Assets\\LargeTile.scale-400.png\" />\n    <Content Include=\"Assets\\ON_ALL.png\" />\n    <Content Include=\"Assets\\ON_Animals.png\" />\n    <Content Include=\"Assets\\ON_Art.png\" />\n    <Content Include=\"Assets\\ON_Film.png\" />\n    <Content Include=\"Assets\\ON_Geography.png\" />\n    <Content Include=\"Assets\\ON_Music.png\" />\n    <Content Include=\"Assets\\ON_Science.png\" />\n    <Content Include=\"Assets\\SmallTile.scale-100.png\" />\n    <Content Include=\"Assets\\SmallTile.scale-125.png\" />\n    <Content Include=\"Assets\\SmallTile.scale-150.png\" />\n    <Content Include=\"Assets\\SmallTile.scale-200.png\" />\n    <Content Include=\"Assets\\SmallTile.scale-400.png\" />\n    <Content Include=\"Assets\\SplashScreen.scale-100.png\" />\n    <Content Include=\"Assets\\SplashScreen.scale-125.png\" />\n    <Content Include=\"Assets\\SplashScreen.scale-150.png\" />\n    <Content Include=\"Assets\\SplashScreen.scale-400.png\" />\n    <Content Include=\"Assets\\Square150x150Logo.scale-100.png\" />\n    <Content Include=\"Assets\\Square150x150Logo.scale-125.png\" />\n    <Content Include=\"Assets\\Square150x150Logo.scale-150.png\" />\n    <Content Include=\"Assets\\Square150x150Logo.scale-400.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.altform-unplated_targetsize-16.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.altform-unplated_targetsize-256.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.altform-unplated_targetsize-32.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.altform-unplated_targetsize-48.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.scale-100.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.scale-125.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.scale-150.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.scale-400.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.targetsize-16.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.targetsize-24.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.targetsize-256.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.targetsize-32.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.targetsize-48.png\" />\n    <Content Include=\"Assets\\Wide310x150Logo.scale-100.png\" />\n    <Content Include=\"Assets\\Wide310x150Logo.scale-125.png\" />\n    <Content Include=\"Assets\\Wide310x150Logo.scale-150.png\" />\n    <Content Include=\"Assets\\Wide310x150Logo.scale-400.png\" />\n    <Content Include=\"Assets\\X_Left.png\" />\n    <Content Include=\"Properties\\Default.rd.xml\" />\n    <Content Include=\"Assets\\LockScreenLogo.scale-200.png\" />\n    <Content Include=\"Assets\\SplashScreen.scale-200.png\" />\n    <Content Include=\"Assets\\Square150x150Logo.scale-200.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.scale-200.png\" />\n    <Content Include=\"Assets\\Square44x44Logo.targetsize-24_altform-unplated.png\" />\n    <Content Include=\"Assets\\StoreLogo.png\" />\n    <Content Include=\"Assets\\Wide310x150Logo.scale-200.png\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ApplicationDefinition Include=\"App.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </ApplicationDefinition>\n    <Page Include=\"MainPage.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n  </ItemGroup>\n  <PropertyGroup Condition=\" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' \">\n    <VisualStudioVersion>14.0</VisualStudioVersion>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\Microsoft\\WindowsXaml\\v$(VisualStudioVersion)\\Microsoft.Windows.UI.Xaml.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaApp/ViewModels/AnswerCard.cs",
    "content": "﻿namespace TrivaApp.ViewModels\n{\n    internal class AnswerCard\n    {\n        public string Index { get; set; }\n        public string AnswerText { get; set; }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaApp/ViewModels/ChatCard.cs",
    "content": "﻿using Windows.UI.Xaml;\n\nnamespace TrivaApp.ViewModels\n{\n    internal class ChatCard\n    {\n        public HorizontalAlignment BorderAlignment { get; set; }       \n\n        public string Message { get; set; }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaApp/ViewModels/CountdownTimer.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing Windows.UI.Xaml;\n\nnamespace TrivaApp.ViewModels\n{\n    internal class CountdownTimer : INotifyPropertyChanged\n    {\n        private DispatcherTimer _timer;\n\n        private DateTime _endTime;\n       \n        public CountdownTimer()\n        {\n            _timer = new DispatcherTimer\n            {\n                Interval = TimeSpan.FromMilliseconds(100)\n            };\n\n            _endTime = DateTime.UtcNow;\n\n            _timer.Tick += (sender, e) =>\n            {\n                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(\"TimeRemaining\"));\n            };\n        }\n\n        public TimeSpan RemainingTime\n        {\n            get\n            {\n                var remainingTime = _endTime - DateTime.UtcNow;\n                return remainingTime.TotalMilliseconds < 0 ? TimeSpan.FromMilliseconds(0) : remainingTime;\n            }\n        }\n\n        public void Start(TimeSpan remainingTime)\n        {\n            _endTime = DateTime.UtcNow + remainingTime;\n            _timer.Start();\n        }\n\n        public void Reset()\n        {\n            _timer.Stop();\n            _endTime = DateTime.UtcNow;\n        }\n\n        public event PropertyChangedEventHandler PropertyChanged;\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaApp/ViewModels/ObservableDictionary.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nusing System.Collections.Generic;\nusing System.Linq;\nusing Windows.Foundation.Collections;\n\nnamespace TrivaApp\n{\n    /// <summary>\n    /// Implementation of IObservableMap that supports reentrancy for use as a default view\n    /// model.\n    /// </summary>\n    public class ObservableDictionary : IObservableMap<string, object>\n    {\n        /// <summary>\n        /// The underlying dictionary to build on\n        /// </summary>\n        private Dictionary<string, object> _dictionary = new Dictionary<string, object>();\n\n        /// <summary>\n        /// Triggers when the map is changed\n        /// </summary>\n        public event MapChangedEventHandler<string, object> MapChanged;\n\n        /// <summary>\n        /// Gets the keys that exist in this map\n        /// </summary>\n        public ICollection<string> Keys\n        {\n            get\n            {\n                return _dictionary.Keys;\n            }\n        }\n\n        /// <summary>\n        /// Gets the values in this dictionary\n        /// </summary>\n        public ICollection<object> Values\n        {\n            get\n            {\n                return _dictionary.Values;\n            }\n        }\n\n        /// <summary>\n        /// Gets how many elements are in the dictionary\n        /// </summary>\n        public int Count\n        {\n            get\n            {\n                return _dictionary.Count;\n            }\n        }\n\n        /// <summary>\n        /// Gets a value indicating whether this dictionary is readonly or not\n        /// </summary>\n        public bool IsReadOnly\n        {\n            get\n            {\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Gets and sets elements in this dictionary using the [] indexer\n        /// </summary>\n        /// <param name=\"key\">The key value to access</param>\n        /// <returns>The object that is identified by key</returns>\n        public object this[string key]\n        {\n            get\n            {\n                return _dictionary[key];\n            }\n\n            set\n            {\n                _dictionary[key] = value;\n                InvokeMapChanged(CollectionChange.ItemChanged, key);\n            }\n        }\n\n        /// <summary>\n        /// Does this dictionary contain item\n        /// </summary>\n        /// <param name=\"item\">The element to look up</param>\n        /// <returns>true if the dictionary contains item, otherwise false</returns>\n        public bool Contains(KeyValuePair<string, object> item)\n        {\n            return _dictionary.Contains(item);\n        }\n\n        /// <summary>\n        /// Does this dictionary contain key\n        /// </summary>\n        /// <param name=\"key\">The key to lookup in the dictionary</param>\n        /// <returns>true if the dictionary contains key, otherwise false</returns>\n        public bool ContainsKey(string key)\n        {\n            return _dictionary.ContainsKey(key);\n        }\n\n        /// <summary>\n        /// Looks up key in the dictionary and sets value to the result\n        /// </summary>\n        /// <param name=\"key\">The key to look up</param>\n        /// <param name=\"value\">The reference to store the result in</param>\n        /// <returns>true if successful, otherwise false</returns>\n        public bool TryGetValue(string key, out object value)\n        {\n            return _dictionary.TryGetValue(key, out value);\n        }\n\n        /// <summary>\n        /// Adds the key/value pair to the dictionary\n        /// </summary>\n        /// <param name=\"key\">The key to use</param>\n        /// <param name=\"value\">The value to store</param>\n        public void Add(string key, object value)\n        {\n            _dictionary.Add(key, value);\n            InvokeMapChanged(CollectionChange.ItemInserted, key);\n        }\n\n        /// <summary>\n        /// Adds the key/value pair to the dictionary\n        /// </summary>\n        /// <param name=\"item\">The key/value pair to store</param>\n        public void Add(KeyValuePair<string, object> item)\n        {\n            Add(item.Key, item.Value);\n        }\n\n        /// <summary>\n        /// Removes the key and its associated value from the dictionary\n        /// </summary>\n        /// <param name=\"key\">The key to remove</param>\n        /// <returns>true if key existed, otherwise false</returns>\n        public bool Remove(string key)\n        {\n            if (_dictionary.Remove(key))\n            {\n                InvokeMapChanged(CollectionChange.ItemRemoved, key);\n                return true;\n            }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Removes the key/value pair from the dictionary\n        /// </summary>\n        /// <param name=\"item\">The key/value pair to remove</param>\n        /// <returns>true if the key/value pair existed in the dictionary</returns>\n        public bool Remove(KeyValuePair<string, object> item)\n        {\n            object currentValue;\n            if (_dictionary.TryGetValue(item.Key, out currentValue) &&\n                object.Equals(item.Value, currentValue) && _dictionary.Remove(item.Key))\n            {\n                InvokeMapChanged(CollectionChange.ItemRemoved, item.Key);\n                return true;\n            }\n\n            return false;\n        }\n\n        /// <summary>\n        /// Removes all key/value pairs from this dictionary\n        /// </summary>\n        public void Clear()\n        {\n            var priorKeys = _dictionary.Keys.ToArray();\n            _dictionary.Clear();\n\n            foreach (var key in priorKeys)\n            {\n                InvokeMapChanged(CollectionChange.ItemRemoved, key);\n            }\n        }\n\n        /// <summary>\n        /// Gets an enumerator for this dictionary\n        /// </summary>\n        /// <returns>The enumerator</returns>\n        public IEnumerator<KeyValuePair<string, object>> GetEnumerator()\n        {\n            return _dictionary.GetEnumerator();\n        }\n\n        /// <summary>\n        /// Gets an enumerator for this dictionary\n        /// </summary>\n        /// <returns>The enumerator</returns>\n        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n        {\n            return _dictionary.GetEnumerator();\n        }\n\n        /// <summary>\n        /// Copy all elements from this dictionary into array at the specified index\n        /// </summary>\n        /// <param name=\"array\">The array to copy elements into</param>\n        /// <param name=\"arrayIndex\">The starting index to copy elements at</param>\n        public void CopyTo(KeyValuePair<string, object>[] array, int arrayIndex)\n        {\n            int arraySize = array.Length;\n            foreach (var pair in _dictionary)\n            {\n                if (arrayIndex >= arraySize)\n                {\n                    break;\n                }\n\n                array[arrayIndex++] = pair;\n            }\n        }\n\n        /// <summary>\n        /// Triggers when a key is changed in the map\n        /// </summary>\n        /// <param name=\"change\">How the key was changed</param>\n        /// <param name=\"key\">What key was changed</param>\n        private void InvokeMapChanged(CollectionChange change, string key)\n        {\n            MapChanged?.Invoke(this, new ObservableDictionaryChangedEventArgs(change, key));\n        }\n\n        /// <summary>\n        /// The event args containing the key that was changed, and how it was changed, when a change takes place\n        /// </summary>\n        private class ObservableDictionaryChangedEventArgs : IMapChangedEventArgs<string>\n        {\n            /// <summary>\n            /// Initializes a new instance of the <see cref=\"ObservableDictionaryChangedEventArgs\" /> class.\n            /// </summary>\n            /// <param name=\"change\">How the key was changed</param>\n            /// <param name=\"key\">What key was changed</param>\n            public ObservableDictionaryChangedEventArgs(CollectionChange change, string key)\n            {\n                CollectionChange = change;\n                Key = key;\n            }\n\n            /// <summary>\n            /// Gets how the key was changed\n            /// </summary>\n            public CollectionChange CollectionChange { get; private set; }\n\n            /// <summary>\n            /// Gets the key that was changed\n            /// </summary>\n            public string Key\n            {\n                get;\n                private set;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaApp/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Newtonsoft.Json\" version=\"9.0.1\" targetFramework=\"netcore50\" />\n</packages>"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaApp/project.json",
    "content": "﻿{\n  \"dependencies\": {\n    \"Microsoft.Bot.Client\": \"0.1.0-beta\",\n    \"Microsoft.NETCore.UniversalWindowsPlatform\": \"5.2.2\",\n    \"Microsoft.Xaml.Behaviors.Uwp.Managed\": \"2.0.0\",\n    \"Newtonsoft.Json\": \"9.0.1\"\n  },\n  \"frameworks\": {\n    \"uap10.0\": {}\n  },\n  \"runtimes\": {\n    \"win10-arm\": {},\n    \"win10-arm-aot\": {},\n    \"win10-x86\": {},\n    \"win10-x86-aot\": {},\n    \"win10-x64\": {},\n    \"win10-x64-aot\": {}\n  }\n}"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/App_Start/WebApiConfig.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\nusing System.Web.Http;\n\nnamespace TriviaBot\n{\n    public static class WebApiConfig\n    {\n        public static void Register(HttpConfiguration config)\n        {\n            // Json settings\n            config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;\n            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();\n            config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented;\n            JsonConvert.DefaultSettings = () => new JsonSerializerSettings()\n            {\n                ContractResolver = new CamelCasePropertyNamesContractResolver(),\n                Formatting = Newtonsoft.Json.Formatting.Indented,\n                NullValueHandling = NullValueHandling.Ignore,\n            };\n\n            // Web API configuration and services\n\n            // Web API routes\n            config.MapHttpAttributeRoutes();\n\n            config.Routes.MapHttpRoute(\n                name: \"DefaultApi\",\n                routeTemplate: \"api/{controller}/{id}\",\n                defaults: new { id = RouteParameter.Optional }\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Controllers/MessagesController.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nusing System;\nusing System.Net;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing System.Web.Http;\nusing Microsoft.Bot.Connector;\nusing Microsoft.Bot.Builder.Dialogs;\n\nnamespace TriviaBot\n{\n    [BotAuthentication]\n    public class MessagesController : ApiController\n    {\n        /// <summary>\n        /// POST: api/Messages\n        /// Receive a message from a user and reply to it\n        /// </summary>\n        public async Task<HttpResponseMessage> Post([FromBody]Activity activity)\n        {\n            try\n            {\n                await HandleActivity(activity);\n            }\n            catch(Exception ex)\n            {\n                System.Diagnostics.Trace.WriteLine(ex.ToString());\n            }\n\n            return Request.CreateResponse(HttpStatusCode.Accepted);\n        }\n\n\n        private async Task<bool> HandleActivity(Activity activity)\n        {\n            if (activity.Type == ActivityTypes.Message)\n            {\n                await HandleMessageActivity(activity);\n\n                return true;\n            }\n            else if (activity.Type == ActivityTypes.DeleteUserData)\n            {\n                // Implement user deletion here\n                // If we handle user deletion, return a real message\n            }\n            else if (activity.Type == ActivityTypes.ConversationUpdate)\n            {\n                // Handle conversation state changes, like members being added and removed\n                // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info\n                // Not available in all channels\n            }\n            else if (activity.Type == ActivityTypes.ContactRelationUpdate)\n            {\n                // Handle add/remove from contact lists\n                // Activity.From + Activity.Action represent what happened\n            }\n            else if (activity.Type == ActivityTypes.Typing)\n            {\n                // Handle knowing tha the user is typing\n            }\n            else if (activity.Type == ActivityTypes.Ping)\n            {\n            }\n\n            return false;\n        }\n\n        private async Task HandleMessageActivity(Activity message)\n        {\n            /*ConnectorClient connector = new ConnectorClient(new Uri(message.ServiceUrl));\n\n            // calculate something for us to return\n            int length = (message.Text ?? string.Empty).Length;\n\n            // return our reply to the user\n            Activity reply = message.CreateReply($\"You sent {message.Text} which was {length} characters\");\n            await connector.Conversations.ReplyToActivityAsync(reply);\n\n            return false;*/\n            await Conversation.SendAsync(message, () => new Runtime.TriviaDialog());\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Global.asax",
    "content": "﻿<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"TriviaBot.WebApiApplication\" Language=\"C#\" %>\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Global.asax.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Http;\nusing System.Web.Routing;\n\nnamespace TriviaBot\n{\n    public class WebApiApplication : System.Web.HttpApplication\n    {\n        protected void Application_Start()\n        {\n            GlobalConfiguration.Configure(WebApiConfig.Register);\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Luis/LuisEntity.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nusing System;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace Luis\n{\n    /// <summary>\n    /// Describes an entity that was identified in the query\n    /// </summary>\n    [DataContract]\n    [Serializable]\n    public class LuisEntity : IComparable, IComparable<LuisEntity>\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"LuisEntity\" /> class.\n        /// </summary>\n        /// <param name=\"entity\">The entity value</param>\n        /// <param name=\"type\">The type of the entity</param>\n        /// <param name=\"startIndex\">The start index of the entity value in the text</param>\n        /// <param name=\"endIndex\">The end index of the entity value in the text</param>\n        /// <param name=\"score\">Confidence that the entity was properly identified</param>\n        public LuisEntity(string entity, string type, int startIndex, int endIndex, double score)\n        {\n            Entity = entity ?? string.Empty;\n            Type = type ?? string.Empty;\n            StartIndex = startIndex;\n            EndIndex = endIndex;\n            Score = score;\n        }\n\n        /// <summary>\n        /// Gets the entity value\n        /// </summary>\n        [DataMember(Name = \"entity\")]\n        public string Entity { get; private set; }\n\n        /// <summary>\n        /// Gets the type, or name, of the entity\n        /// </summary>\n        [DataMember(Name = \"type\")]\n        public string Type { get; private set; }\n\n        /// <summary>\n        /// Gets the index in the query this entity starts at\n        /// </summary>\n        [DataMember(Name = \"startIndex\")]\n        public int StartIndex { get; private set; }\n\n        /// <summary>\n        /// Gets the index in the query this entity ends at\n        /// </summary>\n        [DataMember(Name = \"endIndex\")]\n        public int EndIndex { get; private set; }\n\n        /// <summary>\n        /// Gets the certainty this entity was identified with\n        /// </summary>\n        [DataMember(Name = \"score\")]\n        public double Score { get; private set; }\n\n        /// <summary>\n        /// Gets the type, or name, of the entity\n        /// </summary>\n        [DataMember(Name = \"resolution\")]\n        public Dictionary<string, string> Resolution { get; private set; }\n\n        /// <summary>\n        /// Determines if left is equal to right\n        /// </summary>\n        /// <param name=\"left\">The object to compare</param>\n        /// <param name=\"right\">The object to compare against</param>\n        /// <returns>The result of the comparison</returns>\n        public static bool operator ==(LuisEntity left, LuisEntity right)\n        {\n            if (object.ReferenceEquals(left, null))\n            {\n                return object.ReferenceEquals(right, null);\n            }\n\n            return left.Equals(right);\n        }\n\n        /// <summary>\n        /// Determines if left is not equal to right\n        /// </summary>\n        /// <param name=\"left\">The object to compare</param>\n        /// <param name=\"right\">The object to compare against</param>\n        /// <returns>The result of the comparison</returns>\n        public static bool operator !=(LuisEntity left, LuisEntity right)\n        {\n            return !(left == right);\n        }\n\n        /// <summary>\n        /// Determines if left is less than right\n        /// </summary>\n        /// <param name=\"left\">The object to compare</param>\n        /// <param name=\"right\">The object to compare against</param>\n        /// <returns>The result of the comparison</returns>\n        public static bool operator <(LuisEntity left, LuisEntity right)\n        {\n            return Compare(left, right) < 0;\n        }\n\n        /// <summary>\n        /// Determines if left is greater than right\n        /// </summary>\n        /// <param name=\"left\">The object to compare</param>\n        /// <param name=\"right\">The object to compare against</param>\n        /// <returns>The result of the comparison</returns>\n        public static bool operator >(LuisEntity left, LuisEntity right)\n        {\n            return Compare(left, right) > 0;\n        }\n\n        /// <summary>\n        /// Compare left with right\n        /// </summary>\n        /// <param name=\"left\">The object to compare</param>\n        /// <param name=\"right\">The object to compare against</param>\n        /// <returns>The result of the comparison</returns>\n        public static int Compare(LuisEntity left, LuisEntity right)\n        {\n            if (object.ReferenceEquals(left, right))\n            {\n                return 0;\n            }\n\n            if (object.ReferenceEquals(left, null))\n            {\n                return -1;\n            }\n\n            return left.CompareTo(right);\n        }\n\n        /// <summary>\n        /// Gets the string representation of this object\n        /// </summary>\n        /// <returns>The string representation of this object</returns>\n        public override string ToString()\n        {\n            return \"{ Entity = \" + Entity + \", Type = \" + Type + \", StartIndex = \" +\n                StartIndex + \", EndIndex = \" + EndIndex + \", Score = \" + Score + \" }\";\n        }\n\n        /// <summary>\n        /// Compares this EntityDefinition to the passed in object\n        /// </summary>\n        /// <param name=\"obj\">The object to compare this EntityDefinition with</param>\n        /// <returns>The result of the comparison</returns>\n        public int CompareTo(object obj)\n        {\n            if (obj == null)\n            {\n                return 1;\n            }\n\n            LuisEntity other = obj as LuisEntity;\n\n            if (other == null)\n            {\n                throw new ArgumentException(\"A EntityDefinition object is required for comparison.\", \"obj\");\n            }\n\n            return CompareTo(other);\n        }\n\n        /// <summary>\n        /// Compares this EntityDefinition to the passed in EntityDefinition\n        /// The ordering follows the following precedence (stopping when one value differs)\n        /// Higher score\n        /// Case insensitive lexicographic ordering Type\n        /// Case sensitive lexicographic Entity (value)\n        /// Earlier in the string first\n        /// Shorter first\n        /// </summary>\n        /// <param name=\"other\">The EntityDefinition to compare against</param>\n        /// <returns>The result of the comparison</returns>\n        public int CompareTo(LuisEntity other)\n        {\n            if (object.ReferenceEquals(other, null))\n            {\n                return 1;\n            }\n\n            // Compare score (higher comes first)\n            var comparison = other.Score.CompareTo(Score);\n\n            // Compare Type\n            if (comparison == 0)\n            {\n                comparison = string.Compare(Type, other.Type, StringComparison.Ordinal);\n            }\n\n            // Compare Entity\n            if (comparison == 0)\n            {\n                comparison = string.Compare(Entity, other.Entity, StringComparison.Ordinal);\n            }\n\n            // Compare StartIndex\n            if (comparison == 0)\n            {\n                comparison = StartIndex.CompareTo(other.StartIndex);\n            }\n\n            // Compare EndIndex\n            if (comparison == 0)\n            {\n                comparison = EndIndex.CompareTo(other.EndIndex);\n            }\n\n            return comparison;\n        }\n\n        /// <summary>\n        /// Determines if this EntityDefinition is equal to another\n        /// </summary>\n        /// <param name=\"obj\">The object to compare this EntityDefinition with</param>\n        /// <returns>Whether the objects are equal</returns>\n        public override bool Equals(object obj)\n        {\n            var other = obj as LuisEntity;\n\n            if (object.ReferenceEquals(other, null))\n            {\n                return false;\n            }\n\n            return CompareTo(other) == 0;\n        }\n\n        /// <summary>\n        /// A hash code for this object that will always be the same for EntityDefinition objects with the\n        /// same values\n        /// </summary>\n        /// <returns>The generated hash code</returns>\n        public override int GetHashCode()\n        {\n            int hashCode = Entity.GetHashCode();\n            hashCode = (hashCode * 251) + Type.GetHashCode();\n            hashCode = (hashCode * 251) + StartIndex.GetHashCode();\n            hashCode = (hashCode * 251) + EndIndex.GetHashCode();\n            hashCode = (hashCode * 251) + Score.GetHashCode();\n\n            return hashCode;\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Luis/LuisIntent.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nusing System;\nusing System.Runtime.Serialization;\n\nnamespace Luis\n{\n    /// <summary>\n    /// Describes an intent\n    /// </summary>\n    [DataContract]\n    public class LuisIntent : IComparable, IComparable<LuisIntent>\n    {\n        /// <summary>\n        /// Gets or sets the intent name\n        /// </summary>\n        [DataMember(Name = \"intent\")]\n        public string Intent { get; set; }\n\n        /// <summary>\n        /// Gets or sets the certainty for this intent\n        /// </summary>\n        [DataMember(Name = \"score\")]\n        public double Score { get; set; }\n\n        /// <summary>\n        /// Determines if left is equal to right\n        /// </summary>\n        /// <param name=\"left\">The object to compare</param>\n        /// <param name=\"right\">The object to compare against</param>\n        /// <returns>The result of the comparison</returns>\n        public static bool operator ==(LuisIntent left, LuisIntent right)\n        {\n            if (object.ReferenceEquals(left, null))\n            {\n                return object.ReferenceEquals(right, null);\n            }\n\n            return left.Equals(right);\n        }\n\n        /// <summary>\n        /// Determines if left is not equal to right\n        /// </summary>\n        /// <param name=\"left\">The object to compare</param>\n        /// <param name=\"right\">The object to compare against</param>\n        /// <returns>The result of the comparison</returns>\n        public static bool operator !=(LuisIntent left, LuisIntent right)\n        {\n            return !(left == right);\n        }\n\n        /// <summary>\n        /// Determines if left is less than right\n        /// </summary>\n        /// <param name=\"left\">The object to compare</param>\n        /// <param name=\"right\">The object to compare against</param>\n        /// <returns>The result of the comparison</returns>\n        public static bool operator <(LuisIntent left, LuisIntent right)\n        {\n            return Compare(left, right) < 0;\n        }\n\n        /// <summary>\n        /// Determines if left is greater than right\n        /// </summary>\n        /// <param name=\"left\">The object to compare</param>\n        /// <param name=\"right\">The object to compare against</param>\n        /// <returns>The result of the comparison</returns>\n        public static bool operator >(LuisIntent left, LuisIntent right)\n        {\n            return Compare(left, right) > 0;\n        }\n\n        /// <summary>\n        /// Compare left with right\n        /// </summary>\n        /// <param name=\"left\">The object to compare</param>\n        /// <param name=\"right\">The object to compare against</param>\n        /// <returns>The result of the comparison</returns>\n        public static int Compare(LuisIntent left, LuisIntent right)\n        {\n            if (object.ReferenceEquals(left, right))\n            {\n                return 0;\n            }\n\n            if (object.ReferenceEquals(left, null))\n            {\n                return -1;\n            }\n\n            return left.CompareTo(right);\n        }\n\n        /// <summary>\n        /// Gets the string representation of this object\n        /// </summary>\n        /// <returns>The string representation of this object</returns>\n        public override string ToString()\n        {\n            return \"{ Intent = \" + Intent.ToString() + \", Score = \" + Score.ToString(System.Globalization.CultureInfo.InvariantCulture) + \" }\";\n        }\n\n        /// <summary>\n        /// Compares this IntentDefinition to the passed in object\n        /// </summary>\n        /// <param name=\"obj\">The object to compare this IntentDefinition with</param>\n        /// <returns>The result of the comparison</returns>\n        public int CompareTo(object obj)\n        {\n            if (obj == null)\n            {\n                return 1;\n            }\n\n            LuisIntent other = obj as LuisIntent;\n\n            if (other == null)\n            {\n                throw new ArgumentException(\"A IntentDefinition object is required for comparison.\", \"obj\");\n            }\n\n            return CompareTo(other);\n        }\n\n        /// <summary>\n        /// Compares this IntentDefinition to the passed in IntentDefinition\n        /// </summary>\n        /// <param name=\"other\">The IntentDefinition to compare against</param>\n        /// <returns>The result of the comparison</returns>\n        public int CompareTo(LuisIntent other)\n        {\n            if (object.ReferenceEquals(other, null))\n            {\n                return 1;\n            }\n\n            var comparison = Score.CompareTo(other.Score);\n\n            if (comparison == 0)\n            {\n                comparison = string.Compare(Intent, other.Intent, StringComparison.OrdinalIgnoreCase);\n            }\n\n            return comparison;\n        }\n\n        /// <summary>\n        /// Determines if this IntentDefinition is equal to another\n        /// </summary>\n        /// <param name=\"obj\">The object to compare this IntentDefinition with</param>\n        /// <returns>Whether the objects are equal</returns>\n        public override bool Equals(object obj)\n        {\n            var other = obj as LuisIntent;\n\n            if (object.ReferenceEquals(other, null))\n            {\n                return false;\n            }\n\n            return CompareTo(other) == 0;\n        }\n\n        /// <summary>\n        /// A hash code for this object that will always be the same for IntentDefinition objects with the\n        /// same values\n        /// </summary>\n        /// <returns>The generated hash code</returns>\n        public override int GetHashCode()\n        {\n            int hashCode = Intent.GetHashCode();\n            hashCode = (hashCode * 251) + Score.GetHashCode();\n\n            return hashCode;\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Luis/LuisResult.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\n\nnamespace Luis\n{\n    /// <summary>\n    /// The data structure of the JSON returned by LUIS used for deserialization\n    /// </summary>\n    [DataContract]\n    public class LuisResult\n    {\n        /// <summary>\n        /// Gets or sets the LUIS query that this object was processed from\n        /// </summary>\n        [DataMember(Name = \"query\")]\n        public string Query { get; set; }\n\n        /// <summary>\n        /// Gets the list of intents that the query might relate to\n        /// </summary>\n        [DataMember(Name = \"intents\")]\n        public ICollection<LuisIntent> Intents { get; private set; }\n\n        /// <summary>\n        /// Gets the entities that were identified from the query\n        /// </summary>\n        [DataMember(Name = \"entities\")]\n        public ICollection<LuisEntity> Entities { get; private set; }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Luis/QueryLuis.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Net;\nusing System.Runtime.Serialization.Json;\nusing System.Threading.Tasks;\nusing static TriviaBot.Runtime.Utility;\n\nnamespace Luis\n{\n    /// <summary>\n    /// Contains the default logic for converting text, or the result from the speech recognizer,\n    /// into entities that will be finalized in the conversation\n    /// </summary>\n    public static class QueryLuis\n    {\n        /// <summary>\n        /// Extract the best matching intent and all entities from utterance by calling LUIS with the specified LUISInfo connection data.\n        /// </summary>\n        /// <param name=\"luisInfo\">Connection data for the LUIS recognizer.</param>\n        /// <param name=\"utterance\">Text to check for intents (typed or from the speech recognizer).</param>\n        /// <returns>LuisResult with the intent and entities recognized by LUIS.  Entities won't be returned if intent didn't match.</returns>\n        public static async Task<LuisResult> GetIntentAndEntitiesFromLuis(\n            string appid, \n            string key,\n            string utterance)\n        {\n            ArgumentNotNull(appid, \"appid\");\n            ArgumentNotNull(key, \"key\");\n            ArgumentNotNull(utterance, \"utterance\");\n\n            // Query LUIS and generate our response\n            var luisResult = await QueryLuisWithRetry(appid, key, utterance, 3);\n\n            // LUIS can return more than one of the same entity\n            // with different values and scores, we sort by the score\n            // but don't retain the score otherwise.\n            return luisResult;\n        }\n\n        /// <summary>\n        /// Attempts to query a LUIS application, ignoring exceptions up until the last attempt\n        /// </summary>\n        /// <param name=\"luisApplication\">All information needed to query the LUIS application</param>\n        /// <param name=\"query\">The text query to send to LUIS</param>\n        /// <param name=\"retries\">How many times to retry on failure</param>\n        /// <returns>The deserialized data returned from LUIS</returns>\n        private static async Task<LuisResult> QueryLuisWithRetry(\n            string appid,\n            string key,\n            string query,\n            int retries)\n        {\n            LuisResult result = null;\n            Exception exception = null;\n            int tooManyRequestsDelay = 125;\n\n            for (var attempt = 0; attempt < retries; ++attempt)\n            {\n                exception = null;\n\n                try\n                {\n                    result = await CallLuis(appid, key, query);\n                    break;\n                }\n                catch (Exception e)\n                {\n                    // Check for 429 \"Too many requests\" error.\n                    exception = e;\n                    if (e.IfIs<System.Net.WebException, bool>(\n                            we => we.Response.IfIs<System.Net.HttpWebResponse, bool>(\n                                wr => (int)wr.StatusCode == 429, false), false))\n                    {\n                        await Task.Delay(tooManyRequestsDelay);\n                        tooManyRequestsDelay *= 3;\n                    }\n                    else\n                    {\n                        throw;\n                    }\n                }\n            }\n\n            return result;\n        }\n\n        /// <summary>\n        /// Queries the specified LUIS application with the provided query\n        /// </summary>\n        /// <param name=\"luisInfo\">The information needed to query the LUIS application</param>\n        /// <param name=\"query\">The query to supply the LUIS application</param>\n        /// <returns>The deserialized output of the LUIS application</returns>\n        private static async Task<LuisResult> CallLuis(\n            string appid,\n            string key,\n            string query)\n        {\n            Stream responseStream = null;\n\n            var requestUrl = \"https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/\" + appid + \"?subscription-key=\" + key + \"&timezoneOffset=0&verbose=true&q=\" + query;\n            requestUrl = Uri.EscapeUriString(requestUrl);\n\n            HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest;\n            var response = await request.GetResponseAsync() as HttpWebResponse;\n\n            if (response.StatusCode != HttpStatusCode.OK)\n            {\n                throw new Exception($\"Error communicating with LUIS application {appid}:\\nServer error (HTTP {response.StatusCode}: {response.StatusDescription}).\");\n            }\n\n            responseStream = response.GetResponseStream();\n\n            DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(LuisResult));\n            var objResponse = jsonSerializer.ReadObject(responseStream);\n\n            var jsonResponse = objResponse as LuisResult;\n\n            return jsonResponse;\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"TriviaBot\")]\n[assembly: AssemblyDescription(\"A speech-enabled triva bot built on top of the Bot Framework C# SDK that uses http://opentdb.com/\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"Microsoft\")]\n[assembly: AssemblyProduct(\"TriviaBot\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"a8ba1066-5695-4d71-abb4-65e5a5e0c3d4\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Revision and Build Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Runtime/BotState.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nnamespace TriviaBot.Runtime\n{\n    public enum BotState\n    {\n        None,\n        Trivia,\n        SwitchCategory,\n        WaitingForReengagement\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Runtime/Categories.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nusing System.ComponentModel.DataAnnotations;\n\nnamespace TriviaBot.Runtime\n{\n    /// <summary>\n    /// This list of categories comes from the list of supported categories on https://opentdb.com/\n    /// </summary>\n    public enum TriviaCategory\n    {\n        None = -1,\n\n        [Display(Name = \"Any\")]\n        Any = 0,\n\n        [Display(Name = \"General Knowledge\")]\n        GeneralKnowledge = 9,\n\n        [Display(Name = \"Entertainment: Books\")]\n        EntertainmentBooks,\n\n        [Display(Name = \"Entertainment: Film\")]\n        EntertainmentFilm,\n\n        [Display(Name = \"Entertainment: Music\")]\n        EntertainmentMusic,\n\n        [Display(Name = \"Entertainment: Musicals & Theatres\")]\n        EntertainmentMusicalsTheatre,\n\n        [Display(Name = \"Entertainment: Television\")]\n        EntertainmentTelevision,\n\n        [Display(Name = \"Entertainment: Video Games\")]\n        EntertainmentVideoGames,\n\n        [Display(Name = \"Entertainment: Board Games\")]\n        EntertainmentBoardGames,\n\n        [Display(Name = \"Science & Nature\")]\n        ScienceNature,\n\n        [Display(Name = \"Science: Computers\")]\n        ScienceComputers,\n\n        [Display(Name = \"Science: Mathematics\")]\n        ScienceMathematics,\n\n        [Display(Name = \"Mythology\")]\n        Mythology,\n\n        [Display(Name = \"Sports\")]\n        Sports,\n\n        [Display(Name = \"Geography\")]\n        Geography,\n\n        [Display(Name = \"History\")]\n        History,\n\n        [Display(Name = \"Politics\")]\n        Politics,\n\n        [Display(Name = \"Art\")]\n        Art,\n\n        [Display(Name = \"Celebrities\")]\n        Celebrities,\n\n        [Display(Name = \"Animals\")]\n        Animals,\n\n        [Display(Name = \"Vehicles\")]\n        Vehicles,\n\n        [Display(Name = \"Entertainment: Comics\")]\n        EntertainmentComics,\n\n        [Display(Name = \"Science: Gadgets\")]\n        ScienceGadgets,\n\n        [Display(Name = \"Entertainment: Japanese Anime & Manga\")]\n        EntertainmentJapaneseAnimeManga,\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Runtime/EnumExtensions.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nusing System;\nusing System.ComponentModel.DataAnnotations;\nusing System.Reflection;\n\nnamespace TriviaBot.Runtime\n{\n    public static class EnumExtensions\n    {\n        public static string DisplayName(this Enum value)\n        {\n            var members = value?.GetType()?.GetMember(value.ToString());\n            if (members != null)\n            {\n                foreach (var member in members)\n                {\n                    var displayName = member.GetCustomAttribute<DisplayAttribute>()?.GetName();\n\n                    if (displayName?.Length > 0)\n                    {\n                        return displayName;\n                    }\n                }\n            }\n\n            return value?.ToString();\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Runtime/Extensions.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace TriviaBot\n{\n    public static class Extensions\n    {\n        public static string Normalize(this string msg)\n        {\n            return msg.ToLower().Trim().TrimEnd('.');\n        }\n\n        public static bool NormalizedEquals(this string msg, string other)\n        {\n            return Normalize(msg) == Normalize(other);\n        }\n\n        public static bool ContainsIgnoreCase(this string msg, IEnumerable<string> parts)\n        {\n            var msgL = msg?.ToLower();\n            return parts.Any(x => msgL?.Contains(x.ToLower()) == true);\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Runtime/Responses.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\nusing Newtonsoft.Json.Linq;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Xml;\nusing TriviaBot.Shared;\n\nnamespace TriviaBot.Runtime\n{\n    /// <summary>\n    /// Contains all of the reponses from the bot to the user.\n    /// This separates content from the core bot logic, and allows reuse.\n    /// </summary>\n    public static class Responses\n    {\n        public async static Task Send_LetsGo(IDialogContext context, IMessageActivity message)\n        {\n            var reply = CreateResponse(\n                            context,\n                            message,\n                            \"Let's go!\",\n                            \"Let's go!\",\n                            messageType: MessageType.Statement,\n                            inputHint: InputHints.IgnoringInput);\n\n            await context.PostAsync(reply);\n        }\n\n        public async static Task Send_Goodbye(IDialogContext context, IMessageActivity message)\n        {\n            var reply = CreateResponse(\n                            context,\n                            message,\n                            \"Goodbye.\",\n                            \"See you next time!\",\n                            messageType: MessageType.Statement);\n\n            await context.PostAsync(reply);\n        }\n\n        public async static Task Send_TimeForNextQuestion(IDialogContext context, IMessageActivity message)\n        {\n            var replyText = SelectRandomString(new string[] { \"Alright, here's the next one\",\n                                                              \"Here's one more\", $\"Ok, next question\",\n                                                              \"Time for the next one\" });\n\n            var reply = CreateResponse(\n                            context,\n                            message,\n                            displayText: replyText + \":\",\n                            speakText: replyText,\n                            messageType: MessageType.Statement,\n                            inputHint: InputHints.IgnoringInput);\n\n            await context.PostAsync(reply);\n        }\n\n        public async static Task Send_Greeting(IDialogContext context, IMessageActivity message)\n        {\n            var reply = CreateResponse(\n                            context,\n                            message,\n                            \"Welcome to Trivia!\",\n                            \"Welcome to Trivia! To stop playing you can say. Cancel, or, I'm done playing, at any time. Now, Let's get started.\",\n                            audioToPlay: \"a_sunshine_intro_09.wav\",\n                            messageType: MessageType.Statement,\n                            inputHint: InputHints.IgnoringInput);\n\n            if(message.ChannelId?.ToLower() != \"cortana\")\n            { \n                reply.Attachments.Add((new ThumbnailCard()\n                {\n                    Images = new[] { new CardImage(\"https://trivasdkbot.azurewebsites.net/Assets/trivia.png\") },\n                }).ToAttachment());\n            }\n\n            await context.PostAsync(reply);\n        }\n\n        public async static Task Send_FirstQuestion(IDialogContext context, IMessageActivity message)\n        {\n            var reply = CreateResponse(\n                        context,\n                        message,\n                        \"Here's your first question:\",\n                        \"Here's your first question.\",\n                        messageType: MessageType.Statement,\n                        inputHint: InputHints.IgnoringInput);\n\n            await context.PostAsync(reply);\n        }\n\n        public async static Task SendQuestion(IDialogContext context, IMessageActivity message, string question, IList<string> options)\n        {\n            // Send Question & possible answers\n            var reply = CreateResponse(\n                            context,\n                            message,\n                            question,\n                            question,\n                            messageType: MessageType.Question,\n                            optionsToAdd: options,\n                            inputHint: InputHints.ExpectingInput);\n\n            await context.PostAsync(reply);\n        }\n\n        public async static Task Send_DidNotUnderstand(IDialogContext context, IMessageActivity message)\n        {\n            var reply = CreateResponse(\n                            context,\n                            message,\n                            \"Sorry, I don't understand that.\",\n                            \"Sorry, I don't understand that.\",\n                            messageType: MessageType.Statement,\n                            inputHint: InputHints.IgnoringInput);\n\n            await context.PostAsync(reply);\n        }\n\n        public async static Task Send_WhichOne(IDialogContext context, IMessageActivity message, IList<string> options)\n        {\n            var replyText = \"Which one did you mean?\";\n\n            var reply = CreateResponse(\n                            context,\n                            message,\n                            replyText,\n                            replyText,\n                            messageType: MessageType.Question,\n                            optionsToAdd: options,\n                            inputHint: InputHints.ExpectingInput);\n\n            System.Diagnostics.Trace.WriteLine(\"message: \" + Newtonsoft.Json.JsonConvert.SerializeObject(message));\n            System.Diagnostics.Trace.WriteLine(\"reply: \" + Newtonsoft.Json.JsonConvert.SerializeObject(reply));\n\n            await context.PostAsync(reply);\n        }\n\n        public async static Task AskForCategory(IDialogContext context, IMessageActivity message)\n        {\n            var replyText = \"What category would you like to switch to?\";\n\n            var reply = CreateResponse(\n                            context,\n                            message,\n                            replyText,\n                            replyText,\n                            messageType: MessageType.Statement,\n                            inputHint: InputHints.ExpectingInput);\n\n            await context.PostAsync(reply);\n        }\n\n        public async static Task Send_ConfirmAnswer(IDialogContext context, IMessageActivity message, string choice)\n        {\n            var confirmationReply = CreateResponse(\n                                        context,\n                                        message,\n                                        $\"Is {choice} your final answer?\",\n                                        $\"I think you said {choice}. Is that your final answer?\",\n                                        messageType: MessageType.Statement,\n                                        inputHint: InputHints.ExpectingInput);\n\n            await context.PostAsync(confirmationReply);\n        }\n\n        public async static Task Send_CorrectAnswer(IDialogContext context, IMessageActivity message, string correctAnswer)\n        {\n            var replyText = SelectRandomString(new string[] { \"Congrats, you got it right!\",\n                                                              \"Correct!\", $\"That's right, the answer is {correctAnswer}\",\n                                                              \"100% correct!\" });\n\n            var reply = CreateResponse(\n                            context,\n                            message,\n                            replyText,\n                            replyText,\n                            messageType: MessageType.GotItRight,\n                            audioToPlay: \"tv_gameshow_bell_01.wav\",\n                            inputHint: InputHints.IgnoringInput);\n\n            await context.PostAsync(reply);\n        }\n\n        public async static Task Send_OutOfTime_First(IDialogContext context, IMessageActivity message)\n        {\n            var replyText = SelectRandomString(new string[] { \"Oops! You ran out of time!\",\n                                                              \"Come on, you've gotta be faster than that!\",\n                                                              \"You don't have to be fast, but you can't be that slow!\",\n                                                              \"I don't have all day!\" });\n            var reply = CreateResponse(\n                            context,\n                            message,\n                            replyText,\n                            replyText,\n                            messageType: MessageType.OutOfTime,\n                            inputHint: InputHints.IgnoringInput);\n            \n            await context.PostAsync(reply);\n        }\n\n        public async static Task Send_OutOfTime_X(IDialogContext context, IMessageActivity message)\n        {\n            var replyText = SelectRandomString(new string[] { \"Did you forget you were playing? Say something to continue.\",\n                                                              \"Fine, I won't talk to you either! Say something to continue.\",\n                                                              \"You don't have to be fast, but you can't be that slow! Say something to continue.\",\n                                                              \"Again?  Say something to continue.\" });\n            var reply = CreateResponse(\n                            context,\n                            message,\n                            replyText,\n                            replyText,\n                            messageType: MessageType.OutOfTime,\n                            inputHint: InputHints.AcceptingInput);\n\n\n            await context.PostAsync(reply);\n        }\n\n        public async static Task Send_TryEasierQuestion(IDialogContext context, IMessageActivity message)\n        {\n            var replyText = SelectRandomString(new string[] { \"Let's try something a little easier this time...\",\n                                                              \"Maybe this one will be better.\",\n                                                              \"I believe in you, let's keep going!\",\n                                                              \"Let's try a different question this time.\" });\n            var reply = CreateResponse(\n                                        context,\n                                        message,\n                                        replyText,\n                                        replyText,\n                                        messageType: MessageType.Statement,\n                                        inputHint: InputHints.IgnoringInput);\n\n            await context.PostAsync(reply);\n        }\n\n        public async static Task Send_IncorrectAnswer(IDialogContext context, IMessageActivity message, string correctAnswer)\n        {\n            var replyText = SelectRandomString(new string[] { $\"Sorry, the correct answer was: {correctAnswer}\",\n                                                              $\"Not quite, the correct answer was: {correctAnswer}\",\n                                                              $\"That's incorrect. The answer was: {correctAnswer}\" });\n\n            var reply = CreateResponse(\n                            context,\n                            message,\n                            replyText,\n                            replyText,\n                            messageType: MessageType.GotItWrong,\n                            audioToPlay: \"tv_gameshow_buzzer_03.wav\",\n                            inputHint: InputHints.IgnoringInput);\n\n            await context.PostAsync(reply);\n        }\n\n        public async static Task Send_Help_Game(IDialogContext context, IMessageActivity message)\n        {\n            var reply = CreateResponse(\n                            context,\n                            message,\n                            \"Here are some things you can say to me: \\\"I'd like to play a game\\\", \\\"Let's play trivia\\\"\",\n                            \"Here are some things you can say to me: \\\"I'd like to play a game\\\", \\\"Let's play trivia\\\"\",\n                            messageType: MessageType.Statement,\n                            inputHint: InputHints.AcceptingInput);\n\n            await context.PostAsync(reply);\n        }\n\n        public async static Task Send_Help_Trivia(IDialogContext context, IMessageActivity message)\n        {\n            var reply = CreateResponse(\n                            context,\n                            message,\n                            \"Here are some things you can say to me: \\\"I'd like to play trivia\\\", \\\"How about trivia\\\"\",\n                            \"Here are some things you can say to me: \\\"I'd like to play trivia\\\", \\\"How about trivia\\\"\",\n                            messageType: MessageType.Statement,\n                            inputHint: InputHints.AcceptingInput);\n\n            await context.PostAsync(reply);\n        }\n\n        public async static Task Send_Help_Trivia(IDialogContext context, IMessageActivity message, IList<string> options)\n        {\n            var replyText = \"You're playing trivia! Here are your choices:\";\n\n            var reply = CreateResponse(\n                            context,\n                            message,\n                            replyText,\n                            replyText,\n                            messageType: MessageType.Statement,\n                            optionsToAdd: options,\n                            inputHint: InputHints.ExpectingInput);\n\n            await context.PostAsync(reply);\n        }\n\n        public async static Task Send_Error_UnknownState(IDialogContext context, IMessageActivity message)\n        {\n            var reply = CreateResponse(\n                            context,\n                            message,\n                            \"Sorry, I seem to have gotten into a bad state. I'll try resetting the conversation.\",\n                            \"Sorry, I seem to have gotten into a bad state. I'll try resetting the conversation.\",\n                            messageType: MessageType.Statement,\n                            inputHint: InputHints.AcceptingInput);\n\n            await context.PostAsync(reply);\n        }\n\n        public async static Task Send_Error_NextQuestion(IDialogContext context, IMessageActivity message)\n        {\n            var errorReply = CreateResponse(\n                                context,\n                                message,\n                                \"Sorry, an error occurred. Here's another question.\",\n                                \"I seem to have hit a snag, let's try another question.\",\n                                messageType: MessageType.Statement,\n                                inputHint: InputHints.IgnoringInput);\n\n            await context.PostAsync(errorReply);\n        }\n\n        public async static Task Send_PlayingCategory(IDialogContext context, IMessageActivity message, TriviaCategory category)\n        {\n            var replyText = SelectRandomString(new string[] { $\"We're playing: \\\"{category.DisplayName()}\\\".\",\n                                                              $\"We're going with: \\\"{category.DisplayName()}\\\" today.\",\n                                                              $\"You'll get questions about: \\\"{category.DisplayName()}\\\".\" });\n\n            var reply = CreateResponse(\n                            context,\n                            message,\n                            replyText,\n                            replyText,\n                            messageType: MessageType.Statement,\n                            inputHint: InputHints.IgnoringInput);\n\n            await context.PostAsync(reply);\n        }\n\n        public async static Task Send_SwitchedCategory(IDialogContext context, IMessageActivity message, TriviaCategory category)\n        {\n            var replyText = $\"You've switched to the category \\\"{category.DisplayName()}\\\"\";\n\n            var reply = CreateResponse(\n                            context,\n                            message,\n                            replyText,\n                            replyText,\n                            messageType: MessageType.Statement,\n                            inputHint: InputHints.IgnoringInput);\n\n            await context.PostAsync(reply);\n        }\n\n        public async static Task Send_LightningModeStart(IDialogContext context, IMessageActivity message)\n        {\n            if (message.ChannelId.NormalizedEquals(\"directline\"))\n            {\n                var replyText = \"Starting lightning mode!\";\n\n                var reply = CreateResponse(\n                                context,\n                                message,\n                                replyText,\n                                replyText,\n                                messageType: MessageType.StartLightningMode,\n                                inputHint: InputHints.IgnoringInput);\n\n                await context.PostAsync(reply);\n            }\n            else if (message.ChannelId.NormalizedEquals(\"cortana\"))\n            {\n                var replyText = \"You can play lightning mode in our app! I'll bring you there...\";\n\n                var reply = CreateResponse(\n                                context,\n                                message,\n                                replyText,\n                                replyText,\n                                messageType: MessageType.Statement,\n                                inputHint: InputHints.IgnoringInput);\n\n                await context.PostAsync(reply);\n\n                reply = CreateResponse(\n                            context,\n                            message,\n                            null,\n                            null,\n                            messageType: MessageType.StartLightningMode,\n                            inputHint: InputHints.IgnoringInput);\n\n                await context.PostAsync(reply);\n\n                reply.ChannelData = JObject.FromObject(new { action = new { type = \"LaunchUri\", uri = \"triviaapp://play/gameshow\" } });\n\n                await context.PostAsync(reply);\n            }\n            else\n            {\n                var replyText = \"Sorry, Lightning Mode is only supported in our app.\";\n\n                var reply = CreateResponse(\n                                context,\n                                message,\n                                replyText,\n                                replyText,\n                                messageType: MessageType.Statement,\n                                inputHint: InputHints.IgnoringInput);\n\n                await context.PostAsync(reply);\n            }\n        }\n\n        public async static Task Send_LightningModeEnd(IDialogContext context, IMessageActivity message)\n        {\n            if (message.ChannelId.NormalizedEquals(\"directline\"))\n            {\n                var replyText = \"Turning off lightning mode.\";\n\n                var reply = CreateResponse(\n                                context,\n                                message,\n                                replyText,\n                                replyText,\n                                messageType: MessageType.StopLightningMode,\n                                inputHint: InputHints.IgnoringInput);\n\n                await context.PostAsync(reply);\n            }\n            else\n            {\n                var replyText = \"Sorry, Lightning Mode is only supported in our app. <insert protocol launch button here>\";\n\n                var reply = CreateResponse(\n                                context,\n                                message,\n                                replyText,\n                                replyText,\n                                messageType: MessageType.Statement,\n                                inputHint: InputHints.IgnoringInput);\n\n                await context.PostAsync(reply);\n            }\n        }\n\n        private static IMessageActivity CreateResponse\n        (\n            IDialogContext context,\n            IMessageActivity message,\n            string displayText,\n            string speakText,\n            MessageType messageType,\n            string audioToPlay = null,\n            IList<string> optionsToAdd = null,\n            string inputHint = InputHints.AcceptingInput\n        )\n        {\n            var activityToSend = context.MakeMessage();\n\n            if (displayText != null)\n            {\n                activityToSend.Text = displayText;\n            }\n\n            var ssml = (string)null;\n            if (speakText != null)\n            {\n                var escapedSpeakText = speakText.Replace(\"&\", \"&amp;\").Replace(\"<\", \"&lt;\").Replace(\">\", \"&gt;\").Replace(\"\\\"\", \"&quot;\").Replace(\"'\", \"&apos;\");\n                ssml = SsmlWrapper.Wrap(escapedSpeakText);\n\n                if (audioToPlay != null && message.ChannelId != \"cortana\")\n                {\n                    var assetPath = \"http://\" + System.Web.HttpContext.Current.Request.ServerVariables[\"SERVER_NAME\"] + \"/Assets/\";\n                    var uri = new Uri(assetPath + audioToPlay);\n                    ssml = CombineAudioAndTextForSSML(uri, ssml);\n                }\n            }\n\n            activityToSend.Speak = ssml;\n            activityToSend.InputHint = inputHint;\n\n            var appEntities =\n                new AppEntities\n                {\n                    MessageType = messageType,\n                    TriviaAnswerOptions = optionsToAdd?.Count > 0 ? optionsToAdd : null\n                };\n\n            if (optionsToAdd != null)\n            {\n                List<CardAction> cardButtons = new List<CardAction>();\n\n                bool numberOptions = optionsToAdd.Count > 2;\n                for (int i = 0; i < optionsToAdd.Count; i++)\n                {\n                    var display = numberOptions ? $\"{(i + 1).ToString()}: {optionsToAdd[i]}\" : optionsToAdd[i];\n                    cardButtons.Add(new CardAction() { Value = optionsToAdd[i], Type = \"postBack\", Title = display });\n                }\n\n                var plCard = new ThumbnailCard()\n                {\n                    // Title = \"Pick an answer\",\n                    Buttons = cardButtons,\n                };\n                activityToSend.Attachments.Add(plCard.ToAttachment());\n            }\n\n            var entity = new Entity();\n            entity.SetAs<AppEntities>(appEntities);\n            activityToSend.Entities.Add(entity);\n\n            return activityToSend;\n        }\n\n        public static string GetInnerSsmlContents(string ssml)\n        {\n            StringBuilder sb = new StringBuilder();\n            XmlReader reader = null;\n            reader = XmlReader.Create(new StringReader(ssml));\n            string inner = \"\";\n            if (reader.Read())\n            {\n                inner = reader.ReadInnerXml();\n            }\n\n            return inner;\n        }\n\n        public static string CombineAudioAndTextForSSML(Uri audioStream, string text)\n        {\n            StringBuilder sb = new StringBuilder();\n            const string ssmlPrefix = @\"<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' \" +\n                                            \"xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' \" +\n                                            \"xsi:schemaLocation='http://www.w3.org/2001/10/synthesis \" +\n                                            \"http://www.w3.org/TR/speech-synthesis/synthesis.xsd' \" +\n                                            \"xml:lang='en-us'>\";\n            const string ssmlSuffix = \"</speak>\";\n\n            sb.Append(ssmlPrefix);\n            sb.Append($\"<audio src='{audioStream.AbsoluteUri}'/>\");\n            sb.Append(GetInnerSsmlContents(SsmlWrapper.Wrap(text)));\n            sb.Append(ssmlSuffix);\n            return sb.ToString();\n        }\n\n        private static string SelectRandomString(IList<string> options)\n        {\n            var rand = new Random();\n            var index = rand.Next(0, options.Count - 1);\n            return options[index];\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Runtime/SsmlWrapper.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nnamespace TriviaBot.Runtime\n{\n    /// <summary>\n    /// Clients the support speaking responses will expect SSML. This allows for some more complex functionality\n    /// (like embedded audio, changing speaking speed, etc) but most of the time we just want to send text. This\n    /// wraps text in a basic SSML template.\n    /// </summary>\n    public static class SsmlWrapper\n    {\n        /// <summary>\n        /// SSML template to be filled by the properties\n        /// </summary>\n        private const string SSMLTemplate = @\"<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' \" +\n                                            \"xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' \" +\n                                            \"xsi:schemaLocation='http://www.w3.org/2001/10/synthesis \" +\n                                            \"http://www.w3.org/TR/speech-synthesis/synthesis.xsd' \" +\n                                            \"xml:lang='{0}'><voice gender='{1}'>{2}</voice></speak>\";\n\n        /// <summary>\n        /// Match pattern for SSML unwrap\n        /// </summary>\n        private const string RegexMatchSSMLPattern = @\"^<speak.*xml:lang='(.*)'.*><voice.*gender='(.*)'.*?>([\\s\\S]*)<\\/voice><\\/speak>$\";\n\n        /// <summary>\n        /// Types of gender in the voice to be used in TTS\n        /// </summary>\n        public enum Gender\n        {\n            /// <summary>\n            /// Representation of a female voice\n            /// </summary>\n            Female,\n\n            /// <summary>\n            /// Representation of a male voice\n            /// </summary>\n            Male\n        }\n\n        /// <summary>\n        /// Check if the input text is in SSML format\n        /// </summary>\n        /// <param name=\"text\">The text to be checked</param>\n        /// <returns>Return true if the input text is in SSML format, otherwise return false</returns>\n        public static bool IsInSSMLFormat(string text)\n        {\n            return text != null && text.Contains(\"</speak>\");\n        }\n\n        /// <summary>\n        /// Generates SSML from text\n        /// </summary>\n        /// <param name=\"text\">The input text to generate TTS</param>\n        /// <param name=\"locale\">Language used in the speech</param>\n        /// <param name=\"voiceGender\">Gender of the voice used in speech</param>\n        /// <returns>The TTS string to be sent down to the client and played</returns>\n        public static string Wrap(string text, string locale = \"en-US\", Gender voiceGender = Gender.Female)\n        {\n            if (IsInSSMLFormat(text))\n            {\n                return text;\n            }\n            else\n            {\n                var voiceType = voiceGender == Gender.Female ? \"female\" : \"male\";\n\n                return string.Format(System.Globalization.CultureInfo.InvariantCulture, SSMLTemplate, locale, voiceType, text);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Runtime/TriviaResponse.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nusing Newtonsoft.Json;\nusing System.Web;\n\nnamespace TriviaBot.Runtime\n{\n    public class TriviaQuestion\n    {\n        [JsonProperty(\"speakText\")]\n        public string Category;\n\n        [JsonProperty(\"type\")]\n        public string Type;\n\n        [JsonProperty(\"difficulty\")]\n        public string Difficulty;\n\n        [JsonProperty(\"question\")]\n        public string Question;\n\n        [JsonProperty(\"correct_answer\")]\n        public string CorrectAnswer;\n\n        [JsonProperty(\"incorrect_answers\")]\n        public string[] IncorrectAnswers;\n\n        public void Decode()\n        {\n            this.Category = HttpUtility.HtmlDecode(this.Category);\n            this.CorrectAnswer = HttpUtility.HtmlDecode(this.CorrectAnswer);\n            this.Difficulty = HttpUtility.HtmlDecode(this.Difficulty);\n            for(int i = 0; i < IncorrectAnswers.Length; i++)\n            {\n                this.IncorrectAnswers[i] = HttpUtility.HtmlDecode(this.IncorrectAnswers[i]);\n            }\n            this.Question = HttpUtility.HtmlDecode(this.Question);\n            this.Type = HttpUtility.HtmlDecode(this.Type);\n        }\n    }\n\n    public class TriviaResponse\n    {\n        public void Decode()\n        {\n            foreach(var q in Questions)\n            {\n                q.Decode();\n            }\n        }\n\n        [JsonProperty(\"response_code\")]\n        public int ResponseCode;\n\n\n        [JsonProperty(\"results\")]\n        public TriviaQuestion[] Questions;\n\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Runtime/Utility.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nusing System;\n\nnamespace TriviaBot.Runtime\n{\n    public static class Utility\n    {\n        /// <summary>\n        /// Perform an action if the type of baseObject matches the type of the action\n        /// </summary>\n        /// <typeparam name=\"TDerived\">The type of the action</typeparam>\n        /// <param name=\"baseObject\">The object to operate on</param>\n        /// <param name=\"doIfDerived\">The action to execute if the types match</param>\n        public static void IfIs<TDerived>(this object baseObject, Action<TDerived> doIfDerived)\n            where TDerived : class\n        {\n            var derivedObject = baseObject as TDerived;\n            if (derivedObject != null)\n            {\n                doIfDerived(derivedObject);\n            }\n        }\n\n        /// <summary>\n        /// Perform an action if the type of baseObject matches the type of the action, otherwise returns elseResult\n        /// </summary>\n        /// <typeparam name=\"TDerived\">The type of the action</typeparam>\n        /// <typeparam name=\"TResult\">The type of the result to return</typeparam>\n        /// <param name=\"baseObject\">The object to operate on</param>\n        /// <param name=\"doIfDerived\">The action to execute if the types match</param>\n        /// <param name=\"elseResult\">The value to return if baseObject is not of type TDerived</param>\n        /// <returns>The result of running doIfDerived on baseObject if possible, otherwise elseResult</returns>\n        public static TResult IfIs<TDerived, TResult>(\n            this object baseObject,\n            Func<TDerived, TResult> doIfDerived,\n            TResult elseResult)\n            where TDerived : class\n        {\n            var derivedObject = baseObject as TDerived;\n            return derivedObject != null\n                ? doIfDerived(derivedObject)\n                : elseResult;\n        }\n\n        /// <summary>\n        /// Verifies that an argument is not null, and throws an exception if it is.\n        /// </summary>\n        /// <typeparam name=\"TArg\">The argument type to verify</typeparam>\n        /// <param name=\"arg\">The argument to verify</param>\n        /// <param name=\"name\">The name to display in the thrown exception</param>\n        public static void ArgumentNotNull<TArg>(TArg arg, string name)\n        {\n            if (arg == null)\n            {\n                throw new ArgumentNullException(name);\n            }\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Shared/AppEntities.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nusing System.Collections.Generic;\n\nnamespace TriviaBot.Shared\n{\n    public class AppEntities\n    {\n        public string Type = \"AppEntities\";\n\n        public MessageType? MessageType;\n        public IList<string> TriviaAnswerOptions;\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Shared/MessageType.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nnamespace TriviaBot.Shared\n{\n    public enum MessageType\n    {\n        Statement,\n        Question,\n        GotItRight,\n        GotItWrong,\n        StartLightningMode,\n        StopLightningMode,\n        OutOfTime\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/TriviaBot.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{17505E75-104B-4513-938A-ABB1CD4A39FB}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>TriviaBot</RootNamespace>\n    <AssemblyName>TriviaBot</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <UseIISExpress>true</UseIISExpress>\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Autofac, Version=3.5.0.0, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Autofac.3.5.2\\lib\\net40\\Autofac.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Chronic, Version=0.3.2.0, Culture=neutral, PublicKeyToken=3bd1f1ef638b0d3c, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Chronic.Signed.0.3.2\\lib\\net40\\Chronic.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.ApplicationInsights, Version=2.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.ApplicationInsights.2.2.0\\lib\\net46\\Microsoft.ApplicationInsights.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder, Version=3.5.9.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.5.9.0\\lib\\net46\\Microsoft.Bot.Builder.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder.Autofac, Version=3.5.9.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.5.9.0\\lib\\net46\\Microsoft.Bot.Builder.Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Connector, Version=3.5.9.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.5.9.0\\lib\\net46\\Microsoft.Bot.Connector.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"Microsoft.IdentityModel.Protocol.Extensions, Version=1.0.40306.1554, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Protocol.Extensions.1.0.4.403061554\\lib\\net45\\Microsoft.IdentityModel.Protocol.Extensions.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Rest.ClientRuntime.2.3.2\\lib\\net45\\Microsoft.Rest.ClientRuntime.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.WindowsAzure.Configuration, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.WindowsAzure.ConfigurationManager.3.1.0\\lib\\net40\\Microsoft.WindowsAzure.Configuration.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Newtonsoft.Json.9.0.1\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.IdentityModel.Tokens.Jwt, Version=4.0.40306.1554, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.IdentityModel.Tokens.Jwt.4.0.4.403061554\\lib\\net45\\System.IdentityModel.Tokens.Jwt.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.AspNet.WebApi.Client.5.2.3\\lib\\net45\\System.Net.Http.Formatting.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Net.Http.WebRequest\" />\n    <Reference Include=\"System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Runtime.InteropServices.RuntimeInformation.4.3.0\\lib\\net45\\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.AspNet.WebApi.Core.5.2.3\\lib\\net45\\System.Web.Http.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Web.Http.WebHost, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.AspNet.WebApi.WebHost.5.2.3\\lib\\net45\\System.Web.Http.WebHost.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n    <Reference Include=\"System.Xml.Linq\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Assets\\a_sunshine_intro_09.wav\" />\n    <Content Include=\"Assets\\tv_gameshow_bell_01.wav\" />\n    <Content Include=\"Assets\\tv_gameshow_buzzer_03.wav\" />\n    <Content Include=\"default.htm\" />\n    <Content Include=\"Global.asax\" />\n    <Content Include=\"Assets\\Trivia.png\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </Content>\n    <Content Include=\"Web.config\">\n      <SubType>Designer</SubType>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"App_Start\\WebApiConfig.cs\" />\n    <Compile Include=\"Controllers\\MessagesController.cs\" />\n    <Compile Include=\"Runtime\\BotState.cs\" />\n    <Compile Include=\"Runtime\\Extensions.cs\" />\n    <Compile Include=\"Global.asax.cs\">\n      <DependentUpon>Global.asax</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Runtime\\Responses.cs\" />\n    <Compile Include=\"Runtime\\Categories.cs\" />\n    <Compile Include=\"Runtime\\EnumExtensions.cs\" />\n    <Compile Include=\"Luis\\QueryLuis.cs\" />\n    <Compile Include=\"Luis\\LuisEntity.cs\" />\n    <Compile Include=\"Luis\\LuisIntent.cs\" />\n    <Compile Include=\"Luis\\LuisResult.cs\" />\n    <Compile Include=\"Shared\\AppEntities.cs\" />\n    <Compile Include=\"Shared\\MessageType.cs\" />\n    <Compile Include=\"TriviaDialog.cs\" />\n    <Compile Include=\"Runtime\\SsmlWrapper.cs\" />\n    <Compile Include=\"Runtime\\Utility.cs\" />\n    <Compile Include=\"Runtime\\TriviaResponse.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"packages.config\" />\n    <None Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n    <None Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <WCFMetadata Include=\"Service References\\\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Folder Include=\"Properties\\PublishProfiles\\\" />\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <PropertyGroup>\n    <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>3979</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost:3986/</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/TriviaDialog.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n\nusing Luis;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Net;\nusing System.Threading.Tasks;\nusing TriviaBot.Shared;\n\nnamespace TriviaBot.Runtime\n{\n    [Serializable]\n    public class TriviaDialog : IDialog<object>\n    {\n        public BotState CurrentState { get; set; } = BotState.None;\n\n        // In-game state\n        public TriviaCategory Category = TriviaCategory.None;\n        public string ExpectedAnswer = null;\n        public List<string> AnswerOptions = null;\n\n        public string CurrentQuestion = null;\n        public string ChosenAnswer = null;\n        public bool ConfirmingAnswer = false;\n        public bool TimedOutLastTime = false;\n\n        private void ResetState()\n        {\n            CurrentState = BotState.None;\n\n            Category = TriviaCategory.None;\n            ExpectedAnswer = null;\n            AnswerOptions = null;\n\n            CurrentQuestion = null;\n            ChosenAnswer = null;\n            ConfirmingAnswer = false;\n            TimedOutLastTime = false;\n        }\n\n        public async Task StartAsync(IDialogContext context)\n        {\n            context.Wait(MessageReceivedAsync);\n        }\n\n        public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)\n        {\n            var message = await argument;\n\n            var LU = (LuisResult)null;\n\n            // We have some text to process, run LUIS to get intent + entities\n            if (message.Text != null)\n            {\n                LU = await QueryLuis.GetIntentAndEntitiesFromLuis(\n                    #error You must specify the LUIS endpoint to talk to. You can do this by creating a new LUIS app on http://luis.ai/, importing the included TriviaBotLU.json, and publishing it.\n                    \"appID\", \"subscriptionKey\",\n                    message.Text);\n            }\n            \n            // Process\n            if (LU?.Intents?.Max()?.Intent.NormalizedEquals(\"Cancel\") == true)\n            {\n                await Responses.Send_Goodbye(context, message);\n                ResetState();\n            }\n            else if (CurrentState == BotState.None)\n            {\n                await State_None(context, message, LU);\n            }\n            else if (CurrentState == BotState.Trivia)\n            {\n                await State_Trivia(context, message, LU);\n            }\n            else if (CurrentState == BotState.SwitchCategory)\n            {\n                await State_SwitchCategory(context, message, LU);\n            }\n            else if (CurrentState == BotState.WaitingForReengagement)\n            {\n                CurrentState = BotState.Trivia;\n                TimedOutLastTime = false;\n\n                await Responses.Send_LetsGo(context, message);\n                await Trivia_AskQuestion(context, message, true);\n            }\n            else\n            {\n                await Responses.Send_Error_UnknownState(context, message);\n                ResetState();\n            }\n\n            context.Wait(MessageReceivedAsync);\n        }\n\n        private async Task State_None(IDialogContext context, IMessageActivity message, LuisResult luis)\n        {\n            var intent = luis?.Intents?.Max()?.Intent;\n\n            if (intent == null)\n            {\n                return;\n            }\n            if (intent.NormalizedEquals(\"Help\"))\n            {\n                await Responses.Send_Help_Trivia(context, message);\n            }\n            else if (intent.NormalizedEquals(\"Play\"))\n            {\n                await StartGame_Trivia(context, message, luis);\n            }\n            else if (intent.NormalizedEquals(\"StartMode\"))\n            {\n                await Responses.Send_LightningModeStart(context, message);\n                await Trivia_AskQuestion(context, message, true);\n            }\n            else\n            {\n                await Responses.Send_DidNotUnderstand(context, message);\n                await Responses.Send_Help_Trivia(context, message);\n            }\n        }\n\n        private async Task State_Trivia(IDialogContext context, IMessageActivity message, LuisResult luis)\n        {\n            // We need to handle help, etc at a lower level, because the trivia answers might trigger any intent\n            await Trivia_ProcessAnswer(context, message, luis);\n        }\n\n        private async Task State_SwitchCategory(IDialogContext context, IMessageActivity message, LuisResult luis)\n        {\n            bool firstTime = false;\n            if (CurrentState != BotState.SwitchCategory)\n            {\n                firstTime = true;\n                CurrentState = BotState.SwitchCategory;\n            }\n\n            // See if the category was provided with the SwitchCategory intent\n            var categoryValue = GetCategoryFromLuis(luis);\n\n            if (categoryValue == TriviaCategory.None)\n            {\n                categoryValue = GetCategoryValue(message.Text);\n            }\n\n            if (categoryValue != TriviaCategory.None)\n            {\n                Category = categoryValue;\n\n                await Responses.Send_SwitchedCategory(context, message, Category);\n                await Trivia_AskQuestion(context, message, true);\n                return;\n            }\n\n            if (!firstTime)\n            {\n                await Responses.Send_DidNotUnderstand(context, message);\n            }\n\n            await Responses.AskForCategory(context, message);\n        }\n\n        private TriviaCategory GetCategoryFromLuis(LuisResult luis)\n        {\n            if (luis.Entities != null)\n            {\n                var categories =\n                    from entity in luis.Entities\n                    where entity.Type.NormalizedEquals(\"category\")\n                    select entity.Entity;\n\n                foreach (var category in categories)\n                {\n                    var value = GetCategoryValue(category);\n                    if (value != TriviaCategory.None)\n                    {\n                        return value;\n                    }\n                }\n            }\n\n            return TriviaCategory.None;\n        }\n\n        private TriviaCategory SwitchCategory_ResolveCategory(IDialogContext context, IMessageActivity message, LuisResult luis)\n        {\n            var resolvedCategory = TriviaCategory.Any;\n\n            if (luis != null && luis.Entities != null)\n            {\n                var categories =\n                    from entity in luis.Entities\n                    where entity.Type.NormalizedEquals(\"categories\")\n                    select entity.Entity;\n\n                if (categories.Count() > 0)\n                {\n                    var category = categories.First();\n                    resolvedCategory = GetCategoryValue(category);\n                }\n            }\n            else if (resolvedCategory == TriviaCategory.Any && message.Text != null)\n            {\n                resolvedCategory = GetCategoryValue(message.Text);\n            }\n\n            return resolvedCategory;\n        }\n\n        private async Task Trivia_ProcessAnswer(IDialogContext context, IMessageActivity message, LuisResult luis)\n        {\n            if (ExpectedAnswer == null)\n            {\n                await Responses.Send_Error_NextQuestion(context, message);\n                await Trivia_AskQuestion(context, message, true);\n            }\n\n            var providedAnswer = message.Text;\n\n            // If no answer was provided, see if the user ran out of time\n            if (providedAnswer == null)\n            {\n                var appEntitiesJson =\n                    (from entity in message.Entities\n                     where entity.Type.NormalizedEquals(\"AppEntities\")\n                     select entity).FirstOrDefault();\n\n                if (appEntitiesJson != null)\n                {\n                    var appEntities = appEntitiesJson.GetAs<AppEntities>();\n\n                    if (appEntities.Type.NormalizedEquals(\"AppEntities\") && appEntities.MessageType == MessageType.OutOfTime)\n                    {\n                        if (!TimedOutLastTime)\n                        {\n                            TimedOutLastTime = true;\n\n                            await Responses.Send_OutOfTime_First(context, message);\n\n\n                            await Responses.Send_TryEasierQuestion(context, message);\n\n                            await Trivia_AskQuestion(context, message, true);\n                            return;\n                        }\n                        else\n                        {\n                            await Responses.Send_OutOfTime_X(context, message);\n                            CurrentState = BotState.WaitingForReengagement;\n\n                            return;\n                        }\n                    }\n                }\n            }\n\n            TimedOutLastTime = false;\n\n            // User referred to answer indirectly (by position), and we asked for confirmation\n            if (ConfirmingAnswer)\n            {\n                var tentativeAnswer = ChosenAnswer;\n\n                ChosenAnswer = null;\n                ConfirmingAnswer = false;\n\n                if (luis.Intents.Max().Intent.NormalizedEquals(\"Agree\"))\n                {\n                    providedAnswer = tentativeAnswer;\n                }\n                else\n                {\n                    await Trivia_AskQuestion(context, message, false);\n                    return;\n                }\n            }\n\n            // Try comparing the answer provided\n\n            // No answer provided, just ignore the message\n            if (providedAnswer == null || providedAnswer.Length == 0)\n            {\n                return;\n            }\n\n            // Exact match\n            if (providedAnswer.NormalizedEquals(ExpectedAnswer))\n            {\n                await Responses.Send_CorrectAnswer(context, message, ExpectedAnswer);\n                await Trivia_NextQuestion(context, message, luis);\n                return;\n            }\n\n            // If it matches any answer now, it must be wrong\n            foreach (var option in AnswerOptions)\n            {\n                if (option.NormalizedEquals(providedAnswer))\n                {\n                    await Responses.Send_IncorrectAnswer(context, message, ExpectedAnswer);\n                    await Trivia_NextQuestion(context, message, luis);\n                    return;\n                }\n            }\n\n            // Ordinal answer\n            if (luis.Intents.Max().Intent.NormalizedEquals(\"Select\") && luis.Entities.Count > 0)\n            {\n                var selections =\n                    from entity in luis.Entities\n                    where entity.Type.NormalizedEquals(\"selection\")\n                    select entity.Entity;\n\n                if (selections.Count() > 0)\n                {\n                    var selection = ResolveOrdinalReference(selections.First()) - 1;\n                    \n                    if (selection >= 0 && selection < AnswerOptions.Count)\n                    {\n                        ChosenAnswer = AnswerOptions[selection];\n                        ConfirmingAnswer = true;\n\n                        await Responses.Send_ConfirmAnswer(context, message, ChosenAnswer);\n                        return;\n                    }\n                }\n            }\n\n            // Didn't match any option, see if it's an intent we can handle\n            var intent = luis.Intents.Max()?.Intent;\n\n            if (intent?.NormalizedEquals(\"Help\") == true)\n            {\n                await Responses.Send_Help_Trivia(context, message, AnswerOptions);\n            }\n            else if (intent?.NormalizedEquals(\"SwitchCategory\") == true)\n            {\n                await State_SwitchCategory(context, message, luis);\n            }\n            else if (intent?.NormalizedEquals(\"StartMode\") == true)\n            {\n                await Responses.Send_LightningModeStart(context, message);\n                await Trivia_AskQuestion(context, message, false);\n            }\n            else if (intent?.NormalizedEquals(\"StopMode\") == true)\n            {\n                await Responses.Send_LightningModeEnd(context, message);\n                await Trivia_AskQuestion(context, message, false);\n            }\n            else if (intent?.NormalizedEquals(\"Play\") == true)\n            {\n                await ProcessLuis_Play(context, message, luis);\n                await Trivia_AskQuestion(context, message, false);\n            }\n            else\n            {\n                await Responses.Send_DidNotUnderstand(context, message);\n                await Responses.Send_WhichOne(context, message, AnswerOptions);\n            }\n        }\n\n        private async Task Trivia_NextQuestion(IDialogContext context, IMessageActivity message, LuisResult luis)\n        {\n            await Task.Delay(3000);\n\n            await Responses.Send_TimeForNextQuestion(context, message);\n            await Trivia_AskQuestion(context, message, true);\n        }\n\n        private async Task StartGame_Trivia(IDialogContext context, IMessageActivity message, LuisResult luis)\n        {\n            bool skipIntro = message.Entities?.Any(x => x.Type.NormalizedEquals(\"skipIntro\")) == true || message.ChannelId.NormalizedEquals(\"cortana\");\n\n            if (!skipIntro)\n            {\n                await Responses.Send_Greeting(context, message);\n            }\n                   \n            await ProcessLuis_Play(context, message, luis);\n\n            await Responses.Send_FirstQuestion(context, message);\n\n            await Trivia_AskQuestion(context, message, true);\n        }\n\n        // Process information sent with the LUIS intent Play\n        private async Task ProcessLuis_Play(IDialogContext context, IMessageActivity message, LuisResult luis)\n        {\n            var categoryValue = GetCategoryFromLuis(luis);\n            if (categoryValue != TriviaCategory.None)\n            {\n                await Responses.Send_PlayingCategory(context, message, categoryValue);\n                Category = categoryValue;\n            }\n\n            if (luis?.Entities != null)\n            {\n                var mode =\n                    from entity in luis.Entities\n                    where entity.Type.NormalizedEquals(\"mode\")\n                    select entity;\n\n                if (mode?.Count() > 0)\n                {\n                    await Responses.Send_LightningModeStart(context, message);\n                }\n            }\n        }\n\n        private async Task Trivia_AskQuestion(IDialogContext context, IMessageActivity message, bool getNewQuestion)\n        {\n            CurrentState = BotState.Trivia;\n\n            if (getNewQuestion)\n            {\n                var url = \"https://opentdb.com/api.php?amount=1\";\n                if (Category != TriviaCategory.None)\n                {\n                    url += \"&category=\" + (int)Category;\n                }\n\n                var res = HttpGet(url);\n\n                var triviaResponse = Newtonsoft.Json.JsonConvert.DeserializeObject<TriviaResponse>(res);\n                triviaResponse.Decode();\n\n                var question = triviaResponse.Questions[0];\n\n                var maxIncorrect = question.IncorrectAnswers.Count();\n                // Skype only supports 3 total buttons, so limit incorrect answers\n                if (message.ChannelId.NormalizedEquals(\"skype\"))\n                {\n                    maxIncorrect = Math.Min(maxIncorrect, 2);\n                }\n                var allAnswers = question.IncorrectAnswers.ToList().GetRange(0, maxIncorrect);\n\n                allAnswers.Add(question.CorrectAnswer);\n\n                CurrentQuestion = question.Question;\n                ExpectedAnswer = question.CorrectAnswer;\n                AnswerOptions = ShuffleResults(allAnswers);\n            }\n\n            await Responses.SendQuestion(context, message, CurrentQuestion, AnswerOptions);\n        }\n\n        private TriviaCategory GetCategoryValue(string category)\n        {\n            var normalizedCategory = category?.Normalize();\n\n            if (normalizedCategory != null)\n            {\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"any\", \"whatever\", \"don't care\", \"do not care\", \"all\" })) return TriviaCategory.Any;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"general\" })) return TriviaCategory.GeneralKnowledge;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"history\" })) return TriviaCategory.History; // Must be before Books (story)\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"book\", \"stories\", \"story\" })) return TriviaCategory.EntertainmentBooks;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"film\", \"movie\" })) return TriviaCategory.EntertainmentFilm;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"music\", \"song\" })) return TriviaCategory.EntertainmentMusic;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"musical\", \"theater\", \"theatre\" })) return TriviaCategory.EntertainmentMusicalsTheatre;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"television\", \"tv\", \"tube\" })) return TriviaCategory.EntertainmentTelevision;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"videogames\", \"video games\" })) return TriviaCategory.EntertainmentVideoGames;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"boardgames\", \"board games\" })) return TriviaCategory.EntertainmentBoardGames;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"nature\", \"natural\", \"science\" })) return TriviaCategory.ScienceNature;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"computers\", \"software\" })) return TriviaCategory.ScienceComputers;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"math\" })) return TriviaCategory.ScienceMathematics;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"mythology\" })) return TriviaCategory.Mythology;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"sport\", \"athletic\" })) return TriviaCategory.Sports;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"geography\" })) return TriviaCategory.Geography;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"politics\", \"government\" })) return TriviaCategory.Politics;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"art\", \"paint\", \"draw\" })) return TriviaCategory.Art;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"celeb\", \"famous\" })) return TriviaCategory.Celebrities;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"animal\" })) return TriviaCategory.Animals;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"vehicle\", \"car\", \"driv\" })) return TriviaCategory.Vehicles;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"comic\", \"magazine\" })) return TriviaCategory.EntertainmentComics;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"gadget\", \"electronic\", \"technology\" })) return TriviaCategory.ScienceGadgets;\n                if (normalizedCategory.ContainsIgnoreCase(new[] { \"anime\", \"manga\" })) return TriviaCategory.EntertainmentJapaneseAnimeManga;\n            }\n\n            return TriviaCategory.None;\n        }\n\n        private static string HttpGet(string URI)\n        {\n            WebClient client = new WebClient();\n\n            // Add a user agent header in case the \n            // requested URI contains a query.\n\n            client.Headers.Add(\"user-agent\", \"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)\");\n\n            Stream data = client.OpenRead(URI);\n            StreamReader reader = new StreamReader(data);\n            string s = reader.ReadToEnd();\n            data.Close();\n            reader.Close();\n\n            return s;\n        }\n\n        private static int ResolveOrdinalReference(string message)\n        {\n            var normalizedMessage = message.Normalize();\n\n            if (normalizedMessage != null)\n            {\n                if (normalizedMessage.ContainsIgnoreCase(new[] { \"tenth\", \"ten\", \"10\" })) return 10;\n                if (normalizedMessage.ContainsIgnoreCase(new[] { \"first\", \"1\" })) return 1;\n                if (normalizedMessage.ContainsIgnoreCase(new[] { \"second\", \"two\", \"2\" })) return 2;\n                if (normalizedMessage.ContainsIgnoreCase(new[] { \"third\", \"three\", \"3\" })) return 3;\n                if (normalizedMessage.ContainsIgnoreCase(new[] { \"fourth\", \"four\", \"4\" })) return 4;\n                if (normalizedMessage.ContainsIgnoreCase(new[] { \"fifth\", \"five\", \"5\" })) return 5;\n                if (normalizedMessage.ContainsIgnoreCase(new[] { \"sixth\", \"six\", \"6\" })) return 6;\n                if (normalizedMessage.ContainsIgnoreCase(new[] { \"seventh\", \"seven\", \"7\" })) return 7;\n                if (normalizedMessage.ContainsIgnoreCase(new[] { \"eight\", \"eight\", \"8\" })) return 8;\n                if (normalizedMessage.ContainsIgnoreCase(new[] { \"ninth\", \"nine\", \"9\" })) return 9;\n                if (normalizedMessage.ContainsIgnoreCase(new[] { \"one\" })) return 1; // last to avoid matching \"fourth one\"\n            }\n\n            return -1;\n        }\n\n        private List<string> ShuffleResults(IList<string> list)\n        {\n            // On a true/false, force that order\n            if (list.Count == 2 && \n                list.Contains(\"True\") && list.Contains(\"False\"))\n            {\n                return new List<string>() { \"True\", \"False\" };\n            }\n\n            var inList = list.ToList();\n            var outList = new List<string>();\n\n            var rand = new Random();\n            while (inList.Count > 0)\n            {\n                var index = rand.Next(inList.Count);\n                outList.Add(inList[index]);\n                inList.RemoveAt(index);\n            }\n\n            return outList;\n        }\n    }\n}"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Web.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Web.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/Web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  For more information on how to configure your ASP.NET application, please visit\n  http://go.microsoft.com/fwlink/?LinkId=301879\n  -->\n<configuration>\n  <appSettings>\n    <!-- update these with your BotId, Microsoft App Id and your Microsoft App Password-->\n    <add key=\"BotId\" value=\"TriviaBot\" />\n    <add key=\"MicrosoftAppId\" value=\"\" />\n    <add key=\"MicrosoftAppPassword\" value=\"\" />\n  </appSettings>\n  <!--\n    For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367.\n\n    The following attributes can be set on the <httpRuntime> tag.\n      <system.Web>\n        <httpRuntime targetFramework=\"4.6\" />\n      </system.Web>\n  -->\n  <system.web>\n    <customErrors mode=\"Off\" /> \n    <compilation debug=\"true\" targetFramework=\"4.6\" />\n    <httpRuntime targetFramework=\"4.6\" />\n  </system.web>\n  <system.webServer>\n    <defaultDocument>\n      <files>\n        <clear />\n        <add value=\"default.htm\" />\n      </files>\n    </defaultDocument>\n  <handlers>\n      <remove name=\"ExtensionlessUrlHandler-Integrated-4.0\" />\n      <remove name=\"OPTIONSVerbHandler\" />\n      <remove name=\"TRACEVerbHandler\" />\n      <add name=\"ExtensionlessUrlHandler-Integrated-4.0\" path=\"*.\" verb=\"*\" type=\"System.Web.Handlers.TransferRequestHandler\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n    </handlers>\n  </system.webServer>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Helpers\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Mvc\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.WebPages\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" publicKeyToken=\"30ad4fe6b2a6aeed\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-9.0.0.0\" newVersion=\"9.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.29.0\" newVersion=\"4.2.29.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Formatting\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n</configuration>"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/default.htm",
    "content": "﻿<!DOCTYPE html>\n<html>\n<head>\n    <title></title>\n    <meta charset=\"utf-8\" />\n</head>\n<body style=\"font-family:'Segoe UI'\">\n    <h1>TriviaBot</h1>\n    <p>Describe your bot here and your terms of use etc.</p>\n    <p>Visit <a href=\"https://www.botframework.com/\">Bot Framework</a> to register your bot. When you register it, remember to set your bot's endpoint to <pre>https://<i>your_bots_hostname</i>/api/messages</pre></p>\n</body>\n</html>\n"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBot/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Autofac\" version=\"3.5.2\" targetFramework=\"net46\" />\n  <package id=\"Chronic.Signed\" version=\"0.3.2\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.ApplicationInsights\" version=\"2.2.0\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.Client\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.Core\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.WebHost\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Bot.Builder\" version=\"3.5.9.0\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.IdentityModel.Protocol.Extensions\" version=\"1.0.4.403061554\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Rest.ClientRuntime\" version=\"2.3.2\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.WindowsAzure.ConfigurationManager\" version=\"3.1.0\" targetFramework=\"net46\" />\n  <package id=\"Newtonsoft.Json\" version=\"9.0.1\" targetFramework=\"net46\" />\n  <package id=\"System.IdentityModel.Tokens.Jwt\" version=\"4.0.4.403061554\" targetFramework=\"net46\" />\n  <package id=\"System.Runtime.InteropServices.RuntimeInformation\" version=\"4.3.0\" targetFramework=\"net46\" />\n  <package id=\"System.Xml.XmlSerializer\" version=\"4.3.0\" targetFramework=\"net46\" />\n</packages>"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBotLU.json",
    "content": "{\n  \"luis_schema_version\": \"2.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"TriviaBotLU\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"intents\": [\n    {\n      \"name\": \"Agree\"\n    },\n    {\n      \"name\": \"Cancel\"\n    },\n    {\n      \"name\": \"Disagree\"\n    },\n    {\n      \"name\": \"Help\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"Play\"\n    },\n    {\n      \"name\": \"Select\"\n    },\n    {\n      \"name\": \"StartMode\"\n    },\n    {\n      \"name\": \"StopMode\"\n    },\n    {\n      \"name\": \"SwitchCategory\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"category\"\n    },\n    {\n      \"name\": \"mode\"\n    },\n    {\n      \"name\": \"selection\"\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"bing_entities\": [],\n  \"actions\": [],\n  \"model_features\": [\n    {\n      \"name\": \"Categories\",\n      \"mode\": true,\n      \"words\": \"any,general,history,book,story,stories,film,films,movie,movies,music,song,songs,musical,musicals,theatre,theater,television,tv,tube,videogames,video games,boardgames,board games,nature,natural,science,computers,software,math,mythology,sport,sports,athletic,athletics,geography,politics,government,art,paint,painting,draw,drawing,celebrity,celebrities,famous,animal,animals,vehicle,vehicles,car,cars,driving,comic,comics,magazines,magazine,mags,gadget,gadgets,electronic,electronics,technology,anime,manga\",\n      \"activated\": true\n    },\n    {\n      \"name\": \"number\",\n      \"mode\": true,\n      \"words\": \"1,one,first,2,two,second,3,three,third,4,four,fourth,5,five,fifth,6,six,sixth\",\n      \"activated\": true\n    },\n    {\n      \"name\": \"yesno\",\n      \"mode\": true,\n      \"words\": \"yes,no\",\n      \"activated\": true\n    }\n  ],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"i'd like to order pizza\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"don't do anything\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to play\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where am i\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"who are you\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what is the meaning of life\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to watch a movie\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how about morgan\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the floor is lava\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"teach me how to duggie\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"123\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"testing\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"test\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"lordgenome\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"lord genome\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"wales\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"kingloname\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"safety dance\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"king loname\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"aarhus\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"lagwagon\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"catholic\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"wasabi\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"pilot\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"jens\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ruby/sapphire\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"television remote\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"garry newman\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dog\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"diamond\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yo\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"mgmt\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"arab\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"godzilla\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cognitive dissonance\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yukiteru diary\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"colonel bogey march\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"jason\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"michael jackson\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"september 1st, 1939\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"lkjsadfljk\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"pc-9801\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ariadne\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tin\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"kon\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shadows\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"blue\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"a\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"solidus snake\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yellow moon\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"maxine caulfield\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"shiatsu\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"zero-point energy field manipulator\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"kurt cobain\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"bangladesh\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"11\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"leg\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"1000\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"false\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ios\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dick tracy\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"estelle bright\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"audi\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"9\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"august 21\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"teleport\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sphenopalatine ganglioneuralgia\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"syrian\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"obsidian\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tyrone\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"1983\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"marcel\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"bones\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"japan\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"caterpie\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"coronation of prince johann i joseph in 1805\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"march 28, 1999\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"kill la kill\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"324 days.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the 1936 olympics\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"toyota prius\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"pre s.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"scott cawthon\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"htc.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sebold.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will stamper\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"11100\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"open.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"izmir\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"georgia\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"apollo\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"boss.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"mitochondria.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tracks from the attic\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"columbia university\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"transener.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nova scotia\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"putt-putt\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"edwin neal\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ronald reagan i'm getting feedback from that.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"murder diary\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"htc\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hungarian\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"chi mc.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nevada.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok, i should be options now.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dual berretas\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"paris.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ithaca\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"rhyhorn\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nothing.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"true.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"to go.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ageia\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"luigi.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"2010.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"benjamin franklin.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"enya\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ronald reagan.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"enkimdu\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"70 hz\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"pause.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"something\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"parasite eve\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"april 23rd, 1564\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"toyota prius?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"aldehyde\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will you?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"order pizza\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"1982\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"water\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ultimate\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"this song is not about a girl\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do for me.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"aladdin.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"giorno giovanna\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"chile\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"balls.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"fiji\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"palo alto\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hello\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"15\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't know!\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"james heller.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"false.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"terraforming\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"something.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"south america\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vancouver\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"china\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"single\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"24.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"kratos\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"niagara falls,\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"gasoline.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nagra falls.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"neptune\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"1854\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"peperoncino\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nitro\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"two (2)\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"diane\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"president of the usa jimmy carter.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"10 g sosa's.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"juno\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"duckburg\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"maybe your best course...would be to tread lightly.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"h20\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"movies\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 0,\n          \"endPos\": 5\n        }\n      ]\n    },\n    {\n      \"text\": \"12\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"willow.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the elephant.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"complete color.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"david hockney\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"1111\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"magyarország\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"prince of wallachia\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"my struggle\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ira levin\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"calf\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"search lightning mood.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nature\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"any.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"my choice.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the end.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dau.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"done.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"silver.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ronald reagan supposed to show you the questions again, but\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"there's nothing cancel.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"game boy color.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"leo sayer\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ethiopia\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"mark.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"house.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"jupiter\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd like to meet you.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"blah blah.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"class 43\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"bane\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sazae-san\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"10 gigabytes for second.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the joker\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"jennifer hale\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"apollo 11\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"message in a bottle show\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"unfinished business.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sauce.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop listening mode.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"2 k games\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start lightning road.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm in 5.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"play blackjack\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"oichi\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah, hey, hey.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sorry correct answer was true.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"2001: a space odyssey\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"all.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"balls\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"wallachia, romania\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"keraton.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"1999\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cause.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"jelly bean.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"1,776 ft\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"microsoft\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"rubber soul.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"search lightning weird.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"monster.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"down syndrome\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"varanus.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"search lightning mode.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hydrogen.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"barn.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cleopatra\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"median, achaemenid, parthian, sassanid\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"s.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"skids\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"polycarbonate\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"niger\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what are you fools?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"which i don't understand that?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"pokémon platinum.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"camshaft.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start playing.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"crazy golf.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"carreras.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hey tightrope.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"labyrinth\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tetrisphere\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"fine of $5,000\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"florida.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"text.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"blah.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"toto\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"thank you.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"falls.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"8.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"falsa.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"which one did you mean 40?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"charles bronson\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"farts.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"distant drums\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"december 25th, 1991\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tell.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sorry i don't understand that.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"august 19.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"scared.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"20\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"kanra.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hd graphics 700\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i understand that.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"2 k games.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"o3\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"none.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"pyrrhura molinae\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"median, achaemenid, sassanid, parthian\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"vannia.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"tasmania, australia\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yuen.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"a.i.a.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start liking me.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"a tight rope\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the letter a\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"fly like an eagle\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"indominus rex.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start fighting mode.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"helium.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"lithium.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"big boss.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you bet.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"will smith\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"iran out of time.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"wheatley laboratories\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start listening mode.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"the velvet underground\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dihydrogen monoxide.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"philippines\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cortana.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hello, what the heck is going on.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"turdo.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i's style.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"irish republican army\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"scarred 20.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"leif ericsson.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"france.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"where at\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"take off all your clothes.\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"plant listening mode\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"liquid crystal display\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"elwood\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"do it\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"totally\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yep\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"uh huh\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yup\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeah\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"y\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"definitely\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure thing\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"let's go\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"why not\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yessir\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"totes\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"you bet\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"true\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yeppers\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yes.\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"yep.\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure.\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ok.\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure is\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sure is.\",\n      \"intent\": \"Agree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"n\",\n      \"intent\": \"Disagree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no thank you\",\n      \"intent\": \"Disagree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no way\",\n      \"intent\": \"Disagree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"definitely not\",\n      \"intent\": \"Disagree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no\",\n      \"intent\": \"Disagree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"nope\",\n      \"intent\": \"Disagree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no no\",\n      \"intent\": \"Disagree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no.\",\n      \"intent\": \"Disagree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"no no no no.\",\n      \"intent\": \"Disagree\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can you do\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can i say\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i need help\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't know what to do\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm lost\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what do you understand\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can i say to you\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what can i do\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"what\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"help.\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sorry i don't understand that which one did you mean?\",\n      \"intent\": \"Help\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"one\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 2\n        }\n      ]\n    },\n    {\n      \"text\": \"6\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"5\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"4\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"3\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"2\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"1\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"sixth\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 4\n        }\n      ]\n    },\n    {\n      \"text\": \"fifth\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 4\n        }\n      ]\n    },\n    {\n      \"text\": \"fourth\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 5\n        }\n      ]\n    },\n    {\n      \"text\": \"third\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 4\n        }\n      ]\n    },\n    {\n      \"text\": \"second\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 5\n        }\n      ]\n    },\n    {\n      \"text\": \"the first one\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"six\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 2\n        }\n      ]\n    },\n    {\n      \"text\": \"five\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 3\n        }\n      ]\n    },\n    {\n      \"text\": \"four\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 3\n        }\n      ]\n    },\n    {\n      \"text\": \"three\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 4\n        }\n      ]\n    },\n    {\n      \"text\": \"two\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 2\n        }\n      ]\n    },\n    {\n      \"text\": \"how about the sixth one\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 14,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"let's go with the fifth\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 18,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"let's go with 5\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 14,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"the sixth\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"the fourth one\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 4,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"3.\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"which one did you mean?\",\n      \"intent\": \"Select\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"2.\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"which one falls?\",\n      \"intent\": \"Select\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"5.\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 0\n        }\n      ]\n    },\n    {\n      \"text\": \"first, one.\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 4\n        }\n      ]\n    },\n    {\n      \"text\": \"three men and a baby\",\n      \"intent\": \"Select\",\n      \"entities\": [\n        {\n          \"entity\": \"selection\",\n          \"startPos\": 0,\n          \"endPos\": 4\n        }\n      ]\n    },\n    {\n      \"text\": \"no more questions\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"quit\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'm done playing\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"stop playing\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i would like to stop\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"cancel.\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to stop playing\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"bye\",\n      \"intent\": \"Cancel\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"change to gadgets\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 10,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"i'd like to answer questions about animals now\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 35,\n          \"endPos\": 41\n        }\n      ]\n    },\n    {\n      \"text\": \"can i answer questions about mythology\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 29,\n          \"endPos\": 37\n        }\n      ]\n    },\n    {\n      \"text\": \"i would like to play the category books\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 34,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"how about music questions\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 10,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"switch to general knowledge\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 10,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"change to questions about art\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 26,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"i'd like japanese anime and manga questions now\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 9,\n          \"endPos\": 32\n        }\n      ]\n    },\n    {\n      \"text\": \"i want questions about mathematics\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 23,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"switch to questions about japanese anime & manga\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 26,\n          \"endPos\": 47\n        }\n      ]\n    },\n    {\n      \"text\": \"can you ask questions about board games\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 28,\n          \"endPos\": 38\n        }\n      ]\n    },\n    {\n      \"text\": \"i'd like different questions please\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can we change the category\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to answer questions about a different category now\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"sports questions please\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 0,\n          \"endPos\": 5\n        }\n      ]\n    },\n    {\n      \"text\": \"questions about vehicles\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 16,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"i would be cool if you could ask me about geography now\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 42,\n          \"endPos\": 50\n        }\n      ]\n    },\n    {\n      \"text\": \"ask about film now\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 10,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"switch to musicals & theatres\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 10,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"switch to video game questions\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 10,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"switch to video games questions\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 10,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"ask me about comics\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 13,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"ask me about history\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 13,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"change to mythology questions\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 10,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"ask me about movies\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 13,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"change category to music\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"ask about movies\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 10,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"change cateogory to music\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 20,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"switch to the nature category\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 14,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"switch category manga\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"switch category all\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 16,\n          \"endPos\": 18\n        }\n      ]\n    },\n    {\n      \"text\": \"category all\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 9,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"change to category science\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 19,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"switch to category all\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 19,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"switch to category science\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 19,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"switch to category art\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 19,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"switch category animals\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"switch to category music\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 19,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"switch category music\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 16,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"switch category film\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 16,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"switch to category geography\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 19,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"switch category science\",\n      \"intent\": \"SwitchCategory\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 16,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"i'd like to play\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"let's play trivia\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i want to play\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"let's play\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"play film trivia\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"play anime trivia\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"play movie trivia\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 5,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"trivia\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"play trivia\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"play a game\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ask me questions about movies\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 23,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"let's play trivia.\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd like to play video games trivia\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 17,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"play.\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i wanna play\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can i play\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"play\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't know anything about this, actually, can you ask me about history?\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 65,\n          \"endPos\": 71\n        }\n      ]\n    },\n    {\n      \"text\": \"ask me about anime\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 13,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"how about trivia\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ask me questions about any\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 23,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"as me questions about nature\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 22,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"i'd like to play trivia.\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"play lightning mode\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 5,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"play film trivia in lightning mode\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 5,\n          \"endPos\": 8\n        },\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 20,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"play trivia in lightning mode\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 15,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"start asking questions about celebrities in lightning mode\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 29,\n          \"endPos\": 39\n        },\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 44,\n          \"endPos\": 52\n        }\n      ]\n    },\n    {\n      \"text\": \"play trivia with lightning mode\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 17,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"play trivia in lightning mode.\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 15,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"play triva\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd like to play trivia\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ask me questions about film\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 23,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"play trivia with lighning mode\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 17,\n          \"endPos\": 24\n        }\n      ]\n    },\n    {\n      \"text\": \"ask me questions about nature\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 23,\n          \"endPos\": 28\n        }\n      ]\n    },\n    {\n      \"text\": \"i'd like questions about anime\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 25,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"play lightning\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 5,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"play lightning.\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 5,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"play game\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"play trivia.\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i'd like questions about computers\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 25,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"can i play lightning mode?\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 11,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"ask about nature\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 10,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"play a game in lake\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"play lightning mode.\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 5,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"i'd like to play movie trivia\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 17,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"i'd like to play a game.\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"now ask about tv\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 14,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"trivia.\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"play lightning bird.\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ask me about science.\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 13,\n          \"endPos\": 19\n        }\n      ]\n    },\n    {\n      \"text\": \"let's play some trivia.\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"ask me questions about manga\",\n      \"intent\": \"Play\",\n      \"entities\": [\n        {\n          \"entity\": \"category\",\n          \"startPos\": 23,\n          \"endPos\": 27\n        }\n      ]\n    },\n    {\n      \"text\": \"start a game\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"let's play a game\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"start a game of trivia\",\n      \"intent\": \"Play\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"begin playing in lightning mode\",\n      \"intent\": \"StartMode\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 17,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"start lightning mode\",\n      \"intent\": \"StartMode\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 6,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"i would like to play lightning mode\",\n      \"intent\": \"StartMode\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 21,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"please play lightning mode\",\n      \"intent\": \"StartMode\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 12,\n          \"endPos\": 20\n        }\n      ]\n    },\n    {\n      \"text\": \"please start lightning mode\",\n      \"intent\": \"StartMode\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 13,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"i want lightning mode\",\n      \"intent\": \"StartMode\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 7,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"start lightning mode.\",\n      \"intent\": \"StartMode\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 6,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"start lighning mode\",\n      \"intent\": \"StartMode\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"i don't want to play lightning mode anymore\",\n      \"intent\": \"StopMode\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 21,\n          \"endPos\": 29\n        }\n      ]\n    },\n    {\n      \"text\": \"stop lightning mode\",\n      \"intent\": \"StopMode\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 5,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"stop playing lightning mode\",\n      \"intent\": \"StopMode\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 13,\n          \"endPos\": 21\n        }\n      ]\n    },\n    {\n      \"text\": \"stop lightning mode.\",\n      \"intent\": \"StopMode\",\n      \"entities\": [\n        {\n          \"entity\": \"mode\",\n          \"startPos\": 5,\n          \"endPos\": 13\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "blog-samples/CSharp/TriviaBotSpeechSample/TriviaBotSpeechSample.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26403.7\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TriviaApp\", \"TriviaApp\\TriviaApp.csproj\", \"{59DCDA8D-3407-4585-9B70-BBAD7DA51694}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TriviaBot\", \"TriviaBot\\TriviaBot.csproj\", \"{17505E75-104B-4513-938A-ABB1CD4A39FB}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|ARM = Debug|ARM\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|ARM = Release|ARM\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Debug|Any CPU.ActiveCfg = Debug|x86\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Debug|Any CPU.Build.0 = Debug|x86\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Debug|Any CPU.Deploy.0 = Debug|x86\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Debug|ARM.Deploy.0 = Debug|ARM\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Debug|x64.Build.0 = Debug|x64\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Debug|x64.Deploy.0 = Debug|x64\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Debug|x86.Build.0 = Debug|x86\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Debug|x86.Deploy.0 = Debug|x86\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Release|Any CPU.ActiveCfg = Release|x86\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Release|Any CPU.Build.0 = Release|x86\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Release|Any CPU.Deploy.0 = Release|x86\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Release|ARM.Build.0 = Release|ARM\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Release|ARM.Deploy.0 = Release|ARM\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Release|x64.ActiveCfg = Release|x64\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Release|x64.Build.0 = Release|x64\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Release|x64.Deploy.0 = Release|x64\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Release|x86.ActiveCfg = Release|x86\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Release|x86.Build.0 = Release|x86\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694}.Release|x86.Deploy.0 = Release|x86\n\t\t{17505E75-104B-4513-938A-ABB1CD4A39FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{17505E75-104B-4513-938A-ABB1CD4A39FB}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{17505E75-104B-4513-938A-ABB1CD4A39FB}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{17505E75-104B-4513-938A-ABB1CD4A39FB}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{17505E75-104B-4513-938A-ABB1CD4A39FB}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{17505E75-104B-4513-938A-ABB1CD4A39FB}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{17505E75-104B-4513-938A-ABB1CD4A39FB}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{17505E75-104B-4513-938A-ABB1CD4A39FB}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{17505E75-104B-4513-938A-ABB1CD4A39FB}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{17505E75-104B-4513-938A-ABB1CD4A39FB}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{17505E75-104B-4513-938A-ABB1CD4A39FB}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{17505E75-104B-4513-938A-ABB1CD4A39FB}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{17505E75-104B-4513-938A-ABB1CD4A39FB}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{17505E75-104B-4513-938A-ABB1CD4A39FB}.Release|x64.Build.0 = Release|Any CPU\n\t\t{17505E75-104B-4513-938A-ABB1CD4A39FB}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{17505E75-104B-4513-938A-ABB1CD4A39FB}.Release|x86.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{59DCDA8D-3407-4585-9B70-BBAD7DA51694} = {97A26713-AD4F-4AA2-AD9D-3687DED29EB6}\n\t\t{17505E75-104B-4513-938A-ABB1CD4A39FB} = {F146ACFD-7CD0-4A23-9E8C-B983D7DC8EA6}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "blog-samples/Node/Blog-CustomState-CosmosDB/README.md",
    "content": "# Bot Builder SDK Azure Extensions\n\nThe Microsoft Bot Builder SDK Azure Extensions allow for interactions with specific Azure components.\n\n## High level features:\n\n* Azure Table Storage: Allows bot developers to store bot state in their own Azure Storage accounts. For more information on Azure Table Storage, visit the **[Azure Table Storage Documentation](https://azure.microsoft.com/en-us/services/storage/tables/)**\n* Azure DocumentDB: Allows bot developers to store bot state in DocumentDB. For more information on Azure DocumentDB, visit the **[Azure DocumentDB Documentation](https://azure.microsoft.com/en-us/services/documentdb/)**\n\n## Sample Overview\n\nThis is a simple 'echo' bot which echo's the user's message. The difference is that this sample demonstrates\nhow to leverage the [botbuilder-azure](https://www.npmjs.com/package/botbuilder-azure) npm module to save your bot's conversation state to an Azure database. \n\n## To run this sample\n\nAfter you've cloned this repo, cd into the folder and install the dependencies with npm:\n\n  npm install\n\n## Configure the Bot to your Azure DB\n\n```\n  var documentDbOptions = {\n      host: 'Your-Azure-DocumentDB-URI',\n      masterKey: 'Your-Azure-Key',\n      database: 'botdocdb',\n      collection: 'botdata'\n  };\n```\n\n## Using the Bot Framework Emulator with this sample\n\nTo use the emulator, you'll need to add an environment property.\nIn .env file, add \"NODE_TLS_REJECT_UNAUTHORIZED = 0;\" or, alternatively in your bot\nyou can directly paste the following:\n\n  process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;\n\nMake sure to delete/comment out the above property if you switch to a production channel.\n\n## Run the bot\nRun the following command to start the bot\n\n  node app.js\n"
  },
  {
    "path": "blog-samples/Node/Blog-CustomState-CosmosDB/app.js",
    "content": "var builder = require('botbuilder');\nvar azure = require('botbuilder-azure');\nvar restify = require('restify');\n\n// **UNCOMMENT THE FOLLOWING LINE TO CONNECT TO THE BOT FRAMEWORK EMULATOR\n//process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;\n\nvar documentDbOptions = {\n    host: 'Your-Azure-DocumentDB-URI',\n    masterKey: 'Your-Azure-Key',\n    database: 'botdocdb',\n    collection: 'botdata'\n};\n\nvar docDbClient = new azure.DocumentDbClient(documentDbOptions);\n\nvar tableStorage = new azure.AzureBotStorage({ gzipData: false }, docDbClient);\n\nvar connector = new builder.ChatConnector({\n    appId: process.env.MICROSOFT_APP_ID,\n    appPassword: process.env.MICROSOFT_APP_PASSWORD\n});\n\nvar bot = new builder.UniversalBot(connector, function (session) {\n    session.send(\"You said: %s\", session.message.text);\n}).set('storage', tableStorage);\n\nvar server = restify.createServer();\nserver.listen(process.env.port || process.env.PORT || 3978, function () {\n   console.log('%s listening to %s', server.name, server.url);\n});\n\nserver.post('/api/messages', connector.listen());\n"
  },
  {
    "path": "blog-samples/Node/Blog-CustomState-CosmosDB/package.json",
    "content": "{\n  \"name\": \"azure-extensions-bot\",\n  \"version\": \"1.0.0\",\n  \"main\": \"app.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"MShim\",\n  \"license\": \"ISC\",\n  \"description\": \"\",\n  \"dependencies\": {\n    \"botbuilder\": \"^3.15.0\",\n    \"botbuilder-azure\": \"^3.1.0\",\n    \"restify\": \"^6.4.0\"\n  }\n}\n"
  },
  {
    "path": "blog-samples/Node/Blog-Qna-Attachments/README.md",
    "content": "# QnA Card attachments Bot Sample\n\nThis bot sample using the Node.js SDK is to demonstrate two things:\n\n1. How to connect a bot to a QnA service using the [Bot Builder Cognitive Services](https://www.npmjs.com/package/botbuilder-cognitiveservices) npm module, open source on Github [here](https://github.com/Microsoft/BotBuilder-CognitiveServices). \n\n2. How to implement overrides to the default QnAMakerDialog implementation such that a developer can 'intercept' the response activity from the QnA service and customize the reply to be posted back to a user. In this sample bot, we format the response from the QnA service into [rich card attachments](https://docs.microsoft.com/en-us/bot-framework/nodejs/bot-builder-nodejs-send-rich-cards), in addition to an [adaptive card](https://docs.microsoft.com/en-us/adaptive-cards/get-started/bots).\n\n![Qna Rich Card response][pic1]\n\n## QnA Maker overview\n\n[Click here for the QnA Maker portal](https://qnamaker.ai/)\n\n![QnA Portal][pic2]\n\nOne of the basic requirements in writing your own Bot service is to seed it with questions and answers. In many cases, the questions and answers already exist in content like FAQ URLs/documents, etc.\n\nMicrosoft QnA Maker is a free, easy-to-use, REST API and web-based service that trains AI to respond to user's questions in a more natural, conversational way. Compatible across development platforms, hosting services, and channels, QnA Maker is the only question and answer service with a graphical user interface—meaning you don’t need to be a developer to train, manage, and use it for a wide range of solutions.\n\nWith optimized machine learning logic and the ability to integrate industry-leading language processing with ease, QnA Maker distills masses of information into distinct, helpful answers.\n\n## Prerequisites\n\nThis sample requires some basic understanding of the BotBuilder SDK for Node.js, [click here](https://docs.microsoft.com/en-us/bot-framework/nodejs/bot-builder-nodejs-quickstart) to get started. \n\n- [Node.js](https://nodejs.org/en/)\n- [botbuilder-cognitiveservices](https://www.npmjs.compackage/botbuilder-cognitiveservices) npm module\n- [Bot Framework Emulator](https://docs.microsoft.com/en-us/bot-framework/debug-bots-emulator)\n\n[pic1]: ../../images/qna-rich-cards.png\n[pic2]: ../../images/qna-portal.png"
  },
  {
    "path": "blog-samples/Node/Blog-Qna-Attachments/app.js",
    "content": "var restify = require('restify');\nvar builder = require('botbuilder');\nvar builder_cognitiveservices = require('botbuilder-cognitiveservices');\nvar https = require('https');\n\n// Setup Restify Server\nvar server = restify.createServer();\nserver.listen(process.env.port || process.env.PORT || 3978, function(){\n    console.log('%s listening to %s', server.name, server.url);\n});\n\n// Create chat connector instance\nvar connector = new builder.ChatConnector({\n    appId: 'Your-Microsoft-App-ID', //process.env.MicrosoftAppId,\n    appPassword: 'Your-Microsoft-App-Password', //    process.env.MicrosoftAppPassword,\n});\n\n// Listen for messages from users\nserver.post('/api/messages', connector.listen());\n\n// Bot instance, pass in the connector to receive messages from the user\nvar bot = new builder.UniversalBot(connector);\n\nvar recognizer = new builder_cognitiveservices.QnAMakerRecognizer({\n    knowledgeBaseId: 'Your-Qna-KnowledgeBase-ID', // process.env.QnAKnowledgebaseId, \n    subscriptionKey: 'Your-Qna-KnowledgeBase-Password'}); //process.env.QnASubscriptionKey});\n\nvar basicQnAMakerDialog = new builder_cognitiveservices.QnAMakerDialog({\nrecognizers: [recognizer],\ndefaultMessage: 'No match! Try changing the query terms!',\nqnaThreshold: 0.3}\n);\n\n// override\nbasicQnAMakerDialog.respondFromQnAMakerResult = function(session, qnaMakerResult){\n    // Save the question\n    var question = session.message.text;\n    session.conversationData.userQuestion = question;\n\n    // boolean to check if the result is formatted for a card\n    var isCardFormat = qnaMakerResult.answers[0].answer.includes(';');\n\n    if(!isCardFormat){\n        // Not semi colon delimited, send a normal text response \n        session.send(qnaMakerResult.answers[0].answer);\n    }else if(qnaMakerResult.answers && qnaMakerResult.score >= 0.5){\n        \n        var qnaAnswer = qnaMakerResult.answers[0].answer;\n        \n                var qnaAnswerData = qnaAnswer.split(';');\n                var title = qnaAnswerData[0];\n                var description = qnaAnswerData[1];\n                var url = qnaAnswerData[2];\n                var imageURL = qnaAnswerData[3];\n        \n                var msg = new builder.Message(session)\n                msg.attachments([\n                    new builder.HeroCard(session)\n                    .title(title)\n                    .subtitle(description)\n                    .images([builder.CardImage.create(session, imageURL)])\n                    .buttons([\n                        builder.CardAction.openUrl(session, url, \"Learn More\")\n                    ])\n                ]);\n        }\n    session.send(msg).endDialog();\n}\n\nbasicQnAMakerDialog.defaultWaitNextMessage = function(session, qnaMakerResult){\n    // saves the user's question\n    session.conversationData.userQuestion = session.message.text; \n    \n    if(!qnaMakerResult.answers){\n        let msg = new builder.Message(session)\n        .addAttachment({\n            contentType: \"application/vnd.microsoft.card.adaptive\",\n            content: {\n                type: \"AdaptiveCard\",\n                body: [\n                    {\n                        \"type\": \"TextBlock\",\n                        \"text\": `${session.conversationData.userQuestion}`,\n                        \"size\": \"large\",\n                        \"weight\": \"bolder\",\n                        \"color\": \"accent\",\n                        \"wrap\": true\n                    },\n                    {\n                        \"type\": \"TextBlock\",\n                        \"text\": `Sorry, no answer found in QnA service`,\n                        \"size\": \"large\",\n                        \"weight\": \"regular\",\n                        \"color\": \"dark\",\n                        \"wrap\": true\n                    }\n                ]\n            }\n        });\n        session.send(msg);\n    }\n    session.endDialog();\n}\n\nbot.dialog('/', basicQnAMakerDialog);"
  },
  {
    "path": "blog-samples/Node/Blog-Qna-Attachments/package.json",
    "content": "{\n  \"name\": \"qna-node-bot\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"app.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"botbuilder\": \"^3.15.0\",\n    \"botbuilder-cognitiveservices\": \"^1.2.0\",\n    \"https\": \"^1.0.0\",\n    \"restify\": \"^6.4.0\"\n  }\n}\n"
  },
  {
    "path": "blog-samples/Node/Blog-Redux-Bot/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Runtime data\npids\n*.pid\n*.seed\n*.pid.lock\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n\n# nyc test coverage\n.nyc_output\n\n# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n.grunt\n\n# Bower dependency directory (https://bower.io/)\nbower_components\n\n# node-waf configuration\n.lock-wscript\n\n# Compiled binary addons (http://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directories\nnode_modules/\njspm_packages/\n\n# Typescript v1 declaration files\ntypings/\n\n# Optional npm cache directory\n.npm\n\n# Optional eslint cache\n.eslintcache\n\n# Optional REPL history\n.node_repl_history\n\n# Output of 'npm pack'\n*.tgz\n\n# Yarn Integrity file\n.yarn-integrity\n\n# dotenv environment variables file\n.env\n\n"
  },
  {
    "path": "blog-samples/Node/Blog-Redux-Bot/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 Matt Shim\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "blog-samples/Node/Blog-Redux-Bot/README.md",
    "content": "# Redux-Bot\n![redux-abs-logo][redux-abs-logo]\n\nBotBuilder v3 Node.js bot with Redux state management\n\n# Overview\n\nThis sample is to showcase the flexibility of the Azure Bot Service, by demonstrating that you can author rich conversational experiences using whatever technologies/libraries you'd like. This sample bot uses [Redux](https://redux.js.org/), a popular JavaScript framework for application state management, and [Redux-Saga](https://redux-saga.js.org/) to recreate an existing [city search bot sample](https://github.com/Microsoft/BotBuilder-Samples/tree/master/Node/core-CustomState). \n\n![city-search-bot][city-search-bot]\n\n# To run this sample\n\nClone BotFramework-Samples repo, and CD into this folder (Blog-Redux-Bot). From your CLI, install the node_module dependencies:\n\n```\nnpm install\n```\n\n## Emulator\n\nThis bot runs by default on **localhost:3978**, which you can run directly using the [Bot Framework Emulator](https://github.com/Microsoft/BotFramework-Emulator).\n\n```\nnode app.js \n```\n\n## UI Redux Store Render\n\n![ui-state][ui-state]\n\nIncluded in **public/index.html** is a simple web app using a custom web chat instance which communicates with the Azure Bot Service over the DirectLine channel.  \n\n[Official ngrok page](https://ngrok.com/)\n\n![ngrok][ngrok]\n\nOn Azure, in bot channels registration, copy and paste the ngrok port forwarding address to the messaging endpoint in settings--> configuration as shown. **Ensure that this address ends in /api/messages.**\n\n![channel-reg][channel-registration]\n\nIn your CLI, navigate to the redux bot root folder and run:\n\n```\nnpm start\n```\n\nThis will run the custom web application on **localhost:3000**.\nLastly, provision the [DirectLine Secret](https://docs.microsoft.com/en-us/azure/bot-service/bot-service-channel-connect-directline) in the URL header of your browser. This will allow the Azure Bot Service to communicate with your local hosted custom web chat instance.  \n\n![dl-secret][dl-secret]\n\nNow, when you interact with the bot, any state changes to the Redux Store will be rendered on the web page. \n\n\n# To-do\n\n* [ ] More tests for Redux\n* [X] Cleaner code inside `app.js`\n* [ ] Investigate possibility to use ChatConnector directly\n\n# Hiccups\n\n## Turning `conversationUpdate` event into an action\n\nIt would be great if a new member joined, we sent a welcome message right away.\n\n* `bot.on('conversationUpdate')` event handler does not associate with `session` object\n* `session` object is required to create a Redux store\n\nLooking at other sample code on the same scenario, instead of sending the greeting thru `session.send`, it must be sent thru `bot.send` with an addressed message. Thus, it further proves that `conversationUpdate` is not associated with any `session` object.\n\nBecause our Redux store design requires `session` object, thus, `conversationUpdate` cannot be turn into an action.\n\n## Multi-turn dialog\n\nIt is intuitive to write code in `redux-saga` like this:\n\n```js\ntakeEvery(RECEIVE_MESSAGE, function* (action) {\n  yield put(promptText('What is your name?'));\n\n  action = yield take(RECEIVE_RESULT);\n\n  yield put(sendMessage(`Hello, ${ action.payload.response }`);\n});\n```\n\nBut this would require a dialog to resume in the middle of a saga (resume at the `yield take` line). Due to the nature of serverless functions, it is difficult to implement a saga that works this way.\n\n# References\n* [Redux](https://github.com/reactjs/redux)\n* [Redux-Saga](https://github.com/redux-saga/redux-saga)\n* [BotBuilder SDK](https://github.com/Microsoft/BotBuilder)\n* [ngrok](https://ngrok.com/)\n\n[redux-abs-logo]: ../../images/redux-abs-logo.png\n[ngrok]: ../../images/ngrok-forward.png\n[city-search-bot]: ../../images/redux-bot-02.png\n[channel-registration]: ../../images/bot-channels-ngrok.png\n[bot-webchat]: ../../images/redux-bot-01.png\n[ui-state]: ../../images/redux-store-02.png\n[dl-secret]: ../../images/direct-line-secret-url.png"
  },
  {
    "path": "blog-samples/Node/Blog-Redux-Bot/app.js",
    "content": "require('dotenv').config();\n\nconst builder = require('botbuilder');\nconst restify = require('restify');\n\nconst inMemoryStorage = new builder.MemoryBotStorage();\nconst connector = new builder.ChatConnector({\n  appId: process.env.MICROSOFT_APP_ID,\n  appPassword: process.env.MICROSOFT_APP_PASSWORD\n})\n\nconst bot = new builder.UniversalBot(connector).set('storage', inMemoryStorage); // Register in memory storage\n\n// Redux\nconst loadStore = require('./redux/loadStore');\nconst DialogActions = require('./redux/dialogActions');\n\n// Create server\nconst server = restify.createServer();\n\nserver.listen(process.env.port || process.env.PORT || 3978, function () {\n  console.log(`${ server.name } listening to ${ server.url }`);\n});\n\nserver.post('/api/messages', connector.listen());\n\n//=========================================================\n// Bot Recognizers\n//=========================================================\n\n// const LuisAppID = process.env.LUIS_APP_ID; // Your-LUIS-App-ID\n// const LuisKey = process.env.LUIS_APP_KEY;  // Your-LUIS-Key\n// const LuisModel = `https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/${ LuisAppID }?subscription-key=${ LuisKey }`;\n// const recognizer = new builder.LuisRecognizer(LuisModel);\n\nbot.dialog('/', new builder.SimpleDialog((session, result) => {\n  const store = loadStore(session);\n  const { attachments, text } = session.message || {};\n\n  if (attachments || result || text) {\n    store.dispatch(DialogActions.receiveMessage(text, attachments, result));\n  }\n}));\n"
  },
  {
    "path": "blog-samples/Node/Blog-Redux-Bot/package.json",
    "content": "{\n  \"name\": \"redux-bot\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"app.js\",\n  \"scripts\": {\n    \"start\": \"npx concurrently --names \\\"bot,web\\\" --kill-others \\\"npm run start:bot\\\" \\\"npm run start:web\\\"\",\n    \"start:bot\": \"npx node-dev .\",\n    \"start:web\": \"npx serve -p 3000 public\",\n    \"test\": \"jest\"\n  },\n  \"private\": true,\n  \"author\": \"\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"botbuilder\": \"^3.15.0\",\n    \"dotenv\": \"^5.0.1\",\n    \"redux\": \"^3.7.2\",\n    \"redux-saga\": \"^0.16.0\",\n    \"restify\": \"^6.4.0\"\n  },\n  \"devDependencies\": {\n    \"jest\": \"^22.4.3\"\n  }\n}\n"
  },
  {
    "path": "blog-samples/Node/Blog-Redux-Bot/public/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\" />\n    <title>Bot Chat</title>\n\n    <link href=\"https://unpkg.com/botframework-webchat/botchat.css\" rel=\"stylesheet\" />\n\n    <style>\n      html, body {\n        height: 100%;\n        margin: 0;\n      }\n\n      #container {\n        display: flex;\n        height: 100%;\n      }\n\n      #container > div.state {\n        display: flex;\n        flex: 1;\n        flex-direction: column;\n        margin-left: 1em;\n      }\n\n      #container > div.state > pre {\n        flex: 1;\n        margin: 0;\n        overflow: auto;\n      }\n\n      #container > #botChat {\n        box-shadow: 0 0 10px rgba(0, 0, 0, .2);\n        display: flex;\n        flex-basis: 460px;\n        flex-shrink: 0;\n        width: 460px;\n      }\n\n      #container > #botChat .wc-app {\n        flex: 1;\n      }\n\n      #container > #botChat .wc-chatview-panel {\n        height: 100%;\n        position: relative;\n        width: 100%;\n      }\n    </style>\n  </head>\n  <body>\n    <div id=\"container\">\n      <div id=\"botChat\"></div>\n      <div class=\"state\">\n        <h1>Redux server store</h1>\n        <pre id=\"store\">Nothing to see here</pre>\n        <ul id=\"actions\"></ul>\n      </div>\n    </div>\n    <script src=\"https://unpkg.com/botframework-webchat/botchat.js\"></script>\n    <script>\n      const params = new URLSearchParams(location.search);\n\n      window['botchatDebug'] = params.get('debug') && params.get('debug') === 'true';\n\n      const botConnection = new BotChat.DirectLine({\n        domain: params.get('domain'),\n        secret: params.get('s'),\n        token: params.get('t'),\n        webSocket: params.get('webSocket') && params.get('webSocket') === 'true' // defaults to true\n      });\n\n      BotChat.App({\n        bot: {\n          id: params.get('botid') || 'botid',\n          name: params.get('botname') || 'botname'\n        },\n        botConnection: botConnection,\n        showUploadButton: true,\n        user: {\n          id: params.get('userid') || 'userid',\n          name: params.get('username') || 'username'\n        }\n      }, document.getElementById('botChat'));\n\n      botConnection.activity$\n        .filter(activity => activity.type === 'event' && activity.name === 'store')\n        .subscribe(activity => {\n          document.querySelector('pre#store').innerText = JSON.stringify(activity.value, null, 2);\n        });\n\n      botConnection.activity$\n        .filter(activity => activity.type === 'event' && activity.name === 'action')\n        .subscribe(activity => {\n          const li = document.createElement('li');\n          const pre = document.createElement('pre');\n\n          pre.innerText = JSON.stringify(activity.value).substr(0, 150);\n          li.appendChild(pre);\n          document.querySelector('ul#actions').appendChild(li);\n        });\n\n      setInterval(() => {\n        document.querySelector('.wc-shellinput').focus();\n      }, 300);\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "blog-samples/Node/Blog-Redux-Bot/redux/conversationActions.js",
    "content": "const RESET = 'RESET';\nconst SET_CITY = 'SET_CITY';\nconst SET_USERNAME = 'SET_USERNAME';\n\nfunction reset() {\n  return { type: RESET };\n}\n\nfunction setCity(city) {\n  return { type: SET_CITY, payload: { city } };\n}\n\nfunction setUsername(username) {\n  return { type: SET_USERNAME, payload: { username } };\n}\n\nmodule.exports = {\n  RESET,\n  SET_CITY,\n  SET_USERNAME,\n\n  reset,\n  setCity,\n  setUsername\n};\n"
  },
  {
    "path": "blog-samples/Node/Blog-Redux-Bot/redux/dialogActions.js",
    "content": "const PROMPT_TEXT = 'DIALOG/PROMPT_TEXT';\nconst RECEIVE_MESSAGE = 'DIALOG/RECEIVE_MESSAGE';\nconst SEND_EVENT = 'DIALOG/SEND_EVENT';\nconst SEND_MESSAGE = 'DIALOG/SEND_MESSAGE';\nconst END_CONVERSATION = 'DIALOG/END_CONVERSATION';\n\nfunction promptText(text) {\n  return { type: PROMPT_TEXT, payload: { text } };\n}\n\nfunction receiveMessage(text, attachments, result) {\n  return {\n    type: RECEIVE_MESSAGE,\n    payload: { attachments, result, text }\n  };\n}\n\nfunction sendEvent(name, value) {\n  return {\n    type: SEND_EVENT,\n    payload: { name, value }\n  };\n}\n\nfunction sendMessage(text, attachments) {\n  return {\n    type: SEND_MESSAGE,\n    payload: { attachments, text }\n  };\n}\n\nfunction endConversation(text, attachments, result){\n  return {\n    type: END_CONVERSATION,\n    payload: { attachments, result, text }\n  };\n}\n\nmodule.exports = {\n  PROMPT_TEXT,\n  RECEIVE_MESSAGE,\n  SEND_EVENT,\n  SEND_MESSAGE,\n  END_CONVERSATION,\n\n  promptText,\n  receiveMessage,\n  sendEvent,\n  sendMessage,\n  endConversation\n};\n"
  },
  {
    "path": "blog-samples/Node/Blog-Redux-Bot/redux/loadStore.js",
    "content": "const { applyMiddleware, createStore } = require('redux');\nconst { default: createSagaMiddleware } = require('redux-saga');\n\nconst createDefaultSaga = require('./sagas/default');\nconst createDialogSagas = require('./sagas/dialog');\nconst reducer = require('./reducer');\n\nmodule.exports = function loadStore(session) {\n  const saga = createSagaMiddleware();\n  const store = createStore(\n    reducer,\n\n    // Restore the store from conversationData\n    session.conversationData,\n\n    applyMiddleware(\n      saga,\n      store => next => action => {\n        // Send action to web page for debugging\n        session.send({\n          type: 'event',\n          name: 'action',\n          value: action\n        });\n\n        return next(action);\n      }\n    )\n  );\n\n  store.subscribe(() => {\n    // Save the store to conversationData\n    session.conversationData = store.getState();\n    session.save();\n\n    // Send store state to web page for debugging\n    session.send({\n      type: 'event',\n      name: 'store',\n      value: store.getState()\n    });\n  });\n\n  saga.run(function* () {\n    yield* createDialogSagas(session);\n    yield* createDefaultSaga(session);\n  });\n\n  return store;\n};\n"
  },
  {
    "path": "blog-samples/Node/Blog-Redux-Bot/redux/reducer.js",
    "content": "const { RESET, SET_CITY, SET_USERNAME } = require('./conversationActions');\n\nconst DEFAULT_STATE = {\n  city: null,\n  username: null\n};\n\nfunction conversationReducer(state = DEFAULT_STATE, action) {\n  switch (action.type) {\n  case RESET:\n    state = DEFAULT_STATE;\n    break;\n\n  case SET_CITY:\n    state = { ...state, city: action.payload.city };\n    break;\n\n  case SET_USERNAME:\n    state = { ...state, username: action.payload.username };\n    break;\n  }\n\n  return state;\n}\n\nmodule.exports = conversationReducer;\n"
  },
  {
    "path": "blog-samples/Node/Blog-Redux-Bot/redux/sagas/default.js",
    "content": "const { put, select, takeEvery } = require('redux-saga/effects');\nconst { reset, setCity, setUsername } = require('../conversationActions');\nconst { promptText, RECEIVE_MESSAGE, sendMessage, endConversation } = require('../dialogActions');\n\nmodule.exports = function* (session) {\n  yield takeEvery(RECEIVE_MESSAGE, function* (action) {\n    const { text } = action.payload;\n    const changeCityMatch = /^change city to (.*)/i.exec(text);\n    const currentCityMatch = /^current city/i.exec(text);\n    const resetMatch = /^reset/i.exec(text);\n    const endConversationMatch = /^end conversation/i.exec(text);\n    let { city, username } = yield select();\n\n    if (!city) {\n      city = 'Seattle';\n\n      yield put(setCity(city));\n      yield put(sendMessage(`Welcome to the Search City bot. I\\'m currently configured to search for things in ${ city }`));\n      yield put(promptText('Before get started, please tell me your name?'));\n    } else if (!username) {\n      yield put(setUsername(text));\n      yield put(sendMessage(`Welcome ${ text }!\\n * If you want to know which city I'm using for my searches type 'current city'. \\n * Want to change the current city? Type 'change city to cityName'. \\n * Want to change it just for your searches? Type 'change my city to cityName'`));\n    } else if (changeCityMatch) {\n      const newCity = changeCityMatch[1];\n\n      yield put(setCity(newCity));\n      yield put(sendMessage(`All set ${ username }. From now on, all my searches will be for things in ${ newCity }.`));\n    } else if (currentCityMatch) {\n      yield put(sendMessage(`Hey ${ username }, I\\'m currently configured to search for things in ${ city }.`));\n    } else if (resetMatch) {\n      yield put(reset());\n      yield put(sendMessage('Oops... I\\'m suffering from a memory loss...'));\n    } else if (endConversationMatch){\n      yield put(endConversation());\n      yield put(sendMessage('Ending Conversation...'));\n    } else {\n      const { city, username } = yield select();\n      const messageText = action.payload.text.trim();\n\n      yield put(sendMessage(`${ username }, wait a few seconds. Searching for \\'${ messageText }\\' in \\'${ city }\\'...`));\n      yield put(sendMessage(`https://www.bing.com/search?q=${ encodeURIComponent(`${ messageText } in ${ city }`) }`));\n    }\n  });\n};\n"
  },
  {
    "path": "blog-samples/Node/Blog-Redux-Bot/redux/sagas/dialog.js",
    "content": "const builder = require('botbuilder');\nconst { takeEvery } = require('redux-saga/effects');\nconst DialogActions = require('../dialogActions');\n\nmodule.exports = function* (session) {\n  yield takeEvery(DialogActions.PROMPT_TEXT, function* (action) {\n    builder.Prompts.text(session, action.payload.text);\n  });\n\n  yield takeEvery(DialogActions.END_CONVERSATION, function* (action){\n    \n    session.endConversation('Bye!');\n  });\n\n  yield takeEvery(DialogActions.SEND_EVENT, function* (action) {\n    const { name, value } = action.payload;\n\n    session.send({ type: 'event', name, value });\n  });\n\n  yield takeEvery(DialogActions.SEND_MESSAGE, function* (action) {\n    const { attachments, text } = action.payload;\n\n    message = new builder.Message(session);\n\n    text && message.text(text);\n    attachments && message.attachments(attachments);\n\n    session.send(message);\n  });\n};\n"
  },
  {
    "path": "blog-samples/README.md",
    "content": "# Blog samples\nThese samples and snippets are referenced in the [Bot Framework blog](http://blog.botframework.com)."
  },
  {
    "path": "docs-samples/CSharp/Simple-LUIS-Notes-Sample/Notes.json",
    "content": "{\n  \"luis_schema_version\": \"2.1.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"Notes\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"intents\": [\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"Note.Create\",\n      \"inherits\": {\n        \"domain_name\": \"Note\",\n        \"model_name\": \"Create\"\n      }\n    },\n    {\n      \"name\": \"Note.Delete\",\n      \"inherits\": {\n        \"domain_name\": \"Note\",\n        \"model_name\": \"Delete\"\n      }\n    },\n    {\n      \"name\": \"Note.ReadAloud\",\n      \"inherits\": {\n        \"domain_name\": \"Note\",\n        \"model_name\": \"ReadAloud\"\n      }\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"Note.Text\",\n      \"inherits\": {\n        \"domain_name\": \"Note\",\n        \"model_name\": \"Text\"\n      }\n    },\n    {\n      \"name\": \"Note.Title\",\n      \"inherits\": {\n        \"domain_name\": \"Note\",\n        \"model_name\": \"Title\"\n      }\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"bing_entities\": [],\n  \"actions\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"help\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"drive me home\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add mark to guest list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"add Fred George to onenote\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 4,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"Add oatmeal to shopping list .\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 15,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"send lighter fluid to onenote\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 5,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"add friends to party list in memos\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"add tasks to wunderlist\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"clear my save notes\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"\\\"I want to create a note of title \\\"\\\" Shopping list \\\"\\\"\\\"\",\n      \"intent\": \"Note.Create\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 34,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"To buy list\",\n      \"intent\": \"Note.Create\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 3,\n          \"endPos\": 5\n        }\n      ]\n    },\n    {\n      \"text\": \"Save the current note\",\n      \"intent\": \"Note.Create\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"type in notepad\",\n      \"intent\": \"Note.Create\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create My Favorites note\",\n      \"intent\": \"Note.Create\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"waffles recipe is my new note to be created\",\n      \"intent\": \"Note.Create\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"A new note of name Business Solutions\",\n      \"intent\": \"Note.Create\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"A new note please\",\n      \"intent\": \"Note.Create\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you set a note up to mom\",\n      \"intent\": \"Note.Create\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create note with notepad\",\n      \"intent\": \"Note.Create\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Delete the note of name Guest list\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete poetry notes\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"DELETE LIBRARY LIST\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 7,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"Delete note: Summer Reading List.\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dismiss Fred's notes\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"Remove Daddy's BD note\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"delete my ideas list\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Delete Insurance note please\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete latest note\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Recall note 3 delete\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Can you read the grocery list note please\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 17,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"Repeat the last word again\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Read meeting notes to me\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 5,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"recall most recent groccery list\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"Please read Trip notes\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"I want you to read this note loudly\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Read my grocery list\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"\\\"read note \\\"\\\" grocery list \\\"\\\"\\\"\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 11,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"speak trip note for me please\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 6,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"read the note appointments please\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 14,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"Create for me a note about Car Oil\",\n      \"intent\": \"Note.Create\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 27,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"Stop reading the note\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 0,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"Delete the note number two\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 16,\n          \"endPos\": 25\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "docs-samples/CSharp/Simple-LUIS-Notes-Sample/Simple-LUIS-Notes-Sample/App_Start/WebApiConfig.cs",
    "content": "﻿using System.Web.Http;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization;\n\nnamespace NotesBot01\n{\n    public static class WebApiConfig\n    {\n        public static void Register(HttpConfiguration config)\n        {\n            // Json settings\n            config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;\n            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();\n            config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented;\n            JsonConvert.DefaultSettings = () => new JsonSerializerSettings()\n            {\n                ContractResolver = new CamelCasePropertyNamesContractResolver(),\n                Formatting = Newtonsoft.Json.Formatting.Indented,\n                NullValueHandling = NullValueHandling.Ignore,\n            };\n\n            // Web API configuration and services\n\n            // Web API routes\n            config.MapHttpAttributeRoutes();\n\n            config.Routes.MapHttpRoute(\n                name: \"DefaultApi\",\n                routeTemplate: \"api/{controller}/{id}\",\n                defaults: new { id = RouteParameter.Optional }\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "docs-samples/CSharp/Simple-LUIS-Notes-Sample/Simple-LUIS-Notes-Sample/Controllers/MessagesController.cs",
    "content": "﻿using Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Connector;\nusing System.Net;\nusing System.Net.Http;\nusing System.Threading.Tasks;\nusing System.Web.Http;\n\nnamespace NotesBot\n{\n\n    [BotAuthentication]\n    public class MessagesController : ApiController\n    {\n        /// <summary>\n        /// POST: api/Messages\n        /// Receive a message from a user and reply to it\n        /// </summary>\n        public async Task<HttpResponseMessage> Post([FromBody]Activity activity)\n        {\n            if (activity.Type == ActivityTypes.Message)\n            {\n                await Conversation.SendAsync(activity, () => new Dialogs.SimpleNoteDialog());\n            }\n            else\n            {\n                HandleSystemMessage(activity);\n            }\n            var response = Request.CreateResponse(HttpStatusCode.OK);\n            return response;\n        }\n\n        private Activity HandleSystemMessage(Activity message)\n        {\n            if (message.Type == ActivityTypes.DeleteUserData)\n            {\n                // Implement user deletion here\n                // If we handle user deletion, return a real message\n            }\n            else if (message.Type == ActivityTypes.ConversationUpdate)\n            {\n                // Handle conversation state changes, like members being added and removed\n                // Use Activity.MembersAdded and Activity.MembersRemoved and Activity.Action for info\n                // Not available in all channels\n            }\n            else if (message.Type == ActivityTypes.ContactRelationUpdate)\n            {\n                // Handle add/remove from contact lists\n                // Activity.From + Activity.Action represent what happened\n            }\n            else if (message.Type == ActivityTypes.Typing)\n            {\n                // Handle knowing tha the user is typing\n            }\n            else if (message.Type == ActivityTypes.Ping)\n            {\n            }\n\n            return null;\n        }\n    }\n}"
  },
  {
    "path": "docs-samples/CSharp/Simple-LUIS-Notes-Sample/Simple-LUIS-Notes-Sample/Dialogs/SimpleNoteDialog.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\nusing Microsoft.Bot.Builder.Dialogs;\nusing Microsoft.Bot.Builder.Luis;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Microsoft.Bot.Builder.Luis.Models;\n\nnamespace NotesBot.Dialogs\n{\n    [LuisModel(\"7d8ea658-f01a-49f2-a239-2d7ef805dde9\", \"1cf447f840ee414e87c7b93bb6d5cc63\", domain: \"westus.api.cognitive.microsoft.com\")]\n    [Serializable]\n    public class SimpleNoteDialog : LuisDialog<object>\n    {\n        // Store notes in a dictionary that uses the title as a key\n        private readonly Dictionary<string, Note> noteByTitle = new Dictionary<string, Note>();\n\n        // Default note title\n        public const string DefaultNoteTitle = \"default\";\n        // Name of note title entity\n        public const string Entity_Note_Title = \"Note.Title\";\n\n        /// <summary>\n        /// This method overload inspects the result from LUIS to see if a title entity was detected, and finds the note with that title, or the note with the default title, if no title entity was found.\n        /// </summary>\n        /// <param name=\"result\">The result from LUIS that contains intents and entities that LUIS recognized.</param>\n        /// <param name=\"note\">This parameter returns any note that is found in the list of notes that has a matching title.</param>\n        /// <returns>true if a note was found, otherwise false</returns>\n        public bool TryFindNote(LuisResult result, out Note note)\n        {\n            note = null;\n\n            string titleToFind;\n\n            EntityRecommendation title;\n            if (result.TryFindEntity(Entity_Note_Title, out title))\n            {\n                titleToFind = title.Entity;\n            }\n            else\n            {\n                titleToFind = DefaultNoteTitle;\n            }\n\n            return this.noteByTitle.TryGetValue(titleToFind, out note); // TryGetValue returns false if no match is found.\n        }\n\n        /// <summary>\n        /// This method overload takes a string and finds the note with that title.\n        /// </summary>\n        /// <param name=\"noteTitle\">A string containing the title of the note to search for.</param>\n        /// <param name=\"note\">This parameter returns any note that is found in the list of notes that has a matching title.</param>\n        /// <returns>true if a note was found, otherwise false</returns>\n        public bool TryFindNote(string noteTitle, out Note note)\n        {\n            bool foundNote = this.noteByTitle.TryGetValue(noteTitle, out note); // TryGetValue returns false if no match is found.\n            return foundNote;\n        }\n\n\n        /// <summary>\n        /// Send a generic help message if an intent without an intent handler is detected.\n        /// </summary>\n        /// <param name=\"context\">Dialog context.</param>\n        /// <param name=\"result\">The result from LUIS.</param>\n        [LuisIntent(\"\")]\n        public async Task None(IDialogContext context, LuisResult result)\n        {\n            \n            string message = $\"I'm the Notes bot. I can understand requests to create, delete, and read notes. \\n\\n Detected intent: \" + string.Join(\", \", result.Intents.Select(i => i.Intent));\n            await context.PostAsync(message);\n            context.Wait(MessageReceived);\n        }\n        /// <summary>\n        /// Handle the Note.Delete intent. If a title isn't detected in the LUIS result, prompt the user for a title.\n        /// </summary>\n        /// <param name=\"context\">Dialog context.</param>\n        /// <param name=\"result\">The result from LUIS.</param>\n        /// <returns></returns>\n        [LuisIntent(\"Note.Delete\")]\n        public async Task DeleteNote(IDialogContext context, LuisResult result)\n        {\n            Note note;\n            if (TryFindNote(result, out note))\n            {\n                this.noteByTitle.Remove(note.Title);\n                await context.PostAsync($\"Note {note.Title} deleted\");\n            }\n            else\n            {                             \n                // Prompt the user for a note title\n                PromptDialog.Text(context, After_DeleteTitlePrompt, \"What is the title of the note you want to delete?\");                         \n            }\n\n        }\n\n        private async Task After_DeleteTitlePrompt(IDialogContext context, IAwaitable<string> result)\n        {\n            Note note;\n            string titleToDelete = await result;\n            bool foundNote = this.noteByTitle.TryGetValue(titleToDelete, out note);\n\n            if (foundNote)\n            {\n                this.noteByTitle.Remove(note.Title);\n                await context.PostAsync($\"Note {note.Title} deleted\");\n            }\n            else\n            {\n                await context.PostAsync($\"Did not find note named {titleToDelete}.\");\n            }\n\n            context.Wait(MessageReceived);\n        }\n\n        /// <summary>\n        /// Handles the Note.ReadAloud intent by displaying a note or notes. \n        /// If a title of an existing note is found in the LuisResult, that note is displayed. \n        /// If no title is detected in the LuisResult, all of the notes are displayed.\n        /// </summary>\n        /// <param name=\"context\">Dialog context.</param>\n        /// <param name=\"result\">LUIS result.</param>\n        /// <returns></returns>\n        [LuisIntent(\"Note.ReadAloud\")]\n        public async Task FindNote(IDialogContext context, LuisResult result)\n        {\n            Note note;\n            if (TryFindNote(result, out note))\n            {\n                await context.PostAsync($\"**{note.Title}**: {note.Text}.\");\n            }\n            else\n            {\n                // Print out all the notes if no specific note name was detected\n                string NoteList = \"Here's the list of all notes: \\n\\n\";\n                foreach (KeyValuePair<string, Note> entry in noteByTitle)\n                {\n                    Note noteInList = entry.Value;\n                    NoteList += $\"**{noteInList.Title}**: {noteInList.Text}.\\n\\n\";\n                }\n                await context.PostAsync(NoteList);\n            }\n\n            context.Wait(MessageReceived);\n        }\n\n        private Note noteToCreate;\n        private string currentTitle;\n\n        /// <summary>\n        /// Handles the Note.Create intent. Prompts the user for the note title if the title isn't detected in the LuisResult.\n        /// </summary>\n        /// <param name=\"context\">Dialog context.</param>\n        /// <param name=\"result\">LUIS result.</param>\n        /// <returns></returns>\n        [LuisIntent(\"Note.Create\")]\n        public Task CreateNote(IDialogContext context, LuisResult result)\n        {\n            EntityRecommendation title;\n            if (!result.TryFindEntity(Entity_Note_Title, out title))\n            {\n                // Prompt the user for a note title\n                PromptDialog.Text(context, After_TitlePrompt, \"What is the title of the note you want to create?\");\n            }\n            else\n            {\n                var note = new Note() { Title = title.Entity };\n                noteToCreate = this.noteByTitle[note.Title] = note;\n\n                // Prompt the user for what they want to say in the note           \n                PromptDialog.Text(context, After_TextPrompt, \"What do you want to say in your note?\");\n            }\n\n            return Task.CompletedTask;\n        }\n\n        private async Task After_TitlePrompt(IDialogContext context, IAwaitable<string> result)\n        {\n            EntityRecommendation title;\n            // Set the title (used for creation, deletion, and reading)\n            currentTitle = await result;\n            if (currentTitle != null)\n            {\n                title = new EntityRecommendation(type: Entity_Note_Title) { Entity = currentTitle };\n            }\n            else\n            {\n                // Use the default note title\n                title = new EntityRecommendation(type: Entity_Note_Title) { Entity = DefaultNoteTitle };\n            }\n\n            // Create a new note object \n            var note = new Note() { Title = title.Entity };\n            // Add the new note to the list of notes and also save it in order to add text to it later\n            noteToCreate = this.noteByTitle[note.Title] = note;\n\n            // Prompt the user for what they want to say in the note           \n            PromptDialog.Text(context, After_TextPrompt, \"What do you want to say in your note?\");\n\n        }\n\n        private async Task After_TextPrompt(IDialogContext context, IAwaitable<string> result)\n        {\n            // Set the text of the note\n            noteToCreate.Text = await result;\n            \n            await context.PostAsync($\"Created note **{this.noteToCreate.Title}** that says \\\"{this.noteToCreate.Text}\\\".\");\n            \n            context.Wait(MessageReceived);\n        }\n\n\n        public SimpleNoteDialog()\n        {\n\n        }\n\n        public SimpleNoteDialog(ILuisService service)\n            : base(service)\n        {\n        }\n\n        [Serializable]\n        public sealed class Note : IEquatable<Note>\n        {\n\n            public string Title { get; set; }\n            public string Text { get; set; }\n\n            public override string ToString()\n            {\n                return $\"[{this.Title} : {this.Text}]\";\n            }\n\n            public bool Equals(Note other)\n            {\n                return other != null\n                    && this.Text == other.Text\n                    && this.Title == other.Title;\n            }\n\n            public override bool Equals(object other)\n            {\n                return Equals(other as Note);\n            }\n\n            public override int GetHashCode()\n            {\n                return this.Title.GetHashCode();\n            }\n        }\n    }\n\n\n}"
  },
  {
    "path": "docs-samples/CSharp/Simple-LUIS-Notes-Sample/Simple-LUIS-Notes-Sample/Global.asax",
    "content": "﻿<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"NotesBot01.WebApiApplication\" Language=\"C#\" %>\n"
  },
  {
    "path": "docs-samples/CSharp/Simple-LUIS-Notes-Sample/Simple-LUIS-Notes-Sample/Global.asax.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Http;\nusing System.Web.Routing;\n\nnamespace NotesBot01\n{\n    public class WebApiApplication : System.Web.HttpApplication\n    {\n        protected void Application_Start()\n        {\n            GlobalConfiguration.Configure(WebApiConfig.Register);\n        }\n    }\n}\n"
  },
  {
    "path": "docs-samples/CSharp/Simple-LUIS-Notes-Sample/Simple-LUIS-Notes-Sample/NotesBot.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>NotesBot01</RootNamespace>\n    <AssemblyName>Bot Application</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <UseIISExpress>true</UseIISExpress>\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n    <TargetFrameworkProfile />\n    <Use64BitIISExpress />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Autofac, Version=3.5.0.0, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Autofac.3.5.2\\lib\\net40\\Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Chronic, Version=0.3.2.0, Culture=neutral, PublicKeyToken=3bd1f1ef638b0d3c, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Chronic.Signed.0.3.2\\lib\\net40\\Chronic.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder, Version=3.9.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.9.1.0\\lib\\net46\\Microsoft.Bot.Builder.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Builder.Autofac, Version=3.9.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.9.1.0\\lib\\net46\\Microsoft.Bot.Builder.Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Bot.Connector, Version=3.9.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bot.Builder.3.9.1.0\\lib\\net46\\Microsoft.Bot.Connector.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"Microsoft.IdentityModel.Protocol.Extensions, Version=1.0.40306.1554, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.IdentityModel.Protocol.Extensions.1.0.4.403061554\\lib\\net45\\Microsoft.IdentityModel.Protocol.Extensions.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Rest.ClientRuntime, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.Rest.ClientRuntime.2.3.2\\lib\\net45\\Microsoft.Rest.ClientRuntime.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.WindowsAzure.Configuration, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.WindowsAzure.ConfigurationManager.3.1.0\\lib\\net40\\Microsoft.WindowsAzure.Configuration.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Newtonsoft.Json.8.0.3\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.IdentityModel.Tokens.Jwt, Version=4.0.40306.1554, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.IdentityModel.Tokens.Jwt.4.0.4.403061554\\lib\\net45\\System.IdentityModel.Tokens.Jwt.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.Client.5.2.3\\lib\\net45\\System.Net.Http.Formatting.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net.Http.WebRequest\" />\n    <Reference Include=\"System.Runtime.Serialization\" />\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.Core.5.2.3\\lib\\net45\\System.Web.Http.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.Http.WebHost, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>$(SolutionDir)\\packages\\Microsoft.AspNet.WebApi.WebHost.5.2.3\\lib\\net45\\System.Web.Http.WebHost.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n    <Reference Include=\"System.Xml.Linq\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"default.htm\" />\n    <Content Include=\"Global.asax\" />\n    <Content Include=\"Web.config\">\n      <SubType>Designer</SubType>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"App_Start\\WebApiConfig.cs\" />\n    <Compile Include=\"Controllers\\MessagesController.cs\" />\n    <Compile Include=\"Dialogs\\SimpleNoteDialog.cs\" />\n    <Compile Include=\"Global.asax.cs\">\n      <DependentUpon>Global.asax</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"packages.config\" />\n    <None Include=\"Properties\\PublishProfiles\\NotesBotIgnite - Web Deploy.pubxml\" />\n    <None Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n    <None Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <PropertyGroup>\n    <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>3979</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost:3979/</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "docs-samples/CSharp/Simple-LUIS-Notes-Sample/Simple-LUIS-Notes-Sample/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"NotesBot01\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"NotesBot01\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"889243e9-5325-4893-bf9d-812e605995f9\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Revision and Build Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "docs-samples/CSharp/Simple-LUIS-Notes-Sample/Simple-LUIS-Notes-Sample/Web.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "docs-samples/CSharp/Simple-LUIS-Notes-Sample/Simple-LUIS-Notes-Sample/Web.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "docs-samples/CSharp/Simple-LUIS-Notes-Sample/Simple-LUIS-Notes-Sample/Web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  For more information on how to configure your ASP.NET application, please visit\n  http://go.microsoft.com/fwlink/?LinkId=301879\n  -->\n<configuration>\n  <appSettings>\n    <!-- update these with your BotId, Microsoft App Id and your Microsoft App Password-->\n    <add key=\"BotId\" value=\"YourBotId\" />\n    <add key=\"MicrosoftAppId\" value=\"\" />\n    <add key=\"MicrosoftAppPassword\" value=\"\" />\n  </appSettings>\n  <!--\n    For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367.\n\n    The following attributes can be set on the <httpRuntime> tag.\n      <system.Web>\n        <httpRuntime targetFramework=\"4.6\" />\n      </system.Web>\n  -->\n  <system.web>\n    <customErrors mode=\"Off\" /> \n    <compilation debug=\"true\" targetFramework=\"4.6\" />\n    <httpRuntime targetFramework=\"4.6\" />\n  </system.web>\n  <system.webServer>\n    <defaultDocument>\n      <files>\n        <clear />\n        <add value=\"default.htm\" />\n      </files>\n    </defaultDocument>\n    \n  <handlers>\n      <remove name=\"ExtensionlessUrlHandler-Integrated-4.0\" />\n      <remove name=\"OPTIONSVerbHandler\" />\n      <remove name=\"TRACEVerbHandler\" />\n      <add name=\"ExtensionlessUrlHandler-Integrated-4.0\" path=\"*.\" verb=\"*\" type=\"System.Web.Handlers.TransferRequestHandler\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n    </handlers></system.webServer>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Helpers\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Mvc\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.WebPages\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" publicKeyToken=\"30ad4fe6b2a6aeed\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-8.0.0.0\" newVersion=\"8.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Primitives\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-4.2.29.0\" newVersion=\"4.2.29.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Net.Http.Formatting\" publicKeyToken=\"31bf3856ad364e35\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n</configuration>"
  },
  {
    "path": "docs-samples/CSharp/Simple-LUIS-Notes-Sample/Simple-LUIS-Notes-Sample/default.htm",
    "content": "﻿<!DOCTYPE html>\n<html>\n<head>\n    <title></title>\n    <meta charset=\"utf-8\" />\n</head>\n<body style=\"font-family:'Segoe UI'\">\n    <h1>NotesBot01</h1>\n    <p>Describe your bot here and your terms of use etc.</p>\n    <p>Visit <a href=\"https://www.botframework.com/\">Bot Framework</a> to register your bot. When you register it, remember to set your bot's endpoint to <pre>https://<i>your_bots_hostname</i>/api/messages</pre></p>\n</body>\n</html>\n"
  },
  {
    "path": "docs-samples/CSharp/Simple-LUIS-Notes-Sample/Simple-LUIS-Notes-Sample/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Autofac\" version=\"3.5.2\" targetFramework=\"net46\" />\n  <package id=\"Chronic.Signed\" version=\"0.3.2\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.Client\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.Core\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.AspNet.WebApi.WebHost\" version=\"5.2.3\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Bot.Builder\" version=\"3.9.1.0\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.IdentityModel.Protocol.Extensions\" version=\"1.0.4.403061554\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.Rest.ClientRuntime\" version=\"2.3.2\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.WindowsAzure.ConfigurationManager\" version=\"3.1.0\" targetFramework=\"net46\" />\n  <package id=\"Newtonsoft.Json\" version=\"8.0.3\" targetFramework=\"net46\" />\n  <package id=\"System.IdentityModel.Tokens.Jwt\" version=\"4.0.4.403061554\" targetFramework=\"net46\" />\n</packages>"
  },
  {
    "path": "docs-samples/CSharp/Simple-LUIS-Notes-Sample/Simple-LUIS-Notes-Sample.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26730.12\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"NotesBot\", \"Simple-LUIS-Notes-Sample\\NotesBot.csproj\", \"{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A8BA1066-5695-4D71-ABB4-65E5A5E0C3D4}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {9B625B7D-68FE-4DC9-804E-D483514FE7BC}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "docs-samples/CSharp/Simple-LUIS-Notes-Sample/VSIX/readme.md",
    "content": "NOTE: This is the older version of the VSIX template. With the release of SDK v4, please use the latest VSIX available on [Visual Studio Market Place](https://marketplace.visualstudio.com/items?itemName=BotBuilder.BotBuilderV4). \n"
  },
  {
    "path": "docs-samples/CSharp/Simple-LUIS-Notes-Sample/readme.md",
    "content": "# Recognize intents and entities with LUIS \n\nThis sample demonstrates how to build a note-taking bot that uses Language Understanding Intelligent Service (LUIS) to respond to natural language input. \n\n## Intents and utterances\nA bot needs to detect what a user wants to do, which is their **intent**. This intent is determined from spoken or textual input, or **utterances**. The intent maps utterances to actions that the bot takes, such as invoking a dialog.\n\nIn the note-taking bot example, the following table shows how each intent maps to functionality. \n\n| Intent | Example Utterances | Bot functionality |\n|------|----------------------|------|\n| Note.Create | Create a note <br/> Create a note called Grocery List <br/> save a new note | CreateNote method |\n| Note.Delete | Delete my note<br/> Delete my Grocery List note <br/>  | DeleteNote method |\n| Note.ReadAloud | Read my note<br/> Read me the Grocery List note <br/>  | ReadNote method |\n\n## Entities\nA bot may also need to extract entities, which are important words in utterances. Sometimes entities are required to fulfill an intent. In the note-taking bot, the `Notes.Title` entity identifies the title of each note.\n\n| Entity | Example Utterances | Value | Bot functionality |\n|------|------|------|------|\n| Notes.Title| Create a note called `ShoppingList` now   | \"ShoppingList\" | The CreateNote, DeleteNote, and ReadNote dialog use the title to save or find a note. <br> The dialogs prompt for it if a `Notes.Title` entity isn't detected in the utterance.|\n\nWhen your bot receives an utterance, it can use either regular expressions or an intent recognition service like LUIS to determine the intent. To use LUIS, you configure a web service known as a **LUIS app** at [www.luis.ai][LUIS], and integrate it with your bot using the **LuisDialog** class. \n\n## Create your LUIS app\nTo create the LUIS app that provides the intents and entities to the bot, follow the steps in this section.\n\n**Tip:** The LUIS app that the following steps create can also be imported from a [JSON file](Notes.json). To import the LUIS app in [www.luis.ai][LUIS], go to **My Apps** and click the **Import App** button.\n\n1.\tLog in to [www.luis.ai][LUIS] using your Cognitive Services API account. If you don't have an account, you can create a free account in the [Azure portal](https://ms.portal.azure.com). \n2.\tIn the **My Apps** page, click **New App**, enter a name like Notes in the **Name** field, and choose **Bootstrap Key** in the **Key to use** field. \n3.\tIn the **Intents** page, click **Add prebuilt domain intents** and select **Notes.Create**, **Notes.Delete** and **Notes.ReadAloud**.\n4.\tIn the **Intents** page, click on the **None** intent. This intent is meant for utterances that don’t correspond to any other intents. Enter an example of an utterance unrelated to notes, like “Turn off the lights”.\n5.\tIn the **Entities** page, click **Add prebuilt domain entities** and select **Notes.Title**.\n6.\tIn the **Train & Test** page, train your app.\n7.\tIn the **Publish** page, click **Publish**. After successful publish, copy the **Endpoint URL** from the **Publish App** page, to use later in your bot’s code. The URL has a format similar to this example: `https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/3889f7d0-9501-45c8-be5f-8635975eea8b?subscription-key=67073e45132a459db515ca04cea325d3&timezoneOffset=0&verbose=true&q=`\n\n## How LUIS passes intents and entities to your bot\nThe following diagram shows the sequence of events that happen after the bot receives an utterance from the user. First, the bot passes the utterance to the LUIS app and gets a JSON result from LUIS that contains intents and entities. Next, your bot automatically invokes any matching handler that your bot associates with the high-scoring intent in the LUIS result. The matching handler is specified by the **LuisIntent** attribute. \n<p align=center>\n<img alt=\"How LUIS passes intents and entities to your bot\" src=\"images/bot-builder-dotnet-luis-message-flow-bot-code-notes.png\">\n</p>\n\n## Create the LuisDialog class\n\nTo create a [dialog](https://docs.microsoft.com/en-us/bot-framework/dotnet/bot-builder-dotnet-dialogs) that uses LUIS, first create a class that derives from `LuisDialog` and \nspecify the [LuisModel attribute](https://docs.microsoft.com/en-us/dotnet/api/microsoft.bot.builder.luis.luismodelattribute?view=botbuilder-3.8). \nTo populate the `modelID` and `subscriptionKey` parameters for the `LuisModel` attribute, use \nthe `id` and `subscription-key` attribute values from your LUIS application's endpoint. \n\nThe `domain` parameter is determined by the Azure region to which your LUIS app is published. \nIf not supplied, it defaults to `westus.api.cognitive.microsoft.com`.\nSee [Regions and keys](https://docs.microsoft.com/en-us/azure/cognitive-services/LUIS/manage-keys#regions-and-keys) for more information.\n\n## Create methods to handle intents\n\nWithin the class, create the methods that execute when your LUIS model matches a user's utterance to intent. \nTo designate the method that runs when a specific intent is matched, specify the `LuisIntent` attribute. \n\n## Try the bot\n\nYou can run the bot using the Bot Framework Emulator and tell it to create a note.\n<p align=center>\n<img alt=\"Conversation for creating a note\" src=\"images/dotnet-notes-sample-emulator.png\">\n</p>\n\n**Tip:** If you find that your bot doesn't always recognize the correct intent or entities, improve your LUIS app's performance by giving it more example utterances to train it. You can retrain your LUIS app without any modification to your bot's code. See [Add example utterances](https://docs.microsoft.com/en-us/azure/cognitive-services/LUIS/add-example-utterances) and [train and test your LUIS app](https://docs.microsoft.com/en-us/azure/cognitive-services/LUIS/train-test).\n\n\n[LUIS]: https://www.luis.ai/"
  },
  {
    "path": "docs-samples/Node/basics-naturalLanguage/Notes.json",
    "content": "{\n  \"luis_schema_version\": \"2.1.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"Notes\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\",\n  \"intents\": [\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"Note.Create\",\n      \"inherits\": {\n        \"domain_name\": \"Note\",\n        \"model_name\": \"Create\"\n      }\n    },\n    {\n      \"name\": \"Note.Delete\",\n      \"inherits\": {\n        \"domain_name\": \"Note\",\n        \"model_name\": \"Delete\"\n      }\n    },\n    {\n      \"name\": \"Note.ReadAloud\",\n      \"inherits\": {\n        \"domain_name\": \"Note\",\n        \"model_name\": \"ReadAloud\"\n      }\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"Note.Text\",\n      \"inherits\": {\n        \"domain_name\": \"Note\",\n        \"model_name\": \"Text\"\n      }\n    },\n    {\n      \"name\": \"Note.Title\",\n      \"inherits\": {\n        \"domain_name\": \"Note\",\n        \"model_name\": \"Title\"\n      }\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [],\n  \"bing_entities\": [],\n  \"actions\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"help\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"drive me home\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"add mark to guest list\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 4,\n          \"endPos\": 7\n        },\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 12,\n          \"endPos\": 16\n        }\n      ]\n    },\n    {\n      \"text\": \"add Fred George to onenote\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 4,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"Add oatmeal to shopping list .\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        },\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 15,\n          \"endPos\": 22\n        }\n      ]\n    },\n    {\n      \"text\": \"send lighter fluid to onenote\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 5,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"add friends to party list in memos\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 4,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"add tasks to wunderlist\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 4,\n          \"endPos\": 8\n        }\n      ]\n    },\n    {\n      \"text\": \"clear my save notes\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 9,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"\\\"I want to create a note of title \\\"\\\" Shopping list \\\"\\\"\\\"\",\n      \"intent\": \"Note.Create\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 34,\n          \"endPos\": 35\n        }\n      ]\n    },\n    {\n      \"text\": \"To buy list\",\n      \"intent\": \"Note.Create\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 3,\n          \"endPos\": 5\n        }\n      ]\n    },\n    {\n      \"text\": \"Save the current note\",\n      \"intent\": \"Note.Create\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"type in notepad\",\n      \"intent\": \"Note.Create\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create My Favorites note\",\n      \"intent\": \"Note.Create\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"waffles recipe is my new note to be created\",\n      \"intent\": \"Note.Create\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"A new note of name Business Solutions\",\n      \"intent\": \"Note.Create\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"A new note please\",\n      \"intent\": \"Note.Create\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you set a note up to mom\",\n      \"intent\": \"Note.Create\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"create note with notepad\",\n      \"intent\": \"Note.Create\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Delete the note of name Guest list\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete poetry notes\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"DELETE LIBRARY LIST\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 7,\n          \"endPos\": 13\n        }\n      ]\n    },\n    {\n      \"text\": \"Delete note: Summer Reading List.\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"dismiss Fred's notes\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 8,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"Remove Daddy's BD note\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 7,\n          \"endPos\": 12\n        }\n      ]\n    },\n    {\n      \"text\": \"delete my ideas list\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Delete Insurance note please\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"delete latest note\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Recall note 3 delete\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Can you read the grocery list note please\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 17,\n          \"endPos\": 23\n        }\n      ]\n    },\n    {\n      \"text\": \"Repeat the last word again\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Read meeting notes to me\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 5,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"recall most recent groccery list\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 19,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"Please read Trip notes\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 12,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"I want you to read this note loudly\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Read my grocery list\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 8,\n          \"endPos\": 14\n        }\n      ]\n    },\n    {\n      \"text\": \"\\\"read note \\\"\\\" grocery list \\\"\\\"\\\"\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 11,\n          \"endPos\": 11\n        }\n      ]\n    },\n    {\n      \"text\": \"speak trip note for me please\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Title\",\n          \"startPos\": 6,\n          \"endPos\": 9\n        }\n      ]\n    },\n    {\n      \"text\": \"read the note appointments please\",\n      \"intent\": \"Note.ReadAloud\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 14,\n          \"endPos\": 25\n        }\n      ]\n    },\n    {\n      \"text\": \"Create for me a note about Car Oil\",\n      \"intent\": \"Note.Create\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 27,\n          \"endPos\": 33\n        }\n      ]\n    },\n    {\n      \"text\": \"Stop reading the note\",\n      \"intent\": \"None\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 0,\n          \"endPos\": 15\n        }\n      ]\n    },\n    {\n      \"text\": \"Delete the note number two\",\n      \"intent\": \"Note.Delete\",\n      \"entities\": [\n        {\n          \"entity\": \"Note.Text\",\n          \"startPos\": 16,\n          \"endPos\": 25\n        }\n      ]\n    }\n  ]\n}"
  },
  {
    "path": "docs-samples/Node/basics-naturalLanguage/basicNote-intentDialog.js",
    "content": "\n/*-----------------------------------------------------------------------------\n\nThis bot demonstrates how to use dialogs with a LuisRecognizer to add LUIS support to a bot.\nLUIS identifies intents and entities from user messages, or utterances.\n\nIntents map utterances to functionality in your bot.\nIn this example, the intents provide the following mappings:\n * The Notes.Create intent maps to the CreateNote handler\n * The Notes.Delete intent maps to the DeleteNote handler\n * The Notes.ReadAloud intent maps to the ReadNote handler\n\n-----------------------------------------------------------------------------*/\nvar restify = require('restify');\nvar builder = require('botbuilder');\n\n// Setup Restify Server\nvar server = restify.createServer();\nserver.listen(process.env.port || process.env.PORT || 3978, function () {\n   console.log('%s listening to %s', server.name, server.url); \n});\n\n\n// Create chat connector for communicating with the Bot Framework Service\n// See https://aka.ms/node-env-var for information on setting environment variables in launch.json if you are using VSCode\nvar connector = new builder.ChatConnector({\n    appId: process.env.MICROSOFT_APP_ID,\n    appPassword: process.env.MICROSOFT_APP_PASSWORD\n});\n\n// Listen for messages from users \nserver.post('/api/messages', connector.listen());\n\n// <Constructor>\n// Create your bot\nvar bot = new builder.UniversalBot(connector);\n// </Constructor>\n\n\n// <Recognizer>\n// Add global LUIS recognizer to bot\nvar luisAppUrl = process.env.LUIS_APP_URL || 'https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/<YOUR_APP_ID>?subscription-key=<YOUR_KEY>';\nvar notesRecognizer = bot.recognizer(new builder.LuisRecognizer(luisAppUrl));\n// </Recognizer>\n\n// <IntentDialogs>\nvar noteIntentsDialog = new builder.IntentDialog({\n         recognizers: [notesRecognizer]\n});\n\nbot.dialog('/', noteIntentsDialog);\n// </IntentDialogs>\n\n// <NoneHandler>\n// Handle the None intent\n// This default message handler is invoked if the user's utterance doesn't\n// match any other intents defined in the LUIS app.\nnoteIntentsDialog.matches('None', [\n    function (session, args) {\n    session.send(\"Hi... I'm the note bot sample. I can create new notes, read saved notes to you and delete notes.\");\n\n   // If the object for storing notes in session.userData doesn't exist yet, initialize it\n   if (!session.userData.notes) {\n       session.userData.notes = {};\n       console.log(\"initializing userData.notes in default message handler\");\n   }\n}]);\n// </NoneHandler>\n\n// <CreateNoteHandler>\n// Handle the Note.Create intent\nnoteIntentsDialog.matches('Note.Create', [\n    function (session, args, next) {\n        // Resolve and store any Note.Title entity passed from LUIS.\n        var intent = args.intent;\n        var title = builder.EntityRecognizer.findEntity(intent.entities, 'Note.Title');\n\n        var note = session.dialogData.note = {\n          title: title ? title.entity : null,\n        };\n        \n        // Prompt for title\n        if (!note.title) {\n            builder.Prompts.text(session, 'What would you like to call your note?');\n        } else {\n            next();\n        }\n    },\n    function (session, results, next) {\n        var note = session.dialogData.note;\n        if (results.response) {\n            note.title = results.response;\n        }\n\n        // Prompt for the text of the note\n        if (!note.text) {\n            builder.Prompts.text(session, 'What would you like to say in your note?');\n        } else {\n            next();\n        }\n    },\n    function (session, results) {\n        var note = session.dialogData.note;\n        if (results.response) {\n            note.text = results.response;\n        }\n        \n        // If the object for storing notes in session.userData doesn't exist yet, initialize it\n        if (!session.userData.notes) {\n            session.userData.notes = {};\n            console.log(\"initializing session.userData.notes in CreateNote dialog\");\n        }\n        // Save notes in the notes object\n        session.userData.notes[note.title] = note;\n\n        // Send confirmation to user\n        session.endDialog('Creating note named \"%s\" with text \"%s\"',\n            note.title, note.text);\n    }\n]);\n// </CreateNoteHandler>\n\n// <DeleteNoteHandler>\n// Handle the Note.Delete intent\nnoteIntentsDialog.matches('Note.Delete', [\n    function (session, args, next) {\n        if (noteCount(session.userData.notes) > 0) {\n            // Resolve and store any Note.Title entity passed from LUIS.\n            var title;\n            var intent = args.intent;\n            var entity = builder.EntityRecognizer.findEntity(intent.entities, 'Note.Title');\n            if (entity) {\n                // Verify that the title is in our set of notes.\n                title = builder.EntityRecognizer.findBestMatch(session.userData.notes, entity.entity);\n            }\n            \n            // Prompt for note name\n            if (!title) {\n                builder.Prompts.choice(session, 'Which note would you like to delete?', session.userData.notes);\n            } else {\n                next({ response: title });\n            }\n        } else {\n            session.endDialog(\"No notes to delete.\");\n        }\n    },\n    function (session, results) {\n        delete session.userData.notes[results.response.entity];        \n        session.endDialog(\"Deleted the '%s' note.\", results.response.entity);\n    }\n]);\n// </DeleteNoteHandler>\n\n// <ReadNoteHandler>\n// Handle the Notes.ReadAloud intent\nnoteIntentsDialog.matches('Note.ReadAloud', [\n    function (session, args, next) {\n        if (noteCount(session.userData.notes) > 0) {\n           \n            // Resolve and store any Note.Title entity passed from LUIS.\n            var title;\n            var intent = args.intent;\n            var entity = builder.EntityRecognizer.findEntity(intent.entities, 'Note.Title');\n            if (entity) {\n                // Verify it's in our set of notes.\n                title = builder.EntityRecognizer.findBestMatch(session.userData.notes, entity.entity);\n            }\n            \n            // Prompt for note name\n            if (!title) {\n                builder.Prompts.choice(session, 'Which note would you like to read?', session.userData.notes);\n            } else {\n                next({ response: title });\n            }\n        } else {\n            session.endDialog(\"No notes to read.\");\n        }\n    },\n    function (session, results) {        \n        session.endDialog(\"Here's the '%s' note: '%s'.\", results.response.entity, session.userData.notes[results.response.entity].text);\n    }\n]);\n// </ReadNoteHandler>\n\n// <CountNotesHelper>\n// Helper function to count the number of notes stored in session.userData.notes\nfunction noteCount(notes) {\n\n    var i = 0;\n    for (var name in notes) {\n        i++;\n    }\n    return i;\n}\n// </CountNotesHelper>\n"
  },
  {
    "path": "docs-samples/Node/basics-naturalLanguage/basicNote.js",
    "content": "\n/*-----------------------------------------------------------------------------\n\nThis bot demonstrates how to use dialogs with a LuisRecognizer to add LUIS support to a bot.\nLUIS identifies intents and entities from user messages, or utterances.\n\nIntents map utterances to functionality in your bot.\nIn this example, the intents provide the following mappings:\n * The Notes.Create intent maps to the CreateNote dialog\n * The Notes.Delete intent maps to the DeleteNote dialog\n * The Notes.ReadAloud intent maps to the ReadNote dialog\n\n-----------------------------------------------------------------------------*/\nvar restify = require('restify');\nvar builder = require('botbuilder');\n\n// Setup Restify Server\nvar server = restify.createServer();\nserver.listen(process.env.port || process.env.PORT || 3978, function () {\n   console.log('%s listening to %s', server.name, server.url); \n});\n\n\n// Create chat connector for communicating with the Bot Framework Service\n// See https://aka.ms/node-env-var for information on setting environment variables in launch.json if you are using VSCode\nvar connector = new builder.ChatConnector({\n    appId: process.env.MICROSOFT_APP_ID,\n    appPassword: process.env.MICROSOFT_APP_PASSWORD\n});\n\n// Listen for messages from users \nserver.post('/api/messages', connector.listen());\n\n\n// Create your bot with a function to receive messages from the user.\n// This default message handler is invoked if the user's utterance doesn't\n// match any intents handled by other dialogs.\nvar bot = new builder.UniversalBot(connector, function (session, args) {\n    session.send(\"Hi... I'm the note bot sample. I can create new notes, read saved notes to you and delete notes.\");\n\n   // If the object for storing notes in session.userData doesn't exist yet, initialize it\n   if (!session.userData.notes) {\n       session.userData.notes = {};\n       console.log(\"initializing userData.notes in default message handler\");\n   }\n});\n\n\n// Add global LUIS recognizer to bot\nvar luisAppUrl = process.env.LUIS_APP_URL || 'https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/<YOUR_APP_ID>?subscription-key=<YOUR_KEY>';\nbot.recognizer(new builder.LuisRecognizer(luisAppUrl));\n\n// CreateNote dialog\nbot.dialog('CreateNote', [\n    function (session, args, next) {\n        // Resolve and store any Note.Title entity passed from LUIS.\n        var intent = args.intent;\n        var title = builder.EntityRecognizer.findEntity(intent.entities, 'Note.Title');\n\n        var note = session.dialogData.note = {\n          title: title ? title.entity : null,\n        };\n        \n        // Prompt for title\n        if (!note.title) {\n            builder.Prompts.text(session, 'What would you like to call your note?');\n        } else {\n            next();\n        }\n    },\n    function (session, results, next) {\n        var note = session.dialogData.note;\n        if (results.response) {\n            note.title = results.response;\n        }\n\n        // Prompt for the text of the note\n        if (!note.text) {\n            builder.Prompts.text(session, 'What would you like to say in your note?');\n        } else {\n            next();\n        }\n    },\n    function (session, results) {\n        var note = session.dialogData.note;\n        if (results.response) {\n            note.text = results.response;\n        }\n        \n        // If the object for storing notes in session.userData doesn't exist yet, initialize it\n        if (!session.userData.notes) {\n            session.userData.notes = {};\n            console.log(\"initializing session.userData.notes in CreateNote dialog\");\n        }\n        // Save notes in the notes object\n        session.userData.notes[note.title] = note;\n\n        // Send confirmation to user\n        session.endDialog('Creating note named \"%s\" with text \"%s\"',\n            note.title, note.text);\n    }\n]).triggerAction({ \n    matches: 'Note.Create',\n    confirmPrompt: \"This will cancel the creation of the note you started. Are you sure?\" \n}).cancelAction('cancelCreateNote', \"Note canceled.\", {\n    matches: /^(cancel|nevermind)/i,\n    confirmPrompt: \"Are you sure?\"\n});\n\n// Delete note dialog\nbot.dialog('DeleteNote', [\n    function (session, args, next) {\n        if (noteCount(session.userData.notes) > 0) {\n            // Resolve and store any Note.Title entity passed from LUIS.\n            var title;\n            var intent = args.intent;\n            var entity = builder.EntityRecognizer.findEntity(intent.entities, 'Note.Title');\n            if (entity) {\n                // Verify that the title is in our set of notes.\n                title = builder.EntityRecognizer.findBestMatch(session.userData.notes, entity.entity);\n            }\n            \n            // Prompt for note name\n            if (!title) {\n                builder.Prompts.choice(session, 'Which note would you like to delete?', session.userData.notes);\n            } else {\n                next({ response: title });\n            }\n        } else {\n            session.endDialog(\"No notes to delete.\");\n        }\n    },\n    function (session, results) {\n        delete session.userData.notes[results.response.entity];        \n        session.endDialog(\"Deleted the '%s' note.\", results.response.entity);\n    }\n]).triggerAction({\n    matches: 'Note.Delete'\n}).cancelAction('cancelDeleteNote', \"Ok - canceled note deletion.\", {\n    matches: /^(cancel|nevermind)/i\n});\n\n\n// Read note dialog\nbot.dialog('ReadNote', [\n    function (session, args, next) {\n        if (noteCount(session.userData.notes) > 0) {\n           \n            // Resolve and store any Note.Title entity passed from LUIS.\n            var title;\n            var intent = args.intent;\n            var entity = builder.EntityRecognizer.findEntity(intent.entities, 'Note.Title');\n            if (entity) {\n                // Verify it's in our set of notes.\n                title = builder.EntityRecognizer.findBestMatch(session.userData.notes, entity.entity);\n            }\n            \n            // Prompt for note name\n            if (!title) {\n                builder.Prompts.choice(session, 'Which note would you like to read?', session.userData.notes);\n            } else {\n                next({ response: title });\n            }\n        } else {\n            session.endDialog(\"No notes to read.\");\n        }\n    },\n    function (session, results) {        \n        session.endDialog(\"Here's the '%s' note: '%s'.\", results.response.entity, session.userData.notes[results.response.entity].text);\n    }\n]).triggerAction({\n    matches: 'Note.ReadAloud'\n}).cancelAction('cancelReadNote', \"Ok.\", {\n    matches: /^(cancel|nevermind)/i\n});\n\n\n// Helper function to count the number of notes stored in session.userData.notes\nfunction noteCount(notes) {\n\n    var i = 0;\n    for (var name in notes) {\n        i++;\n    }\n    return i;\n}\n\n"
  },
  {
    "path": "docs-samples/Node/basics-naturalLanguage/readme.md",
    "content": "# Recognize intents and entities with LUIS \n\nThis sample demonstrates how to build a note-taking bot that uses Language Understanding Intelligent Service (LUIS) to respond to natural language input. \n\n## Intents and utterances\nA bot needs to detect what a user wants to do, which is their **intent**. This intent is determined from spoken or textual input, or **utterances**. The intent maps utterances to actions that the bot takes, such as invoking a dialog.\n\nIn the note-taking bot example, the following table shows how each intent maps to functionality. \n\n| Intent | Example Utterances | Bot functionality |\n|------|----------------------|------|\n| Note.Create | Create a note <br/> Create a note called Grocery List <br/> save a new note | CreateNote dialog |\n| Note.Delete | Delete my note<br/> Delete my Grocery List note <br/>  | DeleteNote dialog |\n| Note.ReadAloud | Read my note<br/> Read me the Grocery List note <br/>  | ReadNote dialog |\n\n## Entities\nA bot may also need to extract entities, which are important words in utterances. Sometimes entities are required to fulfill an intent. In the note-taking bot, the `Notes.Title` entity identifies the title of each note.\n\n| Entity | Example Utterances | Value | Bot functionality |\n|------|------|------|------|\n| Notes.Title| Create a note called `ShoppingList` now   | \"ShoppingList\" | The CreateNote, DeleteNote, and ReadNote dialog use the title to save or find a note. <br> The dialogs prompt for it if a `Notes.Title` entity isn't detected in the utterance.|\n\nWhen your bot receives an utterance, it can use either regular expressions or an intent recognition service like LUIS to determine the intent. To use LUIS, you configure a web service known as a **LUIS app** at [www.luis.ai][LUIS], and integrate it with your bot using the [LuisRecognizer][LuisRecognizer] and [Dialog][Dialog] classes. To recognize intent using regular expressions, see [Recognize intent](./bot-builder-nodejs-recognize-intent.md).\n\n## How LUIS passes intents and entities to your bot\nThe following diagram shows the sequence of events that happen after the bot receives an utterance from the user. First, the bot passes the utterance to the LUIS app and gets a JSON result from LUIS that contains intents and entities. Next, your bot automatically invokes any matching dialog that your bot associates with the high-scoring intent in the LUIS result. The full details of the match, including the list of intents and entities that LUIS detected, are passed to the `args` parameter of the matching dialog.\n\n<p align=center>\n<img alt=\"How LUIS passes intents and entities to your bot\" src=\"images/bot-builder-nodejs-luis-message-flow-bot-code-notes.png\">\n</p>\n\n\n## Create your LUIS app\nTo create the LUIS app that provides the intents and entities to the bot, follow the steps in this section.\n\n**Tip:** The LUIS app that the following steps create can also be imported from a [JSON file](Notes.json). To import the LUIS app in [www.luis.ai][LUIS], go to **My Apps** and click the **Import App** button.\n\n1.\tLog in to [www.luis.ai][LUIS] using your Cognitive Services API account. If you don't have an account, you can create a free account in the [Azure portal](https://ms.portal.azure.com). \n2.\tIn the **My Apps** page, click **New App**, enter a name like Notes in the **Name** field, and choose **Bootstrap Key** in the **Key to use** field. \n3.\tIn the **Intents** page, click **Add prebuilt domain intents** and select **Notes.Create**, **Notes.Delete** and **Notes.ReadAloud**.\n4.\tIn the **Intents** page, click on the **None** intent. This intent is meant for utterances that don’t correspond to any other intents. Enter an example of an utterance unrelated to weather, like “Turn off the lights”\n5.\tIn the **Entities** page, click **Add prebuilt domain entities** and select **Notes.Title**.\n6.\tIn the **Train & Test** page, train your app.\n7.\tIn the **Publish** page, click **Publish**. After successful publish, copy the **Endpoint URL** from the **Publish App** page, to use later in your bot’s code. The URL has a format similar to this example: `https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/3889f7d0-9501-45c8-be5f-8635975eea8b?subscription-key=67073e45132a459db515ca04cea325d3&timezoneOffset=0&verbose=true&q=`\n\n\n\n## Create a note-taking bot integrated with the LUIS app\nThe code for the note-taking bot is in `basicNote.js`. To create this bot from scratch, you can first start with the sample code in [Create a bot with Node.js](https://docs.microsoft.com/en-us/bot-framework/nodejs/bot-builder-nodejs-quickstart#create-your-bot), and add code according to the instructions in the following sections.\n\n### Create the bot \nCreate the bot that communicates with the Bot Framework Connector service by instantiating a [UniversalBot][UniversalBot] object. The constructor takes a second parameter for a default message handler. This message handler sends a generic help message about the functionality that the note-taking bot provides, and initializes the `session.userData.notes` object for storing notes. You use `session.userData` so the notes are persisted for the user. Edit the code that creates the bot, so that the constructor looks like the following code:\n\n``` javascript\n// Create your bot with a function to receive messages from the user.\n// This default message handler is invoked if the user's utterance doesn't\n// match any intents handled by other dialogs.\nvar bot = new builder.UniversalBot(connector, function (session, args) {\n    session.send(\"Hi... I'm the note bot sample. I can create new notes, read saved notes to you and delete notes.\");\n\n   // If the object for storing notes in session.userData doesn't exist yet, initialize it\n   if (!session.userData.notes) {\n       session.userData.notes = {};\n       console.log(\"initializing userData.notes in default message handler\");\n   }\n});\n```\n\n### Add a LuisRecognizer\nThe [LuisRecognizer][LuisRecognizer] class calls the LUIS app. You initialize a **LuisRecognizer** using the **Endpoint URL** of the LUIS app that you copied from the **Publish App** page. \n\nAfter you create the `UniversalBot`, add code to create the `LuisRecognizer` and add it to the bot: \n\n``` javascript\n// Add global LUIS recognizer to bot\nvar luisAppUrl = process.env.LUIS_APP_URL || 'https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/<YOUR_APP_ID>?subscription-key=<YOUR_KEY>';\nbot.recognizer(new builder.LuisRecognizer(luisAppUrl));\n```\n\n### Add dialogs\nNow that the notes recognizer is set up to point to the LUIS app, you can add code for the dialogs.  The [matches](https://docs.botframework.com/en-us/node/builder/chat-reference/interfaces/_botbuilder_d_.itriggeractionoptions.html#matches) property of the \n[triggerAction](https://docs.microsoft.com/en-us/bot-framework/nodejs/bot-builder-nodejs-dialog-actions#bind-a-triggeraction) attached to the dialog specifies the name of the intent. The recognizer runs each time the bot receives an utterance from the user. If the highest scoring intent that it detects matches a `triggerAction` bound to a dialog, the bot invokes that dialog.\n\n``` javascript\n// Add global LUIS recognizer to bot\nvar luisAppUrl = process.env.LUIS_APP_URL || 'https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/<YOUR_APP_ID>?subscription-key=<YOUR_KEY>';\nbot.recognizer(new builder.LuisRecognizer(luisAppUrl));\n```\n\n#### Add the CreateNote dialog\nAny entities in the utterance are passed to the dialog using the `args` parameter. The first step of the waterfall calls `EntityRecognizer.findEntity` to get the title of the note from any `Note.Title` entities in the LUIS response. If the LUIS app didn't detect a `Note.Title` entity, the bot prompts the user for the name of the note. The second step of the waterfall prompts for the text to include in the note. Once the bot has the text of the note, the third step uses `session.userData` to save the note in a `notes` object, using the title as the key.\n\n\nThe following code for a CreateNote dialog handles the `Note.Create` intent.\n\n``` javascript \n// CreateNote dialog\nbot.dialog('CreateNote', [\n    function (session, args, next) {\n        // Resolve and store any Note.Title entity passed from LUIS.\n        var intent = args.intent;\n        var title = builder.EntityRecognizer.findEntity(intent.entities, 'Note.Title');\n\n        var note = session.dialogData.note = {\n          title: title ? title.entity : null,\n        };\n        \n        // Prompt for title\n        if (!note.title) {\n            builder.Prompts.text(session, 'What would you like to call your note?');\n        } else {\n            next();\n        }\n    },\n    function (session, results, next) {\n        var note = session.dialogData.note;\n        if (results.response) {\n            note.title = results.response;\n        }\n\n        // Prompt for the text of the note\n        if (!note.text) {\n            builder.Prompts.text(session, 'What would you like to say in your note?');\n        } else {\n            next();\n        }\n    },\n    function (session, results) {\n        var note = session.dialogData.note;\n        if (results.response) {\n            note.text = results.response;\n        }\n        \n        // If the object for storing notes in session.userData doesn't exist yet, initialize it\n        if (!session.userData.notes) {\n            session.userData.notes = {};\n            console.log(\"initializing session.userData.notes in CreateNote dialog\");\n        }\n        // Save notes in the notes object\n        session.userData.notes[note.title] = note;\n\n        // Send confirmation to user\n        session.endDialog('Creating note named \"%s\" with text \"%s\"',\n            note.title, note.text);\n    }\n]).triggerAction({ \n    matches: 'Note.Create',\n    confirmPrompt: \"This will cancel the creation of the note you started. Are you sure?\" \n}).cancelAction('cancelCreateNote', \"Note canceled.\", {\n    matches: /^(cancel|nevermind)/i,\n    confirmPrompt: \"Are you sure?\"\n});\n```\n\nIf the LUIS app detects an intent that interrupts the `CreateNote` dialog, the `confirmPrompt` property of the dialog's `triggerAction` provides a prompt to confirm the interruption. For example, if the bot says \"What would you like to call your note?\", and the user replies \"Actually, I want to delete a note instead\", the bot prompts the user using the `confirmPrompt` message.\n\n#### Add the DeleteNote dialog\nIn the `DeleteNote` dialog, the `triggerAction` matches the `Note.Delete` intent. As in the `CreateNote` dialog, the bot examines the `args` parameter for a title. If no title is detected, the bot prompts the user. The title is used to look up the note to delete from `session.userData.notes`. \n\n``` javascript\n// Delete note dialog\nbot.dialog('DeleteNote', [\n    function (session, args, next) {\n        if (noteCount(session.userData.notes) > 0) {\n            // Resolve and store any Note.Title entity passed from LUIS.\n            var title;\n            var intent = args.intent;\n            var entity = builder.EntityRecognizer.findEntity(intent.entities, 'Note.Title');\n            if (entity) {\n                // Verify that the title is in our set of notes.\n                title = builder.EntityRecognizer.findBestMatch(session.userData.notes, entity.entity);\n            }\n            \n            // Prompt for note name\n            if (!title) {\n                builder.Prompts.choice(session, 'Which note would you like to delete?', session.userData.notes);\n            } else {\n                next({ response: title });\n            }\n        } else {\n            session.endDialog(\"No notes to delete.\");\n        }\n    },\n    function (session, results) {\n        delete session.userData.notes[results.response.entity];        \n        session.endDialog(\"Deleted the '%s' note.\", results.response.entity);\n    }\n]).triggerAction({\n    matches: 'Note.Delete'\n}).cancelAction('cancelDeleteNote', \"Ok - canceled note deletion.\", {\n    matches: /^(cancel|nevermind)/i\n});\n```\n\nThe `DeleteNote` dialog uses the `noteCount` function to determine whether the `notes` object contains notes.\n\n``` javascript\n// Helper function to count the number of notes stored in session.userData.notes\nfunction noteCount(notes) {\n\n    var i = 0;\n    for (var name in notes) {\n        i++;\n    }\n    return i;\n}\n```\n\n#### Add the ReadNote dialog\n\nFor reading a note, the `triggerAction` matches the `Note.ReadAloud` intent. The `session.userData.notes` object is passed as the third argument to `builder.Prompts.choice`, so that the prompt displays a list of notes to the user.\n\n``` javascript\n// Read note dialog\nbot.dialog('ReadNote', [\n    function (session, args, next) {\n        if (noteCount(session.userData.notes) > 0) {\n           \n            // Resolve and store any Note.Title entity passed from LUIS.\n            var title;\n            var intent = args.intent;\n            var entity = builder.EntityRecognizer.findEntity(intent.entities, 'Note.Title');\n            if (entity) {\n                // Verify it's in our set of notes.\n                title = builder.EntityRecognizer.findBestMatch(session.userData.notes, entity.entity);\n            }\n            \n            // Prompt for note name\n            if (!title) {\n                builder.Prompts.choice(session, 'Which note would you like to read?', session.userData.notes);\n            } else {\n                next({ response: title });\n            }\n        } else {\n            session.endDialog(\"No notes to read.\");\n        }\n    },\n    function (session, results) {        \n        session.endDialog(\"Here's the '%s' note: '%s'.\", results.response.entity, session.userData.notes[results.response.entity].text);\n    }\n]).triggerAction({\n    matches: 'Note.ReadAloud'\n}).cancelAction('cancelReadNote', \"Ok.\", {\n    matches: /^(cancel|nevermind)/i\n});\n```\n\n## Try the bot\n\nYou can run the bot using the Bot Framework Emulator and tell it to create a note.\n<p align=center>\n<img alt=\"Conversation for creating a note\" src=\"images/bot-builder-nodejs-use-luis-create-note-output.png\">\n</p>\n\n\nThe use of `triggerAction` to match intents means that the bot can detect and react to intents for every utterance, even utterances that occur in the middle of the steps of a dialog. If the user is in the `CreateNote` dialog, but asks to create a different note before the dialog's conversation flow is complete, the bot detects the second `Note.Create` intent, and prompts the user to verify the interruption.\n\n\n<p align=center>\n<img alt=\"Conversation for creating a note, interrupted by another note request\" src=\"images/bot-builder-nodejs-use-luis-create-note-interruption.png\">\n</p>\n\n## Use an IntentDialog \nAs you can see from trying the bot, the behavior of a `triggerAction` that matches an intent is global and allows interruption of the currently active dialog. Allowing and handling interruptions is a flexible design that accounts for what users really do. However, if you prefer a simpler conversational flow in which other intents can't interrupt a dialog, you can use an `IntentDialog`. \n\nThe code for a note-taking bot that uses `IntentDialog` is in `basicNote-intentDialog.js`. To convert the note-taking bot to use `IntentDialog` instead, start with the code in `basicNote.js` and do the following steps to modify it.\n\nInstead of defining a default message handler in the bot constructor, replace the constructor with this code:\n``` javascript\n// Create your bot\nvar bot = new builder.UniversalBot(connector);\n```\n\nModify the definition of the `LuisRecognizer` to match this code:\n\n``` javascript\n// Add global LUIS recognizer to bot\nvar luisAppUrl = process.env.LUIS_APP_URL || 'https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/<YOUR_APP_ID>?subscription-key=<YOUR_KEY>';\nvar notesRecognizer = bot.recognizer(new builder.LuisRecognizer(luisAppUrl));\n```\n\nDefine an `IntentDialog` using the following code:\n``` javascript\nvar noteIntentsDialog = new builder.IntentDialog({\n         recognizers: [notesRecognizer]\n});\n\nbot.dialog('/', noteIntentsDialog);\n```\n\nTo handle the None intent that is triggered when no other intents are identified, add the following code:\n``` javascript\n// Handle the None intent\n// This default message handler is invoked if the user's utterance doesn't\n// match any other intents defined in the LUIS app.\nnoteIntentsDialog.matches('None', [\n    function (session, args) {\n    session.send(\"Hi... I'm the note bot sample. I can create new notes, read saved notes to you and delete notes.\");\n\n   // If the object for storing notes in session.userData doesn't exist yet, initialize it\n   if (!session.userData.notes) {\n       session.userData.notes = {};\n       console.log(\"initializing userData.notes in default message handler\");\n   }\n}]);\n```\n\nReplace the CreateNote dialog with the following code:\n``` javascript\n// Handle the Note.Create intent\nnoteIntentsDialog.matches('Note.Create', [\n    function (session, args, next) {\n        // Resolve and store any Note.Title entity passed from LUIS.\n        var intent = args.intent;\n        var title = builder.EntityRecognizer.findEntity(intent.entities, 'Note.Title');\n\n        var note = session.dialogData.note = {\n          title: title ? title.entity : null,\n        };\n        \n        // Prompt for title\n        if (!note.title) {\n            builder.Prompts.text(session, 'What would you like to call your note?');\n        } else {\n            next();\n        }\n    },\n    function (session, results, next) {\n        var note = session.dialogData.note;\n        if (results.response) {\n            note.title = results.response;\n        }\n\n        // Prompt for the text of the note\n        if (!note.text) {\n            builder.Prompts.text(session, 'What would you like to say in your note?');\n        } else {\n            next();\n        }\n    },\n    function (session, results) {\n        var note = session.dialogData.note;\n        if (results.response) {\n            note.text = results.response;\n        }\n        \n        // If the object for storing notes in session.userData doesn't exist yet, initialize it\n        if (!session.userData.notes) {\n            session.userData.notes = {};\n            console.log(\"initializing session.userData.notes in CreateNote dialog\");\n        }\n        // Save notes in the notes object\n        session.userData.notes[note.title] = note;\n\n        // Send confirmation to user\n        session.endDialog('Creating note named \"%s\" with text \"%s\"',\n            note.title, note.text);\n    }\n]);\n```\n\nReplace the DeleteNote dialog with the following code:\n``` javascript\n// Handle the Note.Delete intent\nnoteIntentsDialog.matches('Note.Delete', [\n    function (session, args, next) {\n        if (noteCount(session.userData.notes) > 0) {\n            // Resolve and store any Note.Title entity passed from LUIS.\n            var title;\n            var intent = args.intent;\n            var entity = builder.EntityRecognizer.findEntity(intent.entities, 'Note.Title');\n            if (entity) {\n                // Verify that the title is in our set of notes.\n                title = builder.EntityRecognizer.findBestMatch(session.userData.notes, entity.entity);\n            }\n            \n            // Prompt for note name\n            if (!title) {\n                builder.Prompts.choice(session, 'Which note would you like to delete?', session.userData.notes);\n            } else {\n                next({ response: title });\n            }\n        } else {\n            session.endDialog(\"No notes to delete.\");\n        }\n    },\n    function (session, results) {\n        delete session.userData.notes[results.response.entity];        \n        session.endDialog(\"Deleted the '%s' note.\", results.response.entity);\n    }\n]);\n```\n\nReplace the ReadNote dialog with the following code:\n``` javascript\n// Handle the Notes.ReadAloud intent\nnoteIntentsDialog.matches('Note.ReadAloud', [\n    function (session, args, next) {\n        if (noteCount(session.userData.notes) > 0) {\n           \n            // Resolve and store any Note.Title entity passed from LUIS.\n            var title;\n            var intent = args.intent;\n            var entity = builder.EntityRecognizer.findEntity(intent.entities, 'Note.Title');\n            if (entity) {\n                // Verify it's in our set of notes.\n                title = builder.EntityRecognizer.findBestMatch(session.userData.notes, entity.entity);\n            }\n            \n            // Prompt for note name\n            if (!title) {\n                builder.Prompts.choice(session, 'Which note would you like to read?', session.userData.notes);\n            } else {\n                next({ response: title });\n            }\n        } else {\n            session.endDialog(\"No notes to read.\");\n        }\n    },\n    function (session, results) {        \n        session.endDialog(\"Here's the '%s' note: '%s'.\", results.response.entity, session.userData.notes[results.response.entity].text);\n    }\n]);\n```\n\n## Next steps\n\nAs next steps, you may want to improve your note-taking bot's recognition of intents and entities, or add more functionality to it.\n\n### Improve recognition\nIn the process of testing this simple notes bot, you may notice that the LUIS app doesn't always recognize the `Notes.Title` entity in an utterance. There may also be times when the LUIS app identifies the wrong intent. A LUIS app learns from example, so you can improve its performance by giving it more example utterances to train it. You can retrain your LUIS app without any modification to your bot's code.\n\n* See [Add example utterances](https://docs.microsoft.com/en-us/azure/cognitive-services/LUIS/add-example-utterances) for an explanation of how to provide more example utterances to LUIS so it can learn.\n* Once you've provided more utterances, you can [train and test your LUIS app](https://docs.microsoft.com/en-us/azure/cognitive-services/LUIS/train-test).\n\nA more advanced way to improve the performance of the LUIS app is to add features:\n*  See [Features in LUIS](https://docs.microsoft.com/en-us/azure/cognitive-services/LUIS/luis-concept-feature) for an explanation of what features are.\n*  See [Improve performance using features](https://docs.microsoft.com/en-us/azure/cognitive-services/LUIS/add-features) for a walkthrough of adding features to a LUIS app.\n\n### Add more functionality\nTo more functionality to a LUIS-integrated bot, consider whether the new functionality maps to an intent or an entity. You may need a new intent to map to a conversation flow or dialog, and you might need new entities for new parameters or options. For example, if you want your notes bot to also be able to set alarms, you need to add intents to recognize alarm-related utterances, and extract entities like the alarm time.\n\n* See the [Alarm bot sample][AlarmBot] for an example of a simple bot that creates and deletes alarms, and automatically extracts times from user utterances. \n\n## Additional resources\n\nTo learn more about the actions you can associate with a recognized intent, see [Managing conversation flow](bot-builder-nodejs-manage-conversation-flow.md) and [Trigger actions using global handlers](bot-builder-nodejs-global-handlers.md).\n\nFor more information on LUIS, see the [LUIS documentation][LUISAzureDocs].\n\nThe [LUIS Bot sample][LUISBotSample] demonstrates how to build a more complex LUIS-integrated bot. Its LUIS app provides intents and entities for searching for hotels.\n\n\n[LUIS]: https://www.luis.ai/\n\n[LUISAzureDocs]: https://docs.microsoft.com/en-us/azure/cognitive-services/LUIS/Home\n\n[Dialog]: https://docs.botframework.com/en-us/node/builder/chat-reference/classes/_botbuilder_d_.dialog.html\n\n[IntentRecognizerSetOptions]: https://docs.botframework.com/en-us/node/builder/chat-reference/interfaces/_botbuilder_d_.iintentrecognizersetoptions.html\n\n[LuisRecognizer]: https://docs.botframework.com/en-us/node/builder/chat-reference/classes/_botbuilder_d_.luisrecognizer\n\n\n[LUISConcepts]: https://docs.botframework.com/en-us/node/builder/guides/understanding-natural-language/\n\n[DisambiguationSample]: https://github.com/Microsoft/BotBuilder/tree/master/Node/examples/feature-onDisambiguateRoute\n\n[IDisambiguateRouteHandler]: https://docs.botframework.com/en-us/node/builder/chat-reference/interfaces/_botbuilder_d_.idisambiguateroutehandler.html\n\n[RegExpRecognizer]: https://docs.botframework.com/en-us/node/builder/chat-reference/classes/_botbuilder_d_.regexprecognizer.html\n\n[AlarmBot]: https://github.com/Microsoft/BotBuilder/blob/master/Node/examples/basics-naturalLanguage/app.js\n\n[LUISBotSample]: https://github.com/Microsoft/BotBuilder-Samples/tree/master/Node/intelligence-LUIS\n\n[UniversalBot]: https://docs.botframework.com/en-us/node/builder/chat-reference/classes/_botbuilder_d_.universalbot.html\n"
  },
  {
    "path": "docs-samples/README.md",
    "content": "# Documentation samples\nThese samples and code snippets are referenced in the [Bot Framework documentation](https://docs.microsoft.com/bot-framework)."
  },
  {
    "path": "docs-samples/V4/JS/contosocafebot-luis-dialogs/.gitignore",
    "content": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Runtime data\npids\n*.pid\n*.seed\n*.pid.lock\n\n# Directory for instrumented libs generated by jscoverage/JSCover\nlib-cov\n\n# Coverage directory used by tools like istanbul\ncoverage\n\n# nyc test coverage\n.nyc_output\n\n# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)\n.grunt\n\n# Bower dependency directory (https://bower.io/)\nbower_components\n\n# node-waf configuration\n.lock-wscript\n\n# Compiled binary addons (https://nodejs.org/api/addons.html)\nbuild/Release\n\n# Dependency directories\nnode_modules/\njspm_packages/\n\n# TypeScript v1 declaration files\ntypings/\n\n# Optional npm cache directory\n.npm\n\n# Optional eslint cache\n.eslintcache\n\n# Optional REPL history\n.node_repl_history\n\n# Output of 'npm pack'\n*.tgz\n\n# Yarn Integrity file\n.yarn-integrity\n\n# dotenv environment variables file\n.env\n\n# next.js build output\n.next"
  },
  {
    "path": "docs-samples/V4/JS/contosocafebot-luis-dialogs/.vscode/launch.json",
    "content": "{\n    // Use IntelliSense to learn about possible attributes.\n    // Hover to view descriptions of existing attributes.\n    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"type\": \"node\",\n            \"request\": \"launch\",\n            \"name\": \"Launch Program\",\n            \"program\": \"${workspaceFolder}\\\\lib\\\\luisbot.js\",\n            \"outFiles\": [\n                \"${workspaceFolder}/**/*.js\"\n            ],\n            \"envFile\": \"${workspaceFolder}\\\\src\\\\.env\"\n        }\n    ]\n}"
  },
  {
    "path": "docs-samples/V4/JS/contosocafebot-luis-dialogs/cafeLUISModel.json",
    "content": "{\n  \"intents\": [\n    {\n      \"name\": \"Book Table\"\n    },\n    {\n      \"name\": \"Greeting\"\n    },\n    {\n      \"name\": \"None\"\n    },\n    {\n      \"name\": \"Who are you intent\"\n    }\n  ],\n  \"entities\": [\n    {\n      \"name\": \"partySize\",\n      \"roles\": []\n    }\n  ],\n  \"composites\": [],\n  \"closedLists\": [\n    {\n      \"name\": \"cafeLocation\",\n      \"subLists\": [\n        {\n          \"canonicalForm\": \"seattle\",\n          \"list\": [\n            \"seattle\",\n            \"seatac\",\n            \"SEA\",\n            \"seattle tacoma\",\n            \"space needle\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"redmond\",\n          \"list\": [\n            \"microsoft\",\n            \"east side\",\n            \"redmond\",\n            \"bellevue\"\n          ]\n        },\n        {\n          \"canonicalForm\": \"portland\",\n          \"list\": [\n            \"portland\"\n          ]\n        }\n      ],\n      \"roles\": []\n    }\n  ],\n  \"regex_entities\": [],\n  \"model_features\": [],\n  \"regex_features\": [],\n  \"utterances\": [\n    {\n      \"text\": \"book a table\",\n      \"intent\": \"Book Table\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you get me a table\",\n      \"intent\": \"Book Table\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"book a table for 2 in seattle\",\n      \"intent\": \"Book Table\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"can you get me a table for tomorrow?\",\n      \"intent\": \"Book Table\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"please get me a table for 3\",\n      \"intent\": \"Book Table\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 26,\n          \"endPos\": 26\n        }\n      ]\n    },\n    {\n      \"text\": \"book a table for 2 in seattle for 3pm\",\n      \"intent\": \"Book Table\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 17,\n          \"endPos\": 17\n        }\n      ]\n    },\n    {\n      \"text\": \"reserve a table at 5pm\",\n      \"intent\": \"Book Table\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"table for 5 guests\",\n      \"intent\": \"Book Table\",\n      \"entities\": [\n        {\n          \"entity\": \"partySize\",\n          \"startPos\": 10,\n          \"endPos\": 10\n        }\n      ]\n    },\n    {\n      \"text\": \"Hello\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hi\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Hello bot\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hiya\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"hi bot\",\n      \"intent\": \"Greeting\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Who is your ceo?\",\n      \"intent\": \"None\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"Who are you?\",\n      \"intent\": \"Who are you intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"What is your name?\",\n      \"intent\": \"Who are you intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"how should I address you?\",\n      \"intent\": \"Who are you intent\",\n      \"entities\": []\n    },\n    {\n      \"text\": \"What's your name?\",\n      \"intent\": \"Who are you intent\",\n      \"entities\": []\n    }\n  ],\n  \"patterns\": [],\n  \"patternAnyEntities\": [],\n  \"prebuiltEntities\": [\n    {\n      \"name\": \"datetimeV2\",\n      \"roles\": []\n    },\n    {\n      \"name\": \"number\",\n      \"roles\": []\n    }\n  ],\n  \"luis_schema_version\": \"3.0.0\",\n  \"versionId\": \"0.1\",\n  \"name\": \"cafeLUISModel\",\n  \"desc\": \"\",\n  \"culture\": \"en-us\"\n}"
  },
  {
    "path": "docs-samples/V4/JS/contosocafebot-luis-dialogs/lib/CafeLUISModel.d.ts",
    "content": "/**\n* <auto-generated>\n* Code generated by LUISGen Assets\\LU\\models\\LUIS\\cafeLUISModel.json -ts CafeLUISModel -o Assets\\LU\\models\\LUIS\n* Tool github: https://github.com/microsoft/botbuilder-tools\n* Changes may cause incorrect behavior and will be lost if the code is\n* regenerated.\n* </auto-generated>\n*/\nimport { DateTimeSpec, IntentData, InstanceData } from 'botbuilder-ai';\nexport interface _Intents {\n    Book_Table: IntentData;\n    Greeting: IntentData;\n    None: IntentData;\n    Who_are_you_intent: IntentData;\n}\nexport interface _Instance {\n    partySize?: InstanceData[];\n    datetime?: InstanceData[];\n    number?: InstanceData[];\n    cafeLocation?: InstanceData[];\n}\nexport interface _Entities {\n    partySize?: string[];\n    datetime?: DateTimeSpec[];\n    number?: number[];\n    cafeLocation?: string[][];\n    $instance: _Instance;\n}\nexport interface CafeLUISModel {\n    text: string;\n    alteredText?: string;\n    intents: _Intents;\n    entities: _Entities;\n    [propName: string]: any;\n}\n"
  },
  {
    "path": "docs-samples/V4/JS/contosocafebot-luis-dialogs/lib/CafeLUISModel.js",
    "content": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n;\n//# sourceMappingURL=CafeLUISModel.js.map"
  },
  {
    "path": "docs-samples/V4/JS/contosocafebot-luis-dialogs/lib/luisbot.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "docs-samples/V4/JS/contosocafebot-luis-dialogs/lib/luisbot.js",
    "content": "\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst botbuilder_1 = require(\"botbuilder\");\nconst botbuilder_dialogs_1 = require(\"botbuilder-dialogs\");\nconst botbuilder_ai_1 = require(\"botbuilder-ai\");\nconst restify = require(\"restify\");\nconst Resolver = require('@microsoft/recognizers-text-data-types-timex-expression').default.resolver;\nconst Creator = require('@microsoft/recognizers-text-data-types-timex-expression').default.creator;\nconst TimexProperty = require('@microsoft/recognizers-text-data-types-timex-expression').default.TimexProperty;\n// Replace this appId with the ID of the app you create from cafeLUISModel.json\nconst appId = process.env.LUIS_APP_ID;\n// Replace this with your authoring key\nconst subscriptionKey = process.env.LUIS_SUBSCRIPTION_KEY;\nconsole.log(`process.env.LUIS_APP_ID=${process.env.LUIS_APP_ID}, process.env.LUIS_SUBSCRIPTION_KEY=${process.env.LUIS_SUBSCRIPTION_KEY}`);\n// Default is westus\nconst serviceEndpoint = 'https://westus.api.cognitive.microsoft.com';\nconst luisRec = new botbuilder_ai_1.LuisRecognizer({\n    appId: appId,\n    subscriptionKey: subscriptionKey,\n    serviceEndpoint: serviceEndpoint\n});\n// Enum for convenience\n// intent names match CafeLUISModel.ts\nvar Intents;\n(function (Intents) {\n    Intents[\"Book_Table\"] = \"Book_Table\";\n    Intents[\"Greeting\"] = \"Greeting\";\n    Intents[\"None\"] = \"None\";\n    Intents[\"Who_are_you_intent\"] = \"Who_are_you_intent\";\n})(Intents || (Intents = {}));\n;\n// Create server\nlet server = restify.createServer();\nserver.listen(process.env.port || process.env.PORT || 3978, function () {\n    console.log(`${server.name} listening to ${server.url}`);\n});\n// Create adapter\nconst adapter = new botbuilder_1.BotFrameworkAdapter({\n    appId: process.env.MICROSOFT_APP_ID,\n    appPassword: process.env.MICROSOFT_APP_PASSWORD\n});\nconst conversationState = new botbuilder_1.ConversationState(new botbuilder_1.MemoryStorage());\nadapter.use(conversationState);\n// Create empty dialog set\nconst dialogs = new botbuilder_dialogs_1.DialogSet();\n// Listen for incoming requests \nserver.post('/api/messages', (req, res) => {\n    // Route received request to adapter for processing\n    adapter.processActivity(req, res, (context) => __awaiter(this, void 0, void 0, function* () {\n        const isMessage = context.activity.type === 'message';\n        // Create dialog context \n        const state = conversationState.get(context);\n        const dc = dialogs.createContext(context, state);\n        if (!isMessage) {\n            yield context.sendActivity(`[${context.activity.type} event detected]`);\n        }\n        // Check to see if anyone replied. \n        if (!context.responded) {\n            yield dc.continue();\n            // if the dialog didn't send a response\n            if (!context.responded && isMessage) {\n                yield luisRec.recognize(context).then((res) => __awaiter(this, void 0, void 0, function* () {\n                    var typedresult = res;\n                    let topIntent = botbuilder_ai_1.LuisRecognizer.topIntent(res);\n                    switch (topIntent) {\n                        case Intents.Book_Table: {\n                            yield dc.begin('reserveTable', typedresult);\n                            break;\n                        }\n                        case Intents.Greeting: {\n                            yield context.sendActivity(\"Hello!\");\n                            break;\n                        }\n                        case Intents.Who_are_you_intent: {\n                            yield context.sendActivity(\"I'm the Contoso Cafe bot.\");\n                            break;\n                        }\n                        default: {\n                            yield dc.begin('default', topIntent);\n                            break;\n                        }\n                    }\n                }), (err) => {\n                    // there was some error\n                    console.log(err);\n                });\n            }\n        }\n    }));\n});\n// Add dialogs\ndialogs.add('default', [\n    function (dc, args) {\n        return __awaiter(this, void 0, void 0, function* () {\n            const state = conversationState.get(dc.context);\n            yield dc.context.sendActivity(`Hi! I'm the Contoso Cafe reservation bot. Say something like make a reservation.\"`);\n            yield dc.end();\n        });\n    }\n]);\ndialogs.add('textPrompt', new botbuilder_dialogs_1.TextPrompt());\ndialogs.add('dateTimePrompt', new botbuilder_dialogs_1.DatetimePrompt());\ndialogs.add('reserveTable', [\n    function (dc, args, next) {\n        return __awaiter(this, void 0, void 0, function* () {\n            var typedresult = args;\n            // Call a helper function to save the entities in the LUIS result\n            // to dialog state\n            yield SaveEntities(dc, typedresult);\n            yield dc.context.sendActivity(\"Welcome to the reservation service.\");\n            if (dc.activeDialog.state.dateTime) {\n                yield next();\n            }\n            else {\n                yield dc.prompt('dateTimePrompt', \"Please provide a reservation date and time. We're open 4PM-8PM.\");\n            }\n        });\n    },\n    function (dc, result, next) {\n        return __awaiter(this, void 0, void 0, function* () {\n            if (!dc.activeDialog.state.dateTime) {\n                // Save the dateTimePrompt result to dialog state\n                dc.activeDialog.state.dateTime = result[0].value;\n            }\n            // If we don't have party size, ask for it next\n            if (!dc.activeDialog.state.partySize) {\n                yield dc.prompt('textPrompt', \"How many people are in your party?\");\n            }\n            else {\n                yield next();\n            }\n        });\n    },\n    function (dc, result, next) {\n        return __awaiter(this, void 0, void 0, function* () {\n            if (!dc.activeDialog.state.partySize) {\n                dc.activeDialog.state.partySize = result;\n            }\n            // Ask for the reservation name next\n            yield dc.prompt('textPrompt', \"Whose name will this be under?\");\n        });\n    },\n    function (dc, result) {\n        return __awaiter(this, void 0, void 0, function* () {\n            dc.activeDialog.state.Name = result;\n            // Save data to conversation state\n            var state = conversationState.get(dc.context);\n            // Copy the dialog state to the conversation state\n            state = dc.activeDialog.state;\n            // TODO: Add in <br/>Location: ${state.cafeLocation}\n            var msg = `Reservation confirmed. Reservation details:             \n            <br/>Date/Time: ${state.dateTime} \n            <br/>Party size: ${state.partySize} \n            <br/>Reservation name: ${state.Name}`;\n            yield dc.context.sendActivity(msg);\n            yield dc.end();\n        });\n    }\n]);\n// Helper function that saves any entities found in the LUIS result\n// to the dialog state\nfunction SaveEntities(dc, typedresult) {\n    return __awaiter(this, void 0, void 0, function* () {\n        // Resolve entities returned from LUIS, and save these to state\n        if (typedresult.entities) {\n            let datetime = typedresult.entities.datetime;\n            if (datetime) {\n                console.log(`datetime entity found of type ${datetime[0].type}.`);\n                // Use the first date or time found in the utterance            \n                if (datetime[0].timex) {\n                    var timexValues = datetime[0].timex;\n                    // timexValues is the array of all resolutions of datetime[0]\n                    // a datetime entity detected by LUIS is resolved to timex format.\n                    // More information on timex can be found here: \n                    // http://www.timeml.org/publications/timeMLdocs/timeml_1.2.1.html#timex3                                \n                    // More information on the library which does the recognition can be found here: \n                    // https://github.com/Microsoft/Recognizers-Text\n                    if (datetime[0].type === \"datetime\") {\n                        var resolution = Resolver.evaluate(\n                        // array of timex values to evaluate. There may be more than one: \"today at 6\" can be 6AM or 6PM.\n                        timexValues, \n                        // Creator.evening constrains this to times between 4pm and 8pm\n                        [Creator.evening]);\n                        if (resolution[0]) {\n                            // toNaturalLanguage takes the current date into account to create a friendly string\n                            dc.activeDialog.state.dateTime = resolution[0].toNaturalLanguage(new Date());\n                            // You can also use resolution.toString() to format the date/time.\n                        }\n                        else {\n                            // time didn't satisfy constraint.\n                            dc.activeDialog.state.dateTime = null;\n                        }\n                    }\n                    else {\n                        console.log(`Type ${datetime[0].type} is not yet supported. Provide both the date and the time.`);\n                    }\n                }\n            }\n            let partysize = typedresult.entities.partySize;\n            if (partysize) {\n                console.log(`partysize entity detected: ${partysize}`);\n                // use first partySize entity that was found in utterance\n                dc.activeDialog.state.partySize = partysize[0];\n            }\n            let cafelocation = typedresult.entities.cafeLocation;\n            if (cafelocation) {\n                console.log(`location entity detected: ${cafelocation}`);\n                // use first cafeLocation entity that was found in utterance\n                dc.activeDialog.state.cafeLocation = cafelocation[0][0];\n            }\n        }\n    });\n}\n//# sourceMappingURL=luisbot.js.map"
  },
  {
    "path": "docs-samples/V4/JS/contosocafebot-luis-dialogs/package.json",
    "content": "{\n  \"name\": \"dialogs-luisbot-ts\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Bot Builder example showing a simple bot that uses dialogs to echo anything you say.\",\n  \"main\": \"./lib/luisbot.js\",\n  \"scripts\": {\n    \"build-sample\": \"tsc\",\n    \"start\": \"tsc && node ./lib/luisbot.js\"\n  },\n  \"author\": \"\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@types/node\": \"^9.3.0\",\n    \"@types/restify\": \"^5.0.8\",\n    \"@microsoft/recognizers-text-data-types-timex-expression\": \"^1.0.1\",\n    \"botbuilder\": \"^4.0.0-preview1.2\",\n    \"botbuilder-ai\": \"^4.0.0-preview1.2\",\n    \"botbuilder-core\": \"^4.0.0-preview1.2\",\n    \"botbuilder-dialogs\": \"^4.0.0-preview1.2\",\n    \"node\": \"^10.4.0\",\n    \"restify\": \"^6.4.0\"\n  }\n}\n"
  },
  {
    "path": "docs-samples/V4/JS/contosocafebot-luis-dialogs/readme.md",
    "content": "# contosocafebot-luis-dialogs \n\nThis sample bot is integrated with a LUIS app that recognizes intents and entities for making a restaurant reservation.\n\n## Intents\nIntents represent what the user wants to do. The bot can start a dialog or conversation flow based on the intent recognized by LUIS. This bot recognizes three intents.\n\n|Intent| Example |\n|-----|-----|\n|Book table | reserve table for 4 at 6:15pm 5/24/2018 <br> reserve a table|\n|Greeting| hi <br/> Hello|\n|Who_are_you| who are you |\n\n## Entities \n\nBesides recognizing intent, a LUIS can also extract entities, which are important words for fulfilling a user's request. For example, in the example of a restaurant reservation, the LUIS app might be able to extract the party size, reservation date or restaurant location from the user's message. \n\n|Entity type| Example |\n|-----|-----|\n|`PartySize` | reserve table for `4` at 6:15pm 5/24/2018 |\n|`datetime`| reserve table for 4 at `6:15pm 5/24/2018`|\n\n## Create the LUIS app\n\n1. Log in to https://www.luis.ai. \n2. In the **My apps** tab, click on the **Import new app** button and choose the JSON file **cafeLUISModel.json** for the app to import.\n3. [Train](https://docs.microsoft.com/en-us/azure/cognitive-services/LUIS/luis-how-to-train) the new app.\n4. [Publish](https://docs.microsoft.com/en-us/azure/cognitive-services/LUIS/publishapp) the new app.\n\n## Copy the LUIS Subscription Key to use in the bot's code\n\nCopy the App ID from **Settings**, and copy the [LUIS Authoring Key](https://docs.microsoft.com/en-us/azure/cognitive-services/LUIS/luis-concept-keys#authoring-key). Paste them into the bot code in luisbot.ts.\n\n```ts\n// Replace this appId with the ID of the app you create from cafeLUISModel.json\nconst appId = \"YOUR-LUIS-APP-ID\"\n// Replace this with your authoring key\nconst subscriptionKey = \"YOUR-LUIS-SUBSCRIPTION-KEY\"\n```\n\n## Use LUISGen to generate types for the LUIS results\nYou can use the [LUISGen tool](https://github.com/Microsoft/botbuilder-tools/tree/master/LUISGen) to generate types that make it easier to work with LUIS results in your bot's code. The tool takes a JSON file for an exported LUIS app as input.\n\nAt a Node.js command line, install `luisgen` to the global path.\n```\nnpm install -g luisgen\n```\n\nIn the root folder of this sample, this LUISGen command was used to generate **CafeLUISModel.ts**:\n\n```\nluisgen cafeLUISModel.json -ts CafeLUISModel\n```\n\n## Building the bot\nYou'll need the latest TypeScript compiler installed:\n\n```\nnpm install --global typescript\n```\n\nTo compile the sample, run `tsc` from the root directory.\n\nInstall dependencies before you run the bot, by running `npm install` in the root directory of the sample:\n\n```\nnpm install\n```\n\n## Using typed LUIS results\n\nYou can get a `CafeLUISModel` result from the LUIS recognizer in bot code like this:\n\n```typescript\n// call LUIS and get typed results\nawait luisRec.recognize(context).then(async (res : any) => \n{    \n    // get a typed result\n    var typedresult = res as CafeLUISModel;  \n\n}    \n```\n\n## Pass the LUIS result to a dialog\n\nExamine the code in **luisbot.ts**. In the `processActivity` handler, the bot passes the typed result to the `reserveTable` dialog.\n\n```typescript\n// Listen for incoming requests \nserver.post('/api/messages', (req, res) => {\n    // Route received request to adapter for processing\n    adapter.processActivity(req, res, async (context) => {\n        const isMessage = context.activity.type === 'message';\n\n        // Create dialog context \n        const state = conversationState.get(context);\n        const dc = dialogs.createContext(context, state);\n            \n        if (!isMessage) {\n            await context.sendActivity(`[${context.activity.type} event detected]`);\n        }\n\n        // Check to see if anyone replied. \n        if (!context.responded) {\n            await dc.continue();\n            // if the dialog didn't send a response\n            if (!context.responded && isMessage) {\n\n                \n                await luisRec.recognize(context).then(async (res : any) => \n                {    \n                    var typedresult = res as CafeLUISModel;                \n                    let topIntent = LuisRecognizer.topIntent(res);    \n                    switch (topIntent)\n                    {\n                        case Intents.Book_Table: {                        \n                            await dc.begin('reserveTable', typedresult);\n                            break;\n                        }\n                        \n                        case Intents.Greeting: {\n                            await context.sendActivity(\"Hi!\");\n                            break;\n                        }\n    \n                        case Intents.Who_are_you_intent: {\n                            await context.sendActivity(\"I'm the Contoso Cafe Bot.\");\n                            break;\n                        }\n                        default: {\n                            await dc.begin('default', topIntent);\n                            break;\n                        }\n                    }\n    \n                }, (err) => {\n                    // there was some error\n                    console.log(err);\n                }\n                );                                \n            }\n        }\n    });\n});\n```\n\n\n## Check for existing entities in a dialog\n\nIn **luisbot.ts**, the `reserveTable` dialog calls a `SaveEntities` helper function to check for entities detected by the LUIS app. If the entities are found, they're saved to dialog state. Each waterfall step in the dialog checks if an entity was saved to dialog state, and if not, prompts for it.\n\n```typescript\ndialogs.add('reserveTable', [\n    async function(dc, args, next){\n        var typedresult = args as CafeLUISModel;\n\n        // Call a helper function to save the entities in the LUIS result\n        // to dialog state\n        await SaveEntities(dc, typedresult);\n\n        await dc.context.sendActivity(\"Welcome to the reservation service.\");\n        \n        if (dc.activeDialog.state.dateTime) {\n            await next();     \n        }\n        else {\n            await dc.prompt('dateTimePrompt', \"Please provide a reservation date and time.\");\n        }\n    },\n    async function(dc, result, next){\n        if (!dc.activeDialog.state.dateTime) {\n            // Save the dateTimePrompt result to dialog state\n            dc.activeDialog.state.dateTime = result[0].value;\n        }\n\n        // If we don't have party size, ask for it next\n        if (!dc.activeDialog.state.partySize) {\n            await dc.prompt('textPrompt', \"How many people are in your party?\");\n        } else {\n            await next();\n        }\n    },\n    async function(dc, result, next){\n        if (!dc.activeDialog.state.partySize) {\n            dc.activeDialog.state.partySize = result;\n        }\n        // Ask for the reservation name next\n        await dc.prompt('textPrompt', \"Whose name will this be under?\");\n    },\n    async function(dc, result){\n        dc.activeDialog.state.Name = result;\n\n        // Save data to conversation state\n        var state = conversationState.get(dc.context);\n\n        // Copy the dialog state to the conversation state\n        state = dc.activeDialog.state;\n\n        // TODO: Add in <br/>Location: ${state.cafeLocation}\n        var msg = `Reservation confirmed. Reservation details:             \n            <br/>Date/Time: ${state.dateTime} \n            <br/>Party size: ${state.partySize} \n            <br/>Reservation name: ${state.Name}`;\n            \n        await dc.context.sendActivity(msg);\n        await dc.end();\n    }\n]);\n```\n\nThe `SaveEntities` helper function checks for `datetime` and `partysize` entities. The `datetime` entity is a [prebuilt entity](https://docs.microsoft.com/en-us/azure/cognitive-services/luis/luis-reference-prebuilt-entities#builtindatetimev2).\n\n```typescript\n// Helper function that saves any entities found in the LUIS result\n// to the dialog state\nasync function SaveEntities( dc: DialogContext<TurnContext>, typedresult) {\n    // Resolve entities returned from LUIS, and save these to state\n    if (typedresult.entities)\n    {\n        let datetime = typedresult.entities.datetime;\n        if (datetime) {\n            // Use the first date or time found in the utterance\n            var timexValue;\n            if (datetime[0].timex) {\n                timexValue = datetime[0].timex[0];\n                // More information on timex can be found here: \n                // http://www.timeml.org/publications/timeMLdocs/timeml_1.2.1.html#timex3                                \n                // More information on the library which does the recognition can be found here: \n                // https://github.com/Microsoft/Recognizers-Text\n\n                if (datetime[0].type === \"datetime\") {\n                    // in this sample, a datetime detected by LUIS is saved in timex format.\n                    dc.activeDialog.state.dateTime = timexValue;\n                    // If you want to additionally parse timex, \n                    // use @microsoft/recognizers-text-data-types-timex-expression \n                } \n                else  {\n                    console.log(`Type ${datetime[0].type} is not yet supported. Provide both the date and the time.`);\n                }\n            }                                                \n        }\n        let partysize = typedresult.entities.partySize;\n        if (partysize) {\n            console.log(`partysize entity defined.${partysize}`);\n            // use first partySize entity that was found in utterance\n            dc.activeDialog.state.partySize = partysize[0];\n        }\n        let cafelocation = typedresult.entities.cafeLocation;\n\n        if (cafelocation) {\n            console.log(`location entity defined.${cafelocation}`);\n            // use first cafeLocation entity that was found in utterance\n            dc.activeDialog.state.cafeLocation = cafelocation[0][0];\n        }\n    } \n}\n```\n\n### Entity types\nThe code in `SaveEntities` checked `CafeLUISModel` type's `entities` property, which was defined in **CafeLUISModel.ts**.\n\n```typescript\nexport interface CafeLUISModel {\n    text: string;\n    alteredText?: string;\n    intents: _Intents;\n    entities: _Entities;\n    [propName: string]: any;\n}\n```\n\nThe `entities` property includes both simple entities, built-in entities, and lists.\n\n```js\nexport interface _Entities {\n    // Simple entities\n    partySize?: string[];\n\n    // Built-in entities\n    datetime?: DateTimeSpec[];\n    number?: number[];\n\n    // Lists\n    cafeLocation?: string[][];\n    $instance : _Instance;\n}\n```\n\nThe `datetime` type is an array of `DateTimeSpec`:\n\n```js\n// datetime is an array of type \nDateTimeSpec {\n    /**\n        * Type of expression.\n        *\n        * @remarks\n        * Example types include:\n        *\n        * - **time**: simple time expression like \"3pm\".\n        * - **date**: simple date like \"july 3rd\".\n        * - **datetime**: combination of date and time like \"march 23 2pm\".\n        * - **timerange**: a range of time like \"2pm to 4pm\".\n        * - **daterange**: a range of dates like \"march 23rd to 24th\".\n        * - **datetimerange**: a range of dates and times like \"july 3rd 2pm to 5th 4pm\".\n        * - **set**: a recurrence like \"every monday\".\n        */\n    type: string;\n    /** Timex expressions. */\n    timex: string[];\n}  \n```\n\n## Run the sample\n\n1. If you don't have the TypeScript compiler installed, install it using this command:\n\n`npm install --global typescript`\n\n2. Install dependencies before you run the bot, by running `npm install` in the root directory of the sample:\n\n```\nnpm install\n```\n\n3. From the root directory, build the sample using `tsc`. This will generate `luisbot.js`.\n\n4. Run `luisbot.js` in the `lib` directory.\n\n5. Use the [Bot Framework Emulator](https://docs.microsoft.com/en-us/azure/bot-service/bot-service-debug-emulator) to run the sample.\n\n6. In the emulator, say `reserve a table` to start the reservation dialog.\n\n![run the bot](graphics/run-bot.png)\n"
  },
  {
    "path": "docs-samples/V4/JS/contosocafebot-luis-dialogs/src/.vscode/launch.json",
    "content": "{\n    // Use IntelliSense to learn about possible attributes.\n    // Hover to view descriptions of existing attributes.\n    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"type\": \"node\",\n            \"request\": \"launch\",\n            \"name\": \"Launch Program\",\n            \"program\": \"${file}\",\n            \"outFiles\": [\n                \"${workspaceFolder}/**/*.js\"\n            ],\n            \"envFile\": \"../.env\"\n        }\n    ]\n}"
  },
  {
    "path": "docs-samples/V4/JS/contosocafebot-luis-dialogs/src/CafeLUISModel.ts",
    "content": "/**\n* <auto-generated>\n* Code generated by LUISGen Assets\\LU\\models\\LUIS\\cafeLUISModel.json -ts CafeLUISModel -o Assets\\LU\\models\\LUIS\n* Tool github: https://github.com/microsoft/botbuilder-tools\n* Changes may cause incorrect behavior and will be lost if the code is\n* regenerated.\n* </auto-generated>\n*/ \nimport {DateTimeSpec, IntentData, InstanceData, NumberWithUnits} from 'botbuilder-ai';\n\nexport interface _Intents { \n    Book_Table: IntentData;\n    Greeting: IntentData;\n    None: IntentData;\n    Who_are_you_intent: IntentData;\n};\n\nexport interface _Instance {\n    partySize?: InstanceData[];\n    datetime?: InstanceData[];\n    number?: InstanceData[];\n    cafeLocation?: InstanceData[];\n}\n\nexport interface _Entities {\n    // Simple entities\n    partySize?: string[];\n\n    // Built-in entities\n    datetime?: DateTimeSpec[];\n    number?: number[];\n\n    // Lists\n    cafeLocation?: string[][];\n    $instance : _Instance;\n}\n\nexport interface CafeLUISModel {\n    text: string;\n    alteredText?: string;\n    intents: _Intents;\n    entities: _Entities;\n    [propName: string]: any;\n}\n"
  },
  {
    "path": "docs-samples/V4/JS/contosocafebot-luis-dialogs/src/luisbot.ts",
    "content": "import { BotFrameworkAdapter, MemoryStorage, ConversationState, TurnContext, RecognizerResult } from 'botbuilder';\nimport { DialogSet, TextPrompt, DatetimePrompt, DialogContext } from 'botbuilder-dialogs';\nimport { LuisRecognizer, InstanceData, IntentData, DateTimeSpec } from 'botbuilder-ai';\nimport { CafeLUISModel, _Intents, _Entities, _Instance } from './CafeLUISModel';\nimport * as restify from 'restify';\n\nconst Resolver = require('@microsoft/recognizers-text-data-types-timex-expression').default.resolver;\nconst Creator = require('@microsoft/recognizers-text-data-types-timex-expression').default.creator;\nconst TimexProperty = require('@microsoft/recognizers-text-data-types-timex-expression').default.TimexProperty;\n\n// Replace this appId with the ID of the app you create from cafeLUISModel.json\nconst appId = process.env.LUIS_APP_ID; \n// Replace this with your authoring key\nconst subscriptionKey = process.env.LUIS_SUBSCRIPTION_KEY;\nconsole.log(`process.env.LUIS_APP_ID=${process.env.LUIS_APP_ID}, process.env.LUIS_SUBSCRIPTION_KEY=${process.env.LUIS_SUBSCRIPTION_KEY}`);\n// Default is westus\nconst serviceEndpoint = 'https://westus.api.cognitive.microsoft.com';\n\nconst luisRec = new LuisRecognizer({\n    appId: appId,\n    subscriptionKey: subscriptionKey,\n    serviceEndpoint: serviceEndpoint\n});\n\n// Enum for convenience\n// intent names match CafeLUISModel.ts\nenum Intents { \n    Book_Table = \"Book_Table\",\n    Greeting = \"Greeting\",\n    None = \"None\",\n    Who_are_you_intent = \"Who_are_you_intent\"\n};\n\n// Create server\nlet server = restify.createServer();\nserver.listen(process.env.port || process.env.PORT || 3978, function () {\n    console.log(`${server.name} listening to ${server.url}`);\n});\n\n// Create adapter\nconst adapter = new BotFrameworkAdapter( { \n    appId: process.env.MICROSOFT_APP_ID, \n    appPassword: process.env.MICROSOFT_APP_PASSWORD \n});\n\n// Add conversation state middleware\ninterface CafeBotConvState {\n    dialogStack: any[];\n    cafeLocation: string;\n    dateTime: string;\n    partySize: string;     \n    Name: string;  \n}\nconst conversationState = new ConversationState<CafeBotConvState>(new MemoryStorage());\nadapter.use(conversationState);\n\n// Create empty dialog set\nconst dialogs = new DialogSet();\n\n// Listen for incoming requests \nserver.post('/api/messages', (req, res) => {\n    // Route received request to adapter for processing\n    adapter.processActivity(req, res, async (context) => {\n        const isMessage = context.activity.type === 'message';\n\n        // Create dialog context \n        const state = conversationState.get(context);\n        const dc = dialogs.createContext(context, state);\n            \n        if (!isMessage) {\n            await context.sendActivity(`[${context.activity.type} event detected]`);\n        }\n\n        // Check to see if anyone replied. \n        if (!context.responded) {\n            await dc.continue();\n            // if the dialog didn't send a response\n            if (!context.responded && isMessage) {\n\n                \n                await luisRec.recognize(context).then(async (res : any) => \n                {    \n                    var typedresult = res as CafeLUISModel;                \n                    let topIntent = LuisRecognizer.topIntent(res);    \n                    switch (topIntent)\n                    {\n                        case Intents.Book_Table: {                      \n                            await dc.begin('reserveTable', typedresult);\n                            break;\n                        }\n                        \n                        case Intents.Greeting: {\n                            await context.sendActivity(\"Hello!\");\n                            break;\n                        }\n    \n                        case Intents.Who_are_you_intent: {\n                            await context.sendActivity(\"I'm the Contoso Cafe bot.\");\n                            break;\n                        }\n                        default: {\n                            await dc.begin('default', topIntent);\n                            break;\n                        }\n                    }\n    \n                }, (err) => {\n                    // there was some error\n                    console.log(err);\n                }\n                );                                \n            }\n        }\n    });\n});\n\n\n// Add dialogs\ndialogs.add('default', [\n    async function (dc, args) {\n        const state = conversationState.get(dc.context);\n        await dc.context.sendActivity(`Hi! I'm the Contoso Cafe reservation bot. Say something like make a reservation.\"`);\n        await dc.end();\n    }\n]);\n\n\ndialogs.add('textPrompt', new TextPrompt());\ndialogs.add('dateTimePrompt', new DatetimePrompt());\ndialogs.add('reserveTable', [\n    async function(dc, args, next){\n        var typedresult = args as CafeLUISModel;\n\n        // Call a helper function to save the entities in the LUIS result\n        // to dialog state\n        await SaveEntities(dc, typedresult);\n\n        await dc.context.sendActivity(\"Welcome to the reservation service.\");\n        \n        if (dc.activeDialog.state.dateTime) {\n            await next();     \n        }\n        else {\n            await dc.prompt('dateTimePrompt', \"Please provide a reservation date and time. We're open 4PM-8PM.\");\n        }\n    },\n    async function(dc, result, next){\n        if (!dc.activeDialog.state.dateTime) {\n            // Save the dateTimePrompt result to dialog state\n            dc.activeDialog.state.dateTime = result[0].value;\n        }\n\n        // If we don't have party size, ask for it next\n        if (!dc.activeDialog.state.partySize) {\n            await dc.prompt('textPrompt', \"How many people are in your party?\");\n        } else {\n            await next();\n        }\n    },\n    async function(dc, result, next){\n        if (!dc.activeDialog.state.partySize) {\n            dc.activeDialog.state.partySize = result;\n        }\n        // Ask for the reservation name next\n        await dc.prompt('textPrompt', \"Whose name will this be under?\");\n    },\n    async function(dc, result){\n        dc.activeDialog.state.Name = result;\n\n        // Save data to conversation state\n        var state = conversationState.get(dc.context);\n\n        // Copy the dialog state to the conversation state\n        state = dc.activeDialog.state;\n\n        // TODO: Add in <br/>Location: ${state.cafeLocation}\n        var msg = `Reservation confirmed. Reservation details:             \n            <br/>Date/Time: ${state.dateTime} \n            <br/>Party size: ${state.partySize} \n            <br/>Reservation name: ${state.Name}`;\n            \n        await dc.context.sendActivity(msg);\n        await dc.end();\n    }\n]);\n\n// Helper function that saves any entities found in the LUIS result\n// to the dialog state\nasync function SaveEntities( dc: DialogContext<TurnContext>, typedresult) {\n    // Resolve entities returned from LUIS, and save these to state\n    if (typedresult.entities)\n    {\n\n        let datetime = typedresult.entities.datetime;\n\n        if (datetime) {\n            console.log(`datetime entity found of type ${datetime[0].type}.`);\n\n            // Use the first date or time found in the utterance            \n            if (datetime[0].timex) {\n                var timexValues = datetime[0].timex\n                // timexValues is the array of all resolutions of datetime[0]\n                // a datetime entity detected by LUIS is resolved to timex format.\n                // More information on timex can be found here: \n                // http://www.timeml.org/publications/timeMLdocs/timeml_1.2.1.html#timex3                                \n                // More information on the library which does the recognition can be found here: \n                // https://github.com/Microsoft/Recognizers-Text\n\n                if (datetime[0].type === \"datetime\") {\n                    var resolution = Resolver.evaluate(\n                        // array of timex values to evaluate. There may be more than one: \"today at 6\" can be 6AM or 6PM.\n                        timexValues,                        \n                        // Creator.evening constrains this to times between 4pm and 8pm\n                        [Creator.evening]);\n                    if (resolution[0]) {\n                        // toNaturalLanguage takes the current date into account to create a friendly string\n                        dc.activeDialog.state.dateTime = resolution[0].toNaturalLanguage(new Date());\n                        // You can also use resolution.toString() to format the date/time.\n                    } else {\n                        // time didn't satisfy constraint.\n                        dc.activeDialog.state.dateTime = null;\n                    }\n                } \n                else  {\n                    console.log(`Type ${datetime[0].type} is not yet supported. Provide both the date and the time.`);\n                }\n            }                                                \n\n\n        }\n        let partysize = typedresult.entities.partySize;\n        if (partysize) {\n            console.log(`partysize entity detected: ${partysize}`);\n            // use first partySize entity that was found in utterance\n            dc.activeDialog.state.partySize = partysize[0];\n        }\n        let cafelocation = typedresult.entities.cafeLocation;\n\n        if (cafelocation) {\n            console.log(`location entity detected: ${cafelocation}`);\n            // use first cafeLocation entity that was found in utterance\n            dc.activeDialog.state.cafeLocation = cafelocation[0][0];\n        }\n    } \n}"
  },
  {
    "path": "docs-samples/V4/JS/contosocafebot-luis-dialogs/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    /* Basic Options */                       \n    \"target\": \"ES6\",                          /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', or 'ESNEXT'. */\n    \"module\": \"commonjs\",                     /* Specify module code generation: 'commonjs', 'amd', 'system', 'umd' or 'es2015'. */\n    // \"lib\": [],                             /* Specify library files to be included in the compilation:  */\n    // \"allowJs\": true,                       /* Allow javascript files to be compiled. */\n    // \"checkJs\": true,                       /* Report errors in .js files. */\n    // \"jsx\": \"preserve\",                     /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */\n    \"declaration\": true,                   /* Generates corresponding '.d.ts' file. */\n    \"sourceMap\": true,                     /* Generates corresponding '.map' file. */\n    // \"outFile\": \"./\",                       /* Concatenate and emit output to single file. */\n    \"outDir\": \"./lib\",                        /* Redirect output structure to the directory. */\n    \"rootDir\": \"./src\",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */\n    // \"removeComments\": true,                /* Do not emit comments to output. */\n    // \"noEmit\": true,                        /* Do not emit outputs. */\n    // \"importHelpers\": true,                 /* Import emit helpers from 'tslib'. */\n    // \"downlevelIteration\": true,            /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */\n    // \"isolatedModules\": true,               /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */\n                                              \n    /* Strict Type-Checking Options */        \n    \"strict\": false,                            /* Enable all strict type-checking options. */\n    // \"noImplicitAny\": true,                 /* Raise error on expressions and declarations with an implied 'any' type. */\n    // \"strictNullChecks\": true,              /* Enable strict null checks. */\n    // \"noImplicitThis\": true,                /* Raise error on 'this' expressions with an implied 'any' type. */\n    // \"alwaysStrict\": true,                  /* Parse in strict mode and emit \"use strict\" for each source file. */\n                                              \n    /* Additional Checks */                   \n    // \"noUnusedLocals\": true,                /* Report errors on unused locals. */\n    // \"noUnusedParameters\": true,            /* Report errors on unused parameters. */\n    // \"noImplicitReturns\": true,             /* Report error when not all code paths in function return a value. */\n    // \"noFallthroughCasesInSwitch\": true,    /* Report errors for fallthrough cases in switch statement. */\n                                              \n    /* Module Resolution Options */           \n    \"moduleResolution\": \"node\",            /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */\n    \"baseUrl\": \"./node_modules\",                       /* Base directory to resolve non-absolute module names. */\n    // \"baseUrl\": \"./\",                       /* Base directory to resolve non-absolute module names. */\n    // \"paths\": {},                           /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */\n    // \"rootDirs\": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */\n    // \"typeRoots\": [],                       /* List of folders to include type definitions from. */\n    // \"types\": [],                           /* Type declaration files to be included in compilation. */\n    // \"allowSyntheticDefaultImports\": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */\n                                              \n    /* Source Map Options */                  \n    // \"sourceRoot\": \"./\",                    /* Specify the location where debugger should locate TypeScript files instead of source locations. */\n    // \"mapRoot\": \"./\",                       /* Specify the location where debugger should locate map files instead of generated locations. */\n    // \"inlineSourceMap\": true,               /* Emit a single file with source maps instead of having a separate file. */\n    // \"inlineSources\": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */\n                                              \n    /* Experimental Options */                \n    // \"experimentalDecorators\": true,        /* Enables experimental support for ES7 decorators. */\n    // \"emitDecoratorMetadata\": true,         /* Enables experimental support for emitting type metadata for decorators. */\n  }\n}\n"
  },
  {
    "path": "docs-samples/v3Node/startNewDialog/botadapter.js",
    "content": "'user strict';\n\nvar builder = require('botbuilder');\n\nfunction _clone(obj) {\n    var cpy = {};\n    if (obj) {\n        for (var key in obj) {\n            if (obj.hasOwnProperty(key)) {\n                cpy[key] = obj[key];\n            }\n        }\n    }\n    return cpy;\n}\n\nfunction loadSession(address, opts, cb) {\n  \n  var _consts = {\n    Data : {\n      SessionState: 'BotBuilder.Data.SessionState'\n    }\n  };\n\n  var _this = this;\n  this.lookupUser(address, (user) => {\n    _this.ensureConversation(address, function (address) {\n\n      var storageCtx = {\n        userId: user.id,\n        conversationId: address.conversation ? address.conversation.id : null,\n        address: address,\n        persistUserData: _this.settings.persistUserData,\n        persistConversationData: _this.settings.persistConversationData\n      };\n\n      var loadedData;\n      _this.getStorageData(storageCtx, function (data) {\n        if (!_this.localizer) {\n          var defaultLocale = _this.settings.localizerSettings ? _this.settings.localizerSettings.defaultLocale : null;\n          _this.localizer = new DefaultLocalizer_1.DefaultLocalizer(_this.lib, defaultLocale);\n        }\n        var session = new builder.Session({\n          localizer: _this.localizer,\n          autoBatchDelay: _this.settings.autoBatchDelay,\n          library: _this.lib,\n          actions: _this.actions,\n          middleware: _this.mwSession,\n          dialogId: opts.dialogId,\n          dialogArgs: opts.dialogArgs,\n          dialogErrorMessage: _this.settings.dialogErrorMessage,\n          onSave: function (cb) {\n            var finish = _this.errorLogger(cb);\n            loadedData.userData = _clone(session.userData);\n            loadedData.conversationData = _clone(session.conversationData);\n            loadedData.privateConversationData = _clone(session.privateConversationData);\n            loadedData.privateConversationData[_consts.Data.SessionState] = session.sessionState;\n            _this.saveStorageData(storageCtx, loadedData, finish, finish);\n          },\n          onSend: function (messages, cb) {\n            _this.send(messages, cb);\n          }\n        });\n        session.on('error', function (err) { return _this.emitError(err); });\n        var sessionState;\n        session.userData = data.userData || {};\n        session.conversationData = data.conversationData || {};\n        session.privateConversationData = data.privateConversationData || {};\n        if (session.privateConversationData.hasOwnProperty(_consts.Data.SessionState)) {\n          sessionState = session.privateConversationData[_consts.Data.SessionState];\n          delete session.privateConversationData[_consts.Data.SessionState];\n        }\n\n        // Do the important things route/dispatch would have done\n        session.sessionState = sessionState;\n        var cur = session.curDialog();\n        session.dialogData = cur ? cur.state : {};\n        session.message = {address : address};\n\n        loadedData = data;\n        cb(null, session);\n\n      }, (err) => { _this.errorLogger(err); cb(err); })\n    }, (err) => { _this.errorLogger(err); cb(err); })\n  }, (err) => { _this.errorLogger(err); cb(err); })\n}\n\nfunction beginDialog(address, dialogId, dialogArgs, opts, done) {\n  if (typeof opts === 'function') {\n    done = opts;\n    opts = {};\n  }\n\n  if (opts.resume) {\n    this.loadSession(address, { dialogId:dialogId, dialogArgs:dialogArgs }, \n    (err, session) => {\n      if (!err) {\n        session.beginDialog(dialogId, dialogArgs);\n        if (done) {\n          done(null);\n        }\n      }\n      else {\n        if (done) {\n          done(err);\n        } \n      }\n    });\n  }\n  else {\n    this.beginDialog(address, dialogId, dialogArgs, done);\n  }\n}\n\nfunction patch(bot) {\n  bot.beginDialog = beginDialog;\n  bot.loadSession = loadSession;\n  return bot;\n}\n\nexports.patch = patch;\n\n"
  },
  {
    "path": "docs-samples/web-chat-speech/index.html",
    "content": "﻿<!DOCTYPE html>\r\n<!--\r\n  This is a sample HTML file which shows how to use speech in the Web Chat control.\r\n\r\n  1. Start a web server. One way to do so is to use npm http-server at a Node.js command prompt.\r\n       * To install http-server globally so it can be run from the command line, run this command:\r\n             npm install http-server- -g\r\n       * To start a web server using port 8000, from the directory that contains this file, run this command:\r\n             http-server -p 8000\r\n\r\n  2. Open this file by pointing your browser at \"http://localhost:8000/index.html?[parameters as listed below]\"\r\n\r\n  For ease of testing, several parameters can be set in the query string:\r\n  \r\n    * s = Direct Line secret, or\r\n    * t = Direct Line token (obtained by calling Direct Line's Generate Token)\r\n    * domain = optionally, the URL of an alternate Direct Line endpoint\r\n    * webSocket = set to 'true' to use WebSocket to receive messages (currently defaults to false)\r\n    * userid, username = id (and optionally name) of bot user\r\n    * botid, botname = id (and optionally name) of bot\r\n\r\n  For example, if the Direct Line secret for your bot is xxxMySecret.xxx, then open the following URL in your browser\r\n  http://localhost:8000/index.html?s=xxxMySecret.xxx \r\n\r\n  You have a few options to choose from for speech recognition. See definition of speechOptions in the following code,\r\n  and uncomment the option you want to choose. \r\n  \r\n  For more information on how to use the Web Chat control with speech recognition, see https://docs.microsoft.com/en-us/bot-framework/channel-connect-webchat-speech\r\n\r\n-->\r\n<html>\r\n  <head>\r\n    <meta charset=\"UTF-8\" />\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\" />\r\n    <title>Bot Chat</title>\r\n\r\n    <link href=\"https://cdn.botframework.com/botframework-webchat/latest/botchat.css\" rel=\"stylesheet\" />\r\n\r\n    <style>\r\n      .example {\r\n        float: left;\r\n        margin-right: 20px;\r\n        width: 300px;\r\n      }\r\n\r\n      .example > h2 {\r\n        font-family: 'Segoe UI';\r\n      }\r\n\r\n      #BotChatGoesHere {\r\n        border: 1px solid #333;\r\n        float: left;\r\n        height: 600px;\r\n        position: relative;\r\n        width: 460px;\r\n      }\r\n    </style>\r\n  </head>\r\n  <body>\r\n    <section class=\"example\">\r\n      <h2>Web Chat with speech</h2>\r\n      <p>\r\n        This sample shows the various options for enabling speech recognition and speech synthesis in the Web Chat\r\n      </p>\r\n    </section>\r\n\r\n    <div id=\"BotChatGoesHere\"></div>\r\n\r\n    <script src=\"https://cdn.botframework.com/botframework-webchat/latest/botchat.js\"></script>\r\n\r\n    <!-- If you do not want to use Cognitive Services library, comment out the following line -->\r\n    <script src=\"https://cdn.botframework.com/botframework-webchat/latest/CognitiveServices.js\"></script>\r\n\r\n    <script>\r\n      const params = BotChat.queryParams(location.search);\r\n\r\n      const user = {\r\n        id: params['userid'] || 'userid',\r\n        name: params['username'] || 'username'\r\n      };\r\n\r\n      const bot = {\r\n        id: params['botid'] || 'botid',\r\n        name: params['botname'] || 'botname'\r\n      };\r\n\r\n      window.botchatDebug = params['debug'] && params['debug'] === 'true';\r\n\r\n      // // Option 1: No speech\r\n      //\r\n      // const speechOptions = null;\r\n\r\n      // // Option 2: Native browser speech (not supported by all browsers, no speech recognition priming support)\r\n      //\r\n      // Note that Chrome automatically blocks speech if the HTML file is loaded from disk. You can run a server locally\r\n      // or launch Chrome (close all the existing Chrome browsers) with the following option:\r\n      // chrome.exe --allow-file-access-from-files <sampleHtmlFile>\r\n      //\r\n      const speechOptions = {\r\n         speechRecognizer: new BotChat.Speech.BrowserSpeechRecognizer(),\r\n         speechSynthesizer: new BotChat.Speech.BrowserSpeechSynthesizer()\r\n      };\r\n\r\n      // // Option 3: Cognitive Services speech recognition using API key (cross browser, speech priming support)\r\n      //\r\n      /*\r\n      const speechOptions = {\r\n        speechRecognizer: new CognitiveServices.SpeechRecognizer({ subscriptionKey: 'YOUR_COGNITIVE_SPEECH_API_KEY' }),\r\n        speechSynthesizer: new CognitiveServices.SpeechSynthesizer({\r\n          gender: CognitiveServices.SynthesisGender.Female,\r\n          subscriptionKey: 'YOUR_COGNITIVE_SPEECH_API_KEY',\r\n          voiceName: 'Microsoft Server Speech Text to Speech Voice (en-US, JessaRUS)'\r\n        })\r\n      };\r\n      */\r\n      //\r\n\r\n      // // Option 4: Cognitive Services speech recognition using a token (usually generated in a secure backend using your API key)\r\n      //\r\n      // function getToken() {\r\n      //   // Normally this token fetch is done from your secured backend to avoid exposing the API key and this call\r\n      //   // would be to your backend, or to retrieve a token that was served as part of the original page.\r\n\r\n      //   return fetch(\r\n      //     'https://api.cognitive.microsoft.com/sts/v1.0/issueToken',\r\n      //     {\r\n      //       headers: {\r\n      //         'Ocp-Apim-Subscription-Key': 'YOUR_COGNITIVE_SPEECH_API_KEY'\r\n      //       },\r\n      //       method: 'POST'\r\n      //     }\r\n      //   ).then(res => res.text());\r\n      // }\r\n\r\n      // const speechOptions = {\r\n      //   speechRecognizer: new CognitiveServices.SpeechRecognizer({\r\n      //     fetchCallback: (authFetchEventId) => getToken(),\r\n      //     fetchOnExpiryCallback: (authFetchEventId) => getToken()\r\n      //   }),\r\n      //   speechSynthesizer: new BotChat.Speech.BrowserSpeechSynthesizer()\r\n      // };\r\n\r\n      // // Option 5: Your own custom implementations of ISpeechRecognizer and ISpeechSynthesizer\r\n      //\r\n      // const speechOptions = {\r\n      //   speechRecognizer: new YourOwnSpeechRecognizer(),\r\n      //   speechSynthesizer: new YourOwnSpeechSynthesizer()\r\n      // };\r\n\r\n      BotChat.App({\r\n        bot: bot,\r\n        locale: params['locale'],\r\n        resize: 'detect',\r\n        // sendTyping: true,    // defaults to false. set to true to send 'typing' activities to bot (and other users) when user is typing\r\n        speechOptions: speechOptions,\r\n        user: user,\r\n\r\n        directLine: {\r\n          domain: params['domain'],\r\n          secret: params['s'],\r\n          token: params['t'],\r\n          webSocket: params['webSocket'] && params['webSocket'] === 'true' // defaults to true\r\n        }\r\n      }, document.getElementById('BotChatGoesHere'));\r\n    </script>\r\n  </body>\r\n</html>\r\n"
  },
  {
    "path": "docs-samples/web-chat-speech/readme.md",
    "content": "# Please note: this sample is now deprecated\r\n\r\nSee the [Speech updates](#speech-updates) section for more information.\r\n\r\n# Enable speech in the Web Chat control\r\n\r\n  This is a sample HTML file which shows how to enable speech recognition and synthesis in the Web Chat control.\r\n\r\n## Prerequisites\r\n\r\n  Before you run the sample, you need to have a Direct Line secret or token for the bot that you want to run using the Web Chat control.\r\n  * See [Connect a bot to Direct Line](https://docs.microsoft.com/en-us/bot-framework/channel-connect-directline) for information on getting a Direct Line secret.\r\n  * See [Generate a Direct Line token](https://docs.microsoft.com/en-us/bot-framework/rest-api/bot-framework-rest-direct-line-3-0-authentication) for information on exchanging the secret for a token.\r\n\r\n\r\n## Running the sample\r\n\r\nTo run the sample, you need to choose an option in the sample code, start a web server locally, and then open `index.html` in a browser with the appropriate parameters.\r\n\r\n### Choose a speech recognition option\r\n\r\nYou have a few options to choose from for speech recognition. In `index.html`, find and uncomment the definition of `speechOptions` in the code that corresponds to the option you want to choose.\r\n\r\n  | Option | Description |\r\n  |-----------|-------------|\r\n  | No speech | The Web Chat control can be used with speech disabled. |\r\n  | Native browser speech| Browser-provided components handle speech synthesis and generation. Not all browsers support this option. |\r\n  | Cognitive Services speech recognition using an API key | You provide an API key to make calls to the speech recognition and speech synthesis services. This option has cross-browser support.|\r\n  | Cognitive Services speech recognition using a token| Generate a token to avoid exposing your API key. |\r\n  | Custom ISpeechRecognizer and ISpeechSynthesizer| Use this option if you're creating your own speech recognition and synthesis components. |\r\n\r\n### Start a web server\r\nOne way to start a web server is to use `npm http-server` at a Node.js command prompt.\r\n\r\n1. To install `http-server` globally so it can be run from the command line, run this command:\r\n\r\n```\r\nnpm install http-server- -g\r\n```\r\n\r\n2. To start a web server using port 8000, from the directory that contains this file, run this command:\r\n\r\n```\r\nhttp-server -p 8000\r\n```\r\n\r\n### Open the file in a browser\r\n\r\nOpen `index.html` by pointing your browser at `http://localhost:8000/index.html?queryparameters`. For example, http://localhost:8000/index.html?s=YOURDIRECTLINESECRET invokes the WebChat control using the DirectLine secret. The parameters that you can set in the query string are described in the following table:\r\n\r\n  | Parameter | Description |\r\n  |-----------|-------------|\r\n  | s | Direct Line secret. Either a Direct Line secret or a Direct Line token must be provided. See [Connect a bot to Direct Line](https://docs.microsoft.com/en-us/bot-framework/channel-connect-directline) for information on getting a Direct Line secret. |\r\n  | t | Direct Line token. See [Generate a Direct Line token](https://docs.microsoft.com/en-us/bot-framework/rest-api/bot-framework-rest-direct-line-3-0-authentication) for info on how to generate this token. |\r\n  | domain | Optional. The URL of an alternate Direct Line endpoint.  |\r\n  | webSocket | Optional. Set to 'true' to use WebSocket to receive messages. Default is `false`. |\r\n  | userid | Optional. The ID of the bot user.  |\r\n  | username | Optional. The user name of the bot's user.  |\r\n  | botid | Optional. ID of the bot. |\r\n  | botname | Optional. Name of the bot. |\r\n\r\n### Use speech to interact with your bot\r\nWeb Chat should display in the browser window. Users interact with the voice interface by using the microphone in the Web Chat control.\r\n\r\n![Web chat speech screenshot](./webchat-sample-speech.png)\r\n\r\nIf the user types instead of speaking a response, Web Chat turns off the speech functionality and the bot gives only a textual response instead of speaking out loud. To re-enable the spoken response, the user can use the microphone to respond to the bot the next time. If the microphone is accepting input, it appears dark or filled-in. If it's grayed out, the user clicks on it to enable it.\r\n> **NOTE:**\r\n> Google Chrome supports the browser speech recognizer. However, Chrome may block the microphone in the following cases:\r\n> * If the URL of the page that contains Web Chat begins with `http://` instead of `https://`.\r\n> * If the URL is a local file using the `file://` protocol instead of `http://localhost:8000`.\r\n\r\n## Additional resources\r\n\r\n* For more information on how to use the Web Chat control with speech recognition, see [Enable speech in the Web Chat channel](https://docs.microsoft.com/en-us/bot-framework/channel-connect-webchat-speech).\r\n* You can [download the source code](https://github.com/Microsoft/BotFramework-WebChat) for the web chat control on GitHub.\r\n* The [Bing Speech API documentation](https://docs.microsoft.com/en-us/azure/cognitive-services/speech/home) provides more information on the Bing Speech API.\r\n\r\n\r\n# Speech Updates\r\n\r\nAs of October 2018, Bing Speech has been deprecated in favor of the new API, Cognitive Speech Services. Since Bing Speech is now in sunset, new keys can no longer be created. This sample is still available for Web Chat v3 users who already possess a Bing Speech API key.\r\n\r\nThe Cognitive Speech Speech Services API is active and available for customer implementation in v4 of Web Chat. **Bing Speech and Speech Services are not interchangeable APIs**. There is currently no plan to make Cognitive Speech Services backwards-compatible with v3 of Web Chat. Please see below for a list of Web Chat v4 samples for Bing Speech (deprecated), Cognitive Speech Services, and Web Speech API.\r\n\r\n## Speech Samples list as of 2/14/2019\r\n\r\n| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sample&nbsp;Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| Description                                                                                                                                                                                  | Link                                                                                                                 |\r\n|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------|\r\n| [`06.a.cognitive-services-bing-speech-js`](https://github.com/Microsoft/BotFramework-WebChat/tree/master/samples/06.a.cognitive-services-bing-speech-js)                                   | Introduces speech-to-text and text-to-speech ability using the (deprecated) Cognitive Services Bing Speech API and JavaScript.                                                                                                      | [Bing Speech with JS Demo](https://microsoft.github.io/BotFramework-WebChat/06.a.cognitive-services-bing-speech-js)  |\r\n| [`06.b.cognitive-services-bing-speech-react`](https://github.com/Microsoft/BotFramework-WebChat/tree/master/samples/06.b.cognitive-services-bing-speech-react)                             | Introduces speech-to-text and text-to-speech ability using the (deprecated) Cognitive Services Bing Speech API and React.                                                                                                           | [Bing Speech with React Demo](https://microsoft.github.io/BotFramework-WebChat/06.b.cognitive-services-bing-speech-react)|\r\n| [`06.c.cognitive-services-speech-services-js`](https://github.com/Microsoft/BotFramework-WebChat/tree/master/samples/06.c.cognitive-services-speech-services-js)                           | Introduces speech-to-text and text-to-speech ability using Cognitive Services Speech Services API.                                                                                                                                  | [Speech Services with JS Demo](https://microsoft.github.io/BotFramework-WebChat/6.c.cognitive-services-speech-services-js)|\r\n| [`06.d.speech-web-browser`](https://github.com/Microsoft/BotFramework-WebChat/tree/master/samples/06.d.speech-web-browser)                                                                 | Demonstrates how to implement text-to-speech using Web Chat's browser-based Web Speech API. (link to W3C standard in the sample)                                                                                                    | [Web Speech API Demo](https://microsoft.github.io/BotFramework-WebChat/06.d.speech-web-browser)                      |\r\n| [`06.e.cognitive-services-speech-services-with-lexical-result`](https://github.com/Microsoft/BotFramework-WebChat/tree/master/samples/06.e.cognitive-services-speech-services-with-lexical-result) | Demonstrates how to use lexical result from Cognitive Services Speech Services API.                                                                                                                                         | [Lexical Result Demo](https://microsoft.github.io/BotFramework-WebChat/06.e.cognitive-services-speech-services-with-lexical-result)|\r\n| [`06.f.hybrid-speech`](https://github.com/Microsoft/BotFramework-WebChat/tree/master/samples/06.f.hybrid-speech)                                                                           | Demonstrates how to use both browser-based Web Speech API for speech-to-text, and Cognitive Services Speech Services API for text-to-speech.                                                                                        | [Hybrid Speech Demo](https://microsoft.github.io/BotFramework-WebChat/06.f.hybrid-speech)                            |\r\n\r\n## Other resources\r\n- [Bing Speech Documentation](https://docs.microsoft.com/en-us/azure/cognitive-services/speech/home)\r\n- [Cognitive Speech Speech Services website](https://azure.microsoft.com/en-us/services/cognitive-services/speech-services/)\r\n"
  },
  {
    "path": "swagger/ConnectorAPI.json",
    "content": "{\n  \"swagger\": \"2.0\",\n  \"info\": {\n    \"version\": \"v3\",\n    \"title\": \"Microsoft Bot Connector API - v3.0\",\n    \"description\": \"The Bot Connector REST API allows your bot to send and receive messages to channels configured in the\\r\\n[Bot Framework Developer Portal](https://dev.botframework.com). The Connector service uses industry-standard REST\\r\\nand JSON over HTTPS.\\r\\n\\r\\nClient libraries for this REST API are available. See below for a list.\\r\\n\\r\\nMany bots will use both the Bot Connector REST API and the associated [Bot State REST API](/en-us/restapi/state). The\\r\\nBot State REST API allows a bot to store and retrieve state associated with users and conversations.\\r\\n\\r\\nAuthentication for both the Bot Connector and Bot State REST APIs is accomplished with JWT Bearer tokens, and is\\r\\ndescribed in detail in the [Connector Authentication](/en-us/restapi/authentication) document.\\r\\n\\r\\n# Client Libraries for the Bot Connector REST API\\r\\n\\r\\n* [Bot Builder for C#](/en-us/csharp/builder/sdkreference/)\\r\\n* [Bot Builder for Node.js](/en-us/node/builder/overview/)\\r\\n* Generate your own from the [Connector API Swagger file](https://raw.githubusercontent.com/Microsoft/BotBuilder/master/CSharp/Library/Microsoft.Bot.Connector.Shared/Swagger/ConnectorAPI.json)\\r\\n\\r\\n© 2016 Microsoft\",\n    \"termsOfService\": \"https://www.microsoft.com/en-us/legal/intellectualproperty/copyright/default.aspx\",\n    \"contact\": {\n      \"name\": \"Bot Framework\",\n      \"url\": \"https://botframework.com\",\n      \"email\": \"botframework@microsoft.com\"\n    },\n    \"license\": {\n      \"name\": \"The MIT License (MIT)\",\n      \"url\": \"https://opensource.org/licenses/MIT\"\n    }\n  },\n  \"host\": \"api.botframework.com\",\n  \"schemes\": [\n    \"https\"\n  ],\n  \"paths\": {\n    \"/v3/attachments/{attachmentId}\": {\n      \"get\": {\n        \"tags\": [\n          \"Attachments\"\n        ],\n        \"summary\": \"GetAttachmentInfo\",\n        \"description\": \"Get AttachmentInfo structure describing the attachment views\",\n        \"operationId\": \"Attachments_GetAttachmentInfo\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"attachmentId\",\n            \"in\": \"path\",\n            \"description\": \"attachment id\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An attachmentInfo object is returned which describes the:\\r\\n* type of the attachment\\r\\n* name of the attachment\\r\\n\\r\\n\\r\\nand an array of views:\\r\\n* Size - size of the object\\r\\n* ViewId - View Id which can be used to fetch a variation on the content (ex: original or thumbnail)\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/AttachmentInfo\"\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/attachments/{attachmentId}/views/{viewId}\": {\n      \"get\": {\n        \"tags\": [\n          \"Attachments\"\n        ],\n        \"summary\": \"GetAttachment\",\n        \"description\": \"Get the named view as binary content\",\n        \"operationId\": \"Attachments_GetAttachment\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"attachmentId\",\n            \"in\": \"path\",\n            \"description\": \"attachment id\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"viewId\",\n            \"in\": \"path\",\n            \"description\": \"View id from attachmentInfo\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"Attachment stream\",\n            \"schema\": {\n              \"format\": \"byte\",\n              \"type\": \"file\"\n            }\n          },\n          \"301\": {\n            \"description\": \"The Location header describes where the content is now.\"\n          },\n          \"302\": {\n            \"description\": \"The Location header describes where the content is now.\"\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/conversations\": {\n      \"get\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"GetConversations\",\n        \"description\": \"List the Conversations in which this bot has participated.\\r\\n\\r\\nGET from this method with a skip token\\r\\n\\r\\nThe return value is a ConversationsResult, which contains an array of ConversationMembers and a skip token.  If the skip token is not empty, then \\r\\nthere are further values to be returned. Call this method again with the returned token to get more values.\\r\\n\\r\\nEach ConversationMembers object contains the ID of the conversation and an array of ChannelAccounts that describe the members of the conversation.\",\n        \"operationId\": \"Conversations_GetConversations\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"continuationToken\",\n            \"in\": \"query\",\n            \"description\": \"skip or continuation token\",\n            \"required\": false,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An object will be returned containing \\r\\n* an array (Conversations) of ConversationMembers objects\\r\\n* a continuation token\\r\\n\\r\\nEach ConversationMembers object contains:\\r\\n* the Id of the conversation\\r\\n* an array (Members) of ChannelAccount objects\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ConversationsResult\"\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      },\n      \"post\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"CreateConversation\",\n        \"description\": \"Create a new Conversation.\\r\\n\\r\\nPOST to this method with a\\r\\n* Bot being the bot creating the conversation\\r\\n* IsGroup set to true if this is not a direct message (default is false)\\r\\n* Array containing the members to include in the conversation\\r\\n\\r\\nThe return value is a ResourceResponse which contains a conversation id which is suitable for use\\r\\nin the message payload and REST API uris.\\r\\n\\r\\nMost channels only support the semantics of bots initiating a direct message conversation.  An example of how to do that would be:\\r\\n\\r\\n```\\r\\nvar resource = await connector.conversations.CreateConversation(new ConversationParameters(){ Bot = bot, members = new ChannelAccount[] { new ChannelAccount(\\\"user1\\\") } );\\r\\nawait connect.Conversations.SendToConversationAsync(resource.Id, new Activity() ... ) ;\\r\\n\\r\\n```\",\n        \"operationId\": \"Conversations_CreateConversation\",\n        \"consumes\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\",\n          \"application/x-www-form-urlencoded\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"parameters\",\n            \"in\": \"body\",\n            \"description\": \"Parameters to create the conversation from\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/ConversationParameters\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An object will be returned containing \\r\\n* the ID for the conversation\\r\\n* ActivityId for the activity if provided.  If ActivityId is null then the channel doesn't support returning resource id's for activity.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ConversationResourceResponse\"\n            }\n          },\n          \"201\": {\n            \"description\": \"An object will be returned containing \\r\\n* the ID for the conversation\\r\\n* ActivityId for the activity if provided.  If ActivityId is null then the channel doesn't support returning resource id's for activity.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ConversationResourceResponse\"\n            }\n          },\n          \"202\": {\n            \"description\": \"An object will be returned containing \\r\\n* the ID for the conversation\\r\\n* ActivityId for the activity if provided.  If ActivityId is null then the channel doesn't support returning resource id's for activity.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ConversationResourceResponse\"\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/conversations/{conversationId}/activities\": {\n      \"post\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"SendToConversation\",\n        \"description\": \"This method allows you to send an activity to the end of a conversation.\\r\\n\\r\\nThis is slightly different from ReplyToActivity().\\r\\n* SendToConversation(conversationId) - will append the activity to the end of the conversation according to the timestamp or semantics of the channel.\\r\\n* ReplyToActivity(conversationId,ActivityId) - adds the activity as a reply to another activity, if the channel supports it. If the channel does not support nested replies, ReplyToActivity falls back to SendToConversation.\\r\\n\\r\\nUse ReplyToActivity when replying to a specific activity in the conversation.\\r\\n\\r\\nUse SendToConversation in all other cases.\",\n        \"operationId\": \"Conversations_SendToConversation\",\n        \"consumes\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\",\n          \"application/x-www-form-urlencoded\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"activity\",\n            \"in\": \"body\",\n            \"description\": \"Activity to send\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/Activity\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"201\": {\n            \"description\": \"A ResourceResponse object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"202\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/conversations/{conversationId}/activities/history\": {\n      \"post\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"SendConversationHistory\",\n        \"description\": \"This method allows you to upload the historic activities to the conversation.\\r\\n\\r\\nSender must ensure that the historic activities have unique ids and appropriate timestamps. The ids are used by the client to deal with duplicate activities and the timestamps are used by the client to render the activities in the right order.\",\n        \"operationId\": \"Conversations_SendConversationHistory\",\n        \"consumes\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\",\n          \"application/x-www-form-urlencoded\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"history\",\n            \"in\": \"body\",\n            \"description\": \"Historic activities\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/Transcript\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"201\": {\n            \"description\": \"A ResourceResponse object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"202\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/conversations/{conversationId}/activities/{activityId}\": {\n      \"put\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"UpdateActivity\",\n        \"description\": \"Edit an existing activity.\\r\\n\\r\\nSome channels allow you to edit an existing activity to reflect the new state of a bot conversation.\\r\\n\\r\\nFor example, you can remove buttons after someone has clicked \\\"Approve\\\" button.\",\n        \"operationId\": \"Conversations_UpdateActivity\",\n        \"consumes\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\",\n          \"application/x-www-form-urlencoded\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"activityId\",\n            \"in\": \"path\",\n            \"description\": \"activityId to update\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"activity\",\n            \"in\": \"body\",\n            \"description\": \"replacement Activity\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/Activity\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"201\": {\n            \"description\": \"A ResourceResponse object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"202\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      },\n      \"post\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"ReplyToActivity\",\n        \"description\": \"This method allows you to reply to an activity.\\r\\n\\r\\nThis is slightly different from SendToConversation().\\r\\n* SendToConversation(conversationId) - will append the activity to the end of the conversation according to the timestamp or semantics of the channel.\\r\\n* ReplyToActivity(conversationId,ActivityId) - adds the activity as a reply to another activity, if the channel supports it. If the channel does not support nested replies, ReplyToActivity falls back to SendToConversation.\\r\\n\\r\\nUse ReplyToActivity when replying to a specific activity in the conversation.\\r\\n\\r\\nUse SendToConversation in all other cases.\",\n        \"operationId\": \"Conversations_ReplyToActivity\",\n        \"consumes\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\",\n          \"application/x-www-form-urlencoded\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"activityId\",\n            \"in\": \"path\",\n            \"description\": \"activityId the reply is to (OPTIONAL)\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"activity\",\n            \"in\": \"body\",\n            \"description\": \"Activity to send\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/Activity\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"201\": {\n            \"description\": \"A ResourceResponse object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"202\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      },\n      \"delete\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"DeleteActivity\",\n        \"description\": \"Delete an existing activity.\\r\\n\\r\\nSome channels allow you to delete an existing activity, and if successful this method will remove the specified activity.\",\n        \"operationId\": \"Conversations_DeleteActivity\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"activityId\",\n            \"in\": \"path\",\n            \"description\": \"activityId to delete\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation succeeded, there is no response.\"\n          },\n          \"202\": {\n            \"description\": \"The request has been accepted for processing, but the processing has not been completed\"\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/conversations/{conversationId}/members\": {\n      \"get\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"GetConversationMembers\",\n        \"description\": \"Enumerate the members of a conversation. \\r\\n\\r\\nThis REST API takes a ConversationId and returns an array of ChannelAccount objects representing the members of the conversation.\",\n        \"operationId\": \"Conversations_GetConversationMembers\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An array of ChannelAccount objects\",\n            \"schema\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/ChannelAccount\"\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/conversations/{conversationId}/pagedmembers\": {\n      \"get\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"GetConversationPagedMembers\",\n        \"description\": \"Enumerate the members of a conversation one page at a time.\\r\\n\\r\\nThis REST API takes a ConversationId. Optionally a pageSize and/or continuationToken can be provided. It returns a PagedMembersResult, which contains an array\\r\\nof ChannelAccounts representing the members of the conversation and a continuation token that can be used to get more values.\\r\\n\\r\\nOne page of ChannelAccounts records are returned with each call. The number of records in a page may vary between channels and calls. The pageSize parameter can be used as \\r\\na suggestion. If there are no additional results the response will not contain a continuation token. If there are no members in the conversation the Members will be empty or not present in the response.\\r\\n\\r\\nA response to a request that has a continuation token from a prior request may rarely return members from a previous request.\",\n        \"operationId\": \"Conversations_GetConversationPagedMembers\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"pageSize\",\n            \"in\": \"query\",\n            \"description\": \"Suggested page size\",\n            \"required\": false,\n            \"type\": \"integer\",\n            \"format\": \"int32\"\n          },\n          {\n            \"name\": \"continuationToken\",\n            \"in\": \"query\",\n            \"description\": \"Continuation Token\",\n            \"required\": false,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"OK\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/PagedMembersResult\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/conversations/{conversationId}/members/{memberId}\": {\n      \"delete\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"DeleteConversationMember\",\n        \"description\": \"Deletes a member from a conversation. \\r\\n\\r\\nThis REST API takes a ConversationId and a memberId (of type string) and removes that member from the conversation. If that member was the last member\\r\\nof the conversation, the conversation will also be deleted.\",\n        \"operationId\": \"Conversations_DeleteConversationMember\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"memberId\",\n            \"in\": \"path\",\n            \"description\": \"ID of the member to delete from this conversation\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"The operation succeeded, there is no response.\"\n          },\n          \"204\": {\n            \"description\": \"The operation succeeded but no content was returned.\"\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/conversations/{conversationId}/activities/{activityId}/members\": {\n      \"get\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"GetActivityMembers\",\n        \"description\": \"Enumerate the members of an activity. \\r\\n\\r\\nThis REST API takes a ConversationId and a ActivityId, returning an array of ChannelAccount objects representing the members of the particular activity in the conversation.\",\n        \"operationId\": \"Conversations_GetActivityMembers\",\n        \"consumes\": [],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"activityId\",\n            \"in\": \"path\",\n            \"description\": \"Activity ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An array of ChannelAccount objects\",\n            \"schema\": {\n              \"type\": \"array\",\n              \"items\": {\n                \"$ref\": \"#/definitions/ChannelAccount\"\n              }\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    },\n    \"/v3/conversations/{conversationId}/attachments\": {\n      \"post\": {\n        \"tags\": [\n          \"Conversations\"\n        ],\n        \"summary\": \"UploadAttachment\",\n        \"description\": \"Upload an attachment directly into a channel's blob storage.\\r\\n\\r\\nThis is useful because it allows you to store data in a compliant store when dealing with enterprises.\\r\\n\\r\\nThe response is a ResourceResponse which contains an AttachmentId which is suitable for using with the attachments API.\",\n        \"operationId\": \"Conversations_UploadAttachment\",\n        \"consumes\": [\n          \"application/json\",\n          \"text/json\",\n          \"application/xml\",\n          \"text/xml\",\n          \"application/x-www-form-urlencoded\"\n        ],\n        \"produces\": [\n          \"application/json\",\n          \"text/json\"\n        ],\n        \"parameters\": [\n          {\n            \"name\": \"conversationId\",\n            \"in\": \"path\",\n            \"description\": \"Conversation ID\",\n            \"required\": true,\n            \"type\": \"string\"\n          },\n          {\n            \"name\": \"attachmentUpload\",\n            \"in\": \"body\",\n            \"description\": \"Attachment data\",\n            \"required\": true,\n            \"schema\": {\n              \"$ref\": \"#/definitions/AttachmentData\"\n            }\n          }\n        ],\n        \"responses\": {\n          \"200\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"201\": {\n            \"description\": \"A ResourceResponse object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"202\": {\n            \"description\": \"An object will be returned containing the ID for the resource.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ResourceResponse\"\n            }\n          },\n          \"default\": {\n            \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\n            \"schema\": {\n              \"$ref\": \"#/definitions/ErrorResponse\"\n            }\n          }\n        }\n      }\n    }\n  },\n  \"definitions\": {\n    \"AttachmentInfo\": {\n      \"description\": \"Metadata for an attachment\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"name\": {\n          \"description\": \"Name of the attachment\",\n          \"type\": \"string\"\n        },\n        \"type\": {\n          \"description\": \"ContentType of the attachment\",\n          \"type\": \"string\"\n        },\n        \"views\": {\n          \"description\": \"attachment views\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/AttachmentView\"\n          }\n        }\n      }\n    },\n    \"AttachmentView\": {\n      \"description\": \"Attachment View name and size\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"viewId\": {\n          \"description\": \"Content type of the attachment\",\n          \"type\": \"string\"\n        },\n        \"size\": {\n          \"format\": \"int32\",\n          \"description\": \"Name of the attachment\",\n          \"type\": \"integer\"\n        }\n      }\n    },\n    \"ErrorResponse\": {\n      \"description\": \"An HTTP API response\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"error\": {\n          \"$ref\": \"#/definitions/Error\",\n          \"description\": \"Error message\"\n        }\n      }\n    },\n    \"Error\": {\n      \"description\": \"Object representing error information\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"code\": {\n          \"description\": \"Error code\",\n          \"type\": \"string\"\n        },\n        \"message\": {\n          \"description\": \"Error message\",\n          \"type\": \"string\"\n        },\n        \"innerHttpError\": {\n          \"$ref\": \"#/definitions/InnerHttpError\",\n          \"description\": \"Error from inner http call\"\n        }\n      }\n    },\n    \"InnerHttpError\": {\n      \"description\": \"Object representing inner http error\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"statusCode\": {\n          \"format\": \"int32\",\n          \"description\": \"HttpStatusCode from failed request\",\n          \"type\": \"integer\"\n        },\n        \"body\": {\n          \"description\": \"Body from failed request\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"ConversationParameters\": {\n      \"description\": \"Parameters for creating a new conversation\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"isGroup\": {\n          \"description\": \"IsGroup\",\n          \"type\": \"boolean\"\n        },\n        \"bot\": {\n          \"$ref\": \"#/definitions/ChannelAccount\",\n          \"description\": \"The bot address for this conversation\"\n        },\n        \"members\": {\n          \"description\": \"Members to add to the conversation\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ChannelAccount\"\n          }\n        },\n        \"topicName\": {\n          \"description\": \"(Optional) Topic of the conversation (if supported by the channel)\",\n          \"type\": \"string\"\n        },\n        \"activity\": {\n          \"$ref\": \"#/definitions/Activity\",\n          \"description\": \"(Optional) When creating a new conversation, use this activity as the initial message to the conversation\"\n        },\n        \"channelData\": {\n          \"description\": \"Channel specific payload for creating the conversation\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"ChannelAccount\": {\n      \"description\": \"Channel account information needed to route a message\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"Channel id for the user or bot on this channel (Example: joe@smith.com, or @joesmith or 123456)\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"Display friendly name\",\n          \"type\": \"string\"\n        },\n        \"aadObjectId\": {\n          \"description\": \"This account's object ID within Azure Active Directory (AAD)\",\n          \"type\": \"string\"\n        },\n        \"role\": {\n          \"$ref\": \"#/definitions/RoleTypes\",\n          \"description\": \"Role of the entity behind the account (Example: User, Bot, etc.)\"\n        }\n      }\n    },\n    \"Activity\": {\n      \"description\": \"An Activity is the basic communication type for the Bot Framework 3.0 protocol.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"$ref\": \"#/definitions/ActivityTypes\",\n          \"description\": \"Contains the activity type.\"\n        },\n        \"id\": {\n          \"description\": \"Contains an ID that uniquely identifies the activity on the channel.\",\n          \"type\": \"string\"\n        },\n        \"timestamp\": {\n          \"format\": \"date-time\",\n          \"description\": \"Contains the date and time that the message was sent, in UTC, expressed in ISO-8601 format.\",\n          \"type\": \"string\"\n        },\n        \"localTimestamp\": {\n          \"format\": \"date-time\",\n          \"description\": \"Contains the date and time that the message was sent, in local time, expressed in ISO-8601 format.\\r\\nFor example, 2016-09-23T13:07:49.4714686-07:00.\",\n          \"type\": \"string\"\n        },\n        \"localTimezone\": {\n          \"description\": \"Contains the name of the timezone in which the message, in local time, expressed in IANA Time Zone database format.\\r\\nFor example, America/Los_Angeles.\",\n          \"type\": \"string\"\n        },\n        \"serviceUrl\": {\n          \"description\": \"Contains the URL that specifies the channel's service endpoint. Set by the channel.\",\n          \"type\": \"string\"\n        },\n        \"channelId\": {\n          \"description\": \"Contains an ID that uniquely identifies the channel. Set by the channel.\",\n          \"type\": \"string\"\n        },\n        \"from\": {\n          \"$ref\": \"#/definitions/ChannelAccount\",\n          \"description\": \"Identifies the sender of the message.\"\n        },\n        \"conversation\": {\n          \"$ref\": \"#/definitions/ConversationAccount\",\n          \"description\": \"Identifies the conversation to which the activity belongs.\"\n        },\n        \"recipient\": {\n          \"$ref\": \"#/definitions/ChannelAccount\",\n          \"description\": \"Identifies the recipient of the message.\"\n        },\n        \"textFormat\": {\n          \"$ref\": \"#/definitions/TextFormatTypes\",\n          \"description\": \"Format of text fields Default:markdown\"\n        },\n        \"attachmentLayout\": {\n          \"$ref\": \"#/definitions/AttachmentLayoutTypes\",\n          \"description\": \"The layout hint for multiple attachments. Default: list.\"\n        },\n        \"membersAdded\": {\n          \"description\": \"The collection of members added to the conversation.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ChannelAccount\"\n          }\n        },\n        \"membersRemoved\": {\n          \"description\": \"The collection of members removed from the conversation.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ChannelAccount\"\n          }\n        },\n        \"reactionsAdded\": {\n          \"description\": \"The collection of reactions added to the conversation.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MessageReaction\"\n          }\n        },\n        \"reactionsRemoved\": {\n          \"description\": \"The collection of reactions removed from the conversation.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MessageReaction\"\n          }\n        },\n        \"topicName\": {\n          \"description\": \"The updated topic name of the conversation.\",\n          \"type\": \"string\"\n        },\n        \"historyDisclosed\": {\n          \"description\": \"Indicates whether the prior history of the channel is disclosed.\",\n          \"type\": \"boolean\"\n        },\n        \"locale\": {\n          \"description\": \"A locale name for the contents of the text field.\\r\\nThe locale name is a combination of an ISO 639 two- or three-letter culture code associated with a language\\r\\nand an ISO 3166 two-letter subculture code associated with a country or region.\\r\\nThe locale name can also correspond to a valid BCP-47 language tag.\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"The text content of the message.\",\n          \"type\": \"string\"\n        },\n        \"speak\": {\n          \"description\": \"The text to speak.\",\n          \"type\": \"string\"\n        },\n        \"inputHint\": {\n          \"$ref\": \"#/definitions/InputHints\",\n          \"description\": \"Indicates whether your bot is accepting,\\r\\nexpecting, or ignoring user input after the message is delivered to the client.\"\n        },\n        \"summary\": {\n          \"description\": \"The text to display if the channel cannot render cards.\",\n          \"type\": \"string\"\n        },\n        \"suggestedActions\": {\n          \"$ref\": \"#/definitions/SuggestedActions\",\n          \"description\": \"The suggested actions for the activity.\"\n        },\n        \"attachments\": {\n          \"description\": \"Attachments\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/Attachment\"\n          }\n        },\n        \"entities\": {\n          \"description\": \"Represents the entities that were mentioned in the message.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/Entity\"\n          }\n        },\n        \"channelData\": {\n          \"description\": \"Contains channel-specific content.\",\n          \"type\": \"object\"\n        },\n        \"action\": {\n          \"description\": \"Indicates whether the recipient of a contactRelationUpdate was added or removed from the sender's contact list.\",\n          \"type\": \"string\"\n        },\n        \"replyToId\": {\n          \"description\": \"Contains the ID of the message to which this message is a reply.\",\n          \"type\": \"string\"\n        },\n        \"label\": {\n          \"description\": \"A descriptive label for the activity.\",\n          \"type\": \"string\"\n        },\n        \"valueType\": {\n          \"description\": \"The type of the activity's value object.\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"A value that is associated with the activity.\",\n          \"type\": \"object\"\n        },\n        \"name\": {\n          \"description\": \"The name of the operation associated with an invoke or event activity.\",\n          \"type\": \"string\"\n        },\n        \"relatesTo\": {\n          \"$ref\": \"#/definitions/ConversationReference\",\n          \"description\": \"A reference to another conversation or activity.\"\n        },\n        \"code\": {\n          \"$ref\": \"#/definitions/EndOfConversationCodes\",\n          \"description\": \"The a code for endOfConversation activities that indicates why the conversation ended.\"\n        },\n        \"expiration\": {\n          \"format\": \"date-time\",\n          \"description\": \"The time at which the activity should be considered to be \\\"expired\\\" and should not be presented to the recipient.\",\n          \"type\": \"string\"\n        },\n        \"importance\": {\n          \"$ref\": \"#/definitions/ActivityImportance\",\n          \"description\": \"The importance of the activity.\"\n        },\n        \"deliveryMode\": {\n          \"$ref\": \"#/definitions/DeliveryModes\",\n          \"description\": \"A delivery hint to signal to the recipient alternate delivery paths for the activity.\\r\\nThe default delivery mode is \\\"default\\\".\"\n        },\n        \"listenFor\": {\n          \"description\": \"List of phrases and references that speech and language priming systems should listen for\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"textHighlights\": {\n          \"description\": \"The collection of text fragments to highlight when the activity contains a ReplyToId value.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/TextHighlight\"\n          }\n        },\n        \"semanticAction\": {\n          \"$ref\": \"#/definitions/SemanticAction\",\n          \"description\": \"An optional programmatic action accompanying this request\"\n        }\n      }\n    },\n    \"ConversationAccount\": {\n      \"description\": \"Channel account information for a conversation\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"isGroup\": {\n          \"description\": \"Indicates whether the conversation contains more than two participants at the time the activity was generated\",\n          \"type\": \"boolean\"\n        },\n        \"conversationType\": {\n          \"description\": \"Indicates the type of the conversation in channels that distinguish between conversation types\",\n          \"type\": \"string\"\n        },\n        \"id\": {\n          \"description\": \"Channel id for the user or bot on this channel (Example: joe@smith.com, or @joesmith or 123456)\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"Display friendly name\",\n          \"type\": \"string\"\n        },\n        \"aadObjectId\": {\n          \"description\": \"This account's object ID within Azure Active Directory (AAD)\",\n          \"type\": \"string\"\n        },\n        \"role\": {\n          \"$ref\": \"#/definitions/RoleTypes\",\n          \"description\": \"Role of the entity behind the account (Example: User, Bot, etc.)\"\n        }\n      }\n    },\n    \"MessageReaction\": {\n      \"description\": \"Message reaction object\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"$ref\": \"#/definitions/MessageReactionTypes\",\n          \"description\": \"Message reaction type\"\n        }\n      }\n    },\n    \"SuggestedActions\": {\n      \"description\": \"SuggestedActions that can be performed\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"to\": {\n          \"description\": \"Ids of the recipients that the actions should be shown to.  These Ids are relative to the channelId and a subset of all recipients of the activity\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"actions\": {\n          \"description\": \"Actions that can be shown to the user\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        }\n      }\n    },\n    \"Attachment\": {\n      \"description\": \"An attachment within an activity\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"contentType\": {\n          \"description\": \"mimetype/Contenttype for the file\",\n          \"type\": \"string\"\n        },\n        \"contentUrl\": {\n          \"description\": \"Content Url\",\n          \"type\": \"string\"\n        },\n        \"content\": {\n          \"description\": \"Embedded content\",\n          \"type\": \"object\"\n        },\n        \"name\": {\n          \"description\": \"(OPTIONAL) The name of the attachment\",\n          \"type\": \"string\"\n        },\n        \"thumbnailUrl\": {\n          \"description\": \"(OPTIONAL) Thumbnail associated with attachment\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Entity\": {\n      \"description\": \"Metadata object pertaining to an activity\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"description\": \"Type of this entity (RFC 3987 IRI)\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"ConversationReference\": {\n      \"description\": \"An object relating to a particular point in a conversation\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"activityId\": {\n          \"description\": \"(Optional) ID of the activity to refer to\",\n          \"type\": \"string\"\n        },\n        \"user\": {\n          \"$ref\": \"#/definitions/ChannelAccount\",\n          \"description\": \"(Optional) User participating in this conversation\"\n        },\n        \"bot\": {\n          \"$ref\": \"#/definitions/ChannelAccount\",\n          \"description\": \"Bot participating in this conversation\"\n        },\n        \"conversation\": {\n          \"$ref\": \"#/definitions/ConversationAccount\",\n          \"description\": \"Conversation reference\"\n        },\n        \"channelId\": {\n          \"description\": \"Channel ID\",\n          \"type\": \"string\"\n        },\n        \"serviceUrl\": {\n          \"description\": \"Service endpoint where operations concerning the referenced conversation may be performed\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"TextHighlight\": {\n      \"description\": \"Refers to a substring of content within another field\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"text\": {\n          \"description\": \"Defines the snippet of text to highlight\",\n          \"type\": \"string\"\n        },\n        \"occurrence\": {\n          \"format\": \"int32\",\n          \"description\": \"Occurrence of the text field within the referenced text, if multiple exist.\",\n          \"type\": \"integer\"\n        }\n      }\n    },\n    \"SemanticAction\": {\n      \"description\": \"Represents a reference to a programmatic action\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"ID of this action\",\n          \"type\": \"string\"\n        },\n        \"entities\": {\n          \"description\": \"Entities associated with this action\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"$ref\": \"#/definitions/Entity\"\n          }\n        }\n      }\n    },\n    \"CardAction\": {\n      \"description\": \"A clickable action\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"$ref\": \"#/definitions/ActionTypes\",\n          \"description\": \"The type of action implemented by this button\"\n        },\n        \"title\": {\n          \"description\": \"Text description which appears on the button\",\n          \"type\": \"string\"\n        },\n        \"image\": {\n          \"description\": \"Image URL which will appear on the button, next to text label\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text for this action\",\n          \"type\": \"string\"\n        },\n        \"displayText\": {\n          \"description\": \"(Optional) text to display in the chat feed if the button is clicked\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"Supplementary parameter for action. Content of this property depends on the ActionType\",\n          \"type\": \"object\"\n        },\n        \"channelData\": {\n          \"description\": \"Channel-specific data associated with this action\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"ConversationResourceResponse\": {\n      \"description\": \"A response containing a resource\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"activityId\": {\n          \"description\": \"ID of the Activity (if sent)\",\n          \"type\": \"string\"\n        },\n        \"serviceUrl\": {\n          \"description\": \"Service endpoint where operations concerning the conversation may be performed\",\n          \"type\": \"string\"\n        },\n        \"id\": {\n          \"description\": \"Id of the resource\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"ConversationsResult\": {\n      \"description\": \"Conversations result\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"continuationToken\": {\n          \"description\": \"Paging token\",\n          \"type\": \"string\"\n        },\n        \"conversations\": {\n          \"description\": \"List of conversations\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ConversationMembers\"\n          }\n        }\n      }\n    },\n    \"ConversationMembers\": {\n      \"description\": \"Conversation and its members\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"Conversation ID\",\n          \"type\": \"string\"\n        },\n        \"members\": {\n          \"description\": \"List of members in this conversation\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ChannelAccount\"\n          }\n        }\n      }\n    },\n    \"ResourceResponse\": {\n      \"description\": \"A response containing a resource ID\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"Id of the resource\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Transcript\": {\n      \"description\": \"Transcript\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"activities\": {\n          \"description\": \"A collection of Activities that conforms to the Transcript schema.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/Activity\"\n          }\n        }\n      }\n    },\n    \"PagedMembersResult\": {\n      \"description\": \"Page of members.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"continuationToken\": {\n          \"description\": \"Paging token\",\n          \"type\": \"string\"\n        },\n        \"members\": {\n          \"description\": \"The Channel Accounts.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ChannelAccount\"\n          }\n        }\n      }\n    },\n    \"AttachmentData\": {\n      \"description\": \"Attachment data\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"description\": \"Content-Type of the attachment\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"Name of the attachment\",\n          \"type\": \"string\"\n        },\n        \"originalBase64\": {\n          \"format\": \"byte\",\n          \"description\": \"Attachment content\",\n          \"type\": \"string\"\n        },\n        \"thumbnailBase64\": {\n          \"format\": \"byte\",\n          \"description\": \"Attachment thumbnail\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"HeroCard\": {\n      \"description\": \"A Hero card (card with a single, large image)\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of the card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of the card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text for the card\",\n          \"type\": \"string\"\n        },\n        \"images\": {\n          \"description\": \"Array of images for the card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardImage\"\n          }\n        },\n        \"buttons\": {\n          \"description\": \"Set of actions applicable to the current card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        },\n        \"tap\": {\n          \"$ref\": \"#/definitions/CardAction\",\n          \"description\": \"This action will be activated when user taps on the card itself\"\n        }\n      }\n    },\n    \"CardImage\": {\n      \"description\": \"An image on a card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"url\": {\n          \"description\": \"URL thumbnail image for major content property\",\n          \"type\": \"string\"\n        },\n        \"alt\": {\n          \"description\": \"Image description intended for screen readers\",\n          \"type\": \"string\"\n        },\n        \"tap\": {\n          \"$ref\": \"#/definitions/CardAction\",\n          \"description\": \"Action assigned to specific Attachment\"\n        }\n      }\n    },\n    \"AnimationCard\": {\n      \"description\": \"An animation card (Ex: gif or short video clip)\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of this card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of this card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text of this card\",\n          \"type\": \"string\"\n        },\n        \"image\": {\n          \"$ref\": \"#/definitions/ThumbnailUrl\",\n          \"description\": \"Thumbnail placeholder\"\n        },\n        \"media\": {\n          \"description\": \"Media URLs for this card. When this field contains more than one URL, each URL is an alternative format of the same content.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MediaUrl\"\n          }\n        },\n        \"buttons\": {\n          \"description\": \"Actions on this card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        },\n        \"shareable\": {\n          \"description\": \"This content may be shared with others (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autoloop\": {\n          \"description\": \"Should the client loop playback at end of content (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autostart\": {\n          \"description\": \"Should the client automatically start playback of media in this card (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"aspect\": {\n          \"description\": \"Aspect ratio of thumbnail/media placeholder. Allowed values are \\\"16:9\\\" and \\\"4:3\\\"\",\n          \"type\": \"string\"\n        },\n        \"duration\": {\n          \"description\": \"Describes the length of the media content without requiring a receiver to open the content. Formatted as an ISO 8601 Duration field.\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"Supplementary parameter for this card\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"ThumbnailUrl\": {\n      \"description\": \"Thumbnail URL\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"url\": {\n          \"description\": \"URL pointing to the thumbnail to use for media content\",\n          \"type\": \"string\"\n        },\n        \"alt\": {\n          \"description\": \"HTML alt text to include on this thumbnail image\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"MediaUrl\": {\n      \"description\": \"Media URL\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"url\": {\n          \"description\": \"Url for the media\",\n          \"type\": \"string\"\n        },\n        \"profile\": {\n          \"description\": \"Optional profile hint to the client to differentiate multiple MediaUrl objects from each other\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"AudioCard\": {\n      \"description\": \"Audio card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of this card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of this card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text of this card\",\n          \"type\": \"string\"\n        },\n        \"image\": {\n          \"$ref\": \"#/definitions/ThumbnailUrl\",\n          \"description\": \"Thumbnail placeholder\"\n        },\n        \"media\": {\n          \"description\": \"Media URLs for this card. When this field contains more than one URL, each URL is an alternative format of the same content.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MediaUrl\"\n          }\n        },\n        \"buttons\": {\n          \"description\": \"Actions on this card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        },\n        \"shareable\": {\n          \"description\": \"This content may be shared with others (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autoloop\": {\n          \"description\": \"Should the client loop playback at end of content (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autostart\": {\n          \"description\": \"Should the client automatically start playback of media in this card (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"aspect\": {\n          \"description\": \"Aspect ratio of thumbnail/media placeholder. Allowed values are \\\"16:9\\\" and \\\"4:3\\\"\",\n          \"type\": \"string\"\n        },\n        \"duration\": {\n          \"description\": \"Describes the length of the media content without requiring a receiver to open the content. Formatted as an ISO 8601 Duration field.\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"Supplementary parameter for this card\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"BasicCard\": {\n      \"description\": \"A basic card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of the card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of the card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text for the card\",\n          \"type\": \"string\"\n        },\n        \"images\": {\n          \"description\": \"Array of images for the card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardImage\"\n          }\n        },\n        \"buttons\": {\n          \"description\": \"Set of actions applicable to the current card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        },\n        \"tap\": {\n          \"$ref\": \"#/definitions/CardAction\",\n          \"description\": \"This action will be activated when user taps on the card itself\"\n        }\n      }\n    },\n    \"MediaCard\": {\n      \"description\": \"Media card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of this card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of this card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text of this card\",\n          \"type\": \"string\"\n        },\n        \"image\": {\n          \"$ref\": \"#/definitions/ThumbnailUrl\",\n          \"description\": \"Thumbnail placeholder\"\n        },\n        \"media\": {\n          \"description\": \"Media URLs for this card. When this field contains more than one URL, each URL is an alternative format of the same content.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MediaUrl\"\n          }\n        },\n        \"buttons\": {\n          \"description\": \"Actions on this card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        },\n        \"shareable\": {\n          \"description\": \"This content may be shared with others (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autoloop\": {\n          \"description\": \"Should the client loop playback at end of content (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autostart\": {\n          \"description\": \"Should the client automatically start playback of media in this card (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"aspect\": {\n          \"description\": \"Aspect ratio of thumbnail/media placeholder. Allowed values are \\\"16:9\\\" and \\\"4:3\\\"\",\n          \"type\": \"string\"\n        },\n        \"duration\": {\n          \"description\": \"Describes the length of the media content without requiring a receiver to open the content. Formatted as an ISO 8601 Duration field.\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"Supplementary parameter for this card\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"ReceiptCard\": {\n      \"description\": \"A receipt card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of the card\",\n          \"type\": \"string\"\n        },\n        \"facts\": {\n          \"description\": \"Array of Fact objects\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/Fact\"\n          }\n        },\n        \"items\": {\n          \"description\": \"Array of Receipt Items\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/ReceiptItem\"\n          }\n        },\n        \"tap\": {\n          \"$ref\": \"#/definitions/CardAction\",\n          \"description\": \"This action will be activated when user taps on the card\"\n        },\n        \"total\": {\n          \"description\": \"Total amount of money paid (or to be paid)\",\n          \"type\": \"string\"\n        },\n        \"tax\": {\n          \"description\": \"Total amount of tax paid (or to be paid)\",\n          \"type\": \"string\"\n        },\n        \"vat\": {\n          \"description\": \"Total amount of VAT paid (or to be paid)\",\n          \"type\": \"string\"\n        },\n        \"buttons\": {\n          \"description\": \"Set of actions applicable to the current card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        }\n      }\n    },\n    \"Fact\": {\n      \"description\": \"Set of key-value pairs. Advantage of this section is that key and value properties will be \\r\\nrendered with default style information with some delimiter between them. So there is no need for developer to specify style information.\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"key\": {\n          \"description\": \"The key for this Fact\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"The value for this Fact\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"ReceiptItem\": {\n      \"description\": \"An item on a receipt card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of the Card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle appears just below Title field, differs from Title in font styling only\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text field appears just below subtitle, differs from Subtitle in font styling only\",\n          \"type\": \"string\"\n        },\n        \"image\": {\n          \"$ref\": \"#/definitions/CardImage\",\n          \"description\": \"Image\"\n        },\n        \"price\": {\n          \"description\": \"Amount with currency\",\n          \"type\": \"string\"\n        },\n        \"quantity\": {\n          \"description\": \"Number of items of given kind\",\n          \"type\": \"string\"\n        },\n        \"tap\": {\n          \"$ref\": \"#/definitions/CardAction\",\n          \"description\": \"This action will be activated when user taps on the Item bubble.\"\n        }\n      }\n    },\n    \"SigninCard\": {\n      \"description\": \"A card representing a request to sign in\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"text\": {\n          \"description\": \"Text for signin request\",\n          \"type\": \"string\"\n        },\n        \"buttons\": {\n          \"description\": \"Action to use to perform signin\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        }\n      }\n    },\n    \"OAuthCard\": {\n      \"description\": \"A card representing a request to perform a sign in via OAuth\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"text\": {\n          \"description\": \"Text for signin request\",\n          \"type\": \"string\"\n        },\n        \"connectionName\": {\n          \"description\": \"The name of the registered connection\",\n          \"type\": \"string\"\n        },\n        \"buttons\": {\n          \"description\": \"Action to use to perform signin\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        }\n      }\n    },\n    \"ThumbnailCard\": {\n      \"description\": \"A thumbnail card (card with a single, small thumbnail image)\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of the card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of the card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text for the card\",\n          \"type\": \"string\"\n        },\n        \"images\": {\n          \"description\": \"Array of images for the card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardImage\"\n          }\n        },\n        \"buttons\": {\n          \"description\": \"Set of actions applicable to the current card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        },\n        \"tap\": {\n          \"$ref\": \"#/definitions/CardAction\",\n          \"description\": \"This action will be activated when user taps on the card itself\"\n        }\n      }\n    },\n    \"VideoCard\": {\n      \"description\": \"Video card\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"title\": {\n          \"description\": \"Title of this card\",\n          \"type\": \"string\"\n        },\n        \"subtitle\": {\n          \"description\": \"Subtitle of this card\",\n          \"type\": \"string\"\n        },\n        \"text\": {\n          \"description\": \"Text of this card\",\n          \"type\": \"string\"\n        },\n        \"image\": {\n          \"$ref\": \"#/definitions/ThumbnailUrl\",\n          \"description\": \"Thumbnail placeholder\"\n        },\n        \"media\": {\n          \"description\": \"Media URLs for this card. When this field contains more than one URL, each URL is an alternative format of the same content.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/MediaUrl\"\n          }\n        },\n        \"buttons\": {\n          \"description\": \"Actions on this card\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/CardAction\"\n          }\n        },\n        \"shareable\": {\n          \"description\": \"This content may be shared with others (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autoloop\": {\n          \"description\": \"Should the client loop playback at end of content (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"autostart\": {\n          \"description\": \"Should the client automatically start playback of media in this card (default:true)\",\n          \"type\": \"boolean\"\n        },\n        \"aspect\": {\n          \"description\": \"Aspect ratio of thumbnail/media placeholder. Allowed values are \\\"16:9\\\" and \\\"4:3\\\"\",\n          \"type\": \"string\"\n        },\n        \"duration\": {\n          \"description\": \"Describes the length of the media content without requiring a receiver to open the content. Formatted as an ISO 8601 Duration field.\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"Supplementary parameter for this card\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"GeoCoordinates\": {\n      \"description\": \"GeoCoordinates (entity type: \\\"https://schema.org/GeoCoordinates\\\")\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"elevation\": {\n          \"format\": \"double\",\n          \"description\": \"Elevation of the location [WGS 84](https://en.wikipedia.org/wiki/World_Geodetic_System)\",\n          \"type\": \"number\"\n        },\n        \"latitude\": {\n          \"format\": \"double\",\n          \"description\": \"Latitude of the location [WGS 84](https://en.wikipedia.org/wiki/World_Geodetic_System)\",\n          \"type\": \"number\"\n        },\n        \"longitude\": {\n          \"format\": \"double\",\n          \"description\": \"Longitude of the location [WGS 84](https://en.wikipedia.org/wiki/World_Geodetic_System)\",\n          \"type\": \"number\"\n        },\n        \"type\": {\n          \"description\": \"The type of the thing\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"The name of the thing\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Mention\": {\n      \"description\": \"Mention information (entity type: \\\"mention\\\")\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"mentioned\": {\n          \"$ref\": \"#/definitions/ChannelAccount\",\n          \"description\": \"The mentioned user\"\n        },\n        \"text\": {\n          \"description\": \"Sub Text which represents the mention (can be null or empty)\",\n          \"type\": \"string\"\n        },\n        \"type\": {\n          \"description\": \"Type of this entity (RFC 3987 IRI)\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Place\": {\n      \"description\": \"Place (entity type: \\\"https://schema.org/Place\\\")\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"address\": {\n          \"description\": \"Address of the place (may be `string` or complex object of type `PostalAddress`)\",\n          \"type\": \"object\"\n        },\n        \"geo\": {\n          \"description\": \"Geo coordinates of the place (may be complex object of type `GeoCoordinates` or `GeoShape`)\",\n          \"type\": \"object\"\n        },\n        \"hasMap\": {\n          \"description\": \"Map to the place (may be `string` (URL) or complex object of type `Map`)\",\n          \"type\": \"object\"\n        },\n        \"type\": {\n          \"description\": \"The type of the thing\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"The name of the thing\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"Thing\": {\n      \"description\": \"Thing (entity type: \\\"https://schema.org/Thing\\\")\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"type\": {\n          \"description\": \"The type of the thing\",\n          \"type\": \"string\"\n        },\n        \"name\": {\n          \"description\": \"The name of the thing\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"MediaEventValue\": {\n      \"description\": \"Supplementary parameter for media events\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"cardValue\": {\n          \"description\": \"Callback parameter specified in the Value field of the MediaCard that originated this event\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"TokenRequest\": {\n      \"description\": \"A request to receive a user token\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"provider\": {\n          \"description\": \"The provider to request a user token from\",\n          \"type\": \"string\"\n        },\n        \"settings\": {\n          \"description\": \"A collection of settings for the specific provider for this request\",\n          \"type\": \"object\",\n          \"additionalProperties\": {\n            \"type\": \"object\"\n          }\n        }\n      }\n    },\n    \"TokenResponse\": {\n      \"description\": \"A response that includes a user token\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"connectionName\": {\n          \"description\": \"The connection name\",\n          \"type\": \"string\"\n        },\n        \"token\": {\n          \"description\": \"The user token\",\n          \"type\": \"string\"\n        },\n        \"expiration\": {\n          \"description\": \"Expiration for the token, in ISO 8601 format (e.g. \\\"2007-04-05T14:30Z\\\")\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"ActivityTypes\": {\n      \"description\": \"Types of Activities\",\n      \"enum\": [\n        \"message\",\n        \"contactRelationUpdate\",\n        \"conversationUpdate\",\n        \"typing\",\n        \"endOfConversation\",\n        \"event\",\n        \"invoke\",\n        \"deleteUserData\",\n        \"messageUpdate\",\n        \"messageDelete\",\n        \"installationUpdate\",\n        \"messageReaction\",\n        \"suggestion\",\n        \"trace\",\n        \"handoff\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"ActivityTypes\",\n        \"modelAsString\": true\n      }\n    },\n    \"AttachmentLayoutTypes\": {\n      \"description\": \"Attachment layout types\",\n      \"enum\": [\n        \"list\",\n        \"carousel\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"AttachmentLayoutTypes\",\n        \"modelAsString\": true\n      }\n    },\n    \"ActionTypes\": {\n      \"description\": \"Defines action types for clickable buttons.\",\n      \"enum\": [\n        \"openUrl\",\n        \"imBack\",\n        \"postBack\",\n        \"playAudio\",\n        \"playVideo\",\n        \"showImage\",\n        \"downloadFile\",\n        \"signin\",\n        \"call\",\n        \"payment\",\n        \"messageBack\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"ActionTypes\",\n        \"modelAsString\": true\n      }\n    },\n    \"ContactRelationUpdateActionTypes\": {\n      \"description\": \"Action types valid for ContactRelationUpdate activities\",\n      \"enum\": [\n        \"add\",\n        \"remove\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"ContactRelationUpdateActionTypes\",\n        \"modelAsString\": true\n      }\n    },\n    \"InstallationUpdateActionTypes\": {\n      \"description\": \"Action types valid for InstallationUpdate activities\",\n      \"enum\": [\n        \"add\",\n        \"remove\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"InstallationUpdateActionTypes\",\n        \"modelAsString\": true\n      }\n    },\n    \"MessageReactionTypes\": {\n      \"description\": \"Message reaction types\",\n      \"enum\": [\n        \"like\",\n        \"plusOne\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"MessageReactionTypes\",\n        \"modelAsString\": true\n      }\n    },\n    \"TextFormatTypes\": {\n      \"description\": \"Text format types\",\n      \"enum\": [\n        \"markdown\",\n        \"plain\",\n        \"xml\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"TextFormatTypes\",\n        \"modelAsString\": true\n      }\n    },\n    \"InputHints\": {\n      \"description\": \"Indicates whether the bot is accepting, expecting, or ignoring input\",\n      \"enum\": [\n        \"acceptingInput\",\n        \"ignoringInput\",\n        \"expectingInput\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"InputHints\",\n        \"modelAsString\": true\n      }\n    },\n    \"EndOfConversationCodes\": {\n      \"description\": \"Codes indicating why a conversation has ended\",\n      \"enum\": [\n        \"unknown\",\n        \"completedSuccessfully\",\n        \"userCancelled\",\n        \"botTimedOut\",\n        \"botIssuedInvalidMessage\",\n        \"channelFailed\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"EndOfConversationCodes\",\n        \"modelAsString\": true\n      }\n    },\n    \"ActivityImportance\": {\n      \"description\": \"Defines the importance of an Activity\",\n      \"enum\": [\n        \"low\",\n        \"normal\",\n        \"high\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"ActivityImportance\",\n        \"modelAsString\": true\n      }\n    },\n    \"RoleTypes\": {\n      \"description\": \"Role of the entity behind the account (Example: User, Bot, etc.)\",\n      \"enum\": [\n        \"user\",\n        \"bot\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"RoleTypes\",\n        \"modelAsString\": true\n      }\n    },\n    \"DeliveryModes\": {\n      \"description\": \"Values for deliveryMode field\",\n      \"enum\": [\n        \"normal\",\n        \"notification\"\n      ],\n      \"type\": \"string\",\n      \"properties\": {},\n      \"x-ms-enum\": {\n        \"name\": \"DeliveryModes\",\n        \"modelAsString\": true\n      }\n    },\n    \"MicrosoftPayMethodData\": {\n      \"description\": \"W3C Payment Method Data for Microsoft Pay\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"merchantId\": {\n          \"description\": \"Microsoft Pay Merchant ID\",\n          \"type\": \"string\"\n        },\n        \"supportedNetworks\": {\n          \"description\": \"Supported payment networks (e.g., \\\"visa\\\" and \\\"mastercard\\\")\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"supportedTypes\": {\n          \"description\": \"Supported payment types (e.g., \\\"credit\\\")\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    },\n    \"PaymentAddress\": {\n      \"description\": \"Address within a Payment Request\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"country\": {\n          \"description\": \"This is the CLDR (Common Locale Data Repository) region code. For example, US, GB, CN, or JP\",\n          \"type\": \"string\"\n        },\n        \"addressLine\": {\n          \"description\": \"This is the most specific part of the address. It can include, for example, a street name, a house number, apartment number, a rural delivery route, descriptive instructions, or a post office box number.\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"region\": {\n          \"description\": \"This is the top level administrative subdivision of the country. For example, this can be a state, a province, an oblast, or a prefecture.\",\n          \"type\": \"string\"\n        },\n        \"city\": {\n          \"description\": \"This is the city/town portion of the address.\",\n          \"type\": \"string\"\n        },\n        \"dependentLocality\": {\n          \"description\": \"This is the dependent locality or sublocality within a city. For example, used for neighborhoods, boroughs, districts, or UK dependent localities.\",\n          \"type\": \"string\"\n        },\n        \"postalCode\": {\n          \"description\": \"This is the postal code or ZIP code, also known as PIN code in India.\",\n          \"type\": \"string\"\n        },\n        \"sortingCode\": {\n          \"description\": \"This is the sorting code as used in, for example, France.\",\n          \"type\": \"string\"\n        },\n        \"languageCode\": {\n          \"description\": \"This is the BCP-47 language code for the address. It's used to determine the field separators and the order of fields when formatting the address for display.\",\n          \"type\": \"string\"\n        },\n        \"organization\": {\n          \"description\": \"This is the organization, firm, company, or institution at this address.\",\n          \"type\": \"string\"\n        },\n        \"recipient\": {\n          \"description\": \"This is the name of the recipient or contact person.\",\n          \"type\": \"string\"\n        },\n        \"phone\": {\n          \"description\": \"This is the phone number of the recipient or contact person.\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"PaymentCurrencyAmount\": {\n      \"description\": \"Supplies monetary amounts\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"currency\": {\n          \"description\": \"A currency identifier\",\n          \"type\": \"string\"\n        },\n        \"value\": {\n          \"description\": \"Decimal monetary value\",\n          \"type\": \"string\"\n        },\n        \"currencySystem\": {\n          \"description\": \"Currency system\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"PaymentDetails\": {\n      \"description\": \"Provides information about the requested transaction\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"total\": {\n          \"$ref\": \"#/definitions/PaymentItem\",\n          \"description\": \"Contains the total amount of the payment request\"\n        },\n        \"displayItems\": {\n          \"description\": \"Contains line items for the payment request that the user agent may display\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/PaymentItem\"\n          }\n        },\n        \"shippingOptions\": {\n          \"description\": \"A sequence containing the different shipping options for the user to choose from\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/PaymentShippingOption\"\n          }\n        },\n        \"modifiers\": {\n          \"description\": \"Contains modifiers for particular payment method identifiers\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/PaymentDetailsModifier\"\n          }\n        },\n        \"error\": {\n          \"description\": \"Error description\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"PaymentItem\": {\n      \"description\": \"Indicates what the payment request is for and the value asked for\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"label\": {\n          \"description\": \"Human-readable description of the item\",\n          \"type\": \"string\"\n        },\n        \"amount\": {\n          \"$ref\": \"#/definitions/PaymentCurrencyAmount\",\n          \"description\": \"Monetary amount for the item\"\n        },\n        \"pending\": {\n          \"description\": \"When set to true this flag means that the amount field is not final.\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"PaymentShippingOption\": {\n      \"description\": \"Describes a shipping option\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"String identifier used to reference this PaymentShippingOption\",\n          \"type\": \"string\"\n        },\n        \"label\": {\n          \"description\": \"Human-readable description of the item\",\n          \"type\": \"string\"\n        },\n        \"amount\": {\n          \"$ref\": \"#/definitions/PaymentCurrencyAmount\",\n          \"description\": \"Contains the monetary amount for the item\"\n        },\n        \"selected\": {\n          \"description\": \"Indicates whether this is the default selected PaymentShippingOption\",\n          \"type\": \"boolean\"\n        }\n      }\n    },\n    \"PaymentDetailsModifier\": {\n      \"description\": \"Provides details that modify the PaymentDetails based on payment method identifier\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"supportedMethods\": {\n          \"description\": \"Contains a sequence of payment method identifiers\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"total\": {\n          \"$ref\": \"#/definitions/PaymentItem\",\n          \"description\": \"This value overrides the total field in the PaymentDetails dictionary for the payment method identifiers in the supportedMethods field\"\n        },\n        \"additionalDisplayItems\": {\n          \"description\": \"Provides additional display items that are appended to the displayItems field in the PaymentDetails dictionary for the payment method identifiers in the supportedMethods field\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/PaymentItem\"\n          }\n        },\n        \"data\": {\n          \"description\": \"A JSON-serializable object that provides optional information that might be needed by the supported payment methods\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"PaymentMethodData\": {\n      \"description\": \"Indicates a set of supported payment methods and any associated payment method specific data for those methods\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"supportedMethods\": {\n          \"description\": \"Required sequence of strings containing payment method identifiers for payment methods that the merchant web site accepts\",\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"data\": {\n          \"description\": \"A JSON-serializable object that provides optional information that might be needed by the supported payment methods\",\n          \"type\": \"object\"\n        }\n      }\n    },\n    \"PaymentOptions\": {\n      \"description\": \"Provides information about the options desired for the payment request\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"requestPayerName\": {\n          \"description\": \"Indicates whether the user agent should collect and return the payer's name as part of the payment request\",\n          \"type\": \"boolean\"\n        },\n        \"requestPayerEmail\": {\n          \"description\": \"Indicates whether the user agent should collect and return the payer's email address as part of the payment request\",\n          \"type\": \"boolean\"\n        },\n        \"requestPayerPhone\": {\n          \"description\": \"Indicates whether the user agent should collect and return the payer's phone number as part of the payment request\",\n          \"type\": \"boolean\"\n        },\n        \"requestShipping\": {\n          \"description\": \"Indicates whether the user agent should collect and return a shipping address as part of the payment request\",\n          \"type\": \"boolean\"\n        },\n        \"shippingType\": {\n          \"description\": \"If requestShipping is set to true, then the shippingType field may be used to influence the way the user agent presents the user interface for gathering the shipping address\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"PaymentRequest\": {\n      \"description\": \"A request to make a payment\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"ID of this payment request\",\n          \"type\": \"string\"\n        },\n        \"methodData\": {\n          \"description\": \"Allowed payment methods for this request\",\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/definitions/PaymentMethodData\"\n          }\n        },\n        \"details\": {\n          \"$ref\": \"#/definitions/PaymentDetails\",\n          \"description\": \"Details for this request\"\n        },\n        \"options\": {\n          \"$ref\": \"#/definitions/PaymentOptions\",\n          \"description\": \"Provides information about the options desired for the payment request\"\n        },\n        \"expires\": {\n          \"description\": \"Expiration for this request, in ISO 8601 duration format (e.g., 'P1D')\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"PaymentRequestComplete\": {\n      \"description\": \"Payload delivered when completing a payment request\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"Payment request ID\",\n          \"type\": \"string\"\n        },\n        \"paymentRequest\": {\n          \"$ref\": \"#/definitions/PaymentRequest\",\n          \"description\": \"Initial payment request\"\n        },\n        \"paymentResponse\": {\n          \"$ref\": \"#/definitions/PaymentResponse\",\n          \"description\": \"Corresponding payment response\"\n        }\n      }\n    },\n    \"PaymentResponse\": {\n      \"description\": \"A PaymentResponse is returned when a user has selected a payment method and approved a payment request\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"methodName\": {\n          \"description\": \"The payment method identifier for the payment method that the user selected to fulfil the transaction\",\n          \"type\": \"string\"\n        },\n        \"details\": {\n          \"description\": \"A JSON-serializable object that provides a payment method specific message used by the merchant to process the transaction and determine successful fund transfer\",\n          \"type\": \"object\"\n        },\n        \"shippingAddress\": {\n          \"$ref\": \"#/definitions/PaymentAddress\",\n          \"description\": \"If the requestShipping flag was set to true in the PaymentOptions passed to the PaymentRequest constructor, then shippingAddress will be the full and final shipping address chosen by the user\"\n        },\n        \"shippingOption\": {\n          \"description\": \"If the requestShipping flag was set to true in the PaymentOptions passed to the PaymentRequest constructor, then shippingOption will be the id attribute of the selected shipping option\",\n          \"type\": \"string\"\n        },\n        \"payerEmail\": {\n          \"description\": \"If the requestPayerEmail flag was set to true in the PaymentOptions passed to the PaymentRequest constructor, then payerEmail will be the email address chosen by the user\",\n          \"type\": \"string\"\n        },\n        \"payerPhone\": {\n          \"description\": \"If the requestPayerPhone flag was set to true in the PaymentOptions passed to the PaymentRequest constructor, then payerPhone will be the phone number chosen by the user\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"PaymentRequestCompleteResult\": {\n      \"description\": \"Result from a completed payment request\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"result\": {\n          \"description\": \"Result of the payment request completion\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"PaymentRequestUpdate\": {\n      \"description\": \"An update to a payment request\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"id\": {\n          \"description\": \"ID for the payment request to update\",\n          \"type\": \"string\"\n        },\n        \"details\": {\n          \"$ref\": \"#/definitions/PaymentDetails\",\n          \"description\": \"Update payment details\"\n        },\n        \"shippingAddress\": {\n          \"$ref\": \"#/definitions/PaymentAddress\",\n          \"description\": \"Updated shipping address\"\n        },\n        \"shippingOption\": {\n          \"description\": \"Updated shipping options\",\n          \"type\": \"string\"\n        }\n      }\n    },\n    \"PaymentRequestUpdateResult\": {\n      \"description\": \"A result object from a Payment Request Update invoke operation\",\n      \"type\": \"object\",\n      \"properties\": {\n        \"details\": {\n          \"$ref\": \"#/definitions/PaymentDetails\",\n          \"description\": \"Update payment details\"\n        }\n      }\n    }\n  },\n  \"securityDefinitions\": {\n    \"bearer_auth\": {\n      \"type\": \"apiKey\",\n      \"description\": \"Access token to authenticate calls to the Bot Connector Service.\",\n      \"name\": \"Authorization\",\n      \"in\": \"header\"\n    }\n  }\n}"
  },
  {
    "path": "swagger/StateAPI.json",
    "content": "{\r\n    \"swagger\": \"2.0\",\r\n    \"info\": {\r\n        \"version\": \"v3\",\r\n        \"title\": \"Microsoft Bot Connector API - v3.0\",\r\n        \"description\": \"The Bot State REST API allows your bot to store and retrieve state associated with conversations conducted through\\r\\nthe [Bot Connector REST API](/en-us/restapi/connector). The Bot State REST API uses REST and HTTPS to send and receive\\r\\nencoded content that your bot controls.\\r\\n\\r\\nClient libraries for this REST API are available. See below for a list.\\r\\n\\r\\nYour bot may store data for a user, a conversation, or a single user within a conversation (called \\\"private\\\" data).\\r\\nEach payload may be up to 32 kilobytes in size. The data may be removed by the bot or upon a user's request, e.g.\\r\\nif the user requests the channel to inform the bot (and therefore, the Bot Framework) to delete the user's data.\\r\\n\\r\\nThe Bot State REST API is only useful in conjunction with the Bot Connector REST API.\\r\\n\\r\\nAuthentication for both the Bot State and Bot Connector REST APIs is accomplished with JWT Bearer tokens, and is\\r\\ndescribed in detail in the [Connector Authentication](/en-us/restapi/authentication) document.\\r\\n\\r\\nCurrently, clients calling the Bot State REST API must send their requests to the ```state.botframework.com```\\r\\nhost. Channel services do not currently implement the Bot State REST API.\\r\\n\\r\\nRequests to update bot state include an ```eTag``` property within the JSON payload. You may use the ```eTag```\\r\\nfor optimistic concurrency control. If you include an ```eTag``` value equivalent to the ```eTag``` you saw\\r\\nin a prior object, the Bot State REST API will fail the request with an HTTP 409 or 412 error, on update or create,\\r\\nrespectively. If you wish to overwrite whatever data is in the Bot State service, set ```eTag``` to ```*```.\\r\\n\\r\\n# Client Libraries for the Bot State REST API\\r\\n\\r\\n* [Bot Builder for C#](/en-us/csharp/builder/sdkreference/)\\r\\n* [Bot Builder for Node.js](/en-us/node/builder/overview/)\\r\\n* Generate your own from the [State API Swagger file](https://raw.githubusercontent.com/Microsoft/BotBuilder/master/CSharp/Library/Microsoft.Bot.Connector.Shared/Swagger/StateAPI.json)\\r\\n\\r\\n 2016 Microsoft\",\r\n        \"termsOfService\": \"https://www.microsoft.com/en-us/legal/intellectualproperty/copyright/default.aspx\",\r\n        \"contact\": {\r\n            \"name\": \"Bot Framework\",\r\n            \"url\": \"https://botframework.com\",\r\n            \"email\": \"botframework@microsoft.com\"\r\n        },\r\n        \"license\": {\r\n            \"name\": \"The MIT License (MIT)\",\r\n            \"url\": \"https://opensource.org/licenses/MIT\"\r\n        }\r\n    },\r\n    \"host\": \"state.botframework.com\",\r\n    \"schemes\": [\r\n        \"https\"\r\n    ],\r\n    \"paths\": {\r\n        \"/v3/botstate/{channelId}/users/{userId}\": {\r\n            \"get\": {\r\n                \"tags\": [\r\n                    \"BotState\"\r\n                ],\r\n                \"summary\": \"Get user data. This API is deprecated, see https://aka.ms/AA1vm7i\",\r\n                \"description\": \"Get the bot's data for the user across all conversations\",\r\n                \"operationId\": \"BotState_GetUserData\",\r\n                \"consumes\": [],\r\n                \"produces\": [\r\n                    \"application/json\",\r\n                    \"text/json\",\r\n                    \"application/xml\",\r\n                    \"text/xml\"\r\n                ],\r\n                \"parameters\": [\r\n                    {\r\n                        \"name\": \"channelId\",\r\n                        \"in\": \"path\",\r\n                        \"description\": \"channelId\",\r\n                        \"required\": true,\r\n                        \"type\": \"string\"\r\n                    },\r\n                    {\r\n                        \"name\": \"userId\",\r\n                        \"in\": \"path\",\r\n                        \"description\": \"id for the user on the channel\",\r\n                        \"required\": true,\r\n                        \"type\": \"string\"\r\n                    }\r\n                ],\r\n                \"responses\": {\r\n                    \"200\": {\r\n                        \"description\": \"A bot data object will be returned containing your object\",\r\n                        \"schema\": {\r\n                            \"$ref\": \"#/definitions/BotData\"\r\n                        }\r\n                    },\r\n                    \"default\": {\r\n                        \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\r\n                        \"schema\": {\r\n                            \"$ref\": \"#/definitions/ErrorResponse\"\r\n                        }\r\n                    }\r\n                },\r\n                \"deprecated\": true\r\n            },\r\n            \"post\": {\r\n                \"tags\": [\r\n                    \"BotState\"\r\n                ],\r\n                \"summary\": \"Set user data. This API is deprecated, see https://aka.ms/AA1vm7i\",\r\n                \"description\": \"Update the bot's data for a user\",\r\n                \"operationId\": \"BotState_SetUserData\",\r\n                \"consumes\": [\r\n                    \"application/json\",\r\n                    \"text/json\",\r\n                    \"application/xml\",\r\n                    \"text/xml\",\r\n                    \"application/x-www-form-urlencoded\"\r\n                ],\r\n                \"produces\": [\r\n                    \"application/json\",\r\n                    \"text/json\",\r\n                    \"application/xml\",\r\n                    \"text/xml\"\r\n                ],\r\n                \"parameters\": [\r\n                    {\r\n                        \"name\": \"channelId\",\r\n                        \"in\": \"path\",\r\n                        \"description\": \"channelId\",\r\n                        \"required\": true,\r\n                        \"type\": \"string\"\r\n                    },\r\n                    {\r\n                        \"name\": \"userId\",\r\n                        \"in\": \"path\",\r\n                        \"description\": \"id for the user on the channel\",\r\n                        \"required\": true,\r\n                        \"type\": \"string\"\r\n                    },\r\n                    {\r\n                        \"name\": \"botData\",\r\n                        \"in\": \"body\",\r\n                        \"description\": \"the new botdata\",\r\n                        \"required\": true,\r\n                        \"schema\": {\r\n                            \"$ref\": \"#/definitions/BotData\"\r\n                        }\r\n                    }\r\n                ],\r\n                \"responses\": {\r\n                    \"200\": {\r\n                        \"description\": \"A bot data object will be returned containing your object\",\r\n                        \"schema\": {\r\n                            \"$ref\": \"#/definitions/BotData\"\r\n                        }\r\n                    },\r\n                    \"default\": {\r\n                        \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\r\n                        \"schema\": {\r\n                            \"$ref\": \"#/definitions/ErrorResponse\"\r\n                        }\r\n                    }\r\n                },\r\n                \"deprecated\": true\r\n            },\r\n            \"delete\": {\r\n                \"tags\": [\r\n                    \"BotState\"\r\n                ],\r\n                \"summary\": \"Delete state for user. This API is deprecated, see https://aka.ms/AA1vm7i\",\r\n                \"description\": \"Delete all data for a user in a channel (UserData and PrivateConversationData)\",\r\n                \"operationId\": \"BotState_DeleteStateForUser\",\r\n                \"consumes\": [],\r\n                \"produces\": [\r\n                    \"application/json\",\r\n                    \"text/json\",\r\n                    \"application/xml\",\r\n                    \"text/xml\"\r\n                ],\r\n                \"parameters\": [\r\n                    {\r\n                        \"name\": \"channelId\",\r\n                        \"in\": \"path\",\r\n                        \"description\": \"channelId\",\r\n                        \"required\": true,\r\n                        \"type\": \"string\"\r\n                    },\r\n                    {\r\n                        \"name\": \"userId\",\r\n                        \"in\": \"path\",\r\n                        \"description\": \"id for the user on the channel\",\r\n                        \"required\": true,\r\n                        \"type\": \"string\"\r\n                    }\r\n                ],\r\n                \"responses\": {\r\n                    \"200\": {\r\n                        \"description\": \"OK\",\r\n                        \"schema\": {\r\n                            \"type\": \"object\"\r\n                        }\r\n                    },\r\n                    \"204\": {\r\n                        \"description\": \"The operation succeeded but no content was returned.\"\r\n                    },\r\n                    \"default\": {\r\n                        \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\r\n                        \"schema\": {\r\n                            \"$ref\": \"#/definitions/ErrorResponse\"\r\n                        }\r\n                    }\r\n                },\r\n                \"deprecated\": true\r\n            }\r\n        },\r\n        \"/v3/botstate/{channelId}/conversations/{conversationId}\": {\r\n            \"get\": {\r\n                \"tags\": [\r\n                    \"BotState\"\r\n                ],\r\n                \"summary\": \"Get conversation data. This API is deprecated, see https://aka.ms/AA1vm7i\",\r\n                \"description\": \"Get the bot's data for all users in a conversation\",\r\n                \"operationId\": \"BotState_GetConversationData\",\r\n                \"consumes\": [],\r\n                \"produces\": [\r\n                    \"application/json\",\r\n                    \"text/json\",\r\n                    \"application/xml\",\r\n                    \"text/xml\"\r\n                ],\r\n                \"parameters\": [\r\n                    {\r\n                        \"name\": \"channelId\",\r\n                        \"in\": \"path\",\r\n                        \"description\": \"the channelId\",\r\n                        \"required\": true,\r\n                        \"type\": \"string\"\r\n                    },\r\n                    {\r\n                        \"name\": \"conversationId\",\r\n                        \"in\": \"path\",\r\n                        \"description\": \"The id for the conversation on the channel\",\r\n                        \"required\": true,\r\n                        \"type\": \"string\"\r\n                    }\r\n                ],\r\n                \"responses\": {\r\n                    \"200\": {\r\n                        \"description\": \"A bot data object will be returned containing your object\",\r\n                        \"schema\": {\r\n                            \"$ref\": \"#/definitions/BotData\"\r\n                        }\r\n                    },\r\n                    \"default\": {\r\n                        \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\r\n                        \"schema\": {\r\n                            \"$ref\": \"#/definitions/ErrorResponse\"\r\n                        }\r\n                    }\r\n                },\r\n                \"deprecated\": true\r\n            },\r\n            \"post\": {\r\n                \"tags\": [\r\n                    \"BotState\"\r\n                ],\r\n                \"summary\": \"Set conversation data. This API is deprecated, see https://aka.ms/AA1vm7i\",\r\n                \"description\": \"Update the bot's data for all users in a conversation\",\r\n                \"operationId\": \"BotState_SetConversationData\",\r\n                \"consumes\": [\r\n                    \"application/json\",\r\n                    \"text/json\",\r\n                    \"application/xml\",\r\n                    \"text/xml\",\r\n                    \"application/x-www-form-urlencoded\"\r\n                ],\r\n                \"produces\": [\r\n                    \"application/json\",\r\n                    \"text/json\",\r\n                    \"application/xml\",\r\n                    \"text/xml\"\r\n                ],\r\n                \"parameters\": [\r\n                    {\r\n                        \"name\": \"channelId\",\r\n                        \"in\": \"path\",\r\n                        \"description\": \"channelId\",\r\n                        \"required\": true,\r\n                        \"type\": \"string\"\r\n                    },\r\n                    {\r\n                        \"name\": \"conversationId\",\r\n                        \"in\": \"path\",\r\n                        \"description\": \"The id for the conversation on the channel\",\r\n                        \"required\": true,\r\n                        \"type\": \"string\"\r\n                    },\r\n                    {\r\n                        \"name\": \"botData\",\r\n                        \"in\": \"body\",\r\n                        \"description\": \"the new botdata\",\r\n                        \"required\": true,\r\n                        \"schema\": {\r\n                            \"$ref\": \"#/definitions/BotData\"\r\n                        }\r\n                    }\r\n                ],\r\n                \"responses\": {\r\n                    \"200\": {\r\n                        \"description\": \"A bot data object will be returned containing your object\",\r\n                        \"schema\": {\r\n                            \"$ref\": \"#/definitions/BotData\"\r\n                        }\r\n                    },\r\n                    \"default\": {\r\n                        \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\r\n                        \"schema\": {\r\n                            \"$ref\": \"#/definitions/ErrorResponse\"\r\n                        }\r\n                    }\r\n                },\r\n                \"deprecated\": true\r\n            }\r\n        },\r\n        \"/v3/botstate/{channelId}/conversations/{conversationId}/users/{userId}\": {\r\n            \"get\": {\r\n                \"tags\": [\r\n                    \"BotState\"\r\n                ],\r\n                \"summary\": \"Get private conversation data. This API is deprecated, see https://aka.ms/AA1vm7i\",\r\n                \"description\": \"Get the bot's data for a single user in a conversation\",\r\n                \"operationId\": \"BotState_GetPrivateConversationData\",\r\n                \"consumes\": [],\r\n                \"produces\": [\r\n                    \"application/json\",\r\n                    \"text/json\",\r\n                    \"application/xml\",\r\n                    \"text/xml\"\r\n                ],\r\n                \"parameters\": [\r\n                    {\r\n                        \"name\": \"channelId\",\r\n                        \"in\": \"path\",\r\n                        \"description\": \"channelId\",\r\n                        \"required\": true,\r\n                        \"type\": \"string\"\r\n                    },\r\n                    {\r\n                        \"name\": \"conversationId\",\r\n                        \"in\": \"path\",\r\n                        \"description\": \"The id for the conversation on the channel\",\r\n                        \"required\": true,\r\n                        \"type\": \"string\"\r\n                    },\r\n                    {\r\n                        \"name\": \"userId\",\r\n                        \"in\": \"path\",\r\n                        \"description\": \"id for the user on the channel\",\r\n                        \"required\": true,\r\n                        \"type\": \"string\"\r\n                    }\r\n                ],\r\n                \"responses\": {\r\n                    \"200\": {\r\n                        \"description\": \"A bot data object will be returned containing your object\",\r\n                        \"schema\": {\r\n                            \"$ref\": \"#/definitions/BotData\"\r\n                        }\r\n                    },\r\n                    \"default\": {\r\n                        \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\r\n                        \"schema\": {\r\n                            \"$ref\": \"#/definitions/ErrorResponse\"\r\n                        }\r\n                    }\r\n                },\r\n                \"deprecated\": true\r\n            },\r\n            \"post\": {\r\n                \"tags\": [\r\n                    \"BotState\"\r\n                ],\r\n                \"summary\": \"Set private conversation data. This API is deprecated, see https://aka.ms/AA1vm7i\",\r\n                \"description\": \"Update the bot's data for a single user in a conversation\",\r\n                \"operationId\": \"BotState_SetPrivateConversationData\",\r\n                \"consumes\": [\r\n                    \"application/json\",\r\n                    \"text/json\",\r\n                    \"application/xml\",\r\n                    \"text/xml\",\r\n                    \"application/x-www-form-urlencoded\"\r\n                ],\r\n                \"produces\": [\r\n                    \"application/json\",\r\n                    \"text/json\",\r\n                    \"application/xml\",\r\n                    \"text/xml\"\r\n                ],\r\n                \"parameters\": [\r\n                    {\r\n                        \"name\": \"channelId\",\r\n                        \"in\": \"path\",\r\n                        \"description\": \"channelId\",\r\n                        \"required\": true,\r\n                        \"type\": \"string\"\r\n                    },\r\n                    {\r\n                        \"name\": \"conversationId\",\r\n                        \"in\": \"path\",\r\n                        \"description\": \"The id for the conversation on the channel\",\r\n                        \"required\": true,\r\n                        \"type\": \"string\"\r\n                    },\r\n                    {\r\n                        \"name\": \"userId\",\r\n                        \"in\": \"path\",\r\n                        \"description\": \"id for the user on the channel\",\r\n                        \"required\": true,\r\n                        \"type\": \"string\"\r\n                    },\r\n                    {\r\n                        \"name\": \"botData\",\r\n                        \"in\": \"body\",\r\n                        \"description\": \"the new botdata\",\r\n                        \"required\": true,\r\n                        \"schema\": {\r\n                            \"$ref\": \"#/definitions/BotData\"\r\n                        }\r\n                    }\r\n                ],\r\n                \"responses\": {\r\n                    \"200\": {\r\n                        \"description\": \"A bot data object will be returned containing your object\",\r\n                        \"schema\": {\r\n                            \"$ref\": \"#/definitions/BotData\"\r\n                        }\r\n                    },\r\n                    \"default\": {\r\n                        \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\r\n                        \"schema\": {\r\n                            \"$ref\": \"#/definitions/ErrorResponse\"\r\n                        }\r\n                    }\r\n                },\r\n                \"deprecated\": true\r\n            }\r\n        },\r\n        \"/v3/botstate/{channelId}/exportBotStateData\": {\r\n            \"get\": {\r\n                \"tags\": [\r\n                    \"BotState\"\r\n                ],\r\n                \"summary\": \"Export bot state data. This API is deprecated, see https://aka.ms/AA1vm7i\",\r\n                \"description\": \"Get all the state data for a bot in this channel. This returns a list of BotStateData and (possibly) a continuation token\",\r\n                \"operationId\": \"BotState_ExportBotStateData\",\r\n                \"consumes\": [],\r\n                \"produces\": [\r\n                    \"application/json\",\r\n                    \"text/json\",\r\n                    \"application/xml\",\r\n                    \"text/xml\"\r\n                ],\r\n                \"parameters\": [\r\n                    {\r\n                        \"name\": \"channelId\",\r\n                        \"in\": \"path\",\r\n                        \"description\": \"the channelId\",\r\n                        \"required\": true,\r\n                        \"type\": \"string\"\r\n                    }\r\n                ],\r\n                \"responses\": {\r\n                    \"200\": {\r\n                        \"description\": \"A bot state data object will be returned. It contains a (possibly empty) array of BotStateData objects and a continuation token.\",\r\n                        \"schema\": {\r\n                            \"$ref\": \"#/definitions/BotStateDataResult\"\r\n                        }\r\n                    },\r\n                    \"default\": {\r\n                        \"description\": \"The operation failed and the response is an error object describing the status code and failure.\",\r\n                        \"schema\": {\r\n                            \"$ref\": \"#/definitions/ErrorResponse\"\r\n                        }\r\n                    }\r\n                },\r\n                \"deprecated\": true\r\n            }\r\n        }\r\n    },\r\n    \"definitions\": {\r\n        \"BotData\": {\r\n            \"type\": \"object\",\r\n            \"properties\": {\r\n                \"data\": {\r\n                    \"type\": \"object\"\r\n                },\r\n                \"eTag\": {\r\n                    \"type\": \"string\"\r\n                }\r\n            }\r\n        },\r\n        \"ErrorResponse\": {\r\n            \"type\": \"object\",\r\n            \"properties\": {\r\n                \"error\": {\r\n                    \"$ref\": \"#/definitions/Error\"\r\n                }\r\n            }\r\n        },\r\n        \"Error\": {\r\n            \"type\": \"object\",\r\n            \"properties\": {\r\n                \"code\": {\r\n                    \"type\": \"string\"\r\n                },\r\n                \"message\": {\r\n                    \"type\": \"string\"\r\n                },\r\n                \"innerHttpError\": {\r\n                    \"$ref\": \"#/definitions/InnerHttpError\"\r\n                }\r\n            }\r\n        },\r\n        \"InnerHttpError\": {\r\n            \"type\": \"object\",\r\n            \"properties\": {\r\n                \"statusCode\": {\r\n                    \"format\": \"int32\",\r\n                    \"type\": \"integer\"\r\n                },\r\n                \"body\": {\r\n                    \"type\": \"object\"\r\n                }\r\n            }\r\n        },\r\n        \"BotStateDataResult\": {\r\n            \"type\": \"object\",\r\n            \"properties\": {\r\n                \"botStateData\": {\r\n                    \"type\": \"array\",\r\n                    \"items\": {\r\n                        \"$ref\": \"#/definitions/BotStateData\"\r\n                    }\r\n                },\r\n                \"continuationToken\": {\r\n                    \"type\": \"string\"\r\n                }\r\n            }\r\n        },\r\n        \"BotStateData\": {\r\n            \"type\": \"object\",\r\n            \"properties\": {\r\n                \"conversationId\": {\r\n                    \"type\": \"string\"\r\n                },\r\n                \"userId\": {\r\n                    \"type\": \"string\"\r\n                },\r\n                \"data\": {\r\n                    \"type\": \"string\"\r\n                },\r\n                \"lastModified\": {\r\n                    \"format\": \"date-time\",\r\n                    \"type\": \"string\"\r\n                }\r\n            }\r\n        }\r\n    },\r\n    \"securityDefinitions\": {\r\n        \"bearer_auth\": {\r\n            \"type\": \"apiKey\",\r\n            \"description\": \"Access token to authenticate calls to the Bot Connector Service.\",\r\n            \"name\": \"Authorization\",\r\n            \"in\": \"header\"\r\n        }\r\n    }\r\n}"
  }
]