Full Code of microsoft/botframework-sdk for AI

main ed8adc25069b cached
790 files
4.8 MB
1.3M tokens
616 symbols
1 requests
Download .txt
Showing preview only (5,260K chars total). Download the full file or copy to clipboard to get everything.
Repository: microsoft/botframework-sdk
Branch: main
Commit: ed8adc25069b
Files: 790
Total size: 4.8 MB

Directory structure:
gitextract_dp4i3952/

├── .editorconfig
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── bot-framework-bug.md
│   │   └── bot-framework-feature-request.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── issue_template.md
├── .gitignore
├── CODE_OF_CONDUCT.md
├── Common/
│   ├── Telemetry/
│   │   └── README.md
│   ├── Transcripts/
│   │   ├── CoreExtensionsTests/
│   │   │   ├── ConversationStateTest.chat
│   │   │   ├── CustomStateTest.chat
│   │   │   └── UserStateTest.chat
│   │   ├── CoreTests/
│   │   │   └── BotAdapted_Bracketing.chat
│   │   ├── DialogsTests/
│   │   │   ├── AttachmentPrompt.chat
│   │   │   ├── ChoicePrompt.chat
│   │   │   ├── ConfirmPrompt.chat
│   │   │   ├── ContentAttachment.json
│   │   │   ├── DateTimePrompt.chat
│   │   │   ├── NumberPrompt.chat
│   │   │   ├── TextPrompt.chat
│   │   │   ├── Waterfall.chat
│   │   │   ├── WaterfallNested.chat
│   │   │   └── WaterfallPrompt.chat
│   │   ├── LuisTests/
│   │   │   └── LuisMiddleware.chat
│   │   ├── QnATests/
│   │   │   └── QnAMiddleware.chat
│   │   ├── README.md
│   │   └── TranslationTests/
│   │       ├── LocaleConvertToEnglish.chat
│   │       ├── TranslateToEnglish.chat
│   │       └── TranslateToUserLanguage.chat
│   └── badges/
│       └── BotBuilderBadge.md
├── Contributing.md
├── LICENSE
├── Orchestrator/
│   ├── README.md
│   ├── Samples/
│   │   ├── CLI/
│   │   │   └── ModelTuning/
│   │   │       ├── README.md
│   │   │       ├── common.fixed.lu
│   │   │       ├── common.lu
│   │   │       ├── common.test.lu
│   │   │       └── demo.cmd
│   │   └── dotnet/
│   │       └── nlp-with-entities/
│   │           ├── .gitignore
│   │           ├── AdapterWithErrorHandler.cs
│   │           ├── BotServices.cs
│   │           ├── Bots/
│   │           │   └── DispatchBot.cs
│   │           ├── CognitiveModels/
│   │           │   ├── HomeAutomation.lu
│   │           │   ├── QnAMaker.qna
│   │           │   └── Weather.lu
│   │           ├── Controllers/
│   │           │   └── BotController.cs
│   │           ├── IBotServices.cs
│   │           ├── OrchestratorConfig.cs
│   │           ├── Program.cs
│   │           ├── README.md
│   │           ├── Startup.cs
│   │           ├── nlp-with-entities.csproj
│   │           └── wwwroot/
│   │               └── default.html
│   ├── docs/
│   │   ├── BFOrchestratorInteractive.md
│   │   ├── BFOrchestratorReport.md
│   │   ├── BFOrchestratorUsage.md
│   │   ├── DispatchMigrationExample.md
│   │   ├── FAQ.md
│   │   ├── LICENSE.md
│   │   ├── LUFormat.md
│   │   ├── NLRModels.md
│   │   ├── Orchestrator Intro.pptx
│   │   ├── Overview.md
│   │   └── package/
│   │       └── README.md
│   ├── v0.1/
│   │   ├── nlr_versions.json
│   │   └── nlr_versions.schema
│   └── v0.2/
│       ├── nlr_versions.json
│       └── nlr_versions.schema
├── README.md
├── SECURITY.md
├── codeql3000.yml
├── docs/
│   ├── BF Labeling Guide.md
│   └── umlDiagrams/
│       ├── ActivityFlow/
│       │   ├── BFServiceAndBotDetails/
│       │   │   └── BFServiceAndBotDetails_DiagramSource.md
│       │   ├── BotFrameworkAdapterFlow/
│       │   │   └── BFAdapterActivityFlow_DiagramSource.md
│       │   ├── CustomAdapterFlow/
│       │   │   ├── BufferingWithCustomAdapter_DiagramSource.md
│       │   │   └── CustomAdapterActivityFlow_DiagramSource.md
│       │   ├── DetailedSdkFlow/
│       │   │   ├── DetailedSdkFlow.md
│       │   │   └── DetailedSdkFlow_DiagramSource.md
│       │   ├── GeneralActivityFlow.md
│       │   ├── GeneralActivityFlow_DiagramSource.md
│       │   └── README.md
│       └── Authentication/
│           ├── AddingAuthenticationToYourBot/
│           │   ├── AddAuthenticationToYourBotViaABS/
│           │   │   ├── DetailedView_DiagramSource.md
│           │   │   └── HigherLevel_DiagramSource.md
│           │   └── UserAuthenticationWithinAConversation/
│           │       ├── AuthenticationDocExample_Goal_DiagramSource.md
│           │       ├── AuthenticationDocExample_OAuthFlow_HasTokenInStorage_DiagramSource.md
│           │       └── AuthenticationDocExample_OAuthFlow_NoTokenToStart_DiagramSource.md
│           ├── AuthArchitectureInBotFramework/
│           │   └── OAuthPrompt/
│           │       ├── AdapterSavedAsTurnContextMember_DiagramSource.md
│           │       ├── BotFrameworkAdapterCreatesOAuthClient_DiagramSource.md
│           │       ├── BotFrameworkAdapterCreatesTokenApiClient_DiagramSource.md
│           │       ├── BuildAppCredentialsParticipants_DiagramSource.md
│           │       ├── CSharp_AppCredentialsClassDiagram_DiagramSource.md
│           │       ├── CSharp_OAuthPromptAndTokenProvider_DiagramSource.md
│           │       ├── CSharp_UseAppCredentialsToCreateOAuthClient_DiagramSource.md
│           │       ├── CreatingOAuthClientInMoreDetail.md
│           │       ├── CreatingOAuthClientInMoreDetail_DiagramSource.md
│           │       ├── GetUserTokenSequenceDiagram.md
│           │       ├── JS_AppCredentialsClassDiagram_DiagramSource.md
│           │       ├── JS_OAuthPromptAndTokenProvider_DiagramSource.md
│           │       ├── JS_UseAppCredentialsToCreateTokenApiClient_DiagramSource.md
│           │       ├── OAuthClientClassDiagram_DiagramSource.md
│           │       ├── OAuthPromptClassDiagrams.md
│           │       ├── ProcessActivityCreatesTurnContext_DiagramSource.md
│           │       ├── TakesAdapterFromTurnContext_DiagramSource.md
│           │       └── TokenApiClientClassDiagram_DiagramSource.md
│           ├── ChannelToBot/
│           │   ├── AuthenticateRequestOverview_DiagramSource.md
│           │   ├── AuthenticateRequest_DiagramSource.md
│           │   ├── ChannelActingOnBehalfOfSelf_DiagramSource.md
│           │   ├── ChannelActivingOnBehalfOfUser_DiagramSource.md
│           │   ├── ChannelToABSLayerToBot_DiagramSource.md
│           │   ├── HigherLevel_TokenAuthentication_DiagramSource.md
│           │   ├── JwtTokenValidationClassDiagram_DiagramSource.md
│           │   ├── README.md
│           │   ├── SimpleChannelWithTokenToBot_DiagramSource.md
│           │   ├── TokenSignatureParticipants_DiagramSource.md
│           │   └── WhyHelloBot_DiagramSource.md
│           ├── HighLevelAuthFlow/
│           │   ├── AuthServerAuthenticatesUser_DiagramSource.md
│           │   ├── AuthServerIssuesTokenToBot_DiagramSource.md
│           │   ├── GiveBotAccessToProtectedResource_DiagramSource.md
│           │   └── HighLevelAuthFlowSequenceDiagram_DiagramSource.md
│           ├── OAuthPrompt/
│           │   ├── OAuthPrompt_BeginDialog_DiagramSource.md
│           │   ├── OAuthPrompt_ContinueDialog_DetailedView_DiagramSource.md
│           │   ├── OAuthPrompt_ContinueDialog_HigherLevel_DiagramSource.md
│           │   └── README.md
│           └── README.md
├── dri/
│   ├── .gitignore
│   ├── README.md
│   ├── helpers.py
│   ├── output.py
│   ├── report.py
│   └── requirements.txt
├── parsers/
│   └── LU/
│       ├── ANTLR/
│       │   ├── LUFileLexer.g4
│       │   └── LUFileParser.g4
│       └── JS/
│           ├── build/
│           │   ├── bf-cli-build-test-steps.yml
│           │   ├── botframework-cli-azure-devops.yml
│           │   ├── botframework-cli-beta.yml
│           │   ├── botframework-cli-daily.yml
│           │   ├── botframework-cli-mac.yml
│           │   ├── botframework-cli-rc.yml
│           │   ├── botframework-cli-version.yml
│           │   └── botframework-cli.yml
│           ├── common/
│           │   ├── config/
│           │   │   └── rush/
│           │   │       ├── .npmrc
│           │   │       ├── command-line.json
│           │   │       ├── common-versions.json
│           │   │       ├── experiments.json
│           │   │       ├── pnpmfile.js
│           │   │       └── version-policies.json
│           │   └── scripts/
│           │       ├── install-run-rush.js
│           │       ├── install-run-rushx.js
│           │       ├── install-run.js
│           │       └── version-and-pack.js
│           ├── packages/
│           │   └── lu/
│           │       ├── .editorconfig
│           │       ├── .gitignore
│           │       ├── .nycrc
│           │       ├── README.md
│           │       ├── package.json
│           │       ├── src/
│           │       │   ├── index.ts
│           │       │   ├── parser/
│           │       │   │   ├── composerindex.js
│           │       │   │   ├── converters/
│           │       │   │   │   ├── helpers/
│           │       │   │   │   │   └── writer.js
│           │       │   │   │   ├── luistocsconverter.js
│           │       │   │   │   └── luistotsconverter.js
│           │       │   │   ├── cross-train/
│           │       │   │   │   ├── confighelper.js
│           │       │   │   │   ├── cross-train.js
│           │       │   │   │   └── crossTrainer.js
│           │       │   │   ├── index.js
│           │       │   │   ├── lu/
│           │       │   │   │   ├── lu.js
│           │       │   │   │   ├── luMerger.js
│           │       │   │   │   ├── luOptions.js
│           │       │   │   │   ├── qna.js
│           │       │   │   │   └── qnaOptions.js
│           │       │   │   ├── lubuild/
│           │       │   │   │   ├── builder.ts
│           │       │   │   │   ├── core.ts
│           │       │   │   │   ├── cross-trained-recognizer.ts
│           │       │   │   │   ├── multi-language-recognizer.ts
│           │       │   │   │   ├── recognizer.ts
│           │       │   │   │   └── settings.ts
│           │       │   │   ├── lufile/
│           │       │   │   │   ├── LUFileLexer.g4
│           │       │   │   │   ├── LUFileParser.g4
│           │       │   │   │   ├── baseSection.js
│           │       │   │   │   ├── classes/
│           │       │   │   │   │   ├── filesToParse.js
│           │       │   │   │   │   ├── hclasses.js
│           │       │   │   │   │   └── parserObject.js
│           │       │   │   │   ├── diagnostic.js
│           │       │   │   │   ├── entitySection.js
│           │       │   │   │   ├── generated/
│           │       │   │   │   │   ├── LUFileLexer.interp
│           │       │   │   │   │   ├── LUFileLexer.js
│           │       │   │   │   │   ├── LUFileLexer.tokens
│           │       │   │   │   │   ├── LUFileParser.interp
│           │       │   │   │   │   ├── LUFileParser.js
│           │       │   │   │   │   ├── LUFileParser.tokens
│           │       │   │   │   │   ├── LUFileParserListener.js
│           │       │   │   │   │   └── LUFileParserVisitor.js
│           │       │   │   │   ├── importSection.js
│           │       │   │   │   ├── luErrorListener.js
│           │       │   │   │   ├── luParser.js
│           │       │   │   │   ├── luResource.js
│           │       │   │   │   ├── modelInfoSection.js
│           │       │   │   │   ├── nestedIntentSection.js
│           │       │   │   │   ├── newEntitySection.js
│           │       │   │   │   ├── parseFileContents.js
│           │       │   │   │   ├── qnaSection.js
│           │       │   │   │   ├── read-text-file.js
│           │       │   │   │   ├── sectionOperator.js
│           │       │   │   │   ├── simpleIntentSection.js
│           │       │   │   │   ├── translate-helpers.js
│           │       │   │   │   └── visitor.js
│           │       │   │   ├── luis/
│           │       │   │   │   ├── luConverter.js
│           │       │   │   │   ├── luis.js
│           │       │   │   │   ├── luisBuilder.js
│           │       │   │   │   ├── luisCollate.js
│           │       │   │   │   ├── luisGen.js
│           │       │   │   │   ├── luisGenBuilder.js
│           │       │   │   │   ├── luisValidator.js
│           │       │   │   │   └── propertyHelper.js
│           │       │   │   ├── qna/
│           │       │   │   │   ├── alterations/
│           │       │   │   │   │   ├── alterations.js
│           │       │   │   │   │   └── qnaConverter.js
│           │       │   │   │   └── qnamaker/
│           │       │   │   │       ├── kb.js
│           │       │   │   │       ├── kbCollate.js
│           │       │   │   │       ├── qnaContext.js
│           │       │   │   │       ├── qnaConverter.js
│           │       │   │   │       ├── qnaFiles.js
│           │       │   │   │       ├── qnaList.js
│           │       │   │   │       ├── qnaMakerBuilder.js
│           │       │   │   │       ├── qnaMetaData.js
│           │       │   │   │       ├── qnaPrompt.js
│           │       │   │   │       └── qnamaker.js
│           │       │   │   ├── qnabuild/
│           │       │   │   │   ├── builder.ts
│           │       │   │   │   ├── core.ts
│           │       │   │   │   ├── cross-trained-recognizer.ts
│           │       │   │   │   ├── multi-language-recognizer.ts
│           │       │   │   │   ├── recognizer.ts
│           │       │   │   │   ├── serviceBase.js
│           │       │   │   │   └── settings.ts
│           │       │   │   ├── test/
│           │       │   │   │   └── testhelper.ts
│           │       │   │   ├── translator/
│           │       │   │   │   └── lutranslate.js
│           │       │   │   └── utils/
│           │       │   │       ├── enums/
│           │       │   │       │   ├── CLI-errors.js
│           │       │   │       │   ├── invalidchars.js
│           │       │   │       │   ├── luisEntityTypeNameMap.js
│           │       │   │       │   ├── luisEntityTypes.js
│           │       │   │       │   ├── luisbuiltintypes.js
│           │       │   │       │   ├── luisobjenum.js
│           │       │   │       │   ├── lusectiontypes.js
│           │       │   │       │   ├── parsecommands.js
│           │       │   │       │   ├── parserconsts.js
│           │       │   │       │   └── recognizertypes.js
│           │       │   │       ├── exception.js
│           │       │   │       └── helpers.js
│           │       │   └── utils/
│           │       │       ├── filehelper.ts
│           │       │       └── textfilereader.ts
│           │       ├── test/
│           │       │   ├── commands/
│           │       │   │   └── luis/
│           │       │   │       └── convert.test.js
│           │       │   ├── fixtures/
│           │       │   │   ├── empty.json
│           │       │   │   ├── empty.lu
│           │       │   │   ├── es/
│           │       │   │   │   └── file.lu
│           │       │   │   ├── examples/
│           │       │   │   │   ├── 1.lu
│           │       │   │   │   ├── 10.lu
│           │       │   │   │   ├── 11.lu
│           │       │   │   │   ├── 12.lu
│           │       │   │   │   ├── 13.lu
│           │       │   │   │   ├── 2.lu
│           │       │   │   │   ├── 3.lu
│           │       │   │   │   ├── 4.lu
│           │       │   │   │   ├── 5.lu
│           │       │   │   │   ├── 6.lu
│           │       │   │   │   ├── 7.lu
│           │       │   │   │   ├── 8.lu
│           │       │   │   │   ├── 9.lu
│           │       │   │   │   ├── 9a.lu
│           │       │   │   │   ├── README.MD
│           │       │   │   │   ├── all.lu
│           │       │   │   │   ├── all.md
│           │       │   │   │   ├── all.qna
│           │       │   │   │   ├── buyChocolate.lu
│           │       │   │   │   ├── changeAlarm.lu
│           │       │   │   │   ├── comment.lu
│           │       │   │   │   ├── compositeEntities.lu
│           │       │   │   │   ├── en-us/
│           │       │   │   │   │   ├── changeAlarm.lu
│           │       │   │   │   │   ├── none.lu
│           │       │   │   │   │   ├── qna4.lu
│           │       │   │   │   │   └── root.lu
│           │       │   │   │   ├── fr-fr/
│           │       │   │   │   │   ├── changeAlarm.lu
│           │       │   │   │   │   ├── none.lu
│           │       │   │   │   │   ├── qna4.lu
│           │       │   │   │   │   └── root.lu
│           │       │   │   │   ├── luFileReference1.lu
│           │       │   │   │   ├── luFileReference2.lu
│           │       │   │   │   ├── luFileReference3.lu
│           │       │   │   │   ├── luFileReference4.lu
│           │       │   │   │   ├── luFileReference5.lu
│           │       │   │   │   ├── luFileReference6.lu
│           │       │   │   │   ├── negativeCase1.lu
│           │       │   │   │   ├── negativeCase2.lu
│           │       │   │   │   ├── negativeCase3.lu
│           │       │   │   │   ├── negativeCase4.lu
│           │       │   │   │   ├── negativeCase5.lu
│           │       │   │   │   ├── newEntityWithFeatures.lu
│           │       │   │   │   ├── none.lu
│           │       │   │   │   ├── patterns.lu
│           │       │   │   │   ├── patterns1.lu
│           │       │   │   │   ├── phraseLists.lu
│           │       │   │   │   ├── qna-alterations.lu
│           │       │   │   │   ├── qna1.lu
│           │       │   │   │   ├── qna2.lu
│           │       │   │   │   ├── qna3.lu
│           │       │   │   │   ├── qna4.lu
│           │       │   │   │   ├── qna5.lu
│           │       │   │   │   ├── qna6.lu
│           │       │   │   │   ├── qna7.lu
│           │       │   │   │   ├── regexEntity.lu
│           │       │   │   │   └── v7UpgradeTest.lu
│           │       │   │   ├── file.lu
│           │       │   │   ├── fr/
│           │       │   │   │   └── file.lu
│           │       │   │   ├── generate/
│           │       │   │   │   ├── ClosedLists.cs
│           │       │   │   │   ├── ClosedLists.json
│           │       │   │   │   ├── CompositeEntities.cs
│           │       │   │   │   ├── CompositeEntities.json
│           │       │   │   │   ├── ContosoApp.cs
│           │       │   │   │   ├── ContosoApp.json
│           │       │   │   │   ├── FlightBooking.cs
│           │       │   │   │   ├── FlightBooking.json
│           │       │   │   │   ├── FlightBooking.ts
│           │       │   │   │   ├── Intents.cs
│           │       │   │   │   ├── Intents.json
│           │       │   │   │   ├── NamespaceClass.cs
│           │       │   │   │   ├── PatternEntities.cs
│           │       │   │   │   ├── PatternEntities.json
│           │       │   │   │   ├── PrebuiltEntities.cs
│           │       │   │   │   ├── PrebuiltEntities.json
│           │       │   │   │   ├── RegexEntities.cs
│           │       │   │   │   ├── RegexEntities.json
│           │       │   │   │   ├── SimpleEntities.cs
│           │       │   │   │   ├── SimpleEntities.json
│           │       │   │   │   ├── closed-lists.ts
│           │       │   │   │   ├── composite-entities.ts
│           │       │   │   │   ├── contoso-app.ts
│           │       │   │   │   ├── intents.ts
│           │       │   │   │   ├── invalid.json
│           │       │   │   │   ├── pattern-entities.ts
│           │       │   │   │   ├── prebuilt-entities.ts
│           │       │   │   │   ├── regex-entities.ts
│           │       │   │   │   └── simple-entities.ts
│           │       │   │   ├── none.lu
│           │       │   │   ├── qna.lu
│           │       │   │   ├── root.luis.json
│           │       │   │   ├── testcases/
│           │       │   │   │   ├── 1-intent-pattern-prebuilt.lu
│           │       │   │   │   ├── 1-intent.lu
│           │       │   │   │   ├── 8.lu
│           │       │   │   │   ├── Child_Entity_With_Spaces.json
│           │       │   │   │   ├── InvalidLUISModel.json
│           │       │   │   │   ├── InvalidLUISModel1.json
│           │       │   │   │   ├── InvalidLUISModel2.json
│           │       │   │   │   ├── LUISAppWithPAInherits.json
│           │       │   │   │   ├── ListEntityAndBatchtestsProblem.1.lu
│           │       │   │   │   ├── ListEntityAndBatchtestsProblem.2.lu
│           │       │   │   │   ├── ListEntityAndBatchtestsProblem.lu
│           │       │   │   │   ├── MultiturnReplaceKbWithFlattenedTree.json
│           │       │   │   │   ├── Skills/
│           │       │   │   │   │   ├── Calendar/
│           │       │   │   │   │   │   ├── Calendar.lu
│           │       │   │   │   │   │   └── General.lu
│           │       │   │   │   │   ├── Email/
│           │       │   │   │   │   │   ├── Email.lu
│           │       │   │   │   │   │   └── General.lu
│           │       │   │   │   │   └── Todo/
│           │       │   │   │   │       ├── General.lu
│           │       │   │   │   │       └── ToDo.lu
│           │       │   │   │   ├── all-entity-types.lu
│           │       │   │   │   ├── all.json
│           │       │   │   │   ├── all_qna.json
│           │       │   │   │   ├── bad.lu
│           │       │   │   │   ├── bad2.lu
│           │       │   │   │   ├── bad3.lu
│           │       │   │   │   ├── bad3a.lu
│           │       │   │   │   ├── bad4.lu
│           │       │   │   │   ├── bad5.lu
│           │       │   │   │   ├── bf-627.json
│           │       │   │   │   ├── buyChocolate.lu
│           │       │   │   │   ├── calendar_all_prebuilt.json
│           │       │   │   │   ├── collate/
│           │       │   │   │   │   ├── 1.lu
│           │       │   │   │   │   ├── 10.lu
│           │       │   │   │   │   ├── 11.lu
│           │       │   │   │   │   ├── 11.qna
│           │       │   │   │   │   ├── 12.lu
│           │       │   │   │   │   ├── 12.qna
│           │       │   │   │   │   ├── 2.lu
│           │       │   │   │   │   ├── 3.lu
│           │       │   │   │   │   ├── 4.lu
│           │       │   │   │   │   ├── 5.lu
│           │       │   │   │   │   ├── 6.lu
│           │       │   │   │   │   ├── 7.lu
│           │       │   │   │   │   ├── 8.lu
│           │       │   │   │   │   ├── 9.lu
│           │       │   │   │   │   ├── 9a.lu
│           │       │   │   │   │   ├── buyChocolate.lu
│           │       │   │   │   │   ├── changeAlarm.lu
│           │       │   │   │   │   ├── comment.lu
│           │       │   │   │   │   ├── none.lu
│           │       │   │   │   │   ├── patterns1.lu
│           │       │   │   │   │   ├── phraseLists.lu
│           │       │   │   │   │   ├── qna-alterations.qna
│           │       │   │   │   │   ├── qna1.qna
│           │       │   │   │   │   ├── qna2.qna
│           │       │   │   │   │   ├── qna3.qna
│           │       │   │   │   │   ├── qna4.qna
│           │       │   │   │   │   ├── qna5.qna
│           │       │   │   │   │   ├── qna6.lu
│           │       │   │   │   │   ├── qna6.qna
│           │       │   │   │   │   └── qna7.qna
│           │       │   │   │   ├── comment.lu
│           │       │   │   │   ├── deepreference/
│           │       │   │   │   │   ├── qna1.lu
│           │       │   │   │   │   └── qna5.lu
│           │       │   │   │   ├── emptyIntentDescriptors.json
│           │       │   │   │   ├── entityNameWithSpaceAndFeature.json
│           │       │   │   │   ├── faq.lu
│           │       │   │   │   ├── fileReference/
│           │       │   │   │   │   ├── 9.lu
│           │       │   │   │   │   ├── AboutBot.lu
│           │       │   │   │   │   └── L2/
│           │       │   │   │   │       ├── AboutUser.lu
│           │       │   │   │   │       ├── Command.lu
│           │       │   │   │   │       ├── Compliment.lu
│           │       │   │   │   │       ├── Criticism.lu
│           │       │   │   │   │       ├── Dialog.lu
│           │       │   │   │   │       ├── Greeting.lu
│           │       │   │   │   │       ├── Relationship.lu
│           │       │   │   │   │       └── none.lu
│           │       │   │   │   ├── import-resolver/
│           │       │   │   │   │   ├── lu-import-resolver/
│           │       │   │   │   │   │   ├── common.en-us.lu
│           │       │   │   │   │   │   ├── help.en-us.lu
│           │       │   │   │   │   │   ├── terminate.en-us.lu
│           │       │   │   │   │   │   └── welcome.en-us.lu
│           │       │   │   │   │   └── qna-import-resolver/
│           │       │   │   │   │       ├── common.en-us.qna
│           │       │   │   │   │       ├── terminate.en-us.qna
│           │       │   │   │   │       └── welcome.en-us.qna
│           │       │   │   │   ├── intentWithSpace.json
│           │       │   │   │   ├── invalid-alterations.lu
│           │       │   │   │   ├── invalid-entity-definition.lu
│           │       │   │   │   ├── invalid_model.lu
│           │       │   │   │   ├── invalid_prebuilt_1.lu
│           │       │   │   │   ├── invalid_prebuilt_2.lu
│           │       │   │   │   ├── invalid_prebuilt_3.lu
│           │       │   │   │   ├── invalid_prebuilt_4.lu
│           │       │   │   │   ├── list-entity-body-without-hyphen.lu
│           │       │   │   │   ├── lubuild/
│           │       │   │   │   │   ├── file-name-duplicated/
│           │       │   │   │   │   │   ├── Foo.en-us.lu
│           │       │   │   │   │   │   └── Foo.lu
│           │       │   │   │   │   ├── foo/
│           │       │   │   │   │   │   ├── config/
│           │       │   │   │   │   │   │   └── luis.settings.development.westus.json
│           │       │   │   │   │   │   ├── dialogs/
│           │       │   │   │   │   │   │   ├── foo.en-us.lu.dialog
│           │       │   │   │   │   │   │   ├── foo.fr-fr.lu.dialog
│           │       │   │   │   │   │   │   ├── foo.lu.dialog
│           │       │   │   │   │   │   │   └── foo.zh-cn.lu.dialog
│           │       │   │   │   │   │   └── lufiles/
│           │       │   │   │   │   │       ├── foo.fr-fr.lu
│           │       │   │   │   │   │       ├── foo.lu
│           │       │   │   │   │   │       └── foo.zh-cn.lu
│           │       │   │   │   │   ├── foo2/
│           │       │   │   │   │   │   ├── config/
│           │       │   │   │   │   │   │   └── luis.settings.development.westus.json
│           │       │   │   │   │   │   ├── dialogs/
│           │       │   │   │   │   │   │   ├── foo.en-us.lu.dialog
│           │       │   │   │   │   │   │   ├── foo.fr-fr.lu.dialog
│           │       │   │   │   │   │   │   ├── foo.lu.dialog
│           │       │   │   │   │   │   │   └── foo.zh-cn.lu.dialog
│           │       │   │   │   │   │   ├── lufiles-and-dialog-assets/
│           │       │   │   │   │   │   │   ├── foo.en-us.lu.dialog
│           │       │   │   │   │   │   │   ├── foo.fr-fr.lu
│           │       │   │   │   │   │   │   ├── foo.fr-fr.lu.dialog
│           │       │   │   │   │   │   │   ├── foo.lu
│           │       │   │   │   │   │   │   ├── foo.lu.dialog
│           │       │   │   │   │   │   │   ├── foo.zh-cn.lu
│           │       │   │   │   │   │   │   └── luis.settings.development.westus.json
│           │       │   │   │   │   │   └── luis/
│           │       │   │   │   │   │       ├── test(development)-foo.en-us.lu.json
│           │       │   │   │   │   │       └── test(development)-foo.fr-fr.lu.json
│           │       │   │   │   │   └── sandwich/
│           │       │   │   │   │       ├── config/
│           │       │   │   │   │       │   └── luis.settings.development.westus.json
│           │       │   │   │   │       ├── dialogs/
│           │       │   │   │   │       │   ├── sandwich.en-us.lu.dialog
│           │       │   │   │   │       │   └── sandwich.lu.dialog
│           │       │   │   │   │       ├── lufiles/
│           │       │   │   │   │       │   ├── sandwich-BreadEntity.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-CheeseEntity.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-Confirmation.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-DirectionsEntity.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-LengthEntity.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-MeatEntity.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-NameEntity.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-PROPERTYName.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-Price.quantity.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-Quantity.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-QuantityEntity.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-cancelIntent.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-dimension.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-helpIntent.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-money.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-noneIntent.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-number.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-sandwich.lu
│           │       │   │   │   │       │   └── sandwich.en-us.lu
│           │       │   │   │   │       └── luis/
│           │       │   │   │   │           ├── test(development)-sandwich.en-us.lu.json
│           │       │   │   │   │           ├── test(development)-sandwich.utteranceAdded.en-us.lu.json
│           │       │   │   │   │           └── test(development)-sandwich.utteranceChanged.en-us.lu.json
│           │       │   │   │   ├── merge_intents_disabled.lu
│           │       │   │   │   ├── missing-synonyms.lu
│           │       │   │   │   ├── missing-utterance.lu
│           │       │   │   │   ├── missing-utterance2.lu
│           │       │   │   │   ├── multi-ref.lu
│           │       │   │   │   ├── multiturn.qna
│           │       │   │   │   ├── nested-luis-json.json
│           │       │   │   │   ├── newEntity1.json
│           │       │   │   │   ├── newEntity2.json
│           │       │   │   │   ├── overlappingEntities.json
│           │       │   │   │   ├── phraseLists.lu
│           │       │   │   │   ├── plFeatureDisabled.json
│           │       │   │   │   ├── plWithFlags.lu
│           │       │   │   │   ├── prebuilt-entity.lu
│           │       │   │   │   ├── prebuilt_model.json
│           │       │   │   │   ├── qna-alterations_Alterations.json
│           │       │   │   │   ├── qna-filter-line-without-hyphen.lu
│           │       │   │   │   ├── qna-question-line-without-hyphen.lu
│           │       │   │   │   ├── qnaDocuments.json
│           │       │   │   │   ├── qnaref.qna
│           │       │   │   │   ├── reduced.lu
│           │       │   │   │   ├── ref1.lu
│           │       │   │   │   ├── ref10.lu
│           │       │   │   │   ├── ref11.lu
│           │       │   │   │   ├── ref12.lu
│           │       │   │   │   ├── ref13.lu
│           │       │   │   │   ├── ref14.qna
│           │       │   │   │   ├── ref15.qna
│           │       │   │   │   ├── ref2.lu
│           │       │   │   │   ├── ref3.qna
│           │       │   │   │   ├── ref4.lu
│           │       │   │   │   ├── ref5.lu
│           │       │   │   │   ├── ref6.lu
│           │       │   │   │   ├── ref7.lu
│           │       │   │   │   ├── ref8.lu
│           │       │   │   │   ├── ref9.lu
│           │       │   │   │   ├── ref_src1.lu
│           │       │   │   │   ├── ref_src2.lu
│           │       │   │   │   ├── regexmodel.luis
│           │       │   │   │   ├── root.lu
│           │       │   │   │   ├── root2.lu
│           │       │   │   │   ├── root3.lu
│           │       │   │   │   ├── section_disabled.lu
│           │       │   │   │   ├── section_disabled2.lu
│           │       │   │   │   ├── section_enabled.lu
│           │       │   │   │   ├── section_enabled2.lu
│           │       │   │   │   ├── special-char-in-entity-type.lu
│           │       │   │   │   ├── test269-d.json
│           │       │   │   │   ├── testTokenizerVersion.json
│           │       │   │   │   ├── testcases-data.js
│           │       │   │   │   ├── translate-testcase-data.js
│           │       │   │   │   ├── translate-with-number.lu
│           │       │   │   │   ├── utterance-without-hyphen.lu
│           │       │   │   │   ├── v6WithoutPhraseLists.lu
│           │       │   │   │   └── v7app.json
│           │       │   │   ├── translation/
│           │       │   │   │   ├── en/
│           │       │   │   │   │   ├── qna.json
│           │       │   │   │   │   ├── qna.lu
│           │       │   │   │   │   └── translateLuResponse.json
│           │       │   │   │   ├── files/
│           │       │   │   │   │   ├── allEntities.lu
│           │       │   │   │   │   ├── bad.lu
│           │       │   │   │   │   ├── fileRef.lu
│           │       │   │   │   │   ├── intentsAndUtterances.lu
│           │       │   │   │   │   ├── labelledEntityValue.lu
│           │       │   │   │   │   ├── newEntity.lu
│           │       │   │   │   │   ├── normalizedValue.lu
│           │       │   │   │   │   ├── options.lu
│           │       │   │   │   │   ├── phraseList.lu
│           │       │   │   │   │   ├── qna.lu
│           │       │   │   │   │   └── qnaContent.lu
│           │       │   │   │   ├── fr/
│           │       │   │   │   │   ├── qna.json
│           │       │   │   │   │   ├── qna.lu
│           │       │   │   │   │   └── root.luis.json
│           │       │   │   │   ├── serviceresponses/
│           │       │   │   │   │   ├── allEntities.json
│           │       │   │   │   │   ├── fileRef.json
│           │       │   │   │   │   ├── intentsAndUtterances.json
│           │       │   │   │   │   ├── labelledEntityValue.json
│           │       │   │   │   │   ├── newEntity.json
│           │       │   │   │   │   ├── normalizedValue.json
│           │       │   │   │   │   ├── options.json
│           │       │   │   │   │   ├── phraseList.json
│           │       │   │   │   │   ├── qna.json
│           │       │   │   │   │   └── qnaContent.json
│           │       │   │   │   ├── translateLuResponse.json
│           │       │   │   │   ├── translateLuResponseSecond.json
│           │       │   │   │   ├── translateLuisResponse.json
│           │       │   │   │   ├── translateLuisResponseSecond.json
│           │       │   │   │   └── translatedfiles/
│           │       │   │   │       ├── allEntities.lu
│           │       │   │   │       ├── fileRef.lu
│           │       │   │   │       ├── intentsAndUtterances.lu
│           │       │   │   │       ├── labelledEntityValue.lu
│           │       │   │   │       ├── newEntity.lu
│           │       │   │   │       ├── normalizedValue.lu
│           │       │   │   │       ├── options.lu
│           │       │   │   │       ├── phraseList.lu
│           │       │   │   │       ├── qna.lu
│           │       │   │   │       └── qnaContent.lu
│           │       │   │   └── verified/
│           │       │   │       ├── 1.json
│           │       │   │       ├── 1.lu
│           │       │   │       ├── 11.json
│           │       │   │       ├── 12.json
│           │       │   │       ├── 12qna.json
│           │       │   │       ├── 13.json
│           │       │   │       ├── 2.json
│           │       │   │       ├── 3.json
│           │       │   │       ├── 4.json
│           │       │   │       ├── 5.json
│           │       │   │       ├── 6.json
│           │       │   │       ├── 7.json
│           │       │   │       ├── 9.json
│           │       │   │       ├── 9a.json
│           │       │   │       ├── Child_Entity_With_Spaces.lu
│           │       │   │       ├── LUISAppWithPAInherits.lu
│           │       │   │       ├── LUISAppWithPAInherits.lu.json
│           │       │   │       ├── ListEntityAndBatchtestsProblem.1_LUISBatchTest.json
│           │       │   │       ├── ListEntityAndBatchtestsProblem.2_LUISBatchTest.json
│           │       │   │       ├── ListEntityAndBatchtestsProblem_LUISBatchTest.json
│           │       │   │       ├── MultiturnReplaceKbWithFlattenedTree.qna
│           │       │   │       ├── Skills/
│           │       │   │       │   ├── Calendar.json
│           │       │   │       │   ├── Email.json
│           │       │   │       │   └── ToDo.json
│           │       │   │       ├── all-entity-types.json
│           │       │   │       ├── all-qna.json
│           │       │   │       ├── all.json
│           │       │   │       ├── allGen.lu
│           │       │   │       ├── allGenQnA.lu
│           │       │   │       ├── allRefresh.lu
│           │       │   │       ├── allall-qna.lu
│           │       │   │       ├── alterations_qna4.json
│           │       │   │       ├── buyChocolate.json
│           │       │   │       ├── calendar_all_prebuilt.lu
│           │       │   │       ├── calendar_all_prebuilt_parsed.json
│           │       │   │       ├── collate-qna.json
│           │       │   │       ├── collate_Alterations.json
│           │       │   │       ├── collate_alteration_gen.lu
│           │       │   │       ├── collate_refresh.lu
│           │       │   │       ├── collated-luis.json
│           │       │   │       ├── collated-luis_LUISBatchTest.json
│           │       │   │       ├── de/
│           │       │   │       │   ├── all.lu
│           │       │   │       │   ├── faq.lu
│           │       │   │       │   ├── reduced.lu
│           │       │   │       │   └── translate-with-number.lu
│           │       │   │       ├── emptyIntentDescriptors.lu
│           │       │   │       ├── importUrl.json
│           │       │   │       ├── luis_sorted.lu
│           │       │   │       ├── merge_intents_disabled.json
│           │       │   │       ├── modelAsFeatureGen.lu
│           │       │   │       ├── modelAsFeatures.json
│           │       │   │       ├── modelAsFeatures.lu
│           │       │   │       ├── modelInfo.lu
│           │       │   │       ├── multiturn.json.qna
│           │       │   │       ├── multiturn.qna.json
│           │       │   │       ├── nDepthEntity.json
│           │       │   │       ├── nDepthEntity.lu
│           │       │   │       ├── nDepthEntityInUtterance.json
│           │       │   │       ├── nDepthEntityInUtterance.lu
│           │       │   │       ├── newEntity1.lu
│           │       │   │       ├── newEntity2.lu
│           │       │   │       ├── newEntityWithFeatures.json
│           │       │   │       ├── newEntityWithFeatures.lu
│           │       │   │       ├── plFeatures.json
│           │       │   │       ├── plFeatures.lu
│           │       │   │       ├── plWithFlags.json
│           │       │   │       ├── prebuilt-entity.json
│           │       │   │       ├── prebuilt_mode.lu
│           │       │   │       ├── prebuilt_model_parse.json
│           │       │   │       ├── qna5.json
│           │       │   │       ├── qna_a_sorted.lu
│           │       │   │       ├── qna_sorted.lu
│           │       │   │       ├── ref1.json
│           │       │   │       ├── ref14_a.json
│           │       │   │       ├── ref15_a.json
│           │       │   │       ├── ref4.json
│           │       │   │       ├── ref5.json
│           │       │   │       ├── ref6.json
│           │       │   │       ├── ref7.json
│           │       │   │       ├── ref8.json
│           │       │   │       ├── referenceUrl.json
│           │       │   │       ├── referenceUrlWithWildCard.json
│           │       │   │       ├── regexmodel.lu
│           │       │   │       ├── root.json
│           │       │   │       ├── root2.json
│           │       │   │       ├── root2_luis.json
│           │       │   │       ├── root3.lu
│           │       │   │       ├── root_luis.json
│           │       │   │       ├── section_disabled.json
│           │       │   │       ├── section_disabled2.json
│           │       │   │       ├── section_enabled.json
│           │       │   │       ├── section_enabled2.json
│           │       │   │       ├── sorted.lu
│           │       │   │       ├── special-char-in-entity-type.json
│           │       │   │       ├── stdin-qna.lu
│           │       │   │       ├── stdin.lu
│           │       │   │       ├── test269-d.lu
│           │       │   │       ├── v5Upgrade.json
│           │       │   │       ├── v5UpgradeTest.lu
│           │       │   │       ├── v6WithoutPhraseLists.json
│           │       │   │       ├── v7UpgradeTest.json
│           │       │   │       ├── v7UpgradeTest.lu
│           │       │   │       ├── v7app.lu
│           │       │   │       ├── v7app_c.json
│           │       │   │       └── zh-Hans/
│           │       │   │           └── reduced.lu
│           │       │   ├── hook.js
│           │       │   ├── mocha.opts
│           │       │   ├── parser/
│           │       │   │   ├── cross-train/
│           │       │   │   │   └── crossTrainer.test.js
│           │       │   │   ├── lu/
│           │       │   │   │   └── lu.test.js
│           │       │   │   ├── lubuild/
│           │       │   │   │   └── lubuild.test.js
│           │       │   │   ├── lufile/
│           │       │   │   │   ├── appKbMetaData.test.js
│           │       │   │   │   ├── classes/
│           │       │   │   │   │   └── classes.test.js
│           │       │   │   │   ├── helpers.test.js
│           │       │   │   │   ├── luQnAFileReference.test.js
│           │       │   │   │   ├── luis.boundary.test.js
│           │       │   │   │   ├── lutranslator.test.js
│           │       │   │   │   ├── newEntityDefinitionWithSpaces.test.js
│           │       │   │   │   ├── parseFileContents.NewEntityDefinition.test.js
│           │       │   │   │   ├── parseFileContents.comments.test.js
│           │       │   │   │   ├── parseFileContents.composeEntity.test.js
│           │       │   │   │   ├── parseFileContents.featureToModels.test.js
│           │       │   │   │   ├── parseFileContents.modelAsFeature.test.js
│           │       │   │   │   ├── parseFileContents.nDepthEntity.test.js
│           │       │   │   │   ├── parseFileContents.newEntityInUtterance.test.js
│           │       │   │   │   ├── parseFileContents.parseFile.test.js
│           │       │   │   │   ├── parseFileContents.qnafile.test.js
│           │       │   │   │   ├── parseFileContents.regexEntity.test.js
│           │       │   │   │   ├── parseFileContents.roleTest.test.js
│           │       │   │   │   ├── qnaMultiTurnAndReferences.test.js
│           │       │   │   │   ├── sectionapi.test.js
│           │       │   │   │   └── urlReference.test.js
│           │       │   │   ├── luis/
│           │       │   │   │   └── luisBuilder.test.js
│           │       │   │   ├── qna/
│           │       │   │   │   └── qnaMakerBuilder.test.js
│           │       │   │   └── qnabuild/
│           │       │   │       └── qnabuild.test.js
│           │       │   ├── tsconfig.json
│           │       │   └── utils/
│           │       │       └── filehelper.test.js
│           │       ├── tsconfig.json
│           │       └── tslint.json
│           ├── rush.json
│           └── scripts/
│               └── fixurls.js
├── schemas/
│   ├── component/
│   │   ├── component.schema
│   │   ├── definitions.schema
│   │   ├── readme.md
│   │   └── v1.0/
│   │       └── component.schema
│   ├── protocol/
│   │   └── botframework.json
│   ├── readme.md
│   ├── skills/
│   │   ├── SchemaManifestTests/
│   │   │   ├── SchemaManifestTests.csproj
│   │   │   ├── SchemaManifestTests.sln
│   │   │   └── ValidateSchemaTests.cs
│   │   ├── readme.md
│   │   ├── skill-manifest-2.0.0.json
│   │   ├── skill-manifest-2.1.preview-1.json
│   │   ├── v2.0/
│   │   │   ├── samples/
│   │   │   │   ├── complex-skillmanifest.json
│   │   │   │   ├── echo-skillmanifest.json
│   │   │   │   └── simple-skillmanifest.json
│   │   │   └── skill-manifest.json
│   │   ├── v2.1/
│   │   │   ├── samples/
│   │   │   │   ├── complex-pva-manifest.json
│   │   │   │   ├── complex-skillmanifest.json
│   │   │   │   ├── echo-skillmanifest.json
│   │   │   │   └── simple-skillmanifest.json
│   │   │   └── skill-manifest.json
│   │   ├── v2.1.preview-1/
│   │   │   ├── samples/
│   │   │   │   ├── complex-skillmanifest.json
│   │   │   │   ├── echo-skillmanifest.json
│   │   │   │   └── simple-skillmanifest.json
│   │   │   └── skill-manifest.json
│   │   └── v2.2/
│   │       ├── samples/
│   │       │   ├── complex-pva-manifest.json
│   │       │   ├── complex-skillmanifest.json
│   │       │   ├── echo-skillmanifest.json
│   │       │   ├── relativeUris/
│   │       │   │   ├── complex-skillmanifest.json
│   │       │   │   ├── knowledge-base/
│   │       │   │   │   ├── SkillBot-QnA-en.qna
│   │       │   │   │   ├── SkillBot-QnA-es-ES.qna
│   │       │   │   │   └── SkillBot-QnA-es-MX.qna
│   │       │   │   ├── language-understanding/
│   │       │   │   │   ├── SkillBot-en.lu
│   │       │   │   │   ├── SkillBot-es-ES.lu
│   │       │   │   │   └── SkillBot-es-MX.lu
│   │       │   │   └── privacy.html
│   │       │   └── simple-skillmanifest.json
│   │       └── skill-manifest.json
│   └── ui/
│       └── v1.0/
│           └── ui.schema
├── specs/
│   ├── botframework-activity/
│   │   ├── botframework-activity.md
│   │   └── botframework-cards.md
│   ├── botframework-protocol/
│   │   ├── botframework-channel.json
│   │   ├── channel-update-spec.md
│   │   ├── directline-1.1.json
│   │   └── directline-3.0.json
│   ├── component-model/
│   │   └── overview.md
│   ├── manifest/
│   │   ├── botframework-manifest.md
│   │   ├── example.man
│   │   └── manifest.json
│   ├── testing/
│   │   ├── skills/
│   │   │   ├── SkillsFunctionalTesting.md
│   │   │   ├── SkillsMatrixTesting.md
│   │   │   ├── SkillsScopeInformation.md
│   │   │   ├── media/
│   │   │   │   └── src/
│   │   │   │       └── SkillsFunctionalTestingDiagrams.pptx
│   │   │   └── scenarios/
│   │   │       ├── AuthWithOAuthCard.md
│   │   │       ├── AuthWithSSO.md
│   │   │       ├── CardActionsWithInvokes.md
│   │   │       ├── DraftScenarios.md
│   │   │       ├── MultiTurnInteraction.md
│   │   │       ├── ProactiveMessage.md
│   │   │       ├── SingleTurnInteraction.md
│   │   │       ├── SkillCallsSkill.md
│   │   │       ├── SkillReceivesAttachment.md
│   │   │       ├── SkillStartsConversation.md
│   │   │       ├── TeamsAPI.md
│   │   │       ├── TeamsSkillWithTaskModule.md
│   │   │       └── UpdateDeleteAdaptiveCard.md
│   │   └── testing.md
│   └── transcript/
│       └── transcript.md
└── tools/
    └── changelog/
        ├── .gitignore
        └── git-log.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
root = true

[*]
insert_final_newline = true

[*.json]
indent_style = space
indent_size = 4

[*.schema]
indent_style = space
indent_size = 4


================================================
FILE: .gitattributes
================================================
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=crlf

###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs     diff=csharp

###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following 
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln       merge=binary
#*.csproj    merge=binary
#*.vbproj    merge=binary
#*.vcxproj   merge=binary
#*.vcproj    merge=binary
#*.dbproj    merge=binary
#*.fsproj    merge=binary
#*.lsproj    merge=binary
#*.wixproj   merge=binary
#*.modelproj merge=binary
#*.sqlproj   merge=binary
#*.wwaproj   merge=binary

###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg   binary
#*.png   binary
#*.gif   binary

###############################################################################
# diff behavior for common document formats
# 
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the 
# entries below.
###############################################################################
#*.doc   diff=astextplain
#*.DOC   diff=astextplain
#*.docx  diff=astextplain
#*.DOCX  diff=astextplain
#*.dot   diff=astextplain
#*.DOT   diff=astextplain
#*.pdf   diff=astextplain
#*.PDF   diff=astextplain
#*.rtf   diff=astextplain
#*.RTF   diff=astextplain


================================================
FILE: .github/CODEOWNERS
================================================
# Lines starting with '#' are comments.
# Each line is a file pattern followed by one or more owners.

# More details are here: https://help.github.com/articles/about-codeowners/

# The '*' pattern is global owners.

# Order is important. The last matching pattern has the most precedence.
# The folders are ordered as follows:

# In each subsection folders are ordered first by depth, then alphabetically.
# This should make it easy to add new rules without breaking existing ones.

# Global rule:
* @microsoft/botframework-sdk

================================================
FILE: .github/ISSUE_TEMPLATE/bot-framework-bug.md
================================================
---
name: Bug
about: Report a new Bot Framework bug.
title: ""
labels: "needs-triage, bug"
assignees: ""
---

### [Github issues](https://github.com/microsoft/botframework-sdk) should be used for bugs and feature requests. Use [Stack Overflow](https://stackoverflow.com/questions/tagged/botframework) for general "how-to" questions. 

## Version
What package version of the SDK are you using.

## Describe the bug
Give a clear and concise description of what the bug is.

## To Reproduce
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

## Expected behavior
Give a clear and concise description of what you expected to happen.

## Screenshots
If applicable, add screenshots to help explain your problem.

## Additional context
Add any other context about the problem here.

## Tracking Status

**Dotnet SDK** [TODO]()
- [ ] PR
- [ ] Merged

**Javascript SDK** [TODO]()
- [ ] PR
- [ ] Merged

**Python SDK** [TODO]()
- [ ] PR
- [ ] Merged

**Java SDK** [TODO]()
- [ ] PR
- [ ] Merged

**Samples** [TODO]()
- [ ] PR
- [ ] Merged

**Docs** [TODO]()
- [ ] PR
- [ ] Merged

**Tools** [TODO]()
- [ ] PR
- [ ] Merged

================================================
FILE: .github/ISSUE_TEMPLATE/bot-framework-feature-request.md
================================================
---
name: Feature Request
about: Create a new Bot Framework feature request.
title: ""
labels: "needs-triage, feature-request"
assignees: ""
---

## This is not for asking questions or filing bugs

To get help with an issue with your bot
* ["How To"](https://stackoverflow.com/help/how-to-ask) questions should be submitted on [Stack Overflow](https://stackoverflow.com/questions/tagged/botframework).

To file an issue against a component please go to the components repo
* [Create Azure Bot Framework Service or Channel issue](https://github.com/Microsoft/botframework-services/issues/new/choose)
* [Create Bot Builder Tools issue](https://github.com/Microsoft/botbuilder-tools/issues/new/choose)
* [Create Bot Builder SDK V3 (.NET or Javascript) issue](https://github.com/Microsoft/botbuilder-V3/issues/new/choose)
* [Create Bot Builder SDK V4 .NET issue](https://github.com/Microsoft/botbuilder-dotnet/issues/new/choose)
* [Create Bot Builder SDK V4 Javascript issue](https://github.com/Microsoft/botbuilder-js/issues/new/choose)
* [Create Bot Builder SDK V4 Java issue](https://github.com/Microsoft/botbuilder-java/issues/new/choose)
* [Create Bot Builder SDK V4 Python issue](https://github.com/Microsoft/botbuilder-python/issues/new/choose)

## Issue

*Describe the issue you are addressing*

## Proposed change

*Describe the proposed solution*

## Component Impact 

*Describe which components need to be updated*

## Customer Impact 

*Describe the impact on customers*

## Tracking Status

**Dotnet SDK** [TODO]()
- [ ] PR
- [ ] Merged

**Javascript SDK** [TODO]()
- [ ] PR
- [ ] Merged

**Python SDK** [TODO]()
- [ ] PR
- [ ] Merged

**Java SDK** [TODO]()
- [ ] PR
- [ ] Merged

**Samples** [TODO]()
- [ ] PR
- [ ] Merged

**Docs** [TODO]()
- [ ] PR
- [ ] Merged

**Tools** [TODO]()
- [ ] PR
- [ ] Merged


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
Fixes #<!-- If this addresses a specific issue, please provide the issue number here -->

## Proposed Changes
<!-- Please discuss the changes you have worked on. What do the changes do; why is this PR needed? -->
<!-- You must demonstrate that the code works. Include screenshots of the code in action -->

  - 
  -
  -


## Testing
<!-- If you are adding a new feature to a library, you must include tests for your new code. -->

================================================
FILE: .github/issue_template.md
================================================
## This is not for asking questions or filing bugs

To get help with an issue with your bot
* ["How To"](https://stackoverflow.com/help/how-to-ask) questions should be submitted on [Stack Overflow](https://stackoverflow.com/questions/tagged/botframework) where there is a robust community to help you

To file an issue against a component please go to the components repo
* [Create Azure Bot Framework Service or Channel issue](https://github.com/Microsoft/botframework-services/issues/new/choose)
* [Create Bot Builder Tools issue](https://github.com/Microsoft/botbuilder-tools/issues/new/choose)
* [Create Bot Builder SDK V3 (.NET or Javascript) issue](https://github.com/Microsoft/botbuilder-V3/issues/new/choose)
* [Create Bot Builder SDK V4 .NET issue](https://github.com/Microsoft/botbuilder-dotnet/issues/new/choose)
* [Create Bot Builder SDK V4 Javascript issue](https://github.com/Microsoft/botbuilder-js/issues/new/choose)
* [Create Bot Builder SDK V4 Java issue](https://github.com/Microsoft/botbuilder-java/issues/new/choose)
* [Create Bot Builder SDK V4 Python issue](https://github.com/Microsoft/botbuilder-python/issues/new/choose)



================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
ecf/
rcf/

bones/
.vs/
.vscode/
.config/

# Python virtual environments
**/*env/


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Microsoft Open Source Code of Conduct

This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).

Resources:

- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)
- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)
- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns


================================================
FILE: Common/Telemetry/README.md
================================================


# Telemetry Analytics

Bot Analytics provides telemetry for analyzing conversation activities.

## Requirements

To enable bot analytics: 

* [Add Telemetry](https://aka.ms/AddBotTelemetry) via Application Insights in the Bot Code
* [Enable Application Insights](https://docs.microsoft.com/en-us/azure/bot-service/bot-service-resources-app-insights-keys?view=azure-bot-service-4.0) on Azure Bot Service

Once active, basic visualization is available out of the box on Azure Bot Service. In addition, one can deploy and customize more advanced analytics views. 

## Conversation Health Dashboard

The Conversation Health Dashboard template presents analytics view of bot conversation activity. 

<TBD: Are there 2 templates? PBI & AppInsights? Need to describe and provide instructions for both>

### Instructions

<TBD: how to customize and deploy>



## See Also

* [Analyze Bot Telemetry](https://aka.ms/AnalyzeBotTelemetry) : Learn how to analyze Application Insights log analytics data.
* See [Azure ARM templates](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/quickstart-create-templates-use-the-portal) Documentation



================================================
FILE: Common/Transcripts/CoreExtensionsTests/ConversationStateTest.chat
================================================
bot=bot
user=user

user:start test
bot:bot message
user:set foo
user:read
bot:value:foo
user:delete
user:read
bot:value:
user:set bar
user:set test
user:read
bot:value:test
user:read
bot:value:test
user:delete
user:read
bot:value:

================================================
FILE: Common/Transcripts/CoreExtensionsTests/CustomStateTest.chat
================================================
bot=bot
user=user

user:start test
bot:bot message
user:set foo
user:read
bot:value:foo
user:delete
user:read
bot:value:
user:set bar
user:set test
user:read
bot:value:test
user:read
bot:value:test
user:delete
user:read
bot:value:

================================================
FILE: Common/Transcripts/CoreExtensionsTests/UserStateTest.chat
================================================
bot=bot
user=user

user:start test
bot:bot message
user:set foo
user:read
bot:value:foo
user:delete
user:read
bot:value:
user:set bar
user:set test
user:read
bot:value:test
user:read
bot:value:test
user:delete
user:read
bot:value:

================================================
FILE: Common/Transcripts/CoreTests/BotAdapted_Bracketing.chat
================================================
bot=bot
user=user

bot:before message
bot:conversationUpdate
bot:after message
user:use middleware
bot:before message
bot:using middleware
bot:after message
user:catch exception
bot:before message
bot:generating exception
bot:Caught: exception to catch



================================================
FILE: Common/Transcripts/DialogsTests/AttachmentPrompt.chat
================================================
user=User
bot=Bot

User: hello
Bot: please add an attachment.
User: [Attachment=ContentAttachment.json]
Bot: some content

================================================
FILE: Common/Transcripts/DialogsTests/ChoicePrompt.chat
================================================
user=user
bot=bot

user: Hello!
bot: favorite color? (1) red, (2) green, or (3) blue
user: red
bot: Bot received the choice 'red'.

user: Hello!
bot: favorite color? (1) red, (2) green, or (3) blue
user: 3
bot: Bot received the choice 'blue'.

user: Hello!
bot: favorite color? (1) red, (2) green, or (3) blue
user: cat
bot: I didn't catch that. Select a color from the list. (1) red, (2) green, or (3) blue
user: green
bot: Bot received the choice 'green'.

================================================
FILE: Common/Transcripts/DialogsTests/ConfirmPrompt.chat
================================================
user=User
bot=Bot

User: hello
Bot: Please confirm.
User: hello
Bot: Please confirm, say 'yes' or 'no' or something like that.
User: no
Bot: Not confirmed.

User: hello
Bot: Please confirm.
User: yes
Bot: Confirmed.


================================================
FILE: Common/Transcripts/DialogsTests/ContentAttachment.json
================================================
"some content"

================================================
FILE: Common/Transcripts/DialogsTests/DateTimePrompt.chat
================================================
user=User
bot=Bot

User: hello
Bot: What date would you like?
User: cat
Bot: Sorry, but that is not a date. What date would you like?
User: 31 February 2018
Bot: Timex:'2018-02-31' Value:'not resolved'

User: hello
Bot: What date would you like?
User: 5th December 2018 at 9am
Bot: Timex:'2018-12-05T09' Value:'2018-12-05 09:00:00'

================================================
FILE: Common/Transcripts/DialogsTests/NumberPrompt.chat
================================================
user=User
bot=Bot

User: hello
Bot: Enter a number.
User: hello
Bot: You must enter a valid positive number less than 100.
User: 150
Bot: You must enter a valid positive number less than 100.
User: 64
Bot: Bot received the number '64'.

User: hello
Bot: Enter a number.
User: One
Bot: Bot received the number '1'.

================================================
FILE: Common/Transcripts/DialogsTests/TextPrompt.chat
================================================
user=User
bot=Bot

User: hello
Bot: Enter some text.
User: hi
Bot: Make sure the text is greater than three characters.
User: hello
Bot: Bot received the text 'hello'.

================================================
FILE: Common/Transcripts/DialogsTests/Waterfall.chat
================================================
user=User
bot=Bot

User: hello
Bot: step1
User: hello
Bot: step2
User: hello
Bot: step3

================================================
FILE: Common/Transcripts/DialogsTests/WaterfallNested.chat
================================================
user=User
bot=Bot

User: hello
Bot: step1
Bot: step1.1
User: hello
Bot: step1.2
User: hello
Bot: step2
Bot: step2.1
User: hello
Bot: step2.2

================================================
FILE: Common/Transcripts/DialogsTests/WaterfallPrompt.chat
================================================
user=User
bot=Bot

User: hello
Bot: step1
Bot: Enter a number.
User: hello again
Bot: It must be a number
User: 42
Bot: Thanks for '42'
Bot: step2
Bot: Enter a number.
User: apple
Bot: It must be a number
User: orange
Bot: It must be a number
User: 64
Bot: Thanks for '64'
Bot: step3

================================================
FILE: Common/Transcripts/LuisTests/LuisMiddleware.chat
================================================
user=User
bot=Bot

user:test
bot:default message
user:add imax theater to my upcoming events
bot:intent:Calendar_Add
user:display weekend plans
bot:intent:Calendar_Find
user:test
bot:default message

================================================
FILE: Common/Transcripts/QnATests/QnAMiddleware.chat
================================================
user=User
bot=Bot

user:random text
bot:default message
user:hi
bot:hello
user:test
bot:message
user:tests
bot:message
user:custom random text
bot:default message


================================================
FILE: Common/Transcripts/README.md
================================================
# Bot Builder SDK v4 - Transcript Files

This folder contains the transcript files (.chat files) used in BotBuilder-v4 for testing several components and guarantee the same behavior between the different platform (.NET, NodeJS, Python, Java).

## BotBuilder Developer writing new transcript-based tests

1. Clone/Fork the [BotBuilder repository](https://github.com/Microsoft/BotBuilder).

2. Create a branch and place the new transcripts in the [Common\Transcripts folder](https://github.com/southworkscom/BotBuilder/tree/botbuilder-v4-transcripts/Common/Transcripts) (this can be done locally without actually pushing changes at this stage)

3. Write code and create new tests. Set the `BOTBUILDER_TRANSCRIPTS_LOCATION` Environment var pointing to the local repo / transcript folder.

    E.g.:

    ```shell
    # On *nix:
    export BOTBUILDER_TRANSCRIPTS_LOCATION=~/projects/BotBuilder/Common/Transcripts
    ```


    ```Batchfile
    REM On Windows:
    SET BOTBUILDER_TRANSCRIPTS_LOCATION=C:\Projects\BotBuilder\Common\Transcripts
    ```

4. Run the transcript tests from the platform repository. The code will look into the BOTBUILDER_TRANSCRIPTS_LOCATION folder for all files.

    E.g.:

    ```
    cd transcripts
    npm run test
    ```

## Pushing changes to BotBuilder Repos

1. Create a PR to the [BotBuilder repository](https://github.com/Microsoft/BotBuilder) with the new transcripts.

2. Once the transcripts PR is merged, create a PR to the BotBuilder's platform repository with the code updates and tests.


================================================
FILE: Common/Transcripts/TranslationTests/LocaleConvertToEnglish.chat
================================================
user=User
bot=Bot

user:set language fr-ca
user:Set a meeting on 2018-10-04
bot:message: Set a meeting on 10/4/2018
user:set language fr-fr
user:Set a meeting on 26/08/2018
bot:message: Set a meeting on 8/26/2018
user:set language en-us
user:Set a meeting on 05/29/2018
bot:message: Set a meeting on 05/29/2018


================================================
FILE: Common/Transcripts/TranslationTests/TranslateToEnglish.chat
================================================
user=User
bot=Bot

user:set language es-es
user:Hola
bot:message: Hello
user:set language fr-fr
user:Salut
bot:message: Hello
user:set language en-us
user:Hello
bot:message: Hello


================================================
FILE: Common/Transcripts/TranslationTests/TranslateToUserLanguage.chat
================================================
user=User
bot=Bot

user:set language es-es
user:Hola
bot:mensaje: Hola
user:set language fr-fr
user:Salut
bot:message: Bonjour
user:set language en-us
user:Hello
bot:message: Hello


================================================
FILE: Common/badges/BotBuilderBadge.md
================================================
[![BotBuilder](
https://img.shields.io/badge/Powered%20By-BotBuilder-blue.svg?colorA=black&label=Powered%20By&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIGlkPSJtYXN0ZXItYXJ0Ym9hcmQiIHZpZXdCb3g9IjAgMCAxNDAwIDk4MCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHg9IjBweCIgeT0iMHB4IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxNDAwIDk4MDsiIHdpZHRoPSIxNDAwcHgiIGhlaWdodD0iOTgwcHgiPjxnIHRyYW5zZm9ybT0ibWF0cml4KDYxLjI1MDAwMzgxNDY5NzI2NiwgMCwgMCwgNjEuMjUwMDAzODE0Njk3MjY2LCAyMDkuOTk5OTY4NDY0NjY0LCAtMC4wMDAwMDEwMTc3NTc5OTUyMTQxOTY5KSI%2BPHRpdGxlPmljX2JvdF9mcmFtZXdvcms8L3RpdGxlPjxnIGlkPSJMYXllcl8yIiBkYXRhLW5hbWU9IkxheWVyIDIiPjxnIGlkPSJMYXllcl8xLTIiIGRhdGEtbmFtZT0iTGF5ZXIgMSI%2BPHBhdGggZD0iTSA3LjI4IDggQSAwLjczIDAuNzMgMCAwIDEgNi41NSA4LjczIEEgMC43MyAwLjczIDAgMCAxIDUuODIgOCBBIDAuNzMgMC43MyAwIDAgMSA2LjU1IDcuMjcgQSAwLjczIDAuNzMgMCAwIDEgNy4yOCA4IFoiIHN0eWxlPSJmaWxsOiByZ2IoMjU1LCAyNTUsIDI1NSk7Ii8%2BPHBhdGggZD0iTSAxMC4xOCA4IEEgMC43MyAwLjczIDAgMCAxIDkuNDUgOC43MyBBIDAuNzMgMC43MyAwIDAgMSA4LjcyIDggQSAwLjczIDAuNzMgMCAwIDEgOS40NSA3LjI3IEEgMC43MyAwLjczIDAgMCAxIDEwLjE4IDggWiIgc3R5bGU9ImZpbGw6IHJnYigyNTUsIDI1NSwgMjU1KTsiLz48cGF0aCBkPSJNIDYuOTcwMDAwMjY3MDI4ODA5IDExLjc3MDAwMDQ1Nzc2MzY3MiBMIDMuMjAwMDAwMDQ3NjgzNzE2IDggTCA2Ljk3MDAwMDI2NzAyODgwOSA0LjIzMDAwMDAxOTA3MzQ4NiBMIDYuMjg5OTk5OTYxODUzMDI3IDMuNTM5OTk5OTYxODUzMDI3MyBMIDEuODMwMDAwMDQyOTE1MzQ0MiA4IEwgNi4yODk5OTk5NjE4NTMwMjcgMTIuNDYwMDAwMDM4MTQ2OTczIEwgNi45NzAwMDAyNjcwMjg4MDkgMTEuNzcwMDAwNDU3NzYzNjcyIFoiIHN0eWxlPSJmaWxsOiByZ2IoMjU1LCAyNTUsIDI1NSk7Ii8%2BPHBhdGggZD0iTSA5LjAyOTk5OTczMjk3MTE5MSAxMS43NzAwMDA0NTc3NjM2NzIgTCA5LjcxMDAwMDAzODE0Njk3MyAxMi40NjAwMDAwMzgxNDY5NzMgTCAxNC4xNzAwMDAwNzYyOTM5NDUgOCBMIDkuNzEwMDAwMDM4MTQ2OTczIDMuNTM5OTk5OTYxODUzMDI3MyBMIDkuMDI5OTk5NzMyOTcxMTkxIDQuMjMwMDAwMDE5MDczNDg2IEwgMTIuODAwMDAwMTkwNzM0ODYzIDggTCA5LjAyOTk5OTczMjk3MTE5MSAxMS43NzAwMDA0NTc3NjM2NzIgWiIgc3R5bGU9ImZpbGw6IHJnYigyNTUsIDI1NSwgMjU1KTsiLz48cGF0aCBkPSJNOCwwYTgsOCwwLDEsMCw4LDhBOCw4LDAsMCwwLDgsMFpNOCwxNWE3LDcsMCwxLDEsNy03QTcsNywwLDAsMSw4LDE1WiIgc3R5bGU9ImZpbGw6IHJnYigyNTUsIDI1NSwgMjU1KTsiLz48L2c%2BPC9nPjwvZz48L3N2Zz4%3D)](https://github.com/Microsoft/BotBuilder)

Markdown
```
[![BotBuilder](
https://img.shields.io/badge/Powered%20By-BotBuilder-blue.svg?colorA=black&label=Powered%20By&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIGlkPSJtYXN0ZXItYXJ0Ym9hcmQiIHZpZXdCb3g9IjAgMCAxNDAwIDk4MCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHg9IjBweCIgeT0iMHB4IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxNDAwIDk4MDsiIHdpZHRoPSIxNDAwcHgiIGhlaWdodD0iOTgwcHgiPjxnIHRyYW5zZm9ybT0ibWF0cml4KDYxLjI1MDAwMzgxNDY5NzI2NiwgMCwgMCwgNjEuMjUwMDAzODE0Njk3MjY2LCAyMDkuOTk5OTY4NDY0NjY0LCAtMC4wMDAwMDEwMTc3NTc5OTUyMTQxOTY5KSI%2BPHRpdGxlPmljX2JvdF9mcmFtZXdvcms8L3RpdGxlPjxnIGlkPSJMYXllcl8yIiBkYXRhLW5hbWU9IkxheWVyIDIiPjxnIGlkPSJMYXllcl8xLTIiIGRhdGEtbmFtZT0iTGF5ZXIgMSI%2BPHBhdGggZD0iTSA3LjI4IDggQSAwLjczIDAuNzMgMCAwIDEgNi41NSA4LjczIEEgMC43MyAwLjczIDAgMCAxIDUuODIgOCBBIDAuNzMgMC43MyAwIDAgMSA2LjU1IDcuMjcgQSAwLjczIDAuNzMgMCAwIDEgNy4yOCA4IFoiIHN0eWxlPSJmaWxsOiByZ2IoMjU1LCAyNTUsIDI1NSk7Ii8%2BPHBhdGggZD0iTSAxMC4xOCA4IEEgMC43MyAwLjczIDAgMCAxIDkuNDUgOC43MyBBIDAuNzMgMC43MyAwIDAgMSA4LjcyIDggQSAwLjczIDAuNzMgMCAwIDEgOS40NSA3LjI3IEEgMC43MyAwLjczIDAgMCAxIDEwLjE4IDggWiIgc3R5bGU9ImZpbGw6IHJnYigyNTUsIDI1NSwgMjU1KTsiLz48cGF0aCBkPSJNIDYuOTcwMDAwMjY3MDI4ODA5IDExLjc3MDAwMDQ1Nzc2MzY3MiBMIDMuMjAwMDAwMDQ3NjgzNzE2IDggTCA2Ljk3MDAwMDI2NzAyODgwOSA0LjIzMDAwMDAxOTA3MzQ4NiBMIDYuMjg5OTk5OTYxODUzMDI3IDMuNTM5OTk5OTYxODUzMDI3MyBMIDEuODMwMDAwMDQyOTE1MzQ0MiA4IEwgNi4yODk5OTk5NjE4NTMwMjcgMTIuNDYwMDAwMDM4MTQ2OTczIEwgNi45NzAwMDAyNjcwMjg4MDkgMTEuNzcwMDAwNDU3NzYzNjcyIFoiIHN0eWxlPSJmaWxsOiByZ2IoMjU1LCAyNTUsIDI1NSk7Ii8%2BPHBhdGggZD0iTSA5LjAyOTk5OTczMjk3MTE5MSAxMS43NzAwMDA0NTc3NjM2NzIgTCA5LjcxMDAwMDAzODE0Njk3MyAxMi40NjAwMDAwMzgxNDY5NzMgTCAxNC4xNzAwMDAwNzYyOTM5NDUgOCBMIDkuNzEwMDAwMDM4MTQ2OTczIDMuNTM5OTk5OTYxODUzMDI3MyBMIDkuMDI5OTk5NzMyOTcxMTkxIDQuMjMwMDAwMDE5MDczNDg2IEwgMTIuODAwMDAwMTkwNzM0ODYzIDggTCA5LjAyOTk5OTczMjk3MTE5MSAxMS43NzAwMDA0NTc3NjM2NzIgWiIgc3R5bGU9ImZpbGw6IHJnYigyNTUsIDI1NSwgMjU1KTsiLz48cGF0aCBkPSJNOCwwYTgsOCwwLDEsMCw4LDhBOCw4LDAsMCwwLDgsMFpNOCwxNWE3LDcsMCwxLDEsNy03QTcsNywwLDAsMSw4LDE1WiIgc3R5bGU9ImZpbGw6IHJnYigyNTUsIDI1NSwgMjU1KTsiLz48L2c%2BPC9nPjwvZz48L3N2Zz4%3D)](https://github.com/Microsoft/BotBuilder)
```

================================================
FILE: Contributing.md
================================================
# Instructions for Contributing Code

## Contributing bug fixes and features

The Bot Framework team is currently accepting contributions in the form of bug fixes and new 
features. Any submission must have an issue tracking it in the issue tracker that has
 been approved by the Bot Framework team. Your pull request should include a link to 
 the bug that you are fixing. If you've submitted a PR for a bug, please post a 
 comment in the bug to avoid duplication of effort.

## Legal

If your contribution is more than 15 lines of code, you will need to complete a Contributor 
License Agreement (CLA). Briefly, this agreement testifies that you are granting us permission
 to use the submitted change according to the terms of the project's license, and that the work
  being submitted is under appropriate copyright.

Please submit a Contributor License Agreement (CLA) before submitting a pull request. 
You may visit https://cla.azure.com to sign digitally. Alternatively, download the 
agreement ([Microsoft Contribution License Agreement.docx](https://www.codeplex.com/Download?ProjectName=typescript&DownloadId=822190) or
 [Microsoft Contribution License Agreement.pdf](https://www.codeplex.com/Download?ProjectName=typescript&DownloadId=921298)), sign, scan, 
 and email it back to <cla@microsoft.com>. Be sure to include your github user name along with the agreement. Once we have received the 
 signed CLA, we'll review the request. 


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2016 Microsoft

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: Orchestrator/README.md
================================================
# Orchestrator

Conversational AI applications today are built using disparate technologies to fulfill language understanding (LU) needs, such as [LUIS][1] and [QnA Maker][2]. Often, conversational AI applications are also built by accessing subsequent [skills][3], each of which handle a specific conversation topic and can be built using different LU technologies. Hence, conversational AI applications typically require LU to route an incoming user request to an appropriate skill or to dispatch to a specific sub-component.

Orchestrator is an LU solution optimized for conversational AI applications. It is built ground-up to run locally with your bot. See the [technical overview][18] for additional details.

## Scenarios

**Routing**: For bots, Orchestrator can replace the [LUIS Dispatch tool][5]. You can use Orchestrator instead of Dispatch to arbitrate between multiple [LUIS][1] and [QnA Maker][2] applications. With Orchestrator, you are likely to see:

- Improved classification accuracy.
- Higher resilience to data imbalance across your LUIS and QnA Maker authoring data.
- Ability to correctly dispatch from relatively little authoring data.

**Intent recognition**: You can use Orchestrator as an intent recognizer with [adaptive dialogs][6] to route user input to an appropriate skill or sub-component.

**Entity extraction** is currently experimental and not yet for production use.

## Authoring experience

Orchestrator can be used in different development environments:

- [Bot Framework SDK][24]: Orchestrator can be integrated into your code project by replacing LUIS for intent recognition, such as for skill delegation or dispatching to subsequent language understanding services. See the [SDK integration](#sdk-integration) section for more information. <!--We don't yet document Orchestrator in the SDK docs. Do we need to?-->
- [Bot Framework Composer][19]: Orchestrator can be selected as a recognizer within Bot Framework Composer. At this point there are limitations to using Orchestrator in Composer, primarily around importing of existing models and tuning recognition performance. (To use Orchestrator, enable the feature flag in your Composer settings.) See the [Composer integration](#composer-integration) section for more information.

In most cases, the [Bot Framework CLI][7] is required to prepare and optimize the model for your domain. The [BF Orchestrator command usage][23] page describes how to create, evaluate, and use an Orchestrator model. This diagram illustrates the first part of that process. <!--The diagram leaves off steps 4 and 5.-->

<p align="center">
  <img width="350" src="./docs/media/authoring.png" />
</p>

**Note**: To use the CLI, first install the [Bot Framework CLI][7].

See the [BF Orchestrator command usage][23] page for instructions on how to create and optimize the language model for your bot.

## SDK integration

To use Orchestrator in place of Dispatch in an existing bot:

- Create an _Orchestrator recognizer_ and provide it the path to the base model and your snapshot.
- Use the recognizer's _recognize_ method to recognize user input.

### In a C\# bot

- Install the `Microsoft.Bot.Builder.AI.Orchestrator` NuGet package.
- Install the latest supported version of the [Visual C++ redistributable package](https://support.microsoft.com/help/2977003/the-latest-supported-visual-c-downloads).

```csharp
using Microsoft.Bot.Builder.AI.Orchestrator;

// Get Model and Snapshot path.
string modelPath = Path.GetFullPath(OrchestratorConfig.ModelPath);
string snapshotPath = Path.GetFullPath(OrchestratorConfig.SnapshotPath);

// Create OrchestratorRecognizer.
OrchestratorRecognizer orc = new OrchestratorRecognizer()
{
    ModelPath = modelPath,
    SnapshotPath = snapshotPath
};

// Recognize user input.
var recoResult = await orc.RecognizeAsync(turnContext, cancellationToken);
```

### In a JavaScript bot

- Install the `botbuilder-ai-orchestrator` npm package to your bot.

```javascript
const { OrchestratorRecognizer } = require('botbuilder-ai-orchestrator');

// Create OrchestratorRecognizer.
const dispatchRecognizer = new OrchestratorRecognizer().configure({
            modelPath: process.env.ModelPath,
            snapshotPath: process.env.SnapShotPath
});
// To recognize user input
const recoResult = await dispatchRecognizer.recognize(context);
```

## Composer integration

Orchestrator can be used as recognizer in [Bot Framework Composer][19]. 

In general, to specify Orchestrator as a dialog recognizer:

1. Select **Orchestrator** in the **Recognizer Type** drop-down menu for your bot.
2. Review, evaluate and adjust examples in language data as you would normally for LUIS to ensure recognition quality. 

This enables basic intent recognition. For more advanced scenarios follow the steps above to import and tune up routing quality. For more information about recognizers in Composer, see the discussion of [recognizers](https://docs.microsoft.com/composer/concept-dialog#recognizer) with respect to dialogs in Composer.  Please make sure to follow the latest up-to-date instructions in [Composer documentation][25]

### Model Versions 
Composer is using the pre-selected default base models. With the CLI one can download & use alternate models. To force Composer to use different models, one can specify in the bot advanced settings as follows.

The user can change the model by adding the following to appsettings.json:

```
"orchestrator": {
    "model": {
      "en_intent": "pretrained.20200924.microsoft.dte.00.03.en.onnx",
      "multilingual_intent": "pretrained.20200924.microsoft.dte.00.03.multilingual.onnx"
    }
  }
 ```
If this section is blank or unreadable, we simply use the Orchestrator defaults. If the model is not in the supported Orchestrator list, we throw an error message.

See more on models [here][20].

## Limitations

* Orchestrator is limited to intents only. Entity definitions are ignored and no entity extraction is performed during recognition.

## Platform Support
Orchestrator supports the following platforms.

### OS Support
MacOS v10.14 / v10.15
Ubuntu 18 / 20
Windows 10

### Language Support
Nodejs v10, v12, v14
C# .NET Standard 2.1
C# .NET Core 3.1


## Additional Reading

- [Tech overview][18]
- [API reference][14]
- [Roadmap](./docs/Overview.md#Roadmap)
- [BF CLI Orchestrator commands][11]
- [C# samples][12]
- [NodeJS samples][13]
- [BF Orchestrator Command Usage][23]

See the [School skill navigator](https://github.com/microsoft/BotBuilder-Samples/tree/main/composer-samples/csharp_dotnetcore/projects/OrchestratorSchoolNavigator) for an example of using Orchestrator commandlets to improve the quality of a .lu training set and using Composer to build a bot from examples in .lu format.

[1]:https://luis.ai
[2]:https://qnamaker.ai
[3]:https://docs.microsoft.com/en-us/azure/bot-service/skills-conceptual
[4]:https://en.wikipedia.org/wiki/Transformer_(machine_learning_model)
[5]:https://docs.microsoft.com/azure/bot-service/bot-builder-tutorial-dispatch?tabs=cs
[6]:https://aka.ms/adaptive-dialogs
[7]:https://github.com/microsoft/botframework-cli
[8]:https://github.com/microsoft/botframework-cli/tree/main/packages/luis#bf-luisversionexport
[9]:https://github.com/microsoft/botframework-cli/tree/main/packages/luis#bf-luisconvert
[10]:https://github.com/microsoft/botframework-cli/tree/main/packages/qnamaker#bf-qnamakerkbexport
[11]:https://github.com/microsoft/botframework-cli/tree/main/packages/orchestrator
[12]:https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/csharp_dotnetcore/14.nlp-with-orchestrator
[13]:https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/javascript_nodejs/14.nlp-with-orchestrator
[14]:https://aka.ms/bforchestratorapi
[16]:https://github.com/microsoft/botframework-cli/tree/main/packages/orchestrator#bf-orchestratorcreate
[18]:./docs/Overview.md
[19]: https://docs.microsoft.com/composer/introduction
[20]: https://aka.ms/NLRModels "Natural Language Representation Models"
[21]:https://docs.microsoft.com/azure/bot-service/file-format/bot-builder-lu-file-format "LU file format"
[22]:./docs/BFOrchestratorReport.md "report interpretation"
[23]: ./docs/BFOrchestratorUsage.md "BF Orchestrator command usage"
[24]:https://docs.microsoft.com/azure/bot-service/index-bf-sdk
[25]: https://github.com/microsoft/BotFramework-Composer/blob/main/docs/preview%20features/orchestrator.md "Composer integration instructions"

================================================
FILE: Orchestrator/Samples/CLI/ModelTuning/README.md
================================================
# Improve Language Model with BF CLI

The following sample illustrates how to evaluate and improve a simple language model using the Orchestrator report. You may adopt this process simply by editing the [demo.cmd](./demo.cmd) script to use your language model files.

## Prerequisites

* [Bot Framework CLI][5]
* [Bot Framework CLI Orchestrator plugin][1] 
* An understanding of [Orchestrator][6] feature usage.

## Walkthrough

The following files make up this illustration:

```
demo.cmd: Script run evaluation and produces report
common.lu: Bot Language Model LU
common.test.lu: A test set containing examples not present in  original LU
common.fixed.lu: A corrected Language Model based on evaluation run
```

Assume a bot with a simple language model in [common.lu](./common.lu) file as follows:

```
# Help
- help
- i need help
- please help
- can you please help
- what do you do
- what is this bot for


# BuySurface
- How can I buy {ProductType=Surface PRO}
- I want to buy {ProductType=Surface PRO}
- I want to buy {ProductType=Surface laptop}
- Can I buy {ProductType=Surface PRO} online

# USConstitution
- Tell me about the US Constitution
- US Constitution
- Info on the Constitution
- tell me about the Constitution
- constitution knowledgebase
- constitution faq
- what do you know about the constitution
- The united states constitution

# Restart
- restart
- reset
- start over
- menu
- top menu

# Finance
- pay my bills
- transfer funds
- what's my balance
- get $500 cash

# LUIS
- luis

# Orchestrator
- Orchestrator
- Orch

```

This evaluation examines how the Orchestrator engine can generalize language understanding from a few examples to include phrases never seen before. Hence, for proper language evaluation, the test file [common.test.lu](./common.test.lu) should contain utterances not present in the original "training" set:

```
# Help
- help
- do you have help
- any assistance in this bot?

# BuySurface
- Looking for a computer made by MSFT
- what kind of MS products do you have?

# USConstitution
- Where can I read our founding fathers famous document?
- Is there an analysis of the bill of rights?
- What is that proclamation thing?

# Restart
- reset
- go to the beginning

# Finance
- can i pay with credit card?
- do you use Zelle?
- what is my bank borrowing limit?

# LUIS
- Language Understanding Inteligent Service

# Orchestrator
- Conductor

```

Next, run the [demo.cmd](./demo.cmd) script.  

In first run you need to download the Orchestrator basemodel so execute ```demo.cmd getmodel``` which will download the model and run the test. Consequent runs can reuse the same basemodel (hint: see ```bf orchestrator:basemodel:list``` for alternate models). Also, if you wish to compare to [LUIS](https://luis.ai) results, edit the script with your LUIS application info.

This will produce a report in report folder such as follows:

![Before Correction](./reportbefore.png)

Notice how 5 utterances were misclassified.  For example ```do you use Zelle?``` was classified as *Help* (with low score of 0.2998) instead of *Finance*. Also, note that what led to this misclassification is that the nearest example scored 0.5669 under the *Help* label. 

The observation shows that the concepts for those misclassified utterances are not present in the original  common.lu language model. To correct, we'll add representative examples in the original common.lu file. Note how we don't add the exact utterances, only representative examples:

![Compared LU](./comparedLU.png)

The corrected file is available for reference as [common.fixed.lu](./common.fixed.lu). You may copy it over the common.lu.

Now, re-run the test ```demo.cmd``` and view the resulting report:



![Report After](./reportafter.png)

## Summary

This walkthrough showed how to improve your bot's language model before ever deploying it. It uses BF CLI to test the language model, and use the resulting report to correct the language model. One should construct a language model with as many examples representing expected user utterances. However, it also illustrates how one does not need to account for all utterance permutations, rather only to present concepts within those utterances. The Orchestrator engine generalizes and can accurately detect similar utterances. 

## Additional Reading

- [Orchestrator Documentation][6]
- [BF CLI Orchestrator Command Usage][4]
- [Report Interpretation][3]
- [LU File Format][2]



[1]: https://aka.ms/bforchestratorcli	"Orchestrator Plugin"
[2]: https://docs.microsoft.com/en-us/azure/bot-service/file-format/bot-builder-lu-file-format?view=azure-bot-service-4.0	"LU file format"
[3]: https://aka.ms/bforchestratorreport "report interpretation"
[4]: https://github.com/microsoft/botframework-sdk/blob/main/Orchestrator/docs/BFOrchestratorUsage.md "BF Orchestrator usage"
[5]: https://github.com/microsoft/botframework-cli
[6]: https://aka.ms/bf-orchestrator















================================================
FILE: Orchestrator/Samples/CLI/ModelTuning/common.fixed.lu
================================================
# Help
- help
- i need help
- please help
- can you please help
- what do you do
- what is this bot for


# BuySurface
- How can I buy {ProductType=Surface PRO}
- I want to buy {ProductType=Surface PRO}
- I want to buy {ProductType=Surface laptop}
- Can I buy {ProductType=Surface PRO} online
- Types of MS products?

# USConstitution
- Tell me about the US Constitution
- US Constitution
- Info on the Constitution
- tell me about the Constitution
- constitution knowledgebase
- constitution faq
- what do you know about the constitution
- The united states constitution

# Restart
- restart
- reset
- start over
- menu
- top menu

# Finance
- pay my bills
- transfer funds
- what's my balance
- get $500 cash
- use Zelle
- borrowing limits?

# LUIS
- luis
- Language Understanding

# Orchestrator
- Orchestrator
- Orch
- Conductor organizer



================================================
FILE: Orchestrator/Samples/CLI/ModelTuning/common.lu
================================================
# Help
- help
- i need help
- please help
- can you please help
- what do you do
- what is this bot for


# BuySurface
- How can I buy {ProductType=Surface PRO}
- I want to buy {ProductType=Surface PRO}
- I want to buy {ProductType=Surface laptop}
- Can I buy {ProductType=Surface PRO} online

# USConstitution
- Tell me about the US Constitution
- US Constitution
- Info on the Constitution
- tell me about the Constitution
- constitution knowledgebase
- constitution faq
- what do you know about the constitution
- The united states constitution

# Restart
- restart
- reset
- start over
- menu
- top menu

# Finance
- pay my bills
- transfer funds
- what's my balance
- get $500 cash

# LUIS
- luis

# Orchestrator
- Orchestrator
- Orch



================================================
FILE: Orchestrator/Samples/CLI/ModelTuning/common.test.lu
================================================
# Help
- help
- do you have help
- any assistance in this bot?


# BuySurface
- Looking for a computer made by MSFT
- what kind of MS products do you have?

# USConstitution
- Where can I read our founding fathers famous document?
- Is there an analysis of the bill of rights?
- What is that proclamation thing?

# Restart
- reset
- go to the beginning

# Finance
- can i pay with credit card?
- do you use Zelle?
- what is my bank borrowing limit?


# LUIS
- Language Understanding Inteligent Service

# Orchestrator
- Conductor



================================================
FILE: Orchestrator/Samples/CLI/ModelTuning/demo.cmd
================================================
@echo off
@echo ORCHESTRATOR EVALUATION DEMO

@rem set SEED for different test sets
set SEED=common
set BLU=generated\%SEED%.blu 
set LUFILE=%SEED%.lu
@rem test file contains sample utterances that are not in main LU file.
set TESTFILE=%SEED%.test.lu
@rem proper test
@rem set TESTFILE=%SEED%.test.lu


set LUISKEY=
set LUISAPP=
set LUISHOST=

set SKIPLUIS=0
set QUERYRUN=0

if "%LUISKEY%" == "" (
  @echo Skipping comparison with LUIS. Fill in LUIS info to compare results.
  set SKIPLUIS=1
)

@rem set QUERY to run a single utterance test
set QUERY="what is the american declaration of independence?"

if "%1" == "qonly" (
  set QUERYRUN=1
  goto QUERYONLY
)

@rem model folder needs to be downloaded only once.
if "%1" == "getmodel" (
  if EXIST model rd /s /q model
)

@echo cleaning folders
if EXIST report (
rd /s /q report && md report
)
if EXIST generated (
  rd /s /q generated && md generated
)


@rem Only need to retrieve model once
IF NOT EXIST .\model (
@rem see bf orchestrator:basemodel:get --help to get the non-default model 
@rem see available models via bf orchestrator:basemodel:list
  @echo getting base model
  md model
  call bf orchestrator:basemodel:get  --out model
)
@echo Create orchestrator snapshot .blu file
call bf orchestrator:create --model model --out %BLU% --in %LUFILE%

@echo running orchestrator test to generate a report (see report folder) 
call bf orchestrator:test --in %BLU% --model ./model  --out report --test %TESTFILE%

if "%SKIPLUIS%" == "0" (
  @echo running LUIS test...
  call bf luis:test --subscriptionKey %LUISKEY% --endpoint %LUISHOST% --appId %LUISAPP% --in %TESTFILE% --out report/luisresult.txt
)

:QUERYONLY
@rem Illustrates how to query for only a single utterance. Edit %QUERY% above.
if "%QUERYRUN%" == "1" (

  echo Orchestrator single utterance query:
  echo bf orchestrator:query --in %BLU% --model model --query %QUERY%
  call bf orchestrator:query --in %BLU% --model model --query %QUERY%


  if "%SKIPLUIS%" == "0" (
    echo LUIS single utterance query:
    echo bf luis:application:query --appId LUISAPP --endpoint LUISHOST --subscriptionKey LUISKEY --query %QUERY%
    call bf luis:application:query --appId %LUISAPP% --endpoint %LUISHOST% --subscriptionKey %LUISKEY% --query %QUERY%
  )
)

:DONE



================================================
FILE: Orchestrator/Samples/dotnet/nlp-with-entities/.gitignore
================================================
# Assets generated by luis:build, luis:cross-train
**/model
**/[Gg]enerated
**/*.blu
*.json
**/*.targets
**/*.props
**/*.cache
*.dgspec.json

================================================
FILE: Orchestrator/Samples/dotnet/nlp-with-entities/AdapterWithErrorHandler.cs
================================================
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System;
using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.Integration.AspNet.Core;
using Microsoft.Bot.Builder.TraceExtensions;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;

namespace Microsoft.BotBuilderSamples
{
    public class AdapterWithErrorHandler : BotFrameworkHttpAdapter
    {
        public AdapterWithErrorHandler(IConfiguration configuration, ILogger<BotFrameworkHttpAdapter> logger, ConversationState conversationState = null)
            : base(configuration, logger)
        {
            OnTurnError = async (turnContext, exception) =>
            {
                // Log any leaked exception from the application.
                logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}");

                // Send a message to the user
                await turnContext.SendActivityAsync("The bot encountered an error or bug.");
                await turnContext.SendActivityAsync("To run this sample make sure you have the LUIS and QnA models deployed.");
                await turnContext.SendActivityAsync("To continue to run this bot, please fix the bot source code.");

                if (conversationState != null)
                {
                    try
                    {
                        // Delete the conversationState for the current conversation to prevent the
                        // bot from getting stuck in a error-loop caused by being in a bad state.
                        // ConversationState should be thought of as similar to "cookie-state" in a Web pages.
                        await conversationState.DeleteAsync(turnContext);
                    }
                    catch (Exception e)
                    {
                        logger.LogError(e, $"Exception caught on attempting to Delete ConversationState : {e.Message}");
                    }
                }

                // Send a trace activity, which will be displayed in the Bot Framework Emulator
                await turnContext.TraceActivityAsync("OnTurnError Trace", exception.Message, "https://www.botframework.com/schemas/error", "TurnError");
            };
        }
    }
}


================================================
FILE: Orchestrator/Samples/dotnet/nlp-with-entities/BotServices.cs
================================================
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using Microsoft.Bot.Builder.AI.Luis;
using Microsoft.Bot.Builder.AI.Orchestrator;
using Microsoft.Bot.Builder.AI.QnA;
using Microsoft.Extensions.Configuration;

namespace Microsoft.BotBuilderSamples
{
    public class BotServices : IBotServices
    {
        public BotServices(IConfiguration configuration, OrchestratorRecognizer dispatcher)
        {
            // Read the setting for cognitive services (LUIS, QnA) from the appsettings.json
            // If includeApiResults is set to true, the full response from the LUIS api (LuisResult)
            // will be made available in the properties collection of the RecognizerResult
            LuisHomeAutomationRecognizer = CreateLuisRecognizer(configuration, "LuisHomeAutomationAppId");
            LuisWeatherRecognizer = CreateLuisRecognizer(configuration, "LuisWeatherAppId");

            Dispatch = dispatcher;

            SampleQnA = new QnAMaker(new QnAMakerEndpoint
            {
                KnowledgeBaseId = configuration["QnAKnowledgebaseId"],
                EndpointKey = configuration["QnAEndpointKey"],
                Host = configuration["QnAEndpointHostName"]
            });
        }

        public OrchestratorRecognizer Dispatch { get; private set; }
        
        public QnAMaker SampleQnA { get; private set; }
        
        public LuisRecognizer LuisHomeAutomationRecognizer { get; private set; }

        public LuisRecognizer LuisWeatherRecognizer { get; private set; }

        private LuisRecognizer CreateLuisRecognizer(IConfiguration configuration, string appIdKey)
        {
            var luisApplication = new LuisApplication(
                configuration[appIdKey],
                configuration["LuisAPIKey"],
                configuration["LuisAPIHostName"]);

            // Set the recognizer options depending on which endpoint version you want to use.
            // More details can be found in https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-migration-api-v3
            var recognizerOptions = new LuisRecognizerOptionsV2(luisApplication)
            {
                IncludeAPIResults = true,
                PredictionOptions = new LuisPredictionOptions()
                {
                    IncludeAllIntents = true,
                    IncludeInstanceData = true
                }
            };

            return new LuisRecognizer(recognizerOptions);
        }
    }
}


================================================
FILE: Orchestrator/Samples/dotnet/nlp-with-entities/Bots/DispatchBot.cs
================================================
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Azure.CognitiveServices.Language.LUIS.Runtime.Models;
using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Schema;
using Microsoft.Extensions.Logging;

namespace Microsoft.BotBuilderSamples
{
    public class DispatchBot : ActivityHandler
    {
        private ILogger<DispatchBot> _logger;
        private IBotServices _botServices;

        public DispatchBot(IBotServices botServices, ILogger<DispatchBot> logger)
        {
            _logger = logger;
            _botServices = botServices;
        }

        protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            var dc = new DialogContext(new DialogSet(), turnContext, new DialogState());
            // Top intent tell us which cognitive service to use.
            var allScores = await _botServices.Dispatch.RecognizeAsync(dc, (Activity)turnContext.Activity, cancellationToken);
            var topIntent = allScores.Intents.First().Key;

            // Detected entities which could be used to help with intent dispatching, for example, when top intent score is too low or
            // when there are multiple top intents with close scores.
            var entities = allScores.Entities.Children().Where(t => t.Path != "$instance");
            
            // Next, we call the dispatcher with the top intent.
            await DispatchToTopIntentAsync(turnContext, topIntent, cancellationToken);
        }

        protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
        {
            const string WelcomeText = "Type a greeting, or a question about the weather to get started.";

            foreach (var member in membersAdded)
            {
                if (member.Id != turnContext.Activity.Recipient.Id)
                {
                    await turnContext.SendActivityAsync(MessageFactory.Text($"Welcome to Dispatch bot {member.Name}. {WelcomeText}"), cancellationToken);
                }
            }
        }

        private async Task DispatchToTopIntentAsync(ITurnContext<IMessageActivity> turnContext, string intent, CancellationToken cancellationToken)
        {
            switch (intent)
            {
                case "HomeAutomation":
                    await ProcessHomeAutomationAsync(turnContext, cancellationToken);
                    break;
                case "Weather":
                    await ProcessWeatherAsync(turnContext, cancellationToken);
                    break;
                case "QnAMaker":
                    await ProcessSampleQnAAsync(turnContext, cancellationToken);
                    break;
                default:
                    _logger.LogInformation($"Dispatch unrecognized intent: {intent}.");
                    await turnContext.SendActivityAsync(MessageFactory.Text($"Dispatch unrecognized intent: {intent}."), cancellationToken);
                    break;
            }
        }

        private async Task ProcessHomeAutomationAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            _logger.LogInformation("ProcessHomeAutomationAsync");

            // Retrieve LUIS result for HomeAutomation.
            var recognizerResult = await _botServices.LuisHomeAutomationRecognizer.RecognizeAsync(turnContext, cancellationToken);
            var result = recognizerResult.Properties["luisResult"] as LuisResult;

            var topIntent = result.TopScoringIntent.Intent; 
            
            await turnContext.SendActivityAsync(MessageFactory.Text($"HomeAutomation top intent {topIntent}."), cancellationToken);
            await turnContext.SendActivityAsync(MessageFactory.Text($"HomeAutomation intents detected:\n\n{string.Join("\n\n", result.Intents.Select(i => i.Intent))}"), cancellationToken);
            if (result.Entities.Count > 0)
            {
                await turnContext.SendActivityAsync(MessageFactory.Text($"HomeAutomation entities were found in the message:\n\n{string.Join("\n\n", result.Entities.Select(i => i.Entity))}"), cancellationToken);
            }
        }

        private async Task ProcessWeatherAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            _logger.LogInformation("ProcessWeatherAsync");

            // Retrieve LUIS result for Weather.
            var recognizerResult = await _botServices.LuisWeatherRecognizer.RecognizeAsync(turnContext, cancellationToken);
            var result = recognizerResult.Properties["luisResult"] as LuisResult;
            var topIntent = result.TopScoringIntent.Intent;

            await turnContext.SendActivityAsync(MessageFactory.Text($"ProcessWeather top intent {topIntent}."), cancellationToken);
            await turnContext.SendActivityAsync(MessageFactory.Text($"ProcessWeather Intents detected::\n\n{string.Join("\n\n", result.Intents.Select(i => i.Intent))}"), cancellationToken);
            if (result.Entities.Count > 0)
            {
                await turnContext.SendActivityAsync(MessageFactory.Text($"ProcessWeather entities were found in the message:\n\n{string.Join("\n\n", result.Entities.Select(i => i.Entity))}"), cancellationToken);
            }
        }

        private async Task ProcessSampleQnAAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            _logger.LogInformation("ProcessSampleQnAAsync");

            var results = await _botServices.SampleQnA.GetAnswersAsync(turnContext);
            if (results.Any())
            {
                await turnContext.SendActivityAsync(MessageFactory.Text(results.First().Answer), cancellationToken);
            }
            else
            {
                await turnContext.SendActivityAsync(MessageFactory.Text("Sorry, could not find an answer in the Q and A system."), cancellationToken);
            }
        }
    }
}


================================================
FILE: Orchestrator/Samples/dotnet/nlp-with-entities/CognitiveModels/HomeAutomation.lu
================================================

> LUIS application information
> !# @app.name = Home Automation
> !# @app.desc = Home Automation LUIS application - Bot Builder Samples
> !# @app.versionId = 0.1
> !# @app.culture = en-us
> !# @app.luis_schema_version = 4.0.0
> !# @app.tokenizerVersion = 1.0.0


> # Intent definitions

## ControlDevice
- {@Room=breezeway} on please
- change {@deviceProperty=temperature} to seventy two degrees
- {@Device=coffee bar} on please
- decrease {@deviceProperty=temperature} for me please
- dim {@Room=kitchen} {@Device=lights} to 25 .
- {@Device=fish pond} off please
- {@Device=fish pond} on please
- {@Device=illuminate} please
- {@Room=living room} {@Device=lamp} on please
- {@Room=living room} {@Device=lamps} off please
- lock the {@Device=doors} for me please
- lower your {@deviceProperty=volume}
- make {@Device=camera 1} off please
- make some {@Device=coffee}
- play {@Device=dvd}
- set {@Device=lights} out in {@Room=bedroom}
- set {@Device=lights} to {@deviceProperty=bright}
- set {@Device=lights} to {@deviceProperty=concentrate}
- shut down my work {@Device=computer}
- snap switch {@Device=fan} fifty percent
- start {@Room=master bedroom} {@Device=light}.
- {@Room=theater} on please
- turn {@Device=dimmer} off
- turn off {@Device=ac} please
- turn off {@Room=foyer} {@Device=lights}
- turn off {@Room=living room} {@Device=light}
- turn off {@Device=staircase}
- turn off venice {@Device=lamp}
- turn on {@Room=bathroom} {@Device=heater}
- turn on {@Device=external speaker}
- turn on {@Room=kitchen} {@Device=faucet}
- turn on {@Device=light} in {@Room=bedroom}
- turn on my {@Room=bedroom} {@Device=lights}.
- turn on the {@Room=furnace room} {@Device=lights}
- turn on the internet in my {@Room=bedroom} please
- turn on {@Device=thermostat} please
- turn the {@Device=fan} to high
- turn {@Device=thermostat} on 70.
- {@Device_PatternAny} off [please]
- {@Device_PatternAny} in {Room_PatternAny} on [please]
- turn on {@Device_PatternAny} in {Room_PatternAny}
- turn off {@Device_PatternAny} in {Room_PatternAny}
- {@Device_PatternAny} in {Room_PatternAny} off [please]
- {@Device_PatternAny} on [please]
- turn on {@Device_PatternAny}


## None


> # Entity definitions

@ ml Device

@ ml deviceProperty

@ ml Room


> # PREBUILT Entity definitions

@ prebuilt number


> # Phrase list definitions


> # List entities

@ list Operation = 
	- off :
		- turn off
		- switch off
		- lock
		- out
		- shut down
		- stop
	- on :
		- turn on
		- switch on
		- unlock
		- un lock
		- boot up
		- start


> # RegEx entities


> # Pattern.Any entities

@ patternany Device_PatternAny
@ patternany Room_PatternAny


================================================
FILE: Orchestrator/Samples/dotnet/nlp-with-entities/CognitiveModels/QnAMaker.qna
================================================
# ? hi
```
hello
```

# ? greetings
- good morning
- good evening
```
Hello!
```

# ? What are you?
- What?
- What do you do?
- Who are you?
- What is your name?
- What should I call you?
```
I am the LUIS-QnAMaker Dispatch bot! This sample demonstrates using several LUIS applications and QnA Maker knowledge base using Orchestrator.
```

================================================
FILE: Orchestrator/Samples/dotnet/nlp-with-entities/CognitiveModels/Weather.lu
================================================

> LUIS application information
> !# @app.name = Weather
> !# @app.desc = Weather LUIS application - Bot Builder Samples
> !# @app.versionId = 0.1
> !# @app.culture = en-us
> !# @app.luis_schema_version = 4.0.0


> # Intent definitions

## Get Weather Condition
- current weather ?
- do {@Location=florida} residents usually need ice scrapers
- get {@Location=florence} temperature in september
- get for me the weather conditions in {@Location=sonoma county}
- get the daily temperature {@Location=greenwood indiana}
- get the weather at {@Location=saint george utah}
- how much rain does {@Location=chambersburg} get a year
- show average rainfall for {@Location=boise}
- temperature of {@Location=delhi} in celsius please
- was last year about this time as wet as it is now in the {@Location=south} ?
- what is the rain volume in {@Location=sonoma county} ?
- what to wear in march in {@Location=california}
- what's the weather like in {@Location=minneapolis}
- weather in {@Location_PatternAny}
- how's the weather in {@Location_PatternAny}
- current weather in {@Location_PatternAny}


## Get Weather Forecast
- forecast in celcius
- get the forcast for me
- i want to know the temperature at {@Location=death valley}
- provide me by {@Location=toronto} weather please
- show me the forecast at {@Location=alabama}
- soliciting today's weather
- what is the weather in {@Location=redmond} ?
- what is the weather today at 10 day {@Location=durham} ?
- what will the weather be tomorrow in {@Location=new york} ?
- what's the weather going to be like in {@Location=hawaii} ?
- will it be raining in {@Location=ranchi}
- will it rain this weekend
- will it snow today
- what's the forecast for next week in {@Location_PatternAny}
- show me the forecast for {@Location_PatternAny}
- what's the forecast for {@Location_PatternAny}


## None


> # Entity definitions

@ ml Location


> # PREBUILT Entity definitions


> # Phrase list definitions


> # List entities

> # RegEx entities


> # Pattern.Any entities

@ patternany Location_PatternAny


================================================
FILE: Orchestrator/Samples/dotnet/nlp-with-entities/Controllers/BotController.cs
================================================
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.Integration.AspNet.Core;

namespace Microsoft.BotBuilderSamples
{
    [Route("api/messages")]
    [ApiController]
    public class BotController : ControllerBase
    {
        private IBotFrameworkHttpAdapter _adapter;
        private IBot _bot;

        public BotController(IBotFrameworkHttpAdapter adapter, IBot bot)
        {
            _adapter = adapter;
            _bot = bot;
        }

        [HttpPost]
        public async Task PostAsync()
        {
            // Delegate the processingg of the HTTP POST to the adapter.
            // The adapter will invoke the bot.
            await _adapter.ProcessAsync(Request, Response, _bot);
        }
    }
}


================================================
FILE: Orchestrator/Samples/dotnet/nlp-with-entities/IBotServices.cs
================================================
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using Microsoft.Bot.Builder.AI.Luis;
using Microsoft.Bot.Builder.AI.Orchestrator;
using Microsoft.Bot.Builder.AI.QnA;

namespace Microsoft.BotBuilderSamples
{
    public interface IBotServices
    {
        LuisRecognizer LuisHomeAutomationRecognizer { get; }
        
        LuisRecognizer LuisWeatherRecognizer { get; }

        OrchestratorRecognizer Dispatch { get; }
        
        QnAMaker SampleQnA { get; }
    }
}


================================================
FILE: Orchestrator/Samples/dotnet/nlp-with-entities/OrchestratorConfig.cs
================================================
namespace Microsoft.BotBuilderSamples
{
    public class OrchestratorConfig
    {
        public string SnapshotFile { get; set; }
        
        public string ModelFolder { get; set; }
    }
}


================================================
FILE: Orchestrator/Samples/dotnet/nlp-with-entities/Program.cs
================================================
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Logging;

namespace Microsoft.BotBuilderSamples
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .ConfigureLogging((logging) =>
                {
                    logging.AddDebug();
                    logging.AddConsole();
                })
                .UseStartup<Startup>();
    }
}


================================================
FILE: Orchestrator/Samples/dotnet/nlp-with-entities/README.md
================================================
# NLP with Orchestrator

Bot Framework v4 NLP with Orchestrator (with entity recognition) bot sample

This bot has been created using [Bot Framework](https://dev.botframework.com), it shows how to create a bot that relies on multiple [LUIS.ai](https://www.luis.ai) and [QnAMaker.ai](https://www.qnamaker.ai) models for natural language processing (NLP).

Use the Orchestrator dispatch model in cases when:

- Your bot consists of multiple language modules (LUIS + QnA) and you need assistance in routing user's utterances to these modules in order to integrate the different modules into your bot.
- Create a text classification model from text files.

## Overview

This bot uses Orchestrator to route user utterances to multiple LUIS models and QnA maker services to support multiple conversational scenarios.  This bot sample also demonstrates using Orchestrator for entity recognition.

## Prerequisites

| OS      | Version             | Architectures   |
| ------- | ------------------- | --------------- |
| Windows | 10 (1607+)          | ia32 (x86), x64 |
| MacOS   | 10.15+              | x64             |
| Linux   | Ubuntu 18.04, 20.04 | x64             |

This sample **requires** prerequisites in order to run.
- Install latest supported version of [Visual C++ Redistributable](https://support.microsoft.com/en-gb/help/2977003/the-latest-supported-visual-c-downloads)

- Install latest [Bot Framework Emulator](https://github.com/microsoft/BotFramework-Emulator/releases)

- [.NET Core SDK](https://aka.ms/dotnet-core-applaunch?framework=Microsoft.AspNetCore.App&framework_version=3.1.0&arch=x64&rid=win10-x64) version 3.1
  
  ```bash
  > dotnet --version
  ```
  
- Node v14
 
  ```bash
  > node -v 
  ```
    
- Install BF CLI with Orchestrator plugin
    
    ```bash
    > npm i -g @microsoft/botframework-cli
    ```
    Make sure bf orchestrator command is working and shows all available orchestrator commands
    ```bash
    > bf orchestrator
    ```

## To try this bot sample

- Clone the repository
    ```bash
    > git clone https://github.com/microsoft/botbuilder-samples.git
    ```
    
- CD Orchestrator\Samples\dotnet\nlp-with-entities
    ```bash
    > cd Orchestrator\Samples\dotnet\nlp-with-entities
    ```
    
- Configure the LUIS applications (HomeAutomation and Weather) required for this sample.
    - Get your [LUIS authoring key](https://docs.microsoft.com/en-us/azure/cognitive-services/LUIS/luis-concept-keys)
    ```bash
    > bf luis:build --in CognitiveModels --authoringKey <YOUR-KEY> --botName <YOUR-BOT-NAME>
    ```
    - Update application settings in `./appsettings.json`.  
    
- Configure the QnA Maker KB required for this sample.
    - Get your [QnA Maker Subscription key](https://docs.microsoft.com/en-us/azure/cognitive-services/QnAMaker/how-to/set-up-qnamaker-service-azure#create-a-new-qna-maker-service)
    ```bash
    > bf qnamaker:build --in CognitiveModels --subscriptionKey <YOUR-KEY> --botName <YOUR-BOT-NAME>
    ```
    - Update kb information in `./appsettings.json`
    
- Configure Orchestrator to route utterances to LUIS/QnA language services set up above
    - Download Orchestrator intent and entity base models
    ```bash
    > mkdir model
    > bf orchestrator:basemodel:get --out ./model
    > bf orchestrator:basemodel:get --versionId pretrained.20210218.microsoft.dte.00.06.bert_example_ner.en.onnx --out ./model/entity
    ```
    - Create the Orchestrator snapshot
    ```bash
    > mkdir generated
    > bf orchestrator:create --hierarchical --in ./CognitiveModels --out ./generated --model ./model --entityModel ./model/entity
    ```
    The *hierarchical* flag creates top level intents in the snapshot file derived from the .lu/.qna file names in the input folder.   As a result,  the example utterances are mapped to *HomeAutomation*, *QnAMaker* and *Weather* intents/labels.
    The optional *entityModel* parameter provides path to a pretrained base model for named entity recognition and will be used to compute entity embeddings for Orchestrator snapshot file.

    - Verify appsettings.json has the following:

       ```
      "Orchestrator": {
          "ModelFolder": ".\\model",
          "SnapshotFile": ".\\generated\\orchestrator.blu"
      }
      ```
    
- Run the bot from a terminal or from Visual Studio, choose option A or B.
    A) From a terminal

    ```bash
    > cd samples\csharp_dotnetcore\14.nlp-with-orchestrator
    > dotnet run
    ```
    B) Or from Visual Studio
    - Launch Visual Studio
    - File -> Open -> Project/Solution
    - Navigate to `Orchestrator` folder
    - Select `OrchestratorSamples.sln` file
    - Right click on `01.dispatch-bot` project in the solution and 'Set as Startup Project'
    - Press `F5` to run the project

## Connect to the bot using Bot Framework Emulator

- Launch Bot Framework Emulator
- File -> Open Bot
- Enter a Bot URL of `http://localhost:3978/api/messages`
- Try entering several utterances related to home automation, weather or some chit chat.  Some examples:
    - set lights to bright
    - good morning
    - how is the weather in seattle

## Further reading
- [Dispatch Migration Example](https://github.com/microsoft/botframework-sdk/blob/main/Orchestrator/docs/DispatchMigrationExample.md)
- [Bot Framework Documentation](https://docs.botframework.com)
- [BF Orchestrator Command Usage](https://github.com/microsoft/botframework-sdk/blob/main/Orchestrator/docs/BFOrchestratorUsage.md)
- [Bot Basics](https://docs.microsoft.com/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0)
- [Activity processing](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-concept-activity-processing?view=azure-bot-service-4.0)
- [Azure Bot Service Introduction](https://docs.microsoft.com/azure/bot-service/bot-service-overview-introduction?view=azure-bot-service-4.0)
- [Azure Bot Service Documentation](https://docs.microsoft.com/azure/bot-service/?view=azure-bot-service-4.0)
- [.NET Core CLI tools](https://docs.microsoft.com/en-us/dotnet/core/tools/?tabs=netcore2x)
- [Azure CLI](https://docs.microsoft.com/cli/azure/?view=azure-cli-latest)
- [Azure Portal](https://portal.azure.com)
- [Channels and Bot Connector Service](https://docs.microsoft.com/en-us/azure/bot-service/bot-concepts?view=azure-bot-service-4.0)



================================================
FILE: Orchestrator/Samples/dotnet/nlp-with-entities/Startup.cs
================================================
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System.IO;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.AI.Orchestrator;
using Microsoft.Bot.Builder.Integration.AspNet.Core;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace Microsoft.BotBuilderSamples
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            OrchestratorConfig = configuration.GetSection("Orchestrator").Get<OrchestratorConfig>();
        }

        public OrchestratorConfig OrchestratorConfig { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Latest);

            // Create the Bot Framework Adapter with error handling enabled.
            services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithErrorHandler>();

            services.AddSingleton<OrchestratorRecognizer>(InitializeOrchestrator());

            // Create the bot services (LUIS, QnA) as a singleton.
            services.AddSingleton<IBotServices, BotServices>();

            // Create the bot as a transient.
            services.AddTransient<IBot, DispatchBot>();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseDefaultFiles()
                .UseStaticFiles()
                .UseWebSockets()
                .UseRouting()
                .UseAuthorization()
                .UseEndpoints(endpoints =>
                {
                    endpoints.MapControllers();
                });
        }

        private OrchestratorRecognizer InitializeOrchestrator()
        {
            string modelFolder = Path.GetFullPath(OrchestratorConfig.ModelFolder);
            string snapshotFile = Path.GetFullPath(OrchestratorConfig.SnapshotFile);
            OrchestratorRecognizer orc = new OrchestratorRecognizer()
            {
                ModelFolder = modelFolder,
                SnapshotFile = snapshotFile
            };
            return orc;
        }
    }
}


================================================
FILE: Orchestrator/Samples/dotnet/nlp-with-entities/nlp-with-entities.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <LangVersion>latest</LangVersion>
    <Platforms>x64</Platforms>
  </PropertyGroup>
  <ItemGroup>
    <Content Remove="orchestrator.json" />
  </ItemGroup>
  <ItemGroup>
    <Folder Include="generated\" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Bot.Builder.AI.Luis" Version="4.14.1" />
    <PackageReference Include="Microsoft.Bot.Builder.AI.Orchestrator" Version="4.14.1" />
    <PackageReference Include="Microsoft.Bot.Builder.AI.QnA" Version="4.14.1" />
    <PackageReference Include="Microsoft.Bot.Builder.Integration.AspNet.Core" Version="4.14.1" />
  </ItemGroup>

  <ItemGroup>
    <Content Update="appsettings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Update="model\*">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Update="**\*.lu">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Update="**\*.dialog">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Update="**\*.lg">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
</Project>


================================================
FILE: Orchestrator/Samples/dotnet/nlp-with-entities/wwwroot/default.html
================================================
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Dispatch bot sample with Orchestrator</title>
    <style>
        body {
            margin: 0px;
            padding: 0px;
            font-family: Segoe UI;
        }

        html,
        body {
            height: 100%;
        }

        header {
            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");
            background-repeat: no-repeat;
            background-size: 100%;
            background-position: right;
            background-color: #55A0E0;
            width: 100%;
            font-size: 44px;
            height: 120px;
            color: white;
            padding: 30px 0 40px 0px;
            display: inline-block;
        }

        .header-icon {
            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");
            background-repeat: no-repeat;
            float: left;
            height: 140px;
            width: 140px;
            display: inline-block;
            vertical-align: middle;
        }

        .header-text {
            padding-left: 1%;
            color: #FFFFFF;
            font-family: "Segoe UI";
            font-size: 72px;
            font-weight: 300;
            letter-spacing: 0.35px;
            line-height: 96px;
            display: inline-block;
            vertical-align: middle;
        }

        .header-inner-container {
            min-width: 480px;
            max-width: 1366px;
            margin-left: auto;
            margin-right: auto;
            vertical-align: middle;
        }

        .header-inner-container::after {
            content: "";
            clear: both;
            display: table;
        }

        .main-content-area {
            padding-left: 30px;
        }

        .content-title {
            color: #000000;
            font-family: "Segoe UI";
            font-size: 46px;
            font-weight: 300;
            line-height: 62px;
        }

        .main-text {
            color: #808080;
            font-size: 24px;
            font-family: "Segoe UI";
            font-size: 24px;
            font-weight: 200;
            line-height: 32px;
        }

        .main-text-p1{
            padding-top: 48px;
            padding-bottom: 28px;
        }

        .endpoint {
           height: 32px;
           width: 571px;
           color: #808080;
           font-family: "Segoe UI";
           font-size: 24px;
           font-weight: 200;
           line-height: 32px;
           padding-top: 28px;
        }

        .how-to-build-section {
            padding-top: 20px;
            padding-left: 30px;
        }

        .how-to-build-section>h3 {
            font-size: 16px;
            font-weight: 600;
            letter-spacing: 0.35px;
            line-height: 22px;
            margin: 0 0 24px 0;
            text-transform: uppercase;
        }

        .step-container {
            display: flex;
            align-items: stretch;
            position: relative;
        }

        .step-container dl {
            border-left: 1px solid #A0A0A0;
            display: block;
            padding: 0 24px;
            margin: 0;
        }

        .step-container dl>dt::before {
            background-color: white;
            border: 1px solid #A0A0A0;
            border-radius: 100%;
            content: '';
            left: 47px;
            height: 11px;
            position: absolute;
            width: 11px;
        }

        .step-container dl>.test-bullet::before {
            background-color: blue;
        }

        .step-container dl>dt {
            display: block;
            font-size: inherit;
            font-weight: bold;
            line-height: 20px;
        }

        .step-container dl>dd {
            font-size: inherit;
            line-height: 20px;
            margin-left: 0;
            padding-bottom: 32px;
        }

        .step-container:last-child dl {
            border-left: 1px solid transparent;
        }

        .ctaLink {
            background-color: transparent;
            border: 1px solid transparent;
            color: #006AB1;
            cursor: pointer;
            font-weight: 600;
            padding: 0;
            white-space: normal;
        }

        .ctaLink:focus {
            outline: 1px solid #00bcf2;
        }

        .ctaLink:hover {
            text-decoration: underline;
        }

        .step-icon {
            display: flex;
            height: 38px;
            margin-right: 15px;
            width: 38px;
        }

        .step-icon>div {
            height: 30px;
            width: 30px;
            background-repeat: no-repeat;
        }

        .ms-logo-container {
            min-width: 580px;
            max-width: 980px;
            margin-left: auto;
            margin-right: auto;
            left: 0;
            right: 0;
            transition: bottom 400ms;
        }

        .ms-logo {
            float: right;
            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");
        }

        .ms-logo-container>div {
            min-height: 60px;
            width: 150px;
            background-repeat: no-repeat;
        }

        .row {
            padding: 90px 0px 0 20px;
            min-width: 480px;
            max-width: 1366px;
            margin-left: auto;
            margin-right: auto;
        }

        .column {
            float: left;
            width: 45%;
            padding-right: 20px;
        }

        .row:after {
            content: "";
            display: table;
            clear: both;
        }

        a {
            text-decoration: none;
        }

        .download-the-emulator {
            height: 20px;
            color: #0063B1;
            font-size: 15px;
            line-height: 20px;
            padding-bottom: 70px;
        }

        .how-to-iframe {
            max-width: 700px !important;
            min-width: 650px !important;
            height: 700px !important;
        }

        .remove-frame-height {
            height: 10px;
        }

        @media only screen and (max-width: 1300px) {
            .ms-logo {
                padding-top: 30px;
            }

            .header-text {
                font-size: 40x;
            }

            .column {
                float: none;
                padding-top: 30px;
                width: 100%;
            }

            .ms-logo-container {
                padding-top: 30px;
                min-width: 480px;
                max-width: 650px;
                margin-left: auto;
                margin-right: auto;
            }

            .row {
                padding: 20px 0px 0 20px;
                min-width: 480px;
                max-width: 650px;
                margin-left: auto;
                margin-right: auto;
            }
        }

        @media only screen and (max-width: 1370px) {
            header {
                background-color: #55A0E0;
                background-size: auto 200px;
            }
        }

        @media only screen and (max-width: 1230px) {
            header {
                background-color: #55A0E0;
                background-size: auto 200px;
            }

            .header-text {
                font-size: 44px;
            }

            .header-icon {
                height: 120px;
                width: 120px;
            }
        }

        @media only screen and (max-width: 1000px) {
            header {
                background-color: #55A0E0;
                background-image: none;
            }
        }

        @media only screen and (max-width: 632px) {
            .header-text {
                font-size: 32px;
            }

            .row {
                padding: 10px 0px 0 10px;
                max-width: 490px !important;
                min-width: 410px !important;
            }

            .endpoint {
                font-size: 25px;
            }

            .main-text {
                font-size: 20px;
            }

            .step-container dl>dd {
                font-size: 14px;
            }

            .column {
                padding-right: 5px;
            }

            .header-icon {
                height: 110px;
                width: 110px;
            }

            .how-to-iframe {
                max-width: 480px !important;
                min-width: 400px !important;
                height: 650px !important;
                overflow: hidden;
            }
        }

        .remove-frame-height {
            max-height: 10px;
        }
    </style>
    <script>
        document.addEventListener('DOMContentLoaded', function () {
            loadFrame();
        });
        var loadFrame = function () {
            var iframe = document.createElement('iframe');
            iframe.setAttribute("id", "iframe");
            var offLineHTMLContent = "";
            var frameElement = document.getElementById("how-to-iframe");
            if (window.navigator.onLine) {
                iframe.src = 'https://docs.botframework.com/static/abs/pages/f5.htm';
                iframe.setAttribute("scrolling", "no");
                iframe.setAttribute("frameborder", "0");
                iframe.setAttribute("width", "100%");
                iframe.setAttribute("height", "100%");
                var frameDiv = document.getElementById("how-to-iframe");
                frameDiv.appendChild(iframe);
            } else {
                frameElement.classList.add("remove-frame-height");
            }
        };
    </script>
</head>

<body>
    <header class="header">
        <div class="header-inner-container">
            <div class="header-icon" style="display: inline-block"></div>
            <div class="header-text" style="display: inline-block">NLP With Dispatch Sample</div>
        </div>
    </header>
    <div class="row">
        <div class="column" class="main-content-area">
            <div class="content-title">Your bot is ready!</div>
            <div class="main-text main-text-p1">You can test your bot in the Bot Framework Emulator<br />
                by connecting to http://localhost:3978/api/messages.</div>
            <div class="main-text download-the-emulator"><a class="ctaLink" href="https://aka.ms/bot-framework-F5-download-emulator"
                    target="_blank">Download the Emulator</a></div>
            <div class="main-text">Visit <a class="ctaLink" href="https://aka.ms/bot-framework-F5-abs-home" target="_blank">Azure
                    Bot Service</a> to register your bot and add it to<br />
                various channels. The bot's endpoint URL typically looks
                like this:</div>
            <div class="endpoint">https://<i>your_bots_hostname</i>/api/messages</div>
        </div>
        <div class="column how-to-iframe" id="how-to-iframe"></div>
    </div>
    <div class="ms-logo-container">
        <div class="ms-logo"></div>
    </div>
</body>
</html>


================================================
FILE: Orchestrator/docs/BFOrchestratorInteractive.md
================================================

# Interactive

[BF Orchestrator CLI][1] has an "interactive" command which enables a user to
dynamically interact with an Orchestrator base language model (see examples in [Start an interactive session without a training set](#start-an-interactive-session-without-a-training-set)) and
improve the accuracy of an existing language model (see examples in [Start an interactive session with a training set](#start-an-interactive-session-with-a-training-set)) through some CLI commandlets.

During an interactive session, the command loads an Orchestrator base model
into memory and manage several input cache variables that can be used by
ensuing commandlets for maintaining the base model's example set. These variables include:

- **"current" utterance**       -- A cache for storing an utterance that can be used by several commandlets
                              for interacting with an Orchestrator model.
- **"current" intent labels**   -- A cache for storing an array of intent labels that can be used by several
                              commandlet for interacting with an Orchestrator model.
- **"new" intent labels**       -- Another cache for storing an array of intent labels, which were mainly
                              used for changing an utterance's intent labels within an Orchestrator model.

## Scenarios

### Start an interactive session without a training set

An Orchestrator user can launch the interactive command without a training set.
During an session, the user can interactively add utterance examples, revise them, remove them,
validate and create an evaluation report, etc..

#### Argument setup

Below is a command snippet for a user to start the interactive command with two arguments:

    - "--model"     -- folder pointing to an Orchestrator base model
    - "--out"       -- out folder for validation evaluation reports.

```
> set ORCHESTRATOR_MODEL=<Orchestrator base model folder>
> set EVALUATING_OUTPUT=<Evaluation report output folder>
> bf orchestrator:interactive --out=%EVALUATING_OUTPUT% --model=%ORCHESTRATOR_MODEL%
```

After executing the command snippet, the command enters an interactive session shown below:
```
> "Current" utterance:          ""
> "Current" intent label array: ""
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

#### Cache an utterance

The user can then use the 'u' commandlet to enter an utterance and cache it into the "current" utterance
variable. Below is what happened after a user enters "hi" as a new utterance using the 'u' commandlet.

```
Please enter a commandlet, "h" for help > u
Please enter an utterance > hi
> "Current" utterance:          "hi"
> "Current" intent label array: ""
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

#### Cache an intent label

Then the user can issue the 'i' commandlet to enter a new intent label and cache it into the "current"
intent label variable. Notice that Orchestrator supports an utterance with multiple labels, so the 
intent variable cache is actually an array for holding multiple intent labels associated with
the "current" utterance. 
Below is what happened after a user enter "greeting" as a new intent label using the 'i' commandlet.

```
Please enter a commandlet, "h" for help > i
Please enter a "current" intent label > greeting
> "Current" utterance:          "hi"
> "Current" intent label array: "greeting"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

#### Add example to Orchestrator core

After a user enter "hi" and "greeting" during the interactive session, she/he can add this example to
the Orchestrator core. It will become part of the example set Orchestrator core uses for
predicting the intent for new queries. In a sense, this new example was added to a "training" set
for a supervised machine learning model.
The commandlet for adding a new example is 'a'.

```
Please enter a commandlet, "h" for help > a
> Utterance 'hi' has been added to '[
    "greeting"
]'
> "Current" utterance:          "hi"
> "Current" intent label array: "greeting"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

#### Show statistics of the example set

Once a user has entered a sufficient amount of intent/utterance examples into Orchestrator core,
she/he can then use the 's' commandlet to show some statistics of the example set.

```
Please enter a commandlet, "h" for help > s
> Per-label #examples: {
    "greeting": 1
}
> Total #examples:1
> "Current" utterance:          "hi"
> "Current" intent label array: "greeting"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

#### Add examples to current cached intent label

A user can enter more intent/utterance examples.
Below is what happened if the user enters and added two more utterances ("hello" and "good morning")
for the same "greeting" intents. 

```
Please enter a commandlet, "h" for help > u
Please enter an utterance > hello
> "Current" utterance:          "hello"
> "Current" intent label array: "greeting"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help > a
> Utterance 'hello' has been added to '[
    "greeting"
]'
> "Current" utterance:          "hello"
> "Current" intent label array: "greeting"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help > u
Please enter an utterance > good morning
> "Current" utterance:          "good morning"
> "Current" intent label array: "greeting"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help > a
> Utterance 'good morning' has been added to '[
    "greeting"
]'
> "Current" utterance:          "good morning"
> "Current" intent label array: "greeting"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

#### Add example for a new intent label

A user can also enter some utterances with different intents.
Below is what happened if a user enters a new utterance "good bye" with 
a new intent "farewell." However the user forgot to clear the current intent labels, so
the "good bye" intent is actually associated with two intents ("greeting,farewell").
Even though this is not completely wrong semantically, but a user can always
clear the intent variable cache (with the 'ci' commandlet). Remember that the utterance and intents have
not been added to Orchestrator core yet.

```
Please enter a commandlet, "h" for help > u
Please enter an utterance > good bye
> "Current" utterance:          "good bye"
> "Current" intent label array: "greeting"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help > i
Please enter a "current" intent label > farewell
> "Current" utterance:          "good bye"
> "Current" intent label array: "greeting,farewell"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

#### Clear intent label cache

The commandlet to clear the intent label cache is 'ci'.
Below is what happened if the user clear the intent label variable cache.
Similarly, the utterance variable cache can be cleared by the 'cu' commandlet.

```
Please enter a commandlet, "h" for help > ci
> "Current" utterance:          "good bye"
> "Current" intent label array: ""
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

The user can then reenter the "farewell" intent into the cache and add it to Orchestrator core:
```
Please enter a commandlet, "h" for help > i
Please enter a "current" intent label > farewell
> "Current" utterance:          "good bye"
> "Current" intent label array: "farewell"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help > a
> Utterance 'good bye' has been added to '[
    "farewell"
]'
> "Current" utterance:          "good bye"
> "Current" intent label array: "farewell"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

After a while, a user can re-issue the 's' commandlet and see the label utterance tabulation:
From the session below, we can see that there are three utterances for the "greeting" intent,
and one for the "farewell" intent.

```
Please enter a commandlet, "h" for help > s
> Per-label #examples: {
    "greeting": 3,
    "farewell": 1
}
> Total #examples:4
> "Current" utterance:          "good bye"
> "Current" intent label array: "farewell"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

#### Make prediction

After there are some intent/utterance entered to Orchestrator core, the user can use
Orchestrator core to make some prediction.
Below is what happened if "bye" is entered as the "Current" utterance and use the 'p'
commandlet for an prediction. Orchestrator core responded with a prediction
of the "farewell" intent, a high score of 0.977, and the closest example within the 
"farewell" intent, "good bye".
On the other hand, the "greeting" intent was predicted with a score of 0.691 and
the closest example was "good morning."

```
Please enter an utterance > bye
> "Current" utterance:          "bye"
> "Current" intent label array: "farewell"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help > p
> Prediction:
[
    {
        "closest_text": "good bye",
        "score": 0.977452505191936,
        "label": {
            "name": "farewell",
            "label_type": 1,
            "span": {
                "length": 3,
                "offset": 0
            }
        }
    },
    {
        "closest_text": "good morning",
        "score": 0.6907451700060104,
        "label": {
            "name": "greeting",
            "label_type": 1,
            "span": {
                "length": 3,
                "offset": 0
            }
        }
    }
]
> "Current" utterance:          "bye"
> "Current" intent label array: "farewell"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

#### Hints on new intent label needed

The same utterance, intent, add, predict commandlets can be repeated for a user
to build a sizeable example set within Orchestrator core.
A user try out some new utterance, such as "wake me up at 10AM" and he/she can
see the prediction based on the two existing intent labels.
As we can see for the prediction, the prediction scores are fairly low, 0.322 and 0.275.
The low scores indicate that this new utterance may need a new intent label.

```
Please enter an utterance > wake me up at 10AM
> "Current" utterance:          "wake me up at 10AM"
> "Current" intent label array: "farewell"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help > p
> Prediction:
[
    {
        "closest_text": "good morning",
        "score": 0.322484918357831,
        "label": {
            "name": "greeting",
            "label_type": 1,
            "span": {
                "length": 18,
                "offset": 0
            }
        }
    },
    {
        "closest_text": "good bye",
        "score": 0.2750571664975262,
        "label": {
            "name": "farewell",
            "label_type": 1,
            "span": {
                "length": 18,
                "offset": 0
            }
        }
    }
]
> "Current" utterance:          "wake me up at 10AM"
> "Current" intent label array: "farewell"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

Below is what happened if the user enter a new intent label and add the
"wake me up at 10AM" utterances to Ochestrator core.

```
Please enter a commandlet, "h" for help > ci
> "Current" utterance:          "wake me up at 10AM"
> "Current" intent label array: ""
> "New"     intent label array: ""
Please enter a commandlet, "h" for help > i
Please enter a "current" intent label > alarm
> "Current" utterance:          "wake me up at 10AM"
> "Current" intent label array: "alarm"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help > a
> Utterance 'wake me up at 10AM' has been added to '[
    "alarm"
]'
> "Current" utterance:          "wake me up at 10AM"
> "Current" intent label array: "alarm"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

As we can see from issuing the 's' commandlet, now we have one more intents.

```
Please enter a commandlet, "h" for help > s
> Per-label #examples: {
    "greeting": 3,
    "farewell": 1,
    "alarm": 1
}
> Total #examples:5
> "Current" utterance:          "wake me up at 10AM"
> "Current" intent label array: "alarm"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

#### Evaluate the example set

After a while, the user can use the 'v' commandlet to evaluate the example set.
Below is what happened after issuing the 'v' commandlet.
The user can open the evaluation report file and review the progress thus far.
Since there are very few examples per intent, and the valuation is done in
leave-one-out cross validation (LOOCV), so the report does not look good.

```
Please enter a commandlet, "h" for help > v
> Leave-one-out cross validation is done and reports generated in 'experiment_evaluating_PrebuildDomain\orchestrator_predicting_set_summary.html'
> "Current" utterance:          "wake me up at 10AM"
> "Current" intent label array: "alarm"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

#### Remove utterance

However, if the user feels that the "wake me up at 10AM" is not what this chatbot is concerned with,
she/he can remove the utterance using the 'r' commandlet. The 'r' commandlet call Orchestrator core
to remove the intent and utterance example currently cached.
On the other hand, the user can reference the evaluation report and pick out the utterance
example and cache it into the "current" variables.
Below is what happened that the user issue the 'vm' (validation/misclassified) commandlet and
enter an index '2' for the No. 2 utterance and put it and its intent to the "Current" cache.
Similarly a user can issue the 'va' (validation/ambiguous), 'vl' (validation/low-confidence), and
the 'vd' (validation/duplicates) commands to pick up the utterance and intent examples and cache them
into the variables.

```
Please enter a commandlet, "h" for help > vm
Please enter an index from the Misclassified report > 2
> "Current" utterance:          "wake me up at 10AM"
> "Current" intent label array: "alarm"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

Below is what happened after issuing the 'r' commandlet to remove the "wake me up at 10AM"
utterance. Since there is only one utterance for the "alarm" intent, the whole intent is
eliminated. However, a user can simply issue the 'rl' commandlet to eliminate an intent label
with all of its utterances.
Now there are two intent left in the Orchestrator core.
```
> "Current" utterance:          "wake me up at 10AM"
> "Current" intent label array: "alarm"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help > r
> Utterance 'wake me up at 10AM' has been removed from '[
    "alarm"
]'
> "Current" utterance:          "wake me up at 10AM"
> "Current" intent label array: "alarm"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help > s
> Per-label #examples: {
    "greeting": 3,
    "farewell": 1
}
> Total #examples:4
> "Current" utterance:          "wake me up at 10AM"
> "Current" intent label array: "alarm"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

#### Detailed configuration information

For more detailed configuration information for Orchestrator, a user can issue the 'd' commandlet.
Below is what happened after a user issue the 'd' commandlet, where
there are several threshold used for the 'v' commandlet during creating an evaluation report.

```
Please enter a commandlet, "h" for help > d
> Ambiguous closeness:           0.2
> Low-confidence closeness:      0.5
> Multi-label threshold:         1
> Unknown-label threshold:       0.3
> Obfuscation flag:              false
> Orchestrator configuration:    {
    "CDF": "{\"zero\":0.400000,\"unknown\":0.700000,\"one\":1.000000}",
    "EmbedderVersion": 1,
    "Framework": "onnx",
    "Layers": 6,
    "MinRequiredCoreVersion": "1.0.0",
    "ModelFile": "D:\\testsBfCliOrchestrator\\_model\\model_bert_6l\\model.onnx",
    "ModelType": "dte_bert",
    "Name": "pretrained.20200924.microsoft.dte.00.06.en.onnx",
    "Publisher": "Microsoft",
    "Version": "pretrained.20200924.microsoft.dte.00.06.en.onnx",
    "VocabFile": "D:\\testsBfCliOrchestrator\\_model\\model_bert_6l\\vocab.txt",
    "ignore_same_example": true,
    "knn_k": 3,
    "nlr_path": "D:\\testsBfCliOrchestrator\\_model\\model_bert_6l",
    "use_compact_embeddings": true,
    "use_gap": false,
    "use_unknown": true
}
> Current label-index map: {
    "farewell": 0,
    "greeting": 1
}
> "Current" utterance:          "wake me up at 10AM"
> "Current" intent label array: "alarm"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

- The "Ambiguous closeness" threshold is currently set to 0.2, which means if an utterance
  is correctly predicted, but there are some other intent with a score close to 80% of the
  ground-truth intent label, then that close utterance will be listed as an "ambiguous" prediction
  in the evaluation report.

- The "Low-confidence" threshold is default to 0.5, which means that if an utterance's ground-truth
  intent label is predicted to have the highest score, but the score is lower than 0.5, then
  this utterance will be listed as "low confidence"

- The "Unknown-label" threshold is default to 0.3, which means that if the highest predicted
  intent score is lower than 0.3, then Orchestrator will simply declare that the intent is unknown.

- A user can use the 'vo' commandlet to set the "obfuscate" flag,
  so that the 'v' commandlet can create an evaluation report with all the intent and utterances obfuscated.
  An obfuscated report only show some metadata of the example set without any intent or utterance
  disclosed, so that the report might be shareable for benchmark and comparison purpose.
  The 'd' commandlet also list some internal information of the base model and settings used by 
  Orchestrator core. These information can be used for debugging purpose.
  These thresholds can be reset using the 'vat', 'vlt', 'vmt' and 'vut' commandlets.

#### Create a new snapshot (.BLU) file

After a user has reached a milestone, she/he can create a new snapshot (.BLU) file using the 'n' command.
In the future, the user can run an interactive session preloaded with this new snapshot file and
keep refining the intent and utterance examples.
Below is what happened after the running the 'n' command and the location of the new snapshot file.

```
Please enter a commandlet, "h" for help > n
> A new snapshot has been saved to 'experiment_evaluating_PrebuildDomain\orchestrator_predicting_snapshot_set.blu'
> "Current" utterance:          "wake me up at 10AM"
> "Current" intent label array: "alarm"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

#### Exit the session

At the end, a user can enter the 'q' commandlet to exit the session.

### Start an interactive session with a training set

Since there is already a .blu snapshot file from the last session, a user can
use the interactive command to continue refining the example set by using the "--in" argument.

#### Argument setup

```
> set ORCHESTRATOR_MODEL=<Orchestrator base model folder>
> set EVALUATING_OUTPUT=<Evaluation report output folder>
> bf orchestrator:interactive --out=%EVALUATING_OUTPUT% --model=%ORCHESTRATOR_MODEL% --in=%EVALUATING_OUTPUT%\orchestrator_predicting_snapshot_set.blu
```

#### Show statistics of the example set

After a new interactive session, the user can issue the 's' commandlet and take a look
of the intent/utterance distribution.

```
> "Current" utterance:          ""
> "Current" intent label array: ""
> "New"     intent label array: ""
Please enter a commandlet, "h" for help > s
> Per-label #examples: {
    "greeting": 3,
    "farewell": 1
}
> Total #examples:4
> "Current" utterance:          ""
> "Current" intent label array: ""
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

#### Make predictions on utterances

The user can try out some more utterances.

```
Please enter a commandlet, "h" for help > u
Please enter an utterance > bye bye
> "Current" utterance:          "bye bye"
> "Current" intent label array: ""
> "New"     intent label array: ""
Please enter a commandlet, "h" for help > p
> Prediction:
[
    {
        "closest_text": "good bye",
        "score": 0.9852574345531401,
        "label": {
            "name": "farewell",
            "label_type": 1,
            "span": {
                "length": 7,
                "offset": 0
            }
        }
    },
    {
        "closest_text": "good morning",
        "score": 0.7110401992969432,
        "label": {
            "name": "greeting",
            "label_type": 1,
            "span": {
                "length": 7,
                "offset": 0
            }
        }
    }
]
> "Current" utterance:          "bye bye"
> "Current" intent label array: ""
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

#### Add examples to existing language model

The predicted intent label was "farewell" with a very high score of 0.985. However,
suppose it's a low score, then the user can improve model
by adding the utterance into the example set.
Below is what happened after the "bye bye" utterance is added.

```
Please enter a commandlet, "h" for help > i
Please enter a "current" intent label > farewell
> "Current" utterance:          "bye bye"
> "Current" intent label array: "farewell"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help > a
> Utterance 'bye bye' has been added to '[
    "farewell"
]'
> "Current" utterance:          "bye bye"
> "Current" intent label array: "farewell"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help > s
> Per-label #examples: {
    "greeting": 3,
    "farewell": 2
}
> Total #examples:5
> "Current" utterance:          "bye bye"
> "Current" intent label array: "farewell"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

Below is what happened when a user enters a new utterance "good day" and
makes a prediction of it.
As we can see that the prediction scores for the "greeting" and "farewell" intents are both very high and close.
The user then added the "good day" utterance to the "farewell" intent.

```
Please enter a commandlet, "h" for help > u
Please enter an utterance > good day
> "Current" utterance:          "good day"
> "Current" intent label array: "farewell"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help > p
> Prediction:
[
    {
        "closest_text": "good morning",
        "score": 0.8536692972984349,
        "label": {
            "name": "greeting",
            "label_type": 1,
            "span": {
                "length": 8,
                "offset": 0
            }
        }
    },
    {
        "closest_text": "good bye",
        "score": 0.8114553301042285,
        "label": {
            "name": "farewell",
            "label_type": 1,
            "span": {
                "length": 8,
                "offset": 0
            }
        }
    }
]
> "Current" utterance:          "good day"
> "Current" intent label array: "farewell"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help > a
> Utterance 'good day' has been added to '[
    "farewell"
]'
> "Current" utterance:          "good day"
> "Current" intent label array: "farewell"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help > s
> Per-label #examples: {
    "greeting": 3,
    "farewell": 3
}
> Total #examples:6
> "Current" utterance:          "good day"
> "Current" intent label array: "farewell"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help >
```

#### Relabel utterances

However, the user may later decide to change the intent for "good day" from "farewell" to "greeting".
She/he can them use the 'ni' commandlet to enter "greeting" into the "New" intent label
cache. After that, the user can issue the 'c' commandlet to change the intent label for "good day".
As we can see below, the label/utterance distribution has changed afterward.
Notice that the user can use the 'cni' commandlet to clear the "New" intent label cache.

```
Please enter a commandlet, "h" for help > s
> Per-label #examples: {
    "greeting": 3,
    "farewell": 3
}
> Total #examples:6
> "Current" utterance:          "good day"
> "Current" intent label array: "farewell"
> "New"     intent label array: ""
Please enter a commandlet, "h" for help > ni
Please enter a "new" intent label > greeting
> "Current" utterance:          "good day"
> "Current" intent label array: "farewell"
> "New"     intent label array: "greeting"
Please enter a commandlet, "h" for help > c
> Utterance 'good day' has been moved from '[
    "farewell"
]' to '[
    "greeting"
]'
> "Current" utterance:          "good day"
> "Current" intent label array: "farewell"
> "New"     intent label array: "greeting"
Please enter a commandlet, "h" for help > s
> Per-label #examples: {
    "greeting": 4,
    "farewell": 2
}
> Total #examples:6
> "Current" utterance:          "good day"
> "Current" intent label array: "farewell"
> "New"     intent label array: "greeting"
Please enter a commandlet, "h" for help >
```

#### Check existence of an utterance in the language model

Also, the user can enter an utterance and see if it's in the Orchestrator Core's example set or not
using the 'f' commandlet.
Below is what happened when a user tries to find out if "good evening" is in the example set of not.

```
Please enter a commandlet, "h" for help > u
Please enter an utterance > good evening
> "Current" utterance:          "good evening"
> "Current" intent label array: "farewell"
> "New"     intent label array: "greeting"
Please enter a commandlet, "h" for help > f
> The "current" utterance 'good evening' is not in the model.
> "Current" utterance:          "good evening"
> "Current" intent label array: "farewell"
> "New"     intent label array: "greeting"
Please enter a commandlet, "h" for help >
```

## List of interactive commandlets
At any time, if a user needs to reference help messages for the many commandlets, he/she can issue
the 'h' command for a brief help page on all the commandlets.
Below is the list of the commandlets that can be issued during a 'interactive' session.

### 'h' - help command
    h   - print the help messages with short description of each command

### 'q' - quit command
    q   - quit

### 'd' - display command
    d   - display the utterance, intent label array input caches, Orchestrator config,
          and the label-index map

### 's' - statistics command
    s   - show label-utterance statistics of the model examples

### 'u' - utterance command
    u   - enter a new utterance and save it as the "current" utterance input

### 'cu' - clear utterance variable command
    cu  - clear the "current" utterance input cache

### 'i' - intent variable command
    i   - enter an intent and add it to the "current" intent label array input
          (can be an index for retrieving a label from the label-index map)

### 'ci' - clear intent variable command
    ci  - clear the "current" intent label array input cache

### 'ni' - new intent command
    ni  - enter an intent and add it to the "new" intent label array input
          (can be an index for retrieving a label from the label-index map)

### 'cni' - clear new intent command
    cni - clear the "new" intent label array input cache

### 'f' - find command
    f   - find the "current" utterance if it is already in the model example set

### 'p' - predict command
    p   - make a prediction on the "current" utterance input

### 'v' - validate command
    v   - validate the model and save analyses (validation report) to
          "experiment_predicting_va\orchestrator_predicting_set_summary.html"

### 'vd' - utterance/labels retrieval command (from the Duplicates section of the validation report)
    vd  - reference a validation Duplicates report
          (previously generated by the "v" command) and enter an index
          for retrieving utterance/intents into "current"

### 'va' - utterance/labels retrieval command (from the Ambiguous section of the validation report)
    va  - reference a validation Ambiguous report
          (previously generated by the "v" command) and enter an index
          for retrieving utterance/intents into "current"

### 'vm' - utterance/labels retrieval command (from the Misclassified section of the validation report)
    vm  - reference a validation Misclassified report and enter an index
          (previously generated by the "v" command)
          for retrieving utterance/intents into "current"

### 'vl' - utterance/labels retrieval command (from the Low Confidence section of the validation report)
    vl  - reference a validation LowConfidence report
          (previously generated by the "v" command) and enter an index
          for retrieving utterance/intents into "current"

### 'vat' - ambiguous threshold command
    vat - enter a new validation-report ambiguous closeness threshold

### 'vlt' - low-confidence threshold command
    vlt - enter a new validation-report low-confidence threshold

### 'vmt' - multi-label threshold command
    vmt - enter a new multi-label threshold

### 'vut' - unknown label threshold command
    vut - enter a new unknown-label threshold

### 'vo' - obfuscate command
    vo  - enter a boolean for obfuscating labels/utterances or not in evaluation reports
          generated by the "v" command'

### 'a' - add command
    a   - add the "current" utterance and intent labels to the model example set

### 'r' - remove command
    r   - remove the "current" utterance and intent labels from the model example set

### 'c' - change command
    c   - remove the "current" utterance's intent labels and then
          add it with the "new" intent labels to the model example set

### 'rl' - remove label command
    rl  - remove the "current" intent labels from the model example set

### 'n' - new snapshot command
    n   - create a new snapshot of model examples and save it to
          "experiment_predicting_va\orchestrator_predicting_training_set.blu"

## References

- [BF Orchestrator CLI](https://aka.ms/bforchestratorcli)

[1]:https://aka.ms/bforchestratorcli	"BF Orchestrator CLI"


================================================
FILE: Orchestrator/docs/BFOrchestratorReport.md
================================================
# Report Interpretation

The [BF Orchestrator CLI][1] has a "test" command for evaluating the performance of an Orchestrator snapshot file (with .blu extension). A snapshot is composed of natural language representation base model (see [models][3]) along with a set of examples provided in a label file (typically a [.lu file][4]). The snapshot file is used in Bot Framework to detect intents from user utterances. 

In order to achieve high quality natural language processing (e.g. intent detection), it is necessary to assess and refine the quality of the model. This is much simplified in Orchestrator because of its use of pre-trained models. The optimization cycle is required in order to account for human language variations. 
Learn more about Machine Learning evaluation methodology in the [References](# references) section below.

To interpret the report, use the following guidance to actions to improve the snapshot file:
- Incase utterances are the same or semantically similar, mrerge the two intent labels.
- If the utterances are not semantically similar, split an intent's utterance pool and create a new intent label.
- It the utterance are semantically close to a different intent label, change the intent label.
- Rephrase an utterance and make it semantically closer to other utterances labled with the same intent.
- Add more utterances to an intent label as the intent's utterance pool could be too scarce.
- Remove some utterances from an intent label if there were too many utterances label to it.

# Report Organization

The test command thus produces a folder with HTML report and a few supporting artifacts as follows:

- orchestrator_testing_set_ground_truth_instances.json: test instance ground-truth file in JSON format.
- orchestrator_testing_set_labels.txt: intent labels in a plain text file.
- orchestrator_testing_set_prediction_instances.json: test instance prediction file in JSON format.
- orchestrator_testing_set_scores.txt: test instance prediction file in a plain TSV format.
- orchestrator_testing_set_summary.html: report summary in HTML format

The report summary contains several sections as follows:

## Intent / Utterance Statistics

This section contains label and utterance distributions.

It has two statistical sections, one for labels, the other utterances. Attached is an example rendition of the section.

- Label statistics
- Utterance statistics

![Evaluation Report Intent/Utterance Statistics](media/EvaluationReportTabVaIntentUtteranceStatistics.png)

### Label statistics

Label statistics lists the number of utterances labeled to each label. Additional metrics include utterance prevalence (ratio) for every label. The distributions can give Orchestrator users an overall view of the labels and utterances, and whether the distributions are skewed and emphasize too much on some labels, but not others. A machine learn model may learn more from a label (intent) with more instances (utterances) labeled to it. Thus, a developer can check this table and see if some intents needs more utterances in the snapshot file.

### Utterance statistics

On the other hand, utterance statistics focus on the #label distribution by the utterances. Some utterances are labeled with more than one intents, which might not be desirable and could be a bug. This table reflects the distribution of multi-label utterances.
From the above screen snapshot, we can see that there are two utterances labeled twice with distinct labels. Those multi-label utterances will be listed in the next section and the owner can decide to remove the duplicates from the snapshot file.

## Utterance Duplicates

Sometimes some dataset might contain utterances tagged with the same labels multiple times.
The report also lists this redundancy.
This section has two sub-sections:

- Multi-label utterances and their labels
- Duplicate utterance and label pairs

They report on utterances with duplicate or multiple labels. A duplicate utterance is detected when it is present more than once in a snapshot file. Sometimes some dataset might even contain utterances tagged with the same labels multiple times.

The report also lists the redundancy of label/utterance pairs. Orchestrator will deduplicate such redundancy.
Please see the attached screen snapshot as an example.

![Evaluation Report Utterance Duplicates](media/EvaluationReportTabVaUtteranceDuplicates.png)

## Ambiguous

This section reports on utterances with ambiguous predictions. For an evaluation utterance, if an Orchestrator model correctly predicts its intent label, then it's a true positive instance. Every intent label will be predicted with a score, which is essentially the probability or confidence for that label prediction. The predicted intent usually is the one with the highest score. If the Orchestrator model also makes some other high-score prediction close to that of the correctly predicted label, then we call such a prediction "ambiguous."

In this section, the report lists all the utterances with an ambiguous prediction in a table.
The table has several columns:

- Utterance         -- the utterance
- Labels            -- the true labels for the utterance
- Predictions       -- the labels predicted by the Orchestrator model
- Close Predictions -- some other labels predicted with a close, high score to that of the predicted label. 

Besides the prediction score, the report also shows the closest example to the utterance
within the label's utterance set.
Below is a screen snapshot of an ambiguous report:

![Evaluation Report Ambiguous](media/EvaluationReportTabVaAmbiguous.png)

Ambiguous utterances can be a sign of overlapping intent labels. In another word, two intent labels may have their utterance pools semantically close to each other. In the example report about, the utterance "what my events today" was correctly predicted with the Calendar intent label and the closest example is
"What is on my calendar today". However the FAQ3 intent was also predicted with a high school and the closest example from that intent is "What's going on today." From these two closest example, one can remove the latter from the FAQ3 intent as it is now more specific to the Calendar intent, then just a FAQ example.

## Misclassified

This section reports on utterances with incorrect predictions. A misclassified predication is one where an Orchestrator model falsely predicts its intent label. Usually the label with the highest prediction score is chosen as the predicted label, but it can be different from the ground-truth label for the utterance.

Similar to the last section, the report also lists the prediction and ground-truth labels with
their prediction scores and closest examples. Below is a screen snapshot of the misclassified report. A user can also follow the utterances list and decide to update their intent labels and or rephrase the utterances themselves.

![Evaluation Report Misclassified](media/EvaluationReportTabVaMisclassified.png)

## Low Confidence

This section reports on predictions that scored too low to be considered "confident" intent detection.

Sometimes a prediction may be predicted correctly with the highest scores among all labels, but the score is very low, lower than a threshold. We call such predictions low confidence.
Notice that there are several default thresholds used to guide producing the report sections thus far. Usually an Orchestrator user can just predict a label with the highest score, but he/she can also utilize some thresholds for a fine-tuned prediction in a chat bot's dialog logic.

Just like the last sections, the report lists the prediction and ground-truth labels with their prediction scores and closest examples. Also like the previous sections, the utterances listed in this section can guide a user how to improve the snapshot file.

![Evaluation Report Low Confidence](media/EvaluationReportTabVaLowConfidence.png)

## Metrics

The Metrics section is an advanced report that contains analytics that is common in Machine Learning evaluation methodologies.

Advanced machine-learning practitioners may analyze the overall model performance expressed in machine learning metrics. In this section, the report calculates some common metrics in two sections:

- Confusion matrix metrics
- Average confusion matrix metrics

![Evaluation Report Metrics](media/EvaluationReportTabVaMetrics.png)

### Confusion matrix metrics

In this table, the Orchestrator CLI test command reads an evaluation set with ground-truth labels. An evaluation set contains a collection of utterances and their labels. It then calls the Orchestrator base model and makes a prediction for every utterance in the set and generate predicted labels for every utterance. It then compares the predicted labels against the ground-truth labels and creates a table of per-label binary confusion matrices.

For a binary confusion matrix, there are four cells:
    - #True Positives (TP)
        - #False Positives (FP)
        - #False Neagatives (FN)
        - #True Negatives (TN)

For a label, if it exists in an utterance's ground-truth label set as well as in the predicted label set,
then that utterance is a TP for the label.
If the label only exists in the utterance's predicted label set, then it's a false positive.
If the label only exists in the utterance's ground-truth set, then it's a false negative.
If the label does not exist in either the ground-truth or predicted set, then it's a true negative.

By the way, for entity extraction, as a label contains an entity name, entity offset in an utterance and its length,
there can be numerous true negatives, since there are limitless combinations of the entity attributes
not in the ground-truth or the predicted sets.
Thus, for intent prediction evaluation, all four cells are used to calculate confusion matrix metrics,
but only the first three are used for entity-extraction evaluation.

Using just the first three cells of a binary confusion matrix,
the Orchestrator "test" command can then calculate some
more sophisticated metrics, including

    - Precision     - TP / (TP + FP)
    - Recall        - TP / (TP + FN)
    - F1            - harmonic mean of precision and recall

These three metrics do not use TN, but the simple accuracy metric need all 4 cells, including TN.

For details of many confusion matrix metrics, please reference [Wikipedia: Confusion matrix][2].

### Average confusion matrix metrics

Since Orchestrator can evaluate multiple labels, one confusion matrix for each, there can be many
metrics for detailed analysis. For reporting and KPI purpose, it would be great to aggregate all
these metrics for an overall metric and model performance.

There are many nuanced ways to aggregate confusion matrix metrics. For comparing models, it's critical
to compare based on a consistent formula. Please reference the [BF Orchestrator CLI][1] readme page for advanced CLI usage details.

## Thresholds

This evaluation report is created using several thresholds that they can also be useful in building chat bot logic. These thresholds can be reset through environment variables listed below:

- ambiguousClosenessThreshold: default to 0.2, which means that if there are labels predicted to have a score close to within 20% of the top and corrected predicted label, then this utterance is ambiguously predicted.
- lowConfidenceScoreThreshold: default to 0.5, which means that if the top predicted score is lower than 0.5, then the prediction is considered low confidence.
- multiLabelPredictionThreshold: default to 1, which means that the report will predict only one label. However, if the threshold is lower than 1, then every label with a predicted score higher than that will be predicted. This threshold is usually used for multi-label, multi-intent scenarios.
- unknownLabelPredictionThreshold:default to 0.3, which means that the evaluation process will consider a prediction UNKNOWN if the score is lower than that threshold.

## References

- [BF Orchestrator CLI](https://aka.ms/bforchestratorcli)
- [Wikipedia: Confusion matrix](https://en.wikipedia.org/wiki/Confusion_matrix)
- [Wikipedia: Training, validation, and test sets](https://en.wikipedia.org/wiki/Training,_validation,_and_test_sets)
- [Machine Learning Mastery](https://machinelearningmastery.com/difference-test-validation-datasets/).

[1]:https://aka.ms/bforchestratorcli	"BF Orchestrator CLI"
[2]:https://en.wikipedia.org/wiki/Confusion_matrix	"Wikipedia: Confusion matrix"
[3]:https://aka.ms/nlrmodels	"NLR Models"
[4]:https://docs.microsoft.com/en-us/azure/bot-service/file-format/bot-builder-lu-file-format?view=azure-bot-service-4.0 ".LU format"
[5]: https://github.com/microsoft/botframework-cli/tree/main/packages/orchestrator#bf-orchestratortest "bf orchestrator:test"


================================================
FILE: Orchestrator/docs/BFOrchestratorUsage.md
================================================
# BF Orchestrator Command Usage

[BF Orchestrator Command ][1] is used to manage Orchestrator language understanding assets - retrieve, create, evaluate, and tune Orchestrator models to be used in bot development. Typical use is for intent routing to the appropriate language service, LUIS or QnA Maker for additional language tasks such as entity extraction or answer retrieval. This use was previously enabled by use of the legacy *dispatch* CLI. In addition, intent routing can be used to delegate conversations to a backend bot skill. Entity recognition is on the roadmap as a future capability.

## Primary Scenario

The mainstream bot language recognition development cycle with Orchestrator is generally as follows:

1. Create Intent label / utterance examples file in [.lu format][2]  (will be referred to as the *label file*). 
2. Download base model.
3. Combine the label file .lu from (1) with the base model from (2) to create a .blu file (will be referred to as the *snapshot* file). 
4. Test and refine quality of utterance to intent recognition.
5. Integrate Orchestrator language recognizer in your bot.

## Steps

We will use the primary workflow to illustrate how to use Orchestrator commands for full development cycle.

### 1. Create Intent label / utterance examples file in [.lu format][2]

If you are developing a new language model, simply refer to [Language understanding][8] documentation to author label files. Depending on how you plan to design your bot, you may use a single label file corresponding to a single snapshot file for the entire bot or multiple pairs, each for every adaptive dialog where you plan to use Orchestrator as a recognizer. 

In case of **migration from legacy dispatch**, simply add LUIS app(s) or QnAMaker kb(s) as Orchestrator data sources.  Refer to the Dispatch migration documentation [here][11] for more information.

Example:
```
> bf orchestrator:add -t luis --id <luis-app-id> --endpoint <luis-endpoint> -k <luis-subscription-key> -v <luis-app-version> --routingName l_<luis-app-name>
> bf orchestrator:add -t qna --id <kb-id> -k <qna-subscription-key> --routingName q_<kb-name>
```

### 2. Download base model

Create a new folder, say *models*, and download the default base model using: 

```
bf orchestrator:basemodel:get --out ./models
```

out parameter is optional.  If not specified, base model files will be downloaded to the current working directory.

See also the ```orchestrator:basemodel:list``` command if you wish to download and experiment with different base models.  (see descriptions [here][4] ).

### 3. Combine the label file .lu from (1) with the base model from (2) to create a .blu file

There are two ways to create Orchestrator snapshot file(s), depending on the usage scenarios:

- **To route utterances to LUIS/QnA language services**

  Use ```bf orchestrator:create``` command to combine the base model with the label file(s) to create snapshot file for use by the orchestrator recognizer. If using a single folder, create it prior, say *generated*, and specify it in --out parameter:

  ```
  bf orchestrator:create --model <base model folder> --in <label file/folder> --out <generated folder> --hierarchical
  ```

  The create command generates a single Orchestrator snapshot file as output.  If folder is specified as input, it scans the subfolder hierarchy for .lu/.json/.tsv/.qna files and combine all utterances/labels found into the snapshot file.  
  The *hierarchical* flag creates top level intents in the snapshot file derived from the .lu/.json/.tsv/.qna file names in the input folder.  This is useful to create a routing mechanism for further processing by subsequent skills or language services.
  
  In case of **migration from legacy dispatch**, runs orchestrate:create after orchestrator:add commands from (1).   If LUIS app(s) or QnA Maker kb(s) have been updated, add the **--refresh** flag to orchestrator:create command so latest application models will be downloaded to be used to create Orchestrator snapshot file.
  
  Example:
  
  ```
  > bf orchestrator:create 
  ```
  
  
  
  If you have previously used Dispatch CLI to create LUIS based Dispatch application, you could use .dispatch file (created by Dispatch CLI) as input to orchestrator:create command and skip step (1)  above.
  
  Example:
  
  ```
  > bf orchestrator:create --in c:\LuisDispatchBot.dispatch
  ```
  
  
  
- **To recognize intent from incoming user utterance (entity recognition is TBD)**

  Use ```bf orchestrator:create``` command to combine the base model with the label file(s) to create snapshot file for use by the orchestrator recognizer. If using a single folder, create it prior, say *generated*, and specify it in --out parameter:

  ```
  bf orchestrator:create --model <base model folder> --in <label file/folder> --out <generated folder>
  ```

  

### 4. Test and refine quality of utterance to intent recognition

Create a label .lu file with test data set of utterances. Run the following command to generate report for your language model

```
bf orchestrator:test --in <snapshot file> --model <base model file> --out <report folder> --test <test data file>
```

See also [bf orchestrator test](https://github.com/microsoft/botframework-cli/tree/main/packages/orchestrator#bf-orchestratortest) for full command line options.

See also [Report Interpretation][6] for how to use the report to fine tune your language model. 

You can improve your language model by adding or revising examples directly from [.lu][2] files, or interactively by using ```bf orchestrator:interactive``` command (see also [Interactive Command][7]).

### 5. Integrate Orchestrator language recognizer in your bot

Once satisfied with your language model performance, it is time to integrate the model in your bot by specifying Orchestrator as the recognizer. Depending on the flavor of solution there are several methods to hook up Orchestrator. 

See the specific variations for your solution below.

##### Composer Scenario

It is possible to specify  Orchestrator as a dialog recognizer in [Bot Framework Composer][5].  To use Orchestrator in Composer:

1. Enable Orchestrator feature in Composer's Application Settings.
2. Select Orchestrator in the recognizer dropdown menu.
3. Review, evaluate and adjust examples in language data as you would normally for LUIS / Orchestrator to ensure recognition quality.

See the [School skill navigator](https://github.com/microsoft/BotBuilder-Samples/tree/main/composer-samples/csharp_dotnetcore/projects/OrchestratorSchoolNavigator) bot sample for more. 



##### Non-Adaptive (V4) Scenario

The example [NLP with Orchestrator](https://github.com/microsoft/BotBuilder-Samples/tree/main/experimental/orchestrator/csharp_dotnetcore/01.dispatch-bot#nlp-with-orchestrator) illustrates how to use Orchestrator's recognizer in code using the scenario of migrating from legacy dispatch solution.



##### Declarative Dialog Scenario

The best example of declarative use is by inspecting the assets (.dialog files)  produced by Bot Framework Composer.



## Advanced Command

The advanced language recognition development cycle assumes some level understand of machine learning concepts and interactive iterations over the language example definition and potentially evaluation of different models.

For the advanced scenario please refer to the [Interactive Command][7] page.

## Report Interpretation

A particularly important step in tuning your language model is testing and evaluating your language model performance. Orchestrator command produces detailed report to assist in optimizing the language model.

See [Report Interpretation][6] for more.

## References

- [Orchestrator][1]
- [Language Understanding][3]
- [Composer][5]
- [Natural Language Representation Models][4]
- [Wikipedia: Training, validation, and test sets][9]
- [Machine Learning Mastery][10]



[1]:https://aka.ms/bforchestratorcli	"BF Orchestrator CLI"
[2]:https://docs.microsoft.com/en-us/azure/bot-service/file-format/bot-builder-lu-file-format?view=azure-bot-service-4.0 "LU File Format"
[3]:https://docs.microsoft.com/en-us/composer/concept-language-understanding "Language Understanding"
[4]:https://aka.ms/nlrmodels "Orchestrator Base Models"
[5]:https://docs.microsoft.com/en-us/composer/introduction "Composer"
[6]:https://aka.ms/bforchestratorreport "Orchestrator Report"
[7]:https://aka.ms/bforchestratorinteractive "Orchestrator Interactive Command"
[8]:https://docs.microsoft.com/en-us/composer/concept-language-understanding "Language understanding"
[9]:https://en.wikipedia.org/wiki/Training,_validation,_and_test_sets "ML testing"
[10]:https://machinelearningmastery.com/difference-test-validation-datasets/ "Machine Learning Mastery"
[11]:https://github.com/microsoft/botframework-sdk/blob/main/Orchestrator/docs/DispatchMigrationExample.md "Dispatch Migration"








================================================
FILE: Orchestrator/docs/DispatchMigrationExample.md
================================================
# Example Migration from LUIS Dispatch to Orchestrator

The following article describes how to migrate a legacy *dispatch* based solution to [Orchestrator][3] routing.

In  [NLP With Dispatch][2] C# Sample we use LUIS as the top intent arbitrator to redirect intent processing to subsequent language understanding services, LUIS and QnAMaker.  Recall that the top routing was performed by using *dispatch* CLI to create a language model combining the subsequent LUIS and QnAMaker models, and creating an aggregate top LUIS application to be used in the bot logic to further delegate utterances to the detected language service. 

Here, we will modify that sample to use Orchestrator in place of the top LUIS arbitrator as follows:



<p align="center">
  <img width="450" src="./media/dispatch-logic-flow.png" />
</p>




# Prerequisites

* Complete the [NLP With Dispatch][2] C# Sample to serve as the starting point.
  * Have access to create & use [LUIS][4] and [QnAMaker][5] services.
  * See [Dispatch Sample documentation][1] for full details.
* Install [BF CLI][6]
* Bot project must target x64 platform
* Install latest supported version of [Visual C++ runtime](https://support.microsoft.com/en-gb/help/2977003/the-latest-supported-visual-c-downloads)



# Migration Walkthrough

Start with fully working  [NLP With Dispatch][2] C# Sample including all language artifacts (output of dispatch CLI). 



## Prepare
* Add your LUIS application language model(s) and/or QnA Maker knowledge bases(s) as Orchestrator data sources

```
> md CognitiveModels
@rem -v <luis-app-version> is optional, default to 0.1
@rem --routingName is optional, default to l_<luis-app-name> found in the exported lu file
@rem sample luis-endpoint: https://westus.api.cognitive.microsoft.com
> bf orchestrator:add -t luis --id <luis-app-id> --endpoint <luis-endpoint> -k <luis-subscription-key> -v <luis-app-version> --routingName l_<luis-app-name>

@rem --routingName is optional, default to q_<kb-id>
> bf orchestrator:add -t qna --id <kb-id> -k <qna-subscription-key> --routingName q_<kb-name>
```

* Add the ```Microsoft.Bot.Builder.AI.Orchestrator``` assembly and dependencies to your project from nuget package manager.

## Create Orchestrator Language model

* Get Orchestrator base model

* Create Orchestrator snapshot with your previously exported LUIS application language model(s) and/or QnA Maker knowledgebase(s).

  Example:

```
> md model
> bf orchestrator:basemodel:get --out model

> md generated
> bf orchestrator:create --in CognitiveModels --model model --out generated
"Processing c:\\...\\CognitiveModels\\datasources\\l_<luis-app-name>.lu...\n"
"Processing c:\\...\\CognitiveModels\\datasources\\q_<kb-name>.qna...\n"
"Snapshot written to c:\\...\\generated\\Orchestrator.blu"
```

* If you have previously used [**Dispatch CLI tool**][8] to create and refresh LUIS based Dispatch application, you could simply pass in path to the **.dispatch** file (created by Dispatch CLI tool) to bf:orchestrator:create command and skip the bf:orchestrator:add steps above.

  Example:

  ```
  > md generated
  > cd CognitiveModels
  > bf orchestrator:create --in c:\\LuisDispatchBot.dispatch --model model --out ..\\generated
  "Processing c:\\...\\CognitiveModels\\datasources\\l_<luis-app-name>.lu...\n"
  "Processing c:\\...\\CognitiveModels\\datasources\\q_<kb-name>.qna...\n"
  "Snapshot written to c:\\...\\generated\\Orchestrator.blu"
  ```

- To refresh *Orchestrator snapshot* with latest changes from your LUIS application(s) or QnAMaker knowledge base(s),  simply rerun the bf orchestrator:create command above or run the following command from the same directory previous create command was run from.

  Example:

  ```
  > bf orchestrator:create --refresh
  "Processing c:\\...\\CognitiveModels\\datasources\\l_<luis-app-name>.lu...\n"
  "Processing c:\\...\\CognitiveModels\\datasources\\q_<kb-name>.qna...\n"
  "Snapshot written to c:\\...\\generated\\Orchestrator.blu"
  ```



## Modify Settings

* Inspect your LUIS and QnAMaker configurations and modify ```appsettings.json```  so as to specify the two subsequent LUIS applications.

* Add configuration for the top Orchestrator arbitrator (i.e. the new dispatcher)

  ```
  {
    "Logging": {
      "LogLevel": {
        "Default": "Warning"
      }
    },
  
    "MicrosoftAppId": "",
    "MicrosoftAppPassword": "",
  
    "QnAKnowledgebaseId": "--same as in original sample--",
    "QnAEndpointKey": "--same as in original sample--",
    "QnAEndpointHostName": "--same as in original sample--",
  
    "LuisHomeAutomationAppId": "--pick from generated NLPDispatchSample14.dispatch--",
    "LuisWeatherAppId": "--pick from generated NLPDispatchSample14.dispatch--",
    "LuisAPIKey": "--same as in original sample--",
    "LuisAPIHostName": "Old: westus. New: https://westus.api.cognitive.microsoft.com/",
  
    "Orchestrator": {
      "ModelPath": ".\\model",
      "SnapshotPath": ".\\generated\\Orchestrator.blu"
    },
  
    "AllowedHosts": "*"
  }
  ```



## Modify Startup Configuration

* The new ```Startup.cs``` file shall include Orchestrator initialization.
* Modify ```(I)BotService.cs``` to expose Orchestrator as dispatch.
* Add class for Orchestrator configuration settings.

**Startup.cs**

```
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System.IO;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.AI.Orchestrator;
using Microsoft.Bot.Builder.Integration.AspNet.Core;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace Microsoft.BotBuilderSamples
{
    public class Startup
    {

        public OrchestratorConfig OrchestratorConfig { get; }

        public Startup(IConfiguration configuration)
        {
            OrchestratorConfig = configuration.GetSection("Orchestrator").Get<OrchestratorConfig>();
        }


        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers().AddNewtonsoftJson();

            // Create the Bot Framework Adapter with error handling enabled.
            services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithErrorHandler>();

            services.AddSingleton<OrchestratorRecognizer>(InitializeOrchestrator());

            // Create the bot services (Orchestrator, LUIS, QnA) as a singleton.
            services.AddSingleton<IBotServices, BotServices>();

            // Create the bot as a transient.
            services.AddTransient<IBot, DispatchBot>();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseDefaultFiles()
                .UseStaticFiles()
                .UseRouting()
                .UseAuthorization()
                .UseEndpoints(endpoints =>
                {
                    endpoints.MapControllers();
                });

            // app.UseHttpsRedirection();
        }


        private OrchestratorRecognizer InitializeOrchestrator()
        {
            string modelPath = Path.GetFullPath(OrchestratorConfig.ModelPath);
            string snapshotPath = Path.GetFullPath(OrchestratorConfig.SnapshotPath);
            OrchestratorRecognizer orc = new OrchestratorRecognizer()
            {
                ModelPath = modelPath,
                SnapshotPath = snapshotPath
            };
            return orc;
        }

    }
}

```



**IBotServices.cs**

```
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using Microsoft.Bot.Builder.AI.Luis;
using Microsoft.Bot.Builder.AI.Orchestrator;
using Microsoft.Bot.Builder.AI.QnA;

namespace Microsoft.BotBuilderSamples
{
    public interface IBotServices
    {
        LuisRecognizer LuisHomeAutomationRecognizer { get; }
        LuisRecognizer LuisWeatherRecognizer { get; }

        OrchestratorRecognizer Dispatch { get; }
        QnAMaker SampleQnA { get; }
    }
}
```



**BotServices.cs**

```
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using Microsoft.Bot.Builder.AI.Luis;
using Microsoft.Bot.Builder.AI.Orchestrator;
using Microsoft.Bot.Builder.AI.QnA;
using Microsoft.Extensions.Configuration;

namespace Microsoft.BotBuilderSamples
{
    public class BotServices : IBotServices
    {

        public OrchestratorRecognizer Dispatch { get; private set; }
        public QnAMaker SampleQnA { get; private set; }
        public LuisRecognizer LuisHomeAutomationRecognizer { get; private set; }
        public LuisRecognizer LuisWeatherRecognizer { get; private set; }

        public BotServices(IConfiguration configuration, OrchestratorRecognizer dispatcher)
        {
            // Read the setting for cognitive services (LUIS, QnA) from the appsettings.json
            // If includeApiResults is set to true, the full response from the LUIS api (LuisResult)
            // will be made available in the properties collection of the RecognizerResult
            LuisHomeAutomationRecognizer = CreateLuisRecognizer(configuration, "LuisHomeAutomationAppId");
            LuisWeatherRecognizer = CreateLuisRecognizer(configuration, "LuisWeatherAppId");

            Dispatch = dispatcher;

            SampleQnA = new QnAMaker(new QnAMakerEndpoint
            {
                KnowledgeBaseId = configuration["QnAKnowledgebaseId"],
                EndpointKey = configuration["QnAEndpointKey"],
                Host = configuration["QnAEndpointHostName"]
            });
        }

        private LuisRecognizer CreateLuisRecognizer(IConfiguration configuration, string appIdKey)
        {
            var luisApplication = new LuisApplication(
                configuration[appIdKey],
                configuration["LuisAPIKey"],
                configuration["LuisAPIHostName"]);

            // Set the recognizer options depending on which endpoint version you want to use.
            // More details can be found in https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-migration-api-v3
            var recognizerOptions = new LuisRecognizerOptionsV2(luisApplication)
            {
                IncludeAPIResults = true,
                PredictionOptions = new LuisPredictionOptions()
                {
                    IncludeAllIntents = true,
                    IncludeInstanceData = true
                }
            };

            return new LuisRecognizer(recognizerOptions);
        }

    }
}

```



**OrchestratorConfig.cs**

```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Microsoft.BotBuilderSamples
{
    public class OrchestratorConfig
{
        public string SnapshotPath { get; set; }
        public string ModelPath { get; set; }
    }
}

```



## Modify Bot Logic



**Bots\DispatchBot.cs**

```
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.Azure.CognitiveServices.Language.LUIS.Runtime.Models;
using Microsoft.Bot.Builder;
using Microsoft.Bot.Schema;
using Microsoft.BotFramework.Orchestrator;
using Microsoft.Extensions.Logging;

namespace Microsoft.BotBuilderSamples
{
    public class DispatchBot : ActivityHandler
    {
        private readonly ILogger<DispatchBot> _logger;
        private readonly IBotServices _botServices;

        public DispatchBot(IBotServices botServices, ILogger<DispatchBot> logger)
        {
            _logger = logger;
            _botServices = botServices;
        }

        protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
        {

            // Top intent tell us which cognitive service to use.
            var allScores = await _botServices.Dispatch.RecognizeAsync(turnContext, cancellationToken);
            // var topIntent = allScores.Intents.First().Key;
             var topIntent = allScores.GetTopScoringIntent();
             string Intent = topIntent.intent;


            
            // Next, we call the dispatcher with the top intent.
            await DispatchToTopIntentAsync(turnContext, Intent, allScores, cancellationToken);
        }

        protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
        {
            const string WelcomeText = "Type a greeting, or a question about the weather to get started.";

            foreach (var member in membersAdded)
            {
                if (member.Id != turnContext.Activity.Recipient.Id)
                {
                    await turnContext.SendActivityAsync(MessageFactory.Text($"**NLP with Orchestrator Sample**\n\n{WelcomeText}"), cancellationToken);
                }
            }
        }

        private async Task DispatchToTopIntentAsync(ITurnContext<IMessageActivity> turnContext, string intent, RecognizerResult recognizerResult, CancellationToken cancellationToken)
        {
            string props;

            switch (intent)
            {
                case "l_HomeAutomation":
                    props = GetRecognizerProperties("Home Automation", recognizerResult.Properties);
                    await turnContext.SendActivityAsync(MessageFactory.Text(props), cancellationToken);
                    await ProcessHomeAutomationAsync(turnContext, cancellationToken);
                    break;
                case "l_Weather":
                    props = GetRecognizerProperties("Weather", (Dictionary<string, object>)recognizerResult.Properties);
                    await turnContext.SendActivityAsync(MessageFactory.Text(props), cancellationToken);
                    await ProcessWeatherAsync(turnContext, cancellationToken);
                    break;
                case "q_sample-qna":
                    props = GetRecognizerProperties("QnAMaker", (Dictionary<string, object>)recognizerResult.Properties);
                    await turnContext.SendActivityAsync(MessageFactory.Text(props), cancellationToken);
                    await ProcessSampleQnAAsync(turnContext, cancellationToken);
                    break;
                default:
                    _logger.LogInformation($"Dispatch unrecognized intent: {intent}.");
                    await turnContext.SendActivityAsync(MessageFactory.Text($"Dispatch unrecognized intent: {intent}."), cancellationToken);
                    break;
            }
        }

        private async Task ProcessHomeAutomationAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            _logger.LogInformation("ProcessHomeAutomationAsync");

            // Retrieve LUIS result for HomeAutomation.
            var recognizerResult = await _botServices.LuisHomeAutomationRecognizer.RecognizeAsync(turnContext, cancellationToken);
            var result = recognizerResult.Properties["luisResult"] as LuisResult;

            var topIntent = result.TopScoringIntent.Intent;

            await turnContext.SendActivityAsync(MessageFactory.Text($"HomeAutomation top intent: {topIntent}.\n\n"), cancellationToken);
            // await turnContext.SendActivityAsync(MessageFactory.Text($"HomeAutomation intents detected\n\n{string.Join("\n\n* ", result.Intents.Select(i => i.Intent))}"), cancellationToken);
            if (result.Entities.Count > 0)
            {
                await turnContext.SendActivityAsync(MessageFactory.Text($"HomeAutomation entities were found in the message:\n\n{string.Join("\n\n* ", result.Entities.Select(i => i.Entity))}"), cancellationToken);
            }
        }

        private async Task ProcessWeatherAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            _logger.LogInformation("ProcessWeatherAsync");

            // Retrieve LUIS result for Weather.
            var recognizerResult = await _botServices.LuisWeatherRecognizer.RecognizeAsync(turnContext, cancellationToken);
            var result = recognizerResult.Properties["luisResult"] as LuisResult;
            var topIntent = result.TopScoringIntent.Intent;

            await turnContext.SendActivityAsync(MessageFactory.Text($"ProcessWeather top intent: {topIntent}.\n\n"), cancellationToken);
            await turnContext.SendActivityAsync(MessageFactory.Text($"ProcessWeather Intents detected:\n\n{string.Join("\n\n* ", result.Intents.Select(i => i.Intent))}"), cancellationToken);
            if (result.Entities.Count > 0)
            {
                await turnContext.SendActivityAsync(MessageFactory.Text($"ProcessWeather entities were found in the message:\n\n{string.Join("\n\n* ", result.Entities.Select(i => i.Entity))}"), cancellationToken);
            }
        }


        private string GetRecognizerProperties(string Domain, IDictionary<string, object> recognizerResult)
        {
            StringBuilder resultString = new StringBuilder();

            resultString.Append($"**Dispatch: {Domain}**\n\nProperties:\n\n");

            IList<BotFramework.Orchestrator.Result> result = (IList < BotFramework.Orchestrator.Result >)recognizerResult["result"];
            for (var i = 0; i < result.Count; i++)
            {
                BotFramework.Orchestrator.Result r = result[i];
                resultString.Append($"---\n\n* Closest Text: {r.ClosestText}\n\n");
                resultString.Append($"* Label: {r.Label.Name}\n\n");
                resultString.Append($"* Score: {r.Score}\n\n");
            }

            return resultString.ToString();
        }


        private async Task ProcessSampleQnAAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            _logger.LogInformation("ProcessSampleQnAAsync");

            var results = await _botServices.SampleQnA.GetAnswersAsync(turnContext);
            if (results.Any())
            {
                await turnContext.SendActivityAsync(MessageFactory.Text(results.First().Answer), cancellationToken);
            }
            else
            {
                await turnContext.SendActivityAsync(MessageFactory.Text("Sorry, could not find an answer in the Q and A system."), cancellationToken);
            }
        }
    }
}

```



 # Summary

Compile and run. The sample will use Orchestrator to arbitrate ("dispatch") to the corresponding language service, LUIS or QnAMaker which will process the intent and respond to the user.




# References
* [NLP With Dispatch Sample][2]
* [Dispatch Sample documentation][1]

[1]:https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-tutorial-dispatch?view=azure-bot-service-4.0&tabs=cs "Legacy dispatch MSDocs"
[2]:https://github.com/microsoft/BotBuilder-Samples/tree/f6af59378a89864754ef36822c4352aad648f426/samples/csharp_dotnetcore/14.nlp-with-dispatch
[3]:https://aka.ms/bf-orchestrator "Orchestrator"
[4]:https://luis.ai "LUIS"
[5]:https://qnamaker.ai "QnAMaker"
[6]:https://github.com/microsoft/botframework-cli "BF CLI"
[7]:https://github.com/microsoft/botframework-cli/tree/main/packages/orchestrator "Orchestrator plugin"
[8]:https://github.com/microsoft/botbuilder-tools/tree/master/packages/Dispatch "Dispatch CLI"


================================================
FILE: Orchestrator/docs/FAQ.md
================================================
# Frequently Asked Questions

### What are the primary scenarios supported by Orchestrator?
Primary scenario currently supported is routing/dispatching (intent only).  We are working on supporting entities extraction for future releases.


### Can Orchestrator be used from Composer?
Yes.  Follow documentation [here][13] to use Orchestrator as recognizer in Composer.

### Can you use both Orchestrator and LUIS in the same bot?
Yes, definitely.  You could use Orchestrator (OrchestratorRecognizer) to route incoming utterances to the right child applications (i.e., LUISRecognizer, QnAMakerRecognizer).


### What are the guidelines for when Orchestrator correctly predicts incoming utterance for sub intent (app/skill) but the sub app fails to return the right intent?
We recommend tuning the sub app models (i.e. LUIS/QnAMaker/Orchestrator) using the recommended best practices for the app.  
- To improve LUIS model, follow instructions [here][1].
- To improve QnAMaker kb, follow guidelines [here][2].  
- To improve Orchestrator, follow guidelines [here][3].


### Which languages will be supported in Orchestrator multilingual models?
Orchestrator multilingual models currently supports 8 languages (EN, ES, DE, FR, IT, JA, PT, and ZH).  See [Orchestrator base models][14] for more information on specific models.  We are constantly looking to expand the number of supported languages and if a language is not yet supported, Azure translation could be used to translate incoming utterance to English first before passing it to Orchestrator.  

### Does Orchestrator replace LUIS Dispatch?
LUIS based [Dispatch][5] is on the path to be deprecated, although the exact timeline is not yet finalized.  Now is a good time to start evaluating Orchestrator as an alternative to Dispatch.

### Does Orchestrator support entity extraction?
Entity extraction is not yet generally available, however, a simple named entity recognition could be enabled.  See [NLP with entities sample][15] for instructions to enable entity recognition using Orchestrator.

### Does Orchestrator support LUIS patterns and what is the current workaround?  
Not at the moment.  Expanding LUIS patterns as Orchestrator examples is the recommended workaround, i.e. for pattern "do {stuff}", add a few examples to the intent of the pattern, "do clean up", "do homework", etc.  Another alternative is to convert LUIS pattern into examples with entity, i.e.  "do {@stuff=clean up}", "do {@stuff=homework}".  See [NLP with entities sample][15] for instructions to enable entity recognition using Orchestrator.

### What is the guidelines in choosing Orchestrator vs LUIS?
We recommend evaluating each solution against your data and see which performs better.  Both LUIS based [Dispatch CLI][5] and [BF Orchestrator CLI][6] come with a command to evaluate training and test data.

### Could you combine Orchestrator to predict intent and LUIS for entity?
Unfortunately not.  However, Orchestrator Recognizer could take external entity recognizers.  Look [here][7] for supported entity recognizers.

### How do you migrate from Dispatch solution to Orchestrator solution?
[BF Orchestrator CLI][6] comes with commands similar to [Dispatch CLI][5] commands.  bf orchestrator:create command also takes existing .dispatch file generated from Dispatch CLI for easy migration.  See [Dispatch Migration][12] documentation for more information.

### References
* [Orchestrator][8]
* [Composer][9]
* [LUIS][10]
* [QnAMaker][11]

[1]:https://docs.microsoft.com/en-us/azure/cognitive-services/luis/luis-how-to-use-dashboard
[2]:https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/how-to/test-knowledge-base?tabs=v1
[3]:https://github.com/microsoft/botframework-sdk/tree/main/orchestrator/samples/CLI/ModelTuning/README.md
[4]:https://github.com/pytorch/fairseq/tree/master/examples/xlmr#introduction
[5]:https://github.com/microsoft/botbuilder-tools/tree/master/packages/Dispatch
[6]:https://github.com/microsoft/botframework-cli/tree/main/packages/Orchestrator
[7]:https://github.com/microsoft/botbuilder-dotnet/tree/main/libraries/Microsoft.Bot.Builder.Dialogs.Adaptive/Recognizers/EntityRecognizers
[8]:https://aka.ms/bf-orchestrator
[9]:https://github.com/microsoft/BotFramework-Composer
[10]:https://docs.microsoft.com/en-us/azure/cognitive-services/luis/what-is-luis
[11]:https://docs.microsoft.com/en-us/azure/cognitive-services/qnamaker/overview/overview
[12]:https://github.com/microsoft/botframework-sdk/blob/main/Orchestrator/docs/DispatchMigrationExample.md
[13]:https://github.com/microsoft/BotFramework-Composer/blob/main/docs/preview%20features/orchestrator.md
[14]:https://aka.ms/NLRModels
[15]:https://github.com/microsoft/botframework-sdk/tree/main/Orchestrator/Samples/dotnet/nlp-with-entities



================================================
FILE: Orchestrator/docs/LICENSE.md
================================================
# MICROSOFT SOFTWARE LICENSE TERMS

MICROSOFT ORCHESTRATOR FOR AZURE BOT SERVICE

Purpose – For use with Azure Services.

------

**IF YOU LIVE IN (OR ARE A BUSINESS WITH A PRINCIPAL PLACE OF BUSINESS IN) THE UNITED STATES, PLEASE READ THE “BINDING ARBITRATION AND CLASS ACTION WAIVER” SECTION BELOW. IT AFFECTS HOW DISPUTES ARE RESOLVED.**

------

These license terms are an agreement between you and Microsoft Corporation (or one of its affiliates). They apply to the software named above and any Microsoft services or software updates (except to the extent such services or updates are accompanied by new or additional terms, in which case those different terms apply prospectively and do not alter your or Microsoft’s rights relating to pre-updated software or services). IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW. BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS.

## 1.   INSTALLATION AND USE RIGHTS.

   **a)  General.** You may install and use any number of copies of the software, solely for the purpose stated above and otherwise for your internal business purposes.

   **b)  Third Party Components.** The software may include third party components with separate legal notices or governed by other agreements, as may be described in the ThirdPartyNotices file(s) accompanying the software.

## 2.   DATA. 
This software may interact with other Microsoft products that collect data that is transmitted to Microsoft. To learn more about how Microsoft processes personal data we collect, please see the Microsoft Privacy Statement at https://go.microsoft.com/fwlink/?LinkId=248681.

## 3.   SCOPE OF LICENSE. 
The software is licensed, not sold. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you will not (and have no right to):

  **a)**   work around any technical limitations in the software that only allow you to use it in certain ways;

  **b)**  reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software;

  **c)**   remove, minimize, block, or modify any notices of Microsoft or its suppliers in the software;

  **d)**  use the software in any way that is against the law or to create or propagate malware; or

  **e)**   share, publish, distribute, or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party.



## 4.   EXPORT RESTRICTIONS. 
You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information on export restrictions, visit https://aka.ms/exporting.

## 5.   SUPPORT SERVICES. 
Microsoft is not obligated under this agreement to provide any support services for the software. Any support provided is “as is”, “with all faults”, and without warranty of any kind. 

## 6.   UPDATES.
The software may periodically check for updates and download and install them for you. You may obtain updates only from Microsoft or authorized sources. Microsoft may need to update your system to provide you with updates. You agree to receive these automatic updates without any additional notice. Updates may not include or support all existing software features, services, or peripheral devices.

## 7.   BINDING ARBITRATION AND CLASS ACTION WAIVER. 
**This Section applies if you live in (or, if a business, your principal place of business is in) the United States.**  If you and Microsoft have a dispute, you and Microsoft agree to try for 60 days to resolve it informally. If you and Microsoft can’t, you and Microsoft **agree to binding individual arbitration before the American Arbitration Association under the Federal Arbitration Act (“FAA”)**, and not to sue in court in front of a judge or jury. Instead, a neutral arbitrator will decide. **Class action lawsuits, class-wide arbitrations, private attorney-general actions, and any other proceeding where someone acts in a representative capacity are not allowed; nor is combining individual proceedings without the consent of all parties.** The complete Arbitration Agreement contains more terms and is at https://aka.ms/arb-agreement-4. You and Microsoft agree to these terms.

## 8.   TERMINATION.
Without prejudice to any other rights, Microsoft may terminate this agreement if you fail to comply with any of its terms or conditions. In such event, you must destroy all copies of the software and all of its component parts.

## 9.   ENTIRE AGREEMENT.
This agreement, and any other terms Microsoft may provide for supplements, updates, or third-party applications, is the entire agreement for the software.

## 10. APPLICABLE LAW AND PLACE TO RESOLVE DISPUTES. 
If you acquired the software in the United States or Canada, the laws of the state or province where you live (or, if a business, where your principal place of business is located) govern the interpretation of this agreement, claims for its breach, and all other claims (including consumer protection, unfair competition, and tort claims), regardless of conflict of laws principles, except that the FAA governs everything related to arbitration. If you acquired the software in any other country, its laws apply, except that the FAA governs everything related to arbitration. If U.S. federal jurisdiction exists, you and Microsoft consent to exclusive jurisdiction and venue in the federal court in King County, Washington for all disputes heard in court (excluding arbitration). If not, you and Microsoft consent to exclusive jurisdiction and venue in the Superior Court of King County, Washington for all disputes heard in court (excluding arbitration).

## 11. CONSUMER RIGHTS; REGIONAL VARIATIONS. 
This agreement describes certain legal rights. You may have other rights, including consumer rights, under the laws of your state, province, or country. Separate and apart from your relationship with Microsoft, you may also have rights with respect to the party from which you acquired the software. This agreement does not change those other rights if the laws of your state, province, or country do not permit it to do so. For example, if you acquired the software in one of the below regions, or mandatory country law applies, then the following provisions apply to you:

  **a)   Australia.** You have statutory guarantees under the Australian Consumer Law and nothing in this agreement is intended to affect those rights.

  **b)  Canada.** If you acquired this software in Canada, you may stop receiving updates by turning off the automatic update feature, disconnecting your device from the Internet (if and when you re-connect to the Internet, however, the software will resume checking for and installing updates), or uninstalling the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software.

  **c)   Germany and Austria**.

   - **i.  Warranty.** The properly licensed software will perform substantially as described in any Microsoft materials that accompany the software. However, Microsoft gives no contractual guarantee in relation to the licensed software.
    
   - **ii.  Limitation of Liability.** In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as, in case of death or personal or physical injury, Microsoft is liable according to the statutory law.

   Subject to the foregoing clause ii., Microsoft will only be liable for slight negligence if Microsoft is in breach of such material contractual obligations, the fulfillment of which facilitate the due performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence.

## 12. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES, OR CONDITIONS. TO THE EXTENT PERMITTED UNDER APPLICABLE LAWS, MICROSOFT EXCLUDES ALL IMPLIED WARRANTIES, INCLUDING MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.

## 13. LIMITATION ON AND EXCLUSION OF DAMAGES. IF YOU HAVE ANY BASIS FOR RECOVERING DAMAGES DESPITE THE PRECEDING DISCLAIMER OF WARRANTY, YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES.

**This limitation applies to (a) anything related to the software, services, content (including code) on third party Internet sites, or third party applications; and (b) claims for breach of contract, warranty, guarantee, or condition; strict liability, negligence, or other tort; or any other claim; in each case to the extent permitted by applicable law.**

**It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your state, province, or country may not allow the exclusion or limitation of incidental, consequential, or other damages.**

 

**Please note: As this software is distributed in Canada, some of the clauses in this agreement are provided below in French.**

**Remarque: Ce logiciel étant distribué au Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en français.**

**EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues.**

**LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices.**

**Cette limitation concerne:**

**•  tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers; et**

**•  les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur.**

**Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne s’appliquera pas à votre égard.**

**EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de votre pays si celles-ci ne le permettent pas.**

 

================================================
FILE: Orchestrator/docs/LUFormat.md
================================================
# LU Format in Orchestrator



Orchestrator Recognizer is used today only for routing intents to subsequent skills or other language services such as to QnAMaker or LUIS based dialog. A key distinction between Orchestrator and LUIS is that Orchestrator does not process entities. Entities specified in LU file are simply ignored by Orchestrator during language processing. This works because Orchestrator only needs to identify the utterance's intent in order to pass it further to the owning processor per above.  Also, because Orchestrator ignores entities, the user may simply copy,  paste, and merge LU contents from child LUIS dialog or a connected skill to the Orchestrator based dispatcher parent dialog.

To learn more about LU file format please refer to the original documentation here: [.lu file format - Bot Service | Microsoft Docs](https://docs.microsoft.com/en-us/azure/bot-service/file-format/bot-builder-lu-file-format?view=azure-bot-service-4.0)



================================================
FILE: Orchestrator/docs/NLRModels.md
================================================
# Prebuilt Language Models

Prebuilt language models have been trained towards more sophisticated tasks for both monolingual as well as multilingual scenarios, including intent prediction and entity extraction. Entity extraction is currently experimental and not yet ready for production use.

The following prebuilt language models are now available in [versions repository][2].

See the [References](#references) section for technical descriptions of the AI technology behind the models.

## Default Models

### pretrained.20200924.microsoft.dte.00.06.en.onnx
This is a high quality EN-only base model for intent detection that strikes the balance between size, speed and predictive performance. It is a 6-layer pretrained [Transformer][7] model optimized for conversation. Its architecture is pretrained for example-based use ([KNN][3]), thus it can be used out of box. This is the default model used if none explicitly specified.

### pretrained.20210205.microsoft.dte.00.06.unicoder_multilingual.onnx
This is a high quality multilingual base model for intent detection. It's smaller and faster than its 12-layer alternative. It is a 6-layer pretrained [Transformer][7] model optimized for conversation. Its architecture is pretrained for example-based use ([KNN][3]), thus it can be used out of box. The model supports in total 100 languages (full list can be found at [XLMR Supported Languages][8]). 8 languages (EN, ES, DE, FR, IT, JA, PT, and ZH) are fine-tuned with additional data (performance can be found [here](#multilingual-intent-detection-models-evaluation)). 

### pretrained.20210401.microsoft.dte.00.06.bert_example_ner_addon_free.en.onnx (experimental)
This is a high quality EN-only base model for entity extraction. It is a 6-layer pretrained [Transformer][7] model optimized for conversation. Its architecture is pretrained for example-based use ([KNN][3]), thus it can be used out of box.

## Alternate Models

### pretrained.20200924.microsoft.dte.00.03.en.onnx
This is a fast and small EN-only base model for intent detection with sufficient prediction performance. We suggest using this model if speed and memory size is critical to your deployment environment, otherwise consider other options. It is a generic 3-layer pretrained [Transformer][7] model optimized for conversation. Its architecture is pretrained for example-based use ([KNN][3]), thus it can be used out of box.

### pretrained.20200924.microsoft.dte.00.12.en.onnx
This is a high quality EN-only base model for intent detection, but is larger and slower than other options. It is a 12-layer pretrained [Transformer][7] model optimized for conversation. Its architecture is pretrained for example-based use ([KNN][3]), thus it can be used out of box.

### pretrained.20210521.microsoft.dte.01.06.int.en.onnx
This is a high quality quantized EN-only base model for intent detection, and it is smaller and faster than other options. It is a 6-layer pretrained [Transformer][7] model optimized for conversation. Its architecture is pretrained for example-based use ([KNN][3]), thus it can be used out of box.

### pretrained.20201210.microsoft.dte.00.12.unicoder_multilingual.onnx
This is a high quality multilingual base model for intent detection. It is a 12-layer pretrained [Transformer][7] model optimized for conversation.
Its architecture is pretrained for example-based use ([KNN][3]), thus it can be used out of box. The model supports in total 100 languages (full list can be found at [XLMR Supported Languages][8]). 8 languages (EN, ES, DE, FR, IT, JA, PT, and ZH) are fine-tuned with additional data (performance can be found [here](#multilingual-intent-detection-models-evaluation)). 

### pretrained.20210608.microsoft.dte.01.06.int.unicoder_multilingual.onnx
This is a high quality quantized multilingual base model for intent detection. It is a 6-layer pretrained [Transformer][7] model optimized for conversation. Its architecture is pretrained for example-based use ([KNN][3]), thus it can be used out of box. The model supports in total 100 languages (full list can be found at [XLMR Supported Languages][8]). 8 languages (EN, ES, DE, FR, IT, JA, PT, and ZH) are fine-tuned with additional data (performance can be found [here](#multilingual-intent-detection-models-evaluation)). 


## Models Evaluation
For a more quantitative comparison analysis of the different models see the following performance characteristics.

### English Intent Detection Models Evaluation

- The following table shows the size & speed performance attributes.


|  Model |Base Model   |Layers  |Encoding time per query | Disk Allocation |
| ------------ | ------------ | ------------ | ------------ | ------------ |
|pretrained.20200924.microsoft.dte.00.03.en.onnx | BERT | 3  |  ~ 7 ms  | 164M |
|pretrained.20200924.microsoft.dte.00.06.en.onnx | BERT | 6  |  ~ 14 ms | 261M |
|pretrained.20200924.microsoft.dte.00.12.en.onnx | BERT | 12 |  ~ 26 ms | 427M |
|pretrained.20210521.microsoft.dte.01.06.int.en.onnx | BERT | 6 |  ~ 6 ms | 65M |

- 
  The following table shows how accurate is each model relative to provided training sample size using [Snips NLU][4] system, evaluated by **micro-average-accuracy**.


|Training samples per intent   |5   |10   |25   |50   |100   |200   |
| ------------ | ------------ | ------------ | ------------ | ------------ | ------------ |------------ |
|pretrained.20200924.microsoft.dte.00.03.en.onnx |  0.756  | 0.839  | 0.904  | 0.929  | 0.943  | 0.951  |
|pretrained.20200924.microsoft.dte.00.06.en.onnx |   0.924 | 0.940  | 0.957  |  0.960 |  0.966 | 0.969  |
|pretrained.20200924.microsoft.dte.00.12.en.onnx |  0.902  |  0.931 |  0.951 | 0.960  |  0.964 |  0.969 |
|pretrained.20210521.microsoft.dte.01.06.int.en.onnx |  0.917  |  0.939 |  0.951 | 0.958  |  0.963 |  0.965 |


### Multilingual Intent Detection Models Evaluation
- The following table shows the size & speed performance attributes.

| Model                                                        | Base Model | Layers | Encoding time per query | Disk Allocation |
| ------------------------------------------------------------ | ---------- | ------ | ----------------------- | --------------- |
| pretrained.20210205.microsoft.dte.00.06.unicoder_multilingual.onnx | Unicoder   | 6      | ~ 9 ms                 | 918M            |
| pretrained.20201210.microsoft.dte.00.12.unicoder_multilingual.onnx | Unicoder   | 12     | ~ 16 ms                 | 1.08G           |
| pretrained.20210608.microsoft.dte.01.06.int.unicoder_multilingual.onnx | Unicoder   | 6     | ~ 4 ms                 | 230M        |

- The following table shows how accurate is each model by training and testing on the same language, evaluated by **micro-average-accuracy** on an internal dataset.

| Model                                                        | de-de | en-us | es-es | es-mx | fr-ca | fr-fr | it-it | ja-jp | pt-br | zh-cn |
| ------------------------------------------------------------ | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |
| pretrained.20210205.microsoft.dte.00.06.unicoder_multilingual.onnx | 0.638 | 0.785 | 0.662 | 0.760 | 0.723 | 0.661 | 0.701 | 0.786 | 0.735 | 0.805 |
| pretrained.20201210.microsoft.dte.00.12.unicoder_multilingual.onnx | 0.642 | 0.764 | 0.646 | 0.754 | 0.722 | 0.636 | 0.689 | 0.789 | 0.725 | 0.809 |
| pretrained.20210608.microsoft.dte.01.06.int.unicoder_multilingual.onnx | 0.634 | 0.765 | 0.657 | 0.743 | 0.715 | 0.646 | 0.697 | 0.780 | 0.743 | 0.799 |

- The following table shows how accurate is each model by training on **en-us** and testing on the different languages, evaluated by **micro-average-accuracy** on an internal dataset.

| Model                                                        | de-de | en-us | es-es | es-mx | fr-ca | fr-fr | it-it | ja-jp | pt-br | zh-cn |
| ------------------------------------------------------------ | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |
| pretrained.20210205.microsoft.dte.00.06.unicoder_multilingual.onnx | 0.495 | 0.785 | 0.530 | 0.621 | 0.560 | 0.518 | 0.546 | 0.663 | 0.568 | 0.687 |
| pretrained.20201210.microsoft.dte.00.12.unicoder_multilingual.onnx | 0.499 | 0.764 | 0.529 | 0.604 | 0.562 | 0.515 | 0.547 | 0.646 | 0.555 | 0.681 |
| pretrained.20210608.microsoft.dte.01.06.int.unicoder_multilingual.onnx | 0.496 | 0.765 | 0.529 | 0.623 | 0.562 | 0.511 | 0.540 | 0.670 | 0.579 | 0.692 |

### English Entity Extraction Models Evaluation

- The following table shows the size & speed performance attributes.

| Model                                                        | Base Model | Layers | Encoding time per query | Disk Allocation |
| ------------------------------------------------------------ | ---------- | ------ | ----------------------- | --------------- |
| pretrained.20210401.microsoft.dte.00.06.bert_example_ner_addon_free.en.onnx | TNLR       | 6      | ~ 29 ms                 | 253M            |

- The following table shows how accurate is each model relative to provided training sample size using [Snips NLU][4] system, evaluated by **macro-average-F1**.

| Training samples per entity type                             | 10    | 20    | 50    | 100   | 200   |
| ------------------------------------------------------------ | ----- | ----- | ----- | ----- | ----- |
| pretrained.20210401.microsoft.dte.00.06.bert_example_ner_addon_free.en.onnx | 0.702 | 0.712 | 0.731 | 0.752 | 0.739 |




## License

The models are released under the following [License Terms][6].

## References

* [UniLMv2 Paper][1]
* [Base Models Versions Repository][2]
* [KNN (K nearest neighbors algorithm)][3]
* [Snips NLU (Natural Language Understanding)][4]
* [Snips NLU Metrics][5]
* [Transformer][7]
* [XLMR Supported Languages][8]
* [Turing Universal Language Representation model (T-ULRv2)][11]
* [Microsoft DeBERTa - Blog][9]
* [Microsoft  AI At Scale][10]

[1]: https://arxiv.org/abs/2002.12804 "UniLMv2: Pseudo-Masked Language Models for Unified Language Model Pre-Training"
[2]: https://aka.ms/nlrversions_0.2
[3]: https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm
[4]: https://github.com/snipsco/snips-nlu "Snips NLU"
[5]: https://github.com/snipsco/snips-nlu-metrics "Snips NLU Metrics"
[6]: ./LICENSE.md "License agreement"
[7]: https://en.wikipedia.org/wiki/Transformer_(machine_learning_model)
[8]: https://github.com/pytorch/fairseq/tree/master/examples/xlmr#introduction
[9]: https://www.microsoft.com/en-us/research/blog/microsoft-deberta-surpasses-human-performance-on-the-superglue-benchmark/ "Microsoft DeBERTa - Microsoft Blog"
[10]: https://innovation.microsoft.com/en-us/exploring-ai-at-scale "AI at Scale"
[11]: https://www.microsoft.com/en-us/research/blog/microsoft-turing-universal-language-representation-model-t-ulrv2-tops-xtreme-leaderboard/ "Turing Universal Language Representation model"




================================================
FILE: Orchestrator/docs/Overview.md
================================================
# Technical Overview

The Orchestrator is a replacement of the [Bot Framework Dispatcher][1] used in chat bots since 2018. It makes the state of the art natural language understanding methods available to bot developers while at the same time making the process of language modeling quick, and not requiring the expertise in [Deep Neural Networks (DNN), Transformers][5], or [Natural Language Processing (NLP)][6]. This work is co-authored with the industry experts in the field and includes some of the top methods used in the [General Language Understanding Evaluation (GLUE)][7] leaderboard. Orchestrator will continue to evolve an
Download .txt
gitextract_dp4i3952/

├── .editorconfig
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── bot-framework-bug.md
│   │   └── bot-framework-feature-request.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── issue_template.md
├── .gitignore
├── CODE_OF_CONDUCT.md
├── Common/
│   ├── Telemetry/
│   │   └── README.md
│   ├── Transcripts/
│   │   ├── CoreExtensionsTests/
│   │   │   ├── ConversationStateTest.chat
│   │   │   ├── CustomStateTest.chat
│   │   │   └── UserStateTest.chat
│   │   ├── CoreTests/
│   │   │   └── BotAdapted_Bracketing.chat
│   │   ├── DialogsTests/
│   │   │   ├── AttachmentPrompt.chat
│   │   │   ├── ChoicePrompt.chat
│   │   │   ├── ConfirmPrompt.chat
│   │   │   ├── ContentAttachment.json
│   │   │   ├── DateTimePrompt.chat
│   │   │   ├── NumberPrompt.chat
│   │   │   ├── TextPrompt.chat
│   │   │   ├── Waterfall.chat
│   │   │   ├── WaterfallNested.chat
│   │   │   └── WaterfallPrompt.chat
│   │   ├── LuisTests/
│   │   │   └── LuisMiddleware.chat
│   │   ├── QnATests/
│   │   │   └── QnAMiddleware.chat
│   │   ├── README.md
│   │   └── TranslationTests/
│   │       ├── LocaleConvertToEnglish.chat
│   │       ├── TranslateToEnglish.chat
│   │       └── TranslateToUserLanguage.chat
│   └── badges/
│       └── BotBuilderBadge.md
├── Contributing.md
├── LICENSE
├── Orchestrator/
│   ├── README.md
│   ├── Samples/
│   │   ├── CLI/
│   │   │   └── ModelTuning/
│   │   │       ├── README.md
│   │   │       ├── common.fixed.lu
│   │   │       ├── common.lu
│   │   │       ├── common.test.lu
│   │   │       └── demo.cmd
│   │   └── dotnet/
│   │       └── nlp-with-entities/
│   │           ├── .gitignore
│   │           ├── AdapterWithErrorHandler.cs
│   │           ├── BotServices.cs
│   │           ├── Bots/
│   │           │   └── DispatchBot.cs
│   │           ├── CognitiveModels/
│   │           │   ├── HomeAutomation.lu
│   │           │   ├── QnAMaker.qna
│   │           │   └── Weather.lu
│   │           ├── Controllers/
│   │           │   └── BotController.cs
│   │           ├── IBotServices.cs
│   │           ├── OrchestratorConfig.cs
│   │           ├── Program.cs
│   │           ├── README.md
│   │           ├── Startup.cs
│   │           ├── nlp-with-entities.csproj
│   │           └── wwwroot/
│   │               └── default.html
│   ├── docs/
│   │   ├── BFOrchestratorInteractive.md
│   │   ├── BFOrchestratorReport.md
│   │   ├── BFOrchestratorUsage.md
│   │   ├── DispatchMigrationExample.md
│   │   ├── FAQ.md
│   │   ├── LICENSE.md
│   │   ├── LUFormat.md
│   │   ├── NLRModels.md
│   │   ├── Orchestrator Intro.pptx
│   │   ├── Overview.md
│   │   └── package/
│   │       └── README.md
│   ├── v0.1/
│   │   ├── nlr_versions.json
│   │   └── nlr_versions.schema
│   └── v0.2/
│       ├── nlr_versions.json
│       └── nlr_versions.schema
├── README.md
├── SECURITY.md
├── codeql3000.yml
├── docs/
│   ├── BF Labeling Guide.md
│   └── umlDiagrams/
│       ├── ActivityFlow/
│       │   ├── BFServiceAndBotDetails/
│       │   │   └── BFServiceAndBotDetails_DiagramSource.md
│       │   ├── BotFrameworkAdapterFlow/
│       │   │   └── BFAdapterActivityFlow_DiagramSource.md
│       │   ├── CustomAdapterFlow/
│       │   │   ├── BufferingWithCustomAdapter_DiagramSource.md
│       │   │   └── CustomAdapterActivityFlow_DiagramSource.md
│       │   ├── DetailedSdkFlow/
│       │   │   ├── DetailedSdkFlow.md
│       │   │   └── DetailedSdkFlow_DiagramSource.md
│       │   ├── GeneralActivityFlow.md
│       │   ├── GeneralActivityFlow_DiagramSource.md
│       │   └── README.md
│       └── Authentication/
│           ├── AddingAuthenticationToYourBot/
│           │   ├── AddAuthenticationToYourBotViaABS/
│           │   │   ├── DetailedView_DiagramSource.md
│           │   │   └── HigherLevel_DiagramSource.md
│           │   └── UserAuthenticationWithinAConversation/
│           │       ├── AuthenticationDocExample_Goal_DiagramSource.md
│           │       ├── AuthenticationDocExample_OAuthFlow_HasTokenInStorage_DiagramSource.md
│           │       └── AuthenticationDocExample_OAuthFlow_NoTokenToStart_DiagramSource.md
│           ├── AuthArchitectureInBotFramework/
│           │   └── OAuthPrompt/
│           │       ├── AdapterSavedAsTurnContextMember_DiagramSource.md
│           │       ├── BotFrameworkAdapterCreatesOAuthClient_DiagramSource.md
│           │       ├── BotFrameworkAdapterCreatesTokenApiClient_DiagramSource.md
│           │       ├── BuildAppCredentialsParticipants_DiagramSource.md
│           │       ├── CSharp_AppCredentialsClassDiagram_DiagramSource.md
│           │       ├── CSharp_OAuthPromptAndTokenProvider_DiagramSource.md
│           │       ├── CSharp_UseAppCredentialsToCreateOAuthClient_DiagramSource.md
│           │       ├── CreatingOAuthClientInMoreDetail.md
│           │       ├── CreatingOAuthClientInMoreDetail_DiagramSource.md
│           │       ├── GetUserTokenSequenceDiagram.md
│           │       ├── JS_AppCredentialsClassDiagram_DiagramSource.md
│           │       ├── JS_OAuthPromptAndTokenProvider_DiagramSource.md
│           │       ├── JS_UseAppCredentialsToCreateTokenApiClient_DiagramSource.md
│           │       ├── OAuthClientClassDiagram_DiagramSource.md
│           │       ├── OAuthPromptClassDiagrams.md
│           │       ├── ProcessActivityCreatesTurnContext_DiagramSource.md
│           │       ├── TakesAdapterFromTurnContext_DiagramSource.md
│           │       └── TokenApiClientClassDiagram_DiagramSource.md
│           ├── ChannelToBot/
│           │   ├── AuthenticateRequestOverview_DiagramSource.md
│           │   ├── AuthenticateRequest_DiagramSource.md
│           │   ├── ChannelActingOnBehalfOfSelf_DiagramSource.md
│           │   ├── ChannelActivingOnBehalfOfUser_DiagramSource.md
│           │   ├── ChannelToABSLayerToBot_DiagramSource.md
│           │   ├── HigherLevel_TokenAuthentication_DiagramSource.md
│           │   ├── JwtTokenValidationClassDiagram_DiagramSource.md
│           │   ├── README.md
│           │   ├── SimpleChannelWithTokenToBot_DiagramSource.md
│           │   ├── TokenSignatureParticipants_DiagramSource.md
│           │   └── WhyHelloBot_DiagramSource.md
│           ├── HighLevelAuthFlow/
│           │   ├── AuthServerAuthenticatesUser_DiagramSource.md
│           │   ├── AuthServerIssuesTokenToBot_DiagramSource.md
│           │   ├── GiveBotAccessToProtectedResource_DiagramSource.md
│           │   └── HighLevelAuthFlowSequenceDiagram_DiagramSource.md
│           ├── OAuthPrompt/
│           │   ├── OAuthPrompt_BeginDialog_DiagramSource.md
│           │   ├── OAuthPrompt_ContinueDialog_DetailedView_DiagramSource.md
│           │   ├── OAuthPrompt_ContinueDialog_HigherLevel_DiagramSource.md
│           │   └── README.md
│           └── README.md
├── dri/
│   ├── .gitignore
│   ├── README.md
│   ├── helpers.py
│   ├── output.py
│   ├── report.py
│   └── requirements.txt
├── parsers/
│   └── LU/
│       ├── ANTLR/
│       │   ├── LUFileLexer.g4
│       │   └── LUFileParser.g4
│       └── JS/
│           ├── build/
│           │   ├── bf-cli-build-test-steps.yml
│           │   ├── botframework-cli-azure-devops.yml
│           │   ├── botframework-cli-beta.yml
│           │   ├── botframework-cli-daily.yml
│           │   ├── botframework-cli-mac.yml
│           │   ├── botframework-cli-rc.yml
│           │   ├── botframework-cli-version.yml
│           │   └── botframework-cli.yml
│           ├── common/
│           │   ├── config/
│           │   │   └── rush/
│           │   │       ├── .npmrc
│           │   │       ├── command-line.json
│           │   │       ├── common-versions.json
│           │   │       ├── experiments.json
│           │   │       ├── pnpmfile.js
│           │   │       └── version-policies.json
│           │   └── scripts/
│           │       ├── install-run-rush.js
│           │       ├── install-run-rushx.js
│           │       ├── install-run.js
│           │       └── version-and-pack.js
│           ├── packages/
│           │   └── lu/
│           │       ├── .editorconfig
│           │       ├── .gitignore
│           │       ├── .nycrc
│           │       ├── README.md
│           │       ├── package.json
│           │       ├── src/
│           │       │   ├── index.ts
│           │       │   ├── parser/
│           │       │   │   ├── composerindex.js
│           │       │   │   ├── converters/
│           │       │   │   │   ├── helpers/
│           │       │   │   │   │   └── writer.js
│           │       │   │   │   ├── luistocsconverter.js
│           │       │   │   │   └── luistotsconverter.js
│           │       │   │   ├── cross-train/
│           │       │   │   │   ├── confighelper.js
│           │       │   │   │   ├── cross-train.js
│           │       │   │   │   └── crossTrainer.js
│           │       │   │   ├── index.js
│           │       │   │   ├── lu/
│           │       │   │   │   ├── lu.js
│           │       │   │   │   ├── luMerger.js
│           │       │   │   │   ├── luOptions.js
│           │       │   │   │   ├── qna.js
│           │       │   │   │   └── qnaOptions.js
│           │       │   │   ├── lubuild/
│           │       │   │   │   ├── builder.ts
│           │       │   │   │   ├── core.ts
│           │       │   │   │   ├── cross-trained-recognizer.ts
│           │       │   │   │   ├── multi-language-recognizer.ts
│           │       │   │   │   ├── recognizer.ts
│           │       │   │   │   └── settings.ts
│           │       │   │   ├── lufile/
│           │       │   │   │   ├── LUFileLexer.g4
│           │       │   │   │   ├── LUFileParser.g4
│           │       │   │   │   ├── baseSection.js
│           │       │   │   │   ├── classes/
│           │       │   │   │   │   ├── filesToParse.js
│           │       │   │   │   │   ├── hclasses.js
│           │       │   │   │   │   └── parserObject.js
│           │       │   │   │   ├── diagnostic.js
│           │       │   │   │   ├── entitySection.js
│           │       │   │   │   ├── generated/
│           │       │   │   │   │   ├── LUFileLexer.interp
│           │       │   │   │   │   ├── LUFileLexer.js
│           │       │   │   │   │   ├── LUFileLexer.tokens
│           │       │   │   │   │   ├── LUFileParser.interp
│           │       │   │   │   │   ├── LUFileParser.js
│           │       │   │   │   │   ├── LUFileParser.tokens
│           │       │   │   │   │   ├── LUFileParserListener.js
│           │       │   │   │   │   └── LUFileParserVisitor.js
│           │       │   │   │   ├── importSection.js
│           │       │   │   │   ├── luErrorListener.js
│           │       │   │   │   ├── luParser.js
│           │       │   │   │   ├── luResource.js
│           │       │   │   │   ├── modelInfoSection.js
│           │       │   │   │   ├── nestedIntentSection.js
│           │       │   │   │   ├── newEntitySection.js
│           │       │   │   │   ├── parseFileContents.js
│           │       │   │   │   ├── qnaSection.js
│           │       │   │   │   ├── read-text-file.js
│           │       │   │   │   ├── sectionOperator.js
│           │       │   │   │   ├── simpleIntentSection.js
│           │       │   │   │   ├── translate-helpers.js
│           │       │   │   │   └── visitor.js
│           │       │   │   ├── luis/
│           │       │   │   │   ├── luConverter.js
│           │       │   │   │   ├── luis.js
│           │       │   │   │   ├── luisBuilder.js
│           │       │   │   │   ├── luisCollate.js
│           │       │   │   │   ├── luisGen.js
│           │       │   │   │   ├── luisGenBuilder.js
│           │       │   │   │   ├── luisValidator.js
│           │       │   │   │   └── propertyHelper.js
│           │       │   │   ├── qna/
│           │       │   │   │   ├── alterations/
│           │       │   │   │   │   ├── alterations.js
│           │       │   │   │   │   └── qnaConverter.js
│           │       │   │   │   └── qnamaker/
│           │       │   │   │       ├── kb.js
│           │       │   │   │       ├── kbCollate.js
│           │       │   │   │       ├── qnaContext.js
│           │       │   │   │       ├── qnaConverter.js
│           │       │   │   │       ├── qnaFiles.js
│           │       │   │   │       ├── qnaList.js
│           │       │   │   │       ├── qnaMakerBuilder.js
│           │       │   │   │       ├── qnaMetaData.js
│           │       │   │   │       ├── qnaPrompt.js
│           │       │   │   │       └── qnamaker.js
│           │       │   │   ├── qnabuild/
│           │       │   │   │   ├── builder.ts
│           │       │   │   │   ├── core.ts
│           │       │   │   │   ├── cross-trained-recognizer.ts
│           │       │   │   │   ├── multi-language-recognizer.ts
│           │       │   │   │   ├── recognizer.ts
│           │       │   │   │   ├── serviceBase.js
│           │       │   │   │   └── settings.ts
│           │       │   │   ├── test/
│           │       │   │   │   └── testhelper.ts
│           │       │   │   ├── translator/
│           │       │   │   │   └── lutranslate.js
│           │       │   │   └── utils/
│           │       │   │       ├── enums/
│           │       │   │       │   ├── CLI-errors.js
│           │       │   │       │   ├── invalidchars.js
│           │       │   │       │   ├── luisEntityTypeNameMap.js
│           │       │   │       │   ├── luisEntityTypes.js
│           │       │   │       │   ├── luisbuiltintypes.js
│           │       │   │       │   ├── luisobjenum.js
│           │       │   │       │   ├── lusectiontypes.js
│           │       │   │       │   ├── parsecommands.js
│           │       │   │       │   ├── parserconsts.js
│           │       │   │       │   └── recognizertypes.js
│           │       │   │       ├── exception.js
│           │       │   │       └── helpers.js
│           │       │   └── utils/
│           │       │       ├── filehelper.ts
│           │       │       └── textfilereader.ts
│           │       ├── test/
│           │       │   ├── commands/
│           │       │   │   └── luis/
│           │       │   │       └── convert.test.js
│           │       │   ├── fixtures/
│           │       │   │   ├── empty.json
│           │       │   │   ├── empty.lu
│           │       │   │   ├── es/
│           │       │   │   │   └── file.lu
│           │       │   │   ├── examples/
│           │       │   │   │   ├── 1.lu
│           │       │   │   │   ├── 10.lu
│           │       │   │   │   ├── 11.lu
│           │       │   │   │   ├── 12.lu
│           │       │   │   │   ├── 13.lu
│           │       │   │   │   ├── 2.lu
│           │       │   │   │   ├── 3.lu
│           │       │   │   │   ├── 4.lu
│           │       │   │   │   ├── 5.lu
│           │       │   │   │   ├── 6.lu
│           │       │   │   │   ├── 7.lu
│           │       │   │   │   ├── 8.lu
│           │       │   │   │   ├── 9.lu
│           │       │   │   │   ├── 9a.lu
│           │       │   │   │   ├── README.MD
│           │       │   │   │   ├── all.lu
│           │       │   │   │   ├── all.md
│           │       │   │   │   ├── all.qna
│           │       │   │   │   ├── buyChocolate.lu
│           │       │   │   │   ├── changeAlarm.lu
│           │       │   │   │   ├── comment.lu
│           │       │   │   │   ├── compositeEntities.lu
│           │       │   │   │   ├── en-us/
│           │       │   │   │   │   ├── changeAlarm.lu
│           │       │   │   │   │   ├── none.lu
│           │       │   │   │   │   ├── qna4.lu
│           │       │   │   │   │   └── root.lu
│           │       │   │   │   ├── fr-fr/
│           │       │   │   │   │   ├── changeAlarm.lu
│           │       │   │   │   │   ├── none.lu
│           │       │   │   │   │   ├── qna4.lu
│           │       │   │   │   │   └── root.lu
│           │       │   │   │   ├── luFileReference1.lu
│           │       │   │   │   ├── luFileReference2.lu
│           │       │   │   │   ├── luFileReference3.lu
│           │       │   │   │   ├── luFileReference4.lu
│           │       │   │   │   ├── luFileReference5.lu
│           │       │   │   │   ├── luFileReference6.lu
│           │       │   │   │   ├── negativeCase1.lu
│           │       │   │   │   ├── negativeCase2.lu
│           │       │   │   │   ├── negativeCase3.lu
│           │       │   │   │   ├── negativeCase4.lu
│           │       │   │   │   ├── negativeCase5.lu
│           │       │   │   │   ├── newEntityWithFeatures.lu
│           │       │   │   │   ├── none.lu
│           │       │   │   │   ├── patterns.lu
│           │       │   │   │   ├── patterns1.lu
│           │       │   │   │   ├── phraseLists.lu
│           │       │   │   │   ├── qna-alterations.lu
│           │       │   │   │   ├── qna1.lu
│           │       │   │   │   ├── qna2.lu
│           │       │   │   │   ├── qna3.lu
│           │       │   │   │   ├── qna4.lu
│           │       │   │   │   ├── qna5.lu
│           │       │   │   │   ├── qna6.lu
│           │       │   │   │   ├── qna7.lu
│           │       │   │   │   ├── regexEntity.lu
│           │       │   │   │   └── v7UpgradeTest.lu
│           │       │   │   ├── file.lu
│           │       │   │   ├── fr/
│           │       │   │   │   └── file.lu
│           │       │   │   ├── generate/
│           │       │   │   │   ├── ClosedLists.cs
│           │       │   │   │   ├── ClosedLists.json
│           │       │   │   │   ├── CompositeEntities.cs
│           │       │   │   │   ├── CompositeEntities.json
│           │       │   │   │   ├── ContosoApp.cs
│           │       │   │   │   ├── ContosoApp.json
│           │       │   │   │   ├── FlightBooking.cs
│           │       │   │   │   ├── FlightBooking.json
│           │       │   │   │   ├── FlightBooking.ts
│           │       │   │   │   ├── Intents.cs
│           │       │   │   │   ├── Intents.json
│           │       │   │   │   ├── NamespaceClass.cs
│           │       │   │   │   ├── PatternEntities.cs
│           │       │   │   │   ├── PatternEntities.json
│           │       │   │   │   ├── PrebuiltEntities.cs
│           │       │   │   │   ├── PrebuiltEntities.json
│           │       │   │   │   ├── RegexEntities.cs
│           │       │   │   │   ├── RegexEntities.json
│           │       │   │   │   ├── SimpleEntities.cs
│           │       │   │   │   ├── SimpleEntities.json
│           │       │   │   │   ├── closed-lists.ts
│           │       │   │   │   ├── composite-entities.ts
│           │       │   │   │   ├── contoso-app.ts
│           │       │   │   │   ├── intents.ts
│           │       │   │   │   ├── invalid.json
│           │       │   │   │   ├── pattern-entities.ts
│           │       │   │   │   ├── prebuilt-entities.ts
│           │       │   │   │   ├── regex-entities.ts
│           │       │   │   │   └── simple-entities.ts
│           │       │   │   ├── none.lu
│           │       │   │   ├── qna.lu
│           │       │   │   ├── root.luis.json
│           │       │   │   ├── testcases/
│           │       │   │   │   ├── 1-intent-pattern-prebuilt.lu
│           │       │   │   │   ├── 1-intent.lu
│           │       │   │   │   ├── 8.lu
│           │       │   │   │   ├── Child_Entity_With_Spaces.json
│           │       │   │   │   ├── InvalidLUISModel.json
│           │       │   │   │   ├── InvalidLUISModel1.json
│           │       │   │   │   ├── InvalidLUISModel2.json
│           │       │   │   │   ├── LUISAppWithPAInherits.json
│           │       │   │   │   ├── ListEntityAndBatchtestsProblem.1.lu
│           │       │   │   │   ├── ListEntityAndBatchtestsProblem.2.lu
│           │       │   │   │   ├── ListEntityAndBatchtestsProblem.lu
│           │       │   │   │   ├── MultiturnReplaceKbWithFlattenedTree.json
│           │       │   │   │   ├── Skills/
│           │       │   │   │   │   ├── Calendar/
│           │       │   │   │   │   │   ├── Calendar.lu
│           │       │   │   │   │   │   └── General.lu
│           │       │   │   │   │   ├── Email/
│           │       │   │   │   │   │   ├── Email.lu
│           │       │   │   │   │   │   └── General.lu
│           │       │   │   │   │   └── Todo/
│           │       │   │   │   │       ├── General.lu
│           │       │   │   │   │       └── ToDo.lu
│           │       │   │   │   ├── all-entity-types.lu
│           │       │   │   │   ├── all.json
│           │       │   │   │   ├── all_qna.json
│           │       │   │   │   ├── bad.lu
│           │       │   │   │   ├── bad2.lu
│           │       │   │   │   ├── bad3.lu
│           │       │   │   │   ├── bad3a.lu
│           │       │   │   │   ├── bad4.lu
│           │       │   │   │   ├── bad5.lu
│           │       │   │   │   ├── bf-627.json
│           │       │   │   │   ├── buyChocolate.lu
│           │       │   │   │   ├── calendar_all_prebuilt.json
│           │       │   │   │   ├── collate/
│           │       │   │   │   │   ├── 1.lu
│           │       │   │   │   │   ├── 10.lu
│           │       │   │   │   │   ├── 11.lu
│           │       │   │   │   │   ├── 11.qna
│           │       │   │   │   │   ├── 12.lu
│           │       │   │   │   │   ├── 12.qna
│           │       │   │   │   │   ├── 2.lu
│           │       │   │   │   │   ├── 3.lu
│           │       │   │   │   │   ├── 4.lu
│           │       │   │   │   │   ├── 5.lu
│           │       │   │   │   │   ├── 6.lu
│           │       │   │   │   │   ├── 7.lu
│           │       │   │   │   │   ├── 8.lu
│           │       │   │   │   │   ├── 9.lu
│           │       │   │   │   │   ├── 9a.lu
│           │       │   │   │   │   ├── buyChocolate.lu
│           │       │   │   │   │   ├── changeAlarm.lu
│           │       │   │   │   │   ├── comment.lu
│           │       │   │   │   │   ├── none.lu
│           │       │   │   │   │   ├── patterns1.lu
│           │       │   │   │   │   ├── phraseLists.lu
│           │       │   │   │   │   ├── qna-alterations.qna
│           │       │   │   │   │   ├── qna1.qna
│           │       │   │   │   │   ├── qna2.qna
│           │       │   │   │   │   ├── qna3.qna
│           │       │   │   │   │   ├── qna4.qna
│           │       │   │   │   │   ├── qna5.qna
│           │       │   │   │   │   ├── qna6.lu
│           │       │   │   │   │   ├── qna6.qna
│           │       │   │   │   │   └── qna7.qna
│           │       │   │   │   ├── comment.lu
│           │       │   │   │   ├── deepreference/
│           │       │   │   │   │   ├── qna1.lu
│           │       │   │   │   │   └── qna5.lu
│           │       │   │   │   ├── emptyIntentDescriptors.json
│           │       │   │   │   ├── entityNameWithSpaceAndFeature.json
│           │       │   │   │   ├── faq.lu
│           │       │   │   │   ├── fileReference/
│           │       │   │   │   │   ├── 9.lu
│           │       │   │   │   │   ├── AboutBot.lu
│           │       │   │   │   │   └── L2/
│           │       │   │   │   │       ├── AboutUser.lu
│           │       │   │   │   │       ├── Command.lu
│           │       │   │   │   │       ├── Compliment.lu
│           │       │   │   │   │       ├── Criticism.lu
│           │       │   │   │   │       ├── Dialog.lu
│           │       │   │   │   │       ├── Greeting.lu
│           │       │   │   │   │       ├── Relationship.lu
│           │       │   │   │   │       └── none.lu
│           │       │   │   │   ├── import-resolver/
│           │       │   │   │   │   ├── lu-import-resolver/
│           │       │   │   │   │   │   ├── common.en-us.lu
│           │       │   │   │   │   │   ├── help.en-us.lu
│           │       │   │   │   │   │   ├── terminate.en-us.lu
│           │       │   │   │   │   │   └── welcome.en-us.lu
│           │       │   │   │   │   └── qna-import-resolver/
│           │       │   │   │   │       ├── common.en-us.qna
│           │       │   │   │   │       ├── terminate.en-us.qna
│           │       │   │   │   │       └── welcome.en-us.qna
│           │       │   │   │   ├── intentWithSpace.json
│           │       │   │   │   ├── invalid-alterations.lu
│           │       │   │   │   ├── invalid-entity-definition.lu
│           │       │   │   │   ├── invalid_model.lu
│           │       │   │   │   ├── invalid_prebuilt_1.lu
│           │       │   │   │   ├── invalid_prebuilt_2.lu
│           │       │   │   │   ├── invalid_prebuilt_3.lu
│           │       │   │   │   ├── invalid_prebuilt_4.lu
│           │       │   │   │   ├── list-entity-body-without-hyphen.lu
│           │       │   │   │   ├── lubuild/
│           │       │   │   │   │   ├── file-name-duplicated/
│           │       │   │   │   │   │   ├── Foo.en-us.lu
│           │       │   │   │   │   │   └── Foo.lu
│           │       │   │   │   │   ├── foo/
│           │       │   │   │   │   │   ├── config/
│           │       │   │   │   │   │   │   └── luis.settings.development.westus.json
│           │       │   │   │   │   │   ├── dialogs/
│           │       │   │   │   │   │   │   ├── foo.en-us.lu.dialog
│           │       │   │   │   │   │   │   ├── foo.fr-fr.lu.dialog
│           │       │   │   │   │   │   │   ├── foo.lu.dialog
│           │       │   │   │   │   │   │   └── foo.zh-cn.lu.dialog
│           │       │   │   │   │   │   └── lufiles/
│           │       │   │   │   │   │       ├── foo.fr-fr.lu
│           │       │   │   │   │   │       ├── foo.lu
│           │       │   │   │   │   │       └── foo.zh-cn.lu
│           │       │   │   │   │   ├── foo2/
│           │       │   │   │   │   │   ├── config/
│           │       │   │   │   │   │   │   └── luis.settings.development.westus.json
│           │       │   │   │   │   │   ├── dialogs/
│           │       │   │   │   │   │   │   ├── foo.en-us.lu.dialog
│           │       │   │   │   │   │   │   ├── foo.fr-fr.lu.dialog
│           │       │   │   │   │   │   │   ├── foo.lu.dialog
│           │       │   │   │   │   │   │   └── foo.zh-cn.lu.dialog
│           │       │   │   │   │   │   ├── lufiles-and-dialog-assets/
│           │       │   │   │   │   │   │   ├── foo.en-us.lu.dialog
│           │       │   │   │   │   │   │   ├── foo.fr-fr.lu
│           │       │   │   │   │   │   │   ├── foo.fr-fr.lu.dialog
│           │       │   │   │   │   │   │   ├── foo.lu
│           │       │   │   │   │   │   │   ├── foo.lu.dialog
│           │       │   │   │   │   │   │   ├── foo.zh-cn.lu
│           │       │   │   │   │   │   │   └── luis.settings.development.westus.json
│           │       │   │   │   │   │   └── luis/
│           │       │   │   │   │   │       ├── test(development)-foo.en-us.lu.json
│           │       │   │   │   │   │       └── test(development)-foo.fr-fr.lu.json
│           │       │   │   │   │   └── sandwich/
│           │       │   │   │   │       ├── config/
│           │       │   │   │   │       │   └── luis.settings.development.westus.json
│           │       │   │   │   │       ├── dialogs/
│           │       │   │   │   │       │   ├── sandwich.en-us.lu.dialog
│           │       │   │   │   │       │   └── sandwich.lu.dialog
│           │       │   │   │   │       ├── lufiles/
│           │       │   │   │   │       │   ├── sandwich-BreadEntity.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-CheeseEntity.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-Confirmation.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-DirectionsEntity.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-LengthEntity.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-MeatEntity.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-NameEntity.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-PROPERTYName.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-Price.quantity.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-Quantity.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-QuantityEntity.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-cancelIntent.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-dimension.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-helpIntent.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-money.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-noneIntent.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-number.en-us.lu
│           │       │   │   │   │       │   ├── sandwich-sandwich.lu
│           │       │   │   │   │       │   └── sandwich.en-us.lu
│           │       │   │   │   │       └── luis/
│           │       │   │   │   │           ├── test(development)-sandwich.en-us.lu.json
│           │       │   │   │   │           ├── test(development)-sandwich.utteranceAdded.en-us.lu.json
│           │       │   │   │   │           └── test(development)-sandwich.utteranceChanged.en-us.lu.json
│           │       │   │   │   ├── merge_intents_disabled.lu
│           │       │   │   │   ├── missing-synonyms.lu
│           │       │   │   │   ├── missing-utterance.lu
│           │       │   │   │   ├── missing-utterance2.lu
│           │       │   │   │   ├── multi-ref.lu
│           │       │   │   │   ├── multiturn.qna
│           │       │   │   │   ├── nested-luis-json.json
│           │       │   │   │   ├── newEntity1.json
│           │       │   │   │   ├── newEntity2.json
│           │       │   │   │   ├── overlappingEntities.json
│           │       │   │   │   ├── phraseLists.lu
│           │       │   │   │   ├── plFeatureDisabled.json
│           │       │   │   │   ├── plWithFlags.lu
│           │       │   │   │   ├── prebuilt-entity.lu
│           │       │   │   │   ├── prebuilt_model.json
│           │       │   │   │   ├── qna-alterations_Alterations.json
│           │       │   │   │   ├── qna-filter-line-without-hyphen.lu
│           │       │   │   │   ├── qna-question-line-without-hyphen.lu
│           │       │   │   │   ├── qnaDocuments.json
│           │       │   │   │   ├── qnaref.qna
│           │       │   │   │   ├── reduced.lu
│           │       │   │   │   ├── ref1.lu
│           │       │   │   │   ├── ref10.lu
│           │       │   │   │   ├── ref11.lu
│           │       │   │   │   ├── ref12.lu
│           │       │   │   │   ├── ref13.lu
│           │       │   │   │   ├── ref14.qna
│           │       │   │   │   ├── ref15.qna
│           │       │   │   │   ├── ref2.lu
│           │       │   │   │   ├── ref3.qna
│           │       │   │   │   ├── ref4.lu
│           │       │   │   │   ├── ref5.lu
│           │       │   │   │   ├── ref6.lu
│           │       │   │   │   ├── ref7.lu
│           │       │   │   │   ├── ref8.lu
│           │       │   │   │   ├── ref9.lu
│           │       │   │   │   ├── ref_src1.lu
│           │       │   │   │   ├── ref_src2.lu
│           │       │   │   │   ├── regexmodel.luis
│           │       │   │   │   ├── root.lu
│           │       │   │   │   ├── root2.lu
│           │       │   │   │   ├── root3.lu
│           │       │   │   │   ├── section_disabled.lu
│           │       │   │   │   ├── section_disabled2.lu
│           │       │   │   │   ├── section_enabled.lu
│           │       │   │   │   ├── section_enabled2.lu
│           │       │   │   │   ├── special-char-in-entity-type.lu
│           │       │   │   │   ├── test269-d.json
│           │       │   │   │   ├── testTokenizerVersion.json
│           │       │   │   │   ├── testcases-data.js
│           │       │   │   │   ├── translate-testcase-data.js
│           │       │   │   │   ├── translate-with-number.lu
│           │       │   │   │   ├── utterance-without-hyphen.lu
│           │       │   │   │   ├── v6WithoutPhraseLists.lu
│           │       │   │   │   └── v7app.json
│           │       │   │   ├── translation/
│           │       │   │   │   ├── en/
│           │       │   │   │   │   ├── qna.json
│           │       │   │   │   │   ├── qna.lu
│           │       │   │   │   │   └── translateLuResponse.json
│           │       │   │   │   ├── files/
│           │       │   │   │   │   ├── allEntities.lu
│           │       │   │   │   │   ├── bad.lu
│           │       │   │   │   │   ├── fileRef.lu
│           │       │   │   │   │   ├── intentsAndUtterances.lu
│           │       │   │   │   │   ├── labelledEntityValue.lu
│           │       │   │   │   │   ├── newEntity.lu
│           │       │   │   │   │   ├── normalizedValue.lu
│           │       │   │   │   │   ├── options.lu
│           │       │   │   │   │   ├── phraseList.lu
│           │       │   │   │   │   ├── qna.lu
│           │       │   │   │   │   └── qnaContent.lu
│           │       │   │   │   ├── fr/
│           │       │   │   │   │   ├── qna.json
│           │       │   │   │   │   ├── qna.lu
│           │       │   │   │   │   └── root.luis.json
│           │       │   │   │   ├── serviceresponses/
│           │       │   │   │   │   ├── allEntities.json
│           │       │   │   │   │   ├── fileRef.json
│           │       │   │   │   │   ├── intentsAndUtterances.json
│           │       │   │   │   │   ├── labelledEntityValue.json
│           │       │   │   │   │   ├── newEntity.json
│           │       │   │   │   │   ├── normalizedValue.json
│           │       │   │   │   │   ├── options.json
│           │       │   │   │   │   ├── phraseList.json
│           │       │   │   │   │   ├── qna.json
│           │       │   │   │   │   └── qnaContent.json
│           │       │   │   │   ├── translateLuResponse.json
│           │       │   │   │   ├── translateLuResponseSecond.json
│           │       │   │   │   ├── translateLuisResponse.json
│           │       │   │   │   ├── translateLuisResponseSecond.json
│           │       │   │   │   └── translatedfiles/
│           │       │   │   │       ├── allEntities.lu
│           │       │   │   │       ├── fileRef.lu
│           │       │   │   │       ├── intentsAndUtterances.lu
│           │       │   │   │       ├── labelledEntityValue.lu
│           │       │   │   │       ├── newEntity.lu
│           │       │   │   │       ├── normalizedValue.lu
│           │       │   │   │       ├── options.lu
│           │       │   │   │       ├── phraseList.lu
│           │       │   │   │       ├── qna.lu
│           │       │   │   │       └── qnaContent.lu
│           │       │   │   └── verified/
│           │       │   │       ├── 1.json
│           │       │   │       ├── 1.lu
│           │       │   │       ├── 11.json
│           │       │   │       ├── 12.json
│           │       │   │       ├── 12qna.json
│           │       │   │       ├── 13.json
│           │       │   │       ├── 2.json
│           │       │   │       ├── 3.json
│           │       │   │       ├── 4.json
│           │       │   │       ├── 5.json
│           │       │   │       ├── 6.json
│           │       │   │       ├── 7.json
│           │       │   │       ├── 9.json
│           │       │   │       ├── 9a.json
│           │       │   │       ├── Child_Entity_With_Spaces.lu
│           │       │   │       ├── LUISAppWithPAInherits.lu
│           │       │   │       ├── LUISAppWithPAInherits.lu.json
│           │       │   │       ├── ListEntityAndBatchtestsProblem.1_LUISBatchTest.json
│           │       │   │       ├── ListEntityAndBatchtestsProblem.2_LUISBatchTest.json
│           │       │   │       ├── ListEntityAndBatchtestsProblem_LUISBatchTest.json
│           │       │   │       ├── MultiturnReplaceKbWithFlattenedTree.qna
│           │       │   │       ├── Skills/
│           │       │   │       │   ├── Calendar.json
│           │       │   │       │   ├── Email.json
│           │       │   │       │   └── ToDo.json
│           │       │   │       ├── all-entity-types.json
│           │       │   │       ├── all-qna.json
│           │       │   │       ├── all.json
│           │       │   │       ├── allGen.lu
│           │       │   │       ├── allGenQnA.lu
│           │       │   │       ├── allRefresh.lu
│           │       │   │       ├── allall-qna.lu
│           │       │   │       ├── alterations_qna4.json
│           │       │   │       ├── buyChocolate.json
│           │       │   │       ├── calendar_all_prebuilt.lu
│           │       │   │       ├── calendar_all_prebuilt_parsed.json
│           │       │   │       ├── collate-qna.json
│           │       │   │       ├── collate_Alterations.json
│           │       │   │       ├── collate_alteration_gen.lu
│           │       │   │       ├── collate_refresh.lu
│           │       │   │       ├── collated-luis.json
│           │       │   │       ├── collated-luis_LUISBatchTest.json
│           │       │   │       ├── de/
│           │       │   │       │   ├── all.lu
│           │       │   │       │   ├── faq.lu
│           │       │   │       │   ├── reduced.lu
│           │       │   │       │   └── translate-with-number.lu
│           │       │   │       ├── emptyIntentDescriptors.lu
│           │       │   │       ├── importUrl.json
│           │       │   │       ├── luis_sorted.lu
│           │       │   │       ├── merge_intents_disabled.json
│           │       │   │       ├── modelAsFeatureGen.lu
│           │       │   │       ├── modelAsFeatures.json
│           │       │   │       ├── modelAsFeatures.lu
│           │       │   │       ├── modelInfo.lu
│           │       │   │       ├── multiturn.json.qna
│           │       │   │       ├── multiturn.qna.json
│           │       │   │       ├── nDepthEntity.json
│           │       │   │       ├── nDepthEntity.lu
│           │       │   │       ├── nDepthEntityInUtterance.json
│           │       │   │       ├── nDepthEntityInUtterance.lu
│           │       │   │       ├── newEntity1.lu
│           │       │   │       ├── newEntity2.lu
│           │       │   │       ├── newEntityWithFeatures.json
│           │       │   │       ├── newEntityWithFeatures.lu
│           │       │   │       ├── plFeatures.json
│           │       │   │       ├── plFeatures.lu
│           │       │   │       ├── plWithFlags.json
│           │       │   │       ├── prebuilt-entity.json
│           │       │   │       ├── prebuilt_mode.lu
│           │       │   │       ├── prebuilt_model_parse.json
│           │       │   │       ├── qna5.json
│           │       │   │       ├── qna_a_sorted.lu
│           │       │   │       ├── qna_sorted.lu
│           │       │   │       ├── ref1.json
│           │       │   │       ├── ref14_a.json
│           │       │   │       ├── ref15_a.json
│           │       │   │       ├── ref4.json
│           │       │   │       ├── ref5.json
│           │       │   │       ├── ref6.json
│           │       │   │       ├── ref7.json
│           │       │   │       ├── ref8.json
│           │       │   │       ├── referenceUrl.json
│           │       │   │       ├── referenceUrlWithWildCard.json
│           │       │   │       ├── regexmodel.lu
│           │       │   │       ├── root.json
│           │       │   │       ├── root2.json
│           │       │   │       ├── root2_luis.json
│           │       │   │       ├── root3.lu
│           │       │   │       ├── root_luis.json
│           │       │   │       ├── section_disabled.json
│           │       │   │       ├── section_disabled2.json
│           │       │   │       ├── section_enabled.json
│           │       │   │       ├── section_enabled2.json
│           │       │   │       ├── sorted.lu
│           │       │   │       ├── special-char-in-entity-type.json
│           │       │   │       ├── stdin-qna.lu
│           │       │   │       ├── stdin.lu
│           │       │   │       ├── test269-d.lu
│           │       │   │       ├── v5Upgrade.json
│           │       │   │       ├── v5UpgradeTest.lu
│           │       │   │       ├── v6WithoutPhraseLists.json
│           │       │   │       ├── v7UpgradeTest.json
│           │       │   │       ├── v7UpgradeTest.lu
│           │       │   │       ├── v7app.lu
│           │       │   │       ├── v7app_c.json
│           │       │   │       └── zh-Hans/
│           │       │   │           └── reduced.lu
│           │       │   ├── hook.js
│           │       │   ├── mocha.opts
│           │       │   ├── parser/
│           │       │   │   ├── cross-train/
│           │       │   │   │   └── crossTrainer.test.js
│           │       │   │   ├── lu/
│           │       │   │   │   └── lu.test.js
│           │       │   │   ├── lubuild/
│           │       │   │   │   └── lubuild.test.js
│           │       │   │   ├── lufile/
│           │       │   │   │   ├── appKbMetaData.test.js
│           │       │   │   │   ├── classes/
│           │       │   │   │   │   └── classes.test.js
│           │       │   │   │   ├── helpers.test.js
│           │       │   │   │   ├── luQnAFileReference.test.js
│           │       │   │   │   ├── luis.boundary.test.js
│           │       │   │   │   ├── lutranslator.test.js
│           │       │   │   │   ├── newEntityDefinitionWithSpaces.test.js
│           │       │   │   │   ├── parseFileContents.NewEntityDefinition.test.js
│           │       │   │   │   ├── parseFileContents.comments.test.js
│           │       │   │   │   ├── parseFileContents.composeEntity.test.js
│           │       │   │   │   ├── parseFileContents.featureToModels.test.js
│           │       │   │   │   ├── parseFileContents.modelAsFeature.test.js
│           │       │   │   │   ├── parseFileContents.nDepthEntity.test.js
│           │       │   │   │   ├── parseFileContents.newEntityInUtterance.test.js
│           │       │   │   │   ├── parseFileContents.parseFile.test.js
│           │       │   │   │   ├── parseFileContents.qnafile.test.js
│           │       │   │   │   ├── parseFileContents.regexEntity.test.js
│           │       │   │   │   ├── parseFileContents.roleTest.test.js
│           │       │   │   │   ├── qnaMultiTurnAndReferences.test.js
│           │       │   │   │   ├── sectionapi.test.js
│           │       │   │   │   └── urlReference.test.js
│           │       │   │   ├── luis/
│           │       │   │   │   └── luisBuilder.test.js
│           │       │   │   ├── qna/
│           │       │   │   │   └── qnaMakerBuilder.test.js
│           │       │   │   └── qnabuild/
│           │       │   │       └── qnabuild.test.js
│           │       │   ├── tsconfig.json
│           │       │   └── utils/
│           │       │       └── filehelper.test.js
│           │       ├── tsconfig.json
│           │       └── tslint.json
│           ├── rush.json
│           └── scripts/
│               └── fixurls.js
├── schemas/
│   ├── component/
│   │   ├── component.schema
│   │   ├── definitions.schema
│   │   ├── readme.md
│   │   └── v1.0/
│   │       └── component.schema
│   ├── protocol/
│   │   └── botframework.json
│   ├── readme.md
│   ├── skills/
│   │   ├── SchemaManifestTests/
│   │   │   ├── SchemaManifestTests.csproj
│   │   │   ├── SchemaManifestTests.sln
│   │   │   └── ValidateSchemaTests.cs
│   │   ├── readme.md
│   │   ├── skill-manifest-2.0.0.json
│   │   ├── skill-manifest-2.1.preview-1.json
│   │   ├── v2.0/
│   │   │   ├── samples/
│   │   │   │   ├── complex-skillmanifest.json
│   │   │   │   ├── echo-skillmanifest.json
│   │   │   │   └── simple-skillmanifest.json
│   │   │   └── skill-manifest.json
│   │   ├── v2.1/
│   │   │   ├── samples/
│   │   │   │   ├── complex-pva-manifest.json
│   │   │   │   ├── complex-skillmanifest.json
│   │   │   │   ├── echo-skillmanifest.json
│   │   │   │   └── simple-skillmanifest.json
│   │   │   └── skill-manifest.json
│   │   ├── v2.1.preview-1/
│   │   │   ├── samples/
│   │   │   │   ├── complex-skillmanifest.json
│   │   │   │   ├── echo-skillmanifest.json
│   │   │   │   └── simple-skillmanifest.json
│   │   │   └── skill-manifest.json
│   │   └── v2.2/
│   │       ├── samples/
│   │       │   ├── complex-pva-manifest.json
│   │       │   ├── complex-skillmanifest.json
│   │       │   ├── echo-skillmanifest.json
│   │       │   ├── relativeUris/
│   │       │   │   ├── complex-skillmanifest.json
│   │       │   │   ├── knowledge-base/
│   │       │   │   │   ├── SkillBot-QnA-en.qna
│   │       │   │   │   ├── SkillBot-QnA-es-ES.qna
│   │       │   │   │   └── SkillBot-QnA-es-MX.qna
│   │       │   │   ├── language-understanding/
│   │       │   │   │   ├── SkillBot-en.lu
│   │       │   │   │   ├── SkillBot-es-ES.lu
│   │       │   │   │   └── SkillBot-es-MX.lu
│   │       │   │   └── privacy.html
│   │       │   └── simple-skillmanifest.json
│   │       └── skill-manifest.json
│   └── ui/
│       └── v1.0/
│           └── ui.schema
├── specs/
│   ├── botframework-activity/
│   │   ├── botframework-activity.md
│   │   └── botframework-cards.md
│   ├── botframework-protocol/
│   │   ├── botframework-channel.json
│   │   ├── channel-update-spec.md
│   │   ├── directline-1.1.json
│   │   └── directline-3.0.json
│   ├── component-model/
│   │   └── overview.md
│   ├── manifest/
│   │   ├── botframework-manifest.md
│   │   ├── example.man
│   │   └── manifest.json
│   ├── testing/
│   │   ├── skills/
│   │   │   ├── SkillsFunctionalTesting.md
│   │   │   ├── SkillsMatrixTesting.md
│   │   │   ├── SkillsScopeInformation.md
│   │   │   ├── media/
│   │   │   │   └── src/
│   │   │   │       └── SkillsFunctionalTestingDiagrams.pptx
│   │   │   └── scenarios/
│   │   │       ├── AuthWithOAuthCard.md
│   │   │       ├── AuthWithSSO.md
│   │   │       ├── CardActionsWithInvokes.md
│   │   │       ├── DraftScenarios.md
│   │   │       ├── MultiTurnInteraction.md
│   │   │       ├── ProactiveMessage.md
│   │   │       ├── SingleTurnInteraction.md
│   │   │       ├── SkillCallsSkill.md
│   │   │       ├── SkillReceivesAttachment.md
│   │   │       ├── SkillStartsConversation.md
│   │   │       ├── TeamsAPI.md
│   │   │       ├── TeamsSkillWithTaskModule.md
│   │   │       └── UpdateDeleteAdaptiveCard.md
│   │   └── testing.md
│   └── transcript/
│       └── transcript.md
└── tools/
    └── changelog/
        ├── .gitignore
        └── git-log.js
Download .txt
SYMBOL INDEX (616 symbols across 107 files)

FILE: Orchestrator/Samples/dotnet/nlp-with-entities/AdapterWithErrorHandler.cs
  class AdapterWithErrorHandler (line 13) | public class AdapterWithErrorHandler : BotFrameworkHttpAdapter
    method AdapterWithErrorHandler (line 15) | public AdapterWithErrorHandler(IConfiguration configuration, ILogger<B...

FILE: Orchestrator/Samples/dotnet/nlp-with-entities/BotServices.cs
  class BotServices (line 11) | public class BotServices : IBotServices
    method BotServices (line 13) | public BotServices(IConfiguration configuration, OrchestratorRecognize...
    method CreateLuisRecognizer (line 39) | private LuisRecognizer CreateLuisRecognizer(IConfiguration configurati...

FILE: Orchestrator/Samples/dotnet/nlp-with-entities/Bots/DispatchBot.cs
  class DispatchBot (line 16) | public class DispatchBot : ActivityHandler
    method DispatchBot (line 21) | public DispatchBot(IBotServices botServices, ILogger<DispatchBot> logger)
    method OnMessageActivityAsync (line 27) | protected override async Task OnMessageActivityAsync(ITurnContext<IMes...
    method OnMembersAddedAsync (line 42) | protected override async Task OnMembersAddedAsync(IList<ChannelAccount...
    method DispatchToTopIntentAsync (line 55) | private async Task DispatchToTopIntentAsync(ITurnContext<IMessageActiv...
    method ProcessHomeAutomationAsync (line 75) | private async Task ProcessHomeAutomationAsync(ITurnContext<IMessageAct...
    method ProcessWeatherAsync (line 93) | private async Task ProcessWeatherAsync(ITurnContext<IMessageActivity> ...
    method ProcessSampleQnAAsync (line 110) | private async Task ProcessSampleQnAAsync(ITurnContext<IMessageActivity...

FILE: Orchestrator/Samples/dotnet/nlp-with-entities/Controllers/BotController.cs
  class BotController (line 11) | [Route("api/messages")]
    method BotController (line 18) | public BotController(IBotFrameworkHttpAdapter adapter, IBot bot)
    method PostAsync (line 24) | [HttpPost]

FILE: Orchestrator/Samples/dotnet/nlp-with-entities/IBotServices.cs
  type IBotServices (line 10) | public interface IBotServices

FILE: Orchestrator/Samples/dotnet/nlp-with-entities/OrchestratorConfig.cs
  class OrchestratorConfig (line 3) | public class OrchestratorConfig

FILE: Orchestrator/Samples/dotnet/nlp-with-entities/Program.cs
  class Program (line 10) | public class Program
    method Main (line 12) | public static void Main(string[] args)
    method CreateWebHostBuilder (line 17) | public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>

FILE: Orchestrator/Samples/dotnet/nlp-with-entities/Startup.cs
  class Startup (line 17) | public class Startup
    method Startup (line 19) | public Startup(IConfiguration configuration)
    method ConfigureServices (line 27) | public void ConfigureServices(IServiceCollection services)
    method Configure (line 44) | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    method InitializeOrchestrator (line 62) | private OrchestratorRecognizer InitializeOrchestrator()

FILE: dri/helpers.py
  function filter_stale_customer_issues (line 41) | def filter_stale_customer_issues(issue, days_old=60):
  function last_touched_by_microsoft (line 49) | def last_touched_by_microsoft(issue, microsoft_members) -> bool:
  function get_msorg_members (line 55) | def get_msorg_members(github, refresh_in_days=5):
  function filter_azure (line 77) | def filter_azure(repo, issue):
  function strfdelta (line 85) | def strfdelta(tdelta, fmt):
  function add_last_comment (line 92) | def add_last_comment(issue, stale_days=10):
  function filter_bot_service_label (line 109) | def filter_bot_service_label(issue):
  function filter_customer_reported_label (line 112) | def filter_customer_reported_label(issue):
  function filter_customer_replied_label (line 115) | def filter_customer_replied_label(issue):
  function filter_adaptive_label (line 118) | def filter_adaptive_label(issue):
  function filter_exempt_from_dri_label (line 121) | def filter_exempt_from_dri_label(issue):
  function filter_milestone_label (line 124) | def filter_milestone_label(issue):

FILE: dri/output.py
  class OuputIssuesJson (line 27) | class OuputIssuesJson():
    method __init__ (line 28) | def __init__(self):
    method write_output (line 31) | def write_output(self, file_name = "botreport_" + datetime.now().strft...
  class OutputRepository (line 36) | class OutputRepository():
    method __init__ (line 37) | def __init__(self, name):
  class OutputIssue (line 42) | class OutputIssue():
    method __init__ (line 43) | def __init__(self, tag, issue):
  function print_issue (line 47) | def print_issue(issue):
  function print_status (line 57) | def print_status(text, css=''):
  function print_stale_issue (line 67) | def print_stale_issue(issue):
  function print_break (line 75) | def print_break():
  function setup_html (line 78) | def setup_html():

FILE: dri/report.py
  function main (line 108) | def main():

FILE: parsers/LU/JS/common/config/rush/pnpmfile.js
  function readPackage (line 29) | function readPackage(packageJson, context) {

FILE: parsers/LU/JS/common/scripts/install-run-rush.js
  constant PACKAGE_NAME (line 18) | const PACKAGE_NAME = '@microsoft/rush';
  constant RUSH_PREVIEW_VERSION (line 19) | const RUSH_PREVIEW_VERSION = 'RUSH_PREVIEW_VERSION';
  function _getRushVersion (line 20) | function _getRushVersion() {
  function _run (line 41) | function _run() {

FILE: parsers/LU/JS/common/scripts/install-run.js
  constant RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME (line 20) | const RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME = 'RUSH_TEMP_FOLDER';
  constant INSTALLED_FLAG_FILENAME (line 21) | const INSTALLED_FLAG_FILENAME = 'installed.flag';
  constant NODE_MODULES_FOLDER_NAME (line 22) | const NODE_MODULES_FOLDER_NAME = 'node_modules';
  constant PACKAGE_JSON_FILENAME (line 23) | const PACKAGE_JSON_FILENAME = 'package.json';
  function _parsePackageSpecifier (line 27) | function _parsePackageSpecifier(rawPackageSpecifier) {
  function _syncNpmrc (line 63) | function _syncNpmrc(sourceNpmrcFolder, targetNpmrcFolder) {
  function getNpmPath (line 111) | function getNpmPath() {
  function _ensureFolder (line 138) | function _ensureFolder(folderPath) {
  function _ensureAndJoinPath (line 151) | function _ensureAndJoinPath(baseFolder, ...pathSegments) {
  function _getRushTempFolder (line 167) | function _getRushTempFolder(rushCommonFolder) {
  function _resolvePackageVersion (line 180) | function _resolvePackageVersion(rushCommonFolder, { name, version }) {
  function findRushJsonFolder (line 230) | function findRushJsonFolder() {
  function _isPackageAlreadyInstalled (line 254) | function _isPackageAlreadyInstalled(packageInstallFolder) {
  function _cleanInstallFolder (line 273) | function _cleanInstallFolder(rushTempFolder, packageInstallFolder) {
  function _createPackageJson (line 293) | function _createPackageJson(packageInstallFolder, name, version) {
  function _installPackage (line 315) | function _installPackage(packageInstallFolder, name, version) {
  function _getBinPath (line 336) | function _getBinPath(packageInstallFolder, binName) {
  function _writeFlagFile (line 344) | function _writeFlagFile(packageInstallFolder) {
  function installAndRun (line 353) | function installAndRun(packageName, packageVersion, packageBinName, pack...
  function runWithErrorAndStatusCode (line 384) | function runWithErrorAndStatusCode(fn) {
  function _run (line 395) | function _run() {

FILE: parsers/LU/JS/common/scripts/version-and-pack.js
  function main (line 24) | async function main() {
  function extractVersion (line 86) | function extractVersion(argv) {
  function parseTgz (line 94) | function parseTgz(text) {
  function exec (line 103) | async function exec(command, args, opts) {
  function createIfNotExistSync (line 135) | function createIfNotExistSync(path) {
  function prettyLogger (line 145) | function prettyLogger(...labels) {

FILE: parsers/LU/JS/packages/lu/src/parser/converters/helpers/writer.js
  class Writer (line 2) | class Writer {
    method constructor (line 3) | constructor() {
    method setOutputStream (line 8) | async setOutputStream(outputPath) {
    method increaseIndentation (line 30) | increaseIndentation() {
    method decreaseIndentation (line 33) | decreaseIndentation() {
    method write (line 36) | write(str) {
    method writeLine (line 39) | writeLine(str = '') {
    method writeIndented (line 49) | writeIndented(str) {
    method writeLineIndented (line 66) | writeLineIndented(lines) {
    method closeOutputStream (line 76) | async closeOutputStream() {

FILE: parsers/LU/JS/packages/lu/src/parser/cross-train/crossTrainer.js
  constant NEWLINE (line 20) | const NEWLINE = require('os').EOL
  constant QNA_GENERIC_SOURCE (line 22) | const QNA_GENERIC_SOURCE = "custom editorial"
  constant MAX_QUESTIONS_PER_ANSWER (line 23) | const MAX_QUESTIONS_PER_ANSWER = 1000

FILE: parsers/LU/JS/packages/lu/src/parser/lu/lu.js
  class Lu (line 9) | class Lu {
    method constructor (line 10) | constructor(content, options = new luOptions){
    method translate (line 24) | async translate(translate_key, tgt_lang, translate_comments = false, t...

FILE: parsers/LU/JS/packages/lu/src/parser/lu/luOptions.js
  class LuOptions (line 1) | class LuOptions {
    method constructor (line 2) | constructor(id = '', includeInCollate = true, language = '', path = ''){

FILE: parsers/LU/JS/packages/lu/src/parser/lu/qna.js
  class Qna (line 9) | class Qna {
    method constructor (line 10) | constructor(content, options = new qnaOptions()){
    method translate (line 24) | async translate(translate_key, tgt_lang, translate_comments = false, t...

FILE: parsers/LU/JS/packages/lu/src/parser/lu/qnaOptions.js
  class QnAOptions (line 1) | class QnAOptions {
    method constructor (line 2) | constructor(id = '', includeInCollate = true, language = '', path = ''){

FILE: parsers/LU/JS/packages/lu/src/parser/lubuild/builder.ts
  class Builder (line 25) | class Builder {
    method constructor (line 28) | constructor(handler: any) {
    method loadContents (line 32) | async loadContents(
    method build (line 154) | async build(
    method writeDialogAssets (line 287) | async writeDialogAssets(contents: any[], force: boolean, out: string, ...
    method getActiveVersionIds (line 336) | async getActiveVersionIds(appNames: string[], authoringKey: string, re...
    method initApplicationFromLuContent (line 355) | async initApplicationFromLuContent(content: any, botName: string, suff...
    method updateApplication (line 370) | async updateApplication(currentApp: any, luBuildCore: LuBuildCore, rec...
    method createApplication (line 410) | async createApplication(currentApp: any, luBuildCore: LuBuildCore, rec...
    method trainAndPublishApplication (line 420) | async trainAndPublishApplication(luBuildCore: LuBuildCore, recognizer:...
    method generateDeclarativeAssets (line 451) | generateDeclarativeAssets(recognizers: Array<Recognizer>, multiRecogni...
    method mergeSettingsContent (line 477) | mergeSettingsContent(settingsPath: string, contents: any[]) {
    method filterEmptyIntents (line 489) | filterEmptyIntents(app: any) {

FILE: parsers/LU/JS/packages/lu/src/parser/lubuild/core.ts
  class LuBuildCore (line 17) | class LuBuildCore {
    method constructor (line 24) | constructor(subscriptionKey: string, endpoint: string, retryCount: num...
    method getApplicationList (line 35) | public async getApplicationList() {
    method getApplicationInfo (line 61) | public async getApplicationInfo(appId: string) {
    method importApplication (line 87) | public async importApplication(currentApp: any): Promise<any> {
    method exportApplication (line 122) | public async exportApplication(appId: string, versionId: string) {
    method compareApplications (line 159) | public compareApplications(currentApp: any, existingApp: any) {
    method updateVersion (line 196) | public updateVersion(currentApp: any, existingApp: any) {
    method importNewVersion (line 209) | public async importNewVersion(appId: string, app: any, options: any) {
    method listApplicationVersions (line 244) | public async listApplicationVersions(appId: string) {
    method deleteVersion (line 270) | public async deleteVersion(appId: string, versionId: string) {
    method trainApplication (line 293) | public async trainApplication(appId: string, versionId: string) {
    method getTrainingStatus (line 316) | public async getTrainingStatus(appId: string, versionId: string) {
    method publishApplication (line 342) | public async publishApplication(appId: string, versionId: string, isSt...
    method updateVersionValue (line 369) | private updateVersionValue(versionId: string) {
    method isApplicationEqual (line 392) | private isApplicationEqual(appA: any, appB: any) {
    method sortLuis (line 404) | private sortLuis(app: any) {
    method sortProperty (line 419) | private sortProperty(arrayToSort: any[], propertyToSort: string) {

FILE: parsers/LU/JS/packages/lu/src/parser/lubuild/cross-trained-recognizer.ts
  class CrossTrainedRecognizer (line 6) | class CrossTrainedRecognizer {
    method constructor (line 11) | constructor(dialogPath: string, recognizers: any, schema?: string) {
    method save (line 17) | save(): string {
    method getDialogPath (line 30) | getDialogPath(): string {

FILE: parsers/LU/JS/packages/lu/src/parser/lubuild/multi-language-recognizer.ts
  class MultiLanguageRecognizer (line 8) | class MultiLanguageRecognizer {
    method constructor (line 14) | constructor(dialogPath: string, recognizers: any, schema?: string) {
    method save (line 21) | save(): string {
    method getDialogPath (line 35) | getDialogPath(): string {

FILE: parsers/LU/JS/packages/lu/src/parser/lubuild/recognizer.ts
  class Recognizer (line 9) | class Recognizer {
    method load (line 10) | static load(luFile: string, targetFileName: string, dialogPath: string...
    method constructor (line 35) | constructor(private readonly luFile: string, targetFileName: string, s...
    method save (line 45) | save(): string {
    method getAppId (line 61) | getAppId(): string {
    method setAppId (line 65) | setAppId(appId: string) {
    method getDialogPath (line 69) | getDialogPath(): string {
    method getLuPath (line 73) | getLuPath() {

FILE: parsers/LU/JS/packages/lu/src/parser/lubuild/settings.ts
  class Settings (line 6) | class Settings {
    method constructor (line 10) | constructor(settingsPath: string, luis: any) {
    method save (line 15) | save(): string {
    method getSettingsPath (line 23) | getSettingsPath(): string {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/baseSection.js
  class BaseSection (line 1) | class BaseSection {
    method constructor (line 2) | constructor(parameters) {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/classes/filesToParse.js
  class FileToParse (line 5) | class FileToParse {
    method constructor (line 12) | constructor(filePath, includeInCollate) {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/classes/hclasses.js
  method constructor (line 7) | constructor(sourceFile, model) {
  method constructor (line 13) | constructor(entity, value, start, end) {
  method constructor (line 21) | constructor(intent, utterances) {
  method constructor (line 27) | constructor(text, intent, entities) {
  method constructor (line 34) | constructor(intents, patterns) {
  method constructor (line 40) | constructor(pattern, intent) {
  method constructor (line 46) | constructor(name, mode, words, activated) {
  method constructor (line 54) | constructor(canonicalForm, list) {
  method constructor (line 60) | constructor(name, subLists, roles) {
  method constructor (line 67) | constructor (name, regexPattern, roles) {
  method constructor (line 74) | constructor (name, children, roles) {
  method constructor (line 81) | constructor (name, startPos, endPos, role) {
  method constructor (line 88) | constructor (parent, startPos, entity, value, endPos, type, role) {
  method constructor (line 99) | constructor(name, explicitList, roles) {
  method constructor (line 106) | constructor(name, type, roles) {
  method addRoles (line 111) | addRoles(roles) {
  method hasRole (line 116) | hasRole(value) {
  method constructor (line 121) | constructor(name, featureType) {
  method constructor (line 127) | constructor(name, featureType) {
  method constructor (line 133) | constructor(name, instanceOf, context, children, features) {
  method constructor (line 142) | constructor(name, isRequired) {
  method constructor (line 148) | constructor(name, isRequired) {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/classes/parserObject.js
  constant LUIS (line 6) | const LUIS = require('./../../luis/luis');
  class parserObject (line 8) | class parserObject {
    method constructor (line 27) | constructor() {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/diagnostic.js
  class Diagnostic (line 4) | class Diagnostic {
    method constructor (line 5) | constructor(range, message, severity = DiagnosticSeverity.ERROR) {
    method toString (line 11) | toString() {
  class Range (line 24) | class Range {
    method constructor (line 25) | constructor(start, end) {
    method toString (line 30) | toString() {
  class Position (line 44) | class Position {
    method constructor (line 45) | constructor(line, character) {
    method toString (line 50) | toString() { return `line ${this.Line}:${this.Character}` }

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/entitySection.js
  class EntitySection (line 10) | class EntitySection extends BaseSection {
    method constructor (line 15) | constructor(parseTree) {
    method ExtractName (line 27) | ExtractName(parseTree) {
    method ExtractType (line 48) | ExtractType(parseTree) {
    method ExtractSynonymsOrPhraseList (line 59) | ExtractSynonymsOrPhraseList(parseTree) {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileLexer.js
  function LUFileLexer (line 450) | function LUFileLexer(input) {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileParser.js
  function LUFileParser (line 481) | function LUFileParser (input) {
  function FileContext (line 599) | function FileContext(parser, parent, invokingState) {
  function ParagraphContext (line 694) | function ParagraphContext(parser, parent, invokingState) {
  function NewlineContext (line 840) | function NewlineContext(parser, parent, invokingState) {
  function ErrorStringContext (line 942) | function ErrorStringContext(parser, parent, invokingState) {
  function NestedIntentSectionContext (line 1052) | function NestedIntentSectionContext(parser, parent, invokingState) {
  function NestedIntentNameLineContext (line 1126) | function NestedIntentNameLineContext(parser, parent, invokingState) {
  function NestedIntentNameContext (line 1233) | function NestedIntentNameContext(parser, parent, invokingState) {
  function NameIdentifierContext (line 1345) | function NameIdentifierContext(parser, parent, invokingState) {
  function NestedIntentBodyDefinitionContext (line 1446) | function NestedIntentBodyDefinitionContext(parser, parent, invokingState) {
  function SubIntentDefinitionContext (line 1535) | function SubIntentDefinitionContext(parser, parent, invokingState) {
  function SimpleIntentSectionContext (line 1632) | function SimpleIntentSectionContext(parser, parent, invokingState) {
  function IntentDefinitionContext (line 1700) | function IntentDefinitionContext(parser, parent, invokingState) {
  function IntentNameLineContext (line 1780) | function IntentNameLineContext(parser, parent, invokingState) {
  function IntentNameContext (line 1903) | function IntentNameContext(parser, parent, invokingState) {
  function IntentBodyContext (line 2015) | function IntentBodyContext(parser, parent, invokingState) {
  function NormalIntentBodyContext (line 2108) | function NormalIntentBodyContext(parser, parent, invokingState) {
  function NormalIntentStringContext (line 2259) | function NormalIntentStringContext(parser, parent, invokingState) {
  function NewEntitySectionContext (line 2406) | function NewEntitySectionContext(parser, parent, invokingState) {
  function NewEntityDefinitionContext (line 2474) | function NewEntityDefinitionContext(parser, parent, invokingState) {
  function NewEntityListbodyContext (line 2554) | function NewEntityListbodyContext(parser, parent, invokingState) {
  function NewEntityLineContext (line 2680) | function NewEntityLineContext(parser, parent, invokingState) {
  function NewCompositeDefinitionContext (line 2949) | function NewCompositeDefinitionContext(parser, parent, invokingState) {
  function NewRegexDefinitionContext (line 3017) | function NewRegexDefinitionContext(parser, parent, invokingState) {
  function NewEntityTypeContext (line 3085) | function NewEntityTypeContext(parser, parent, invokingState) {
  function NewEntityRolesContext (line 3153) | function NewEntityRolesContext(parser, parent, invokingState) {
  function NewEntityUsesFeaturesContext (line 3256) | function NewEntityUsesFeaturesContext(parser, parent, invokingState) {
  function NewEntityRoleOrFeaturesContext (line 3353) | function NewEntityRoleOrFeaturesContext(parser, parent, invokingState) {
  function NewEntityNameContext (line 3515) | function NewEntityNameContext(parser, parent, invokingState) {
  function NewEntityNameWithWSContext (line 3618) | function NewEntityNameWithWSContext(parser, parent, invokingState) {
  function EntitySectionContext (line 3721) | function EntitySectionContext(parser, parent, invokingState) {
  function EntityDefinitionContext (line 3789) | function EntityDefinitionContext(parser, parent, invokingState) {
  function EntityLineContext (line 3869) | function EntityLineContext(parser, parent, invokingState) {
  function EntityNameContext (line 3996) | function EntityNameContext(parser, parent, invokingState) {
  function EntityTypeContext (line 4106) | function EntityTypeContext(parser, parent, invokingState) {
  function CompositeEntityIdentifierContext (line 4266) | function CompositeEntityIdentifierContext(parser, parent, invokingState) {
  function RegexEntityIdentifierContext (line 4334) | function RegexEntityIdentifierContext(parser, parent, invokingState) {
  function EntityListBodyContext (line 4402) | function EntityListBodyContext(parser, parent, invokingState) {
  function NormalItemStringContext (line 4528) | function NormalItemStringContext(parser, parent, invokingState) {
  function ImportSectionContext (line 4675) | function ImportSectionContext(parser, parent, invokingState) {
  function ImportDefinitionContext (line 4743) | function ImportDefinitionContext(parser, parent, invokingState) {
  function QnaSectionContext (line 4847) | function QnaSectionContext(parser, parent, invokingState) {
  function QnaDefinitionContext (line 4915) | function QnaDefinitionContext(parser, parent, invokingState) {
  function QnaSourceInfoContext (line 5031) | function QnaSourceInfoContext(parser, parent, invokingState) {
  function QnaIdMarkContext (line 5122) | function QnaIdMarkContext(parser, parent, invokingState) {
  function QnaQuestionContext (line 5213) | function QnaQuestionContext(parser, parent, invokingState) {
  function QuestionTextContext (line 5310) | function QuestionTextContext(parser, parent, invokingState) {
  function MoreQuestionsBodyContext (line 5395) | function MoreQuestionsBodyContext(parser, parent, invokingState) {
  function MoreQuestionContext (line 5543) | function MoreQuestionContext(parser, parent, invokingState) {
  function ErrorQuestionStringContext (line 5656) | function ErrorQuestionStringContext(parser, parent, invokingState) {
  function QnaAnswerBodyContext (line 5766) | function QnaAnswerBodyContext(parser, parent, invokingState) {
  function FilterSectionContext (line 5867) | function FilterSectionContext(parser, parent, invokingState) {
  function PromptSectionContext (line 6009) | function PromptSectionContext(parser, parent, invokingState) {
  function FilterLineContext (line 6151) | function FilterLineContext(parser, parent, invokingState) {
  function ErrorFilterLineContext (line 6280) | function ErrorFilterLineContext(parser, parent, invokingState) {
  function MultiLineAnswerContext (line 6390) | function MultiLineAnswerContext(parser, parent, invokingState) {
  function ModelInfoSectionContext (line 6481) | function ModelInfoSectionContext(parser, parent, invokingState) {
  function ModelInfoDefinitionContext (line 6549) | function ModelInfoDefinitionContext(parser, parent, invokingState) {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileParserListener.js
  function LUFileParserListener (line 6) | function LUFileParserListener() {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileParserVisitor.js
  function LUFileParserVisitor (line 7) | function LUFileParserVisitor() {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/importSection.js
  class ImportSection (line 8) | class ImportSection extends BaseSection {
    method constructor (line 13) | constructor(parseTree) {
    method ExtractDescriptionAndPath (line 26) | ExtractDescriptionAndPath(parseTree) {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/luParser.js
  constant NEWLINE (line 19) | const NEWLINE = require('os').EOL;
  class LUParser (line 21) | class LUParser {
    method parseWithRef (line 28) | static parseWithRef(text, luResource) {
    method parse (line 41) | static parse(text, sectionEnabled) {
    method extractFileContent (line 51) | static extractFileContent(fileContent, content, errors, sectionEnabled) {
    method getFileContent (line 166) | static getFileContent(text) {
    method extractNestedIntentSections (line 192) | static extractNestedIntentSections(fileContext, content) {
    method extractSimpleIntentSections (line 211) | static extractSimpleIntentSections(fileContext, content) {
    method extractEntitiesSections (line 229) | static extractEntitiesSections(fileContext) {
    method extractNewEntitiesSections (line 247) | static extractNewEntitiesSections(fileContext) {
    method extractImportSections (line 265) | static extractImportSections(fileContext) {
    method extractQnaSections (line 283) | static extractQnaSections(fileContext) {
    method extractModelInfoSections (line 301) | static extractModelInfoSections(fileContext) {
    method reconstractIntentSections (line 319) | static reconstractIntentSections(sections) {
    method extractSectionBody (line 376) | static extractSectionBody(sections, content) {
    method isSectionEnabled (line 414) | static isSectionEnabled(sections) {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/luResource.js
  class LUResource (line 1) | class LUResource {
    method constructor (line 7) | constructor(sections, content, errors) {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/modelInfoSection.js
  class LUModelInfo (line 7) | class LUModelInfo  extends BaseSection {
    method constructor (line 12) | constructor(parseTree) {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/nestedIntentSection.js
  constant NEWLINE (line 4) | const NEWLINE = require('os').EOL;
  class NestedIntentSection (line 9) | class NestedIntentSection  extends BaseSection {
    method constructor (line 14) | constructor(parseTree, content) {
    method ExtractName (line 33) | ExtractName(parseTree) {
    method ExtractSimpleIntentSections (line 37) | ExtractSimpleIntentSections(parseTree, content) {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/newEntitySection.js
  class NewEntitySection (line 10) | class NewEntitySection  extends BaseSection {
    method constructor (line 15) | constructor(parseTree) {
    method ExtractName (line 32) | ExtractName(parseTree) {
    method ExtractType (line 55) | ExtractType(parseTree) {
    method ExtractRoles (line 61) | ExtractRoles(parseTree) {
    method ExtractFeatures (line 67) | ExtractFeatures(parseTree) {
    method ExtractCompositeDefinition (line 73) | ExtractCompositeDefinition(parseTree) {
    method ExtractRegexDefinition (line 79) | ExtractRegexDefinition(parseTree) {
    method ExtractSynonymsOrPhraseList (line 85) | ExtractSynonymsOrPhraseList(parseTree) {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/parseFileContents.js
  constant PARSERCONSTS (line 6) | const PARSERCONSTS = require('./../utils/enums/parserconsts');
  constant INTENTTYPE (line 47) | const INTENTTYPE = 'intent';
  constant PLCONSTS (line 48) | const PLCONSTS = {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/qnaSection.js
  constant QNA_GENERIC_SOURCE (line 4) | const QNA_GENERIC_SOURCE = "custom editorial";
  class QnaSection (line 9) | class QnaSection extends BaseSection {
    method constructor (line 14) | constructor(parseTree) {
    method ExtractSourceInfo (line 36) | ExtractSourceInfo(parseTree) {
    method ExtractAssignedId (line 46) | ExtractAssignedId(parseTree) {
    method ExtractPrompts (line 56) | ExtractPrompts(parseTree) {
    method ExtractQuestion (line 91) | ExtractQuestion(parseTree) {
    method ExtractMoreQuestions (line 95) | ExtractMoreQuestions(parseTree) {
    method ExtractFilterPairs (line 115) | ExtractFilterPairs(parseTree) {
    method ExtractAnswer (line 143) | ExtractAnswer(parseTree) {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/sectionOperator.js
  constant NEWLINE (line 3) | const NEWLINE = require('os').EOL;
  class SectionOperator (line 7) | class SectionOperator {
    method constructor (line 12) | constructor(luresource) {
    method addSection (line 17) | addSection(sectionContent) {
    method updateSection (line 44) | updateSection(id, sectionContent) {
    method deleteSection (line 80) | deleteSection(id) {
    method insertSection (line 102) | insertSection(id, sectionContent) {
    method removeErrors (line 139) | removeErrors(errors, startLine, endLine) {
    method adjustRangeForErrors (line 151) | adjustRangeForErrors(errors, offset, startLine, endLine) {
    method adjustErrorRange (line 173) | adjustErrorRange(error, offset) {
    method adjustRangeForAddSection (line 180) | adjustRangeForAddSection(newSections, offset) {
    method adjustSectionRange (line 186) | adjustSectionRange(section, offset) {
    method adjustRangeForDeleteSection (line 200) | adjustRangeForDeleteSection(index, offset) {
    method adjustRangeForUpdateSection (line 207) | adjustRangeForUpdateSection(oldIndex, newSections) {
    method adjustRangeForInsertSection (line 231) | adjustRangeForInsertSection(postIndex, newSections) {
    method replaceRangeContent (line 253) | replaceRangeContent(originString, startLine, stopLine, replaceString) {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/simpleIntentSection.js
  constant NEWLINE (line 8) | const NEWLINE = require('os').EOL;
  class SimpleIntentSection (line 13) | class SimpleIntentSection  extends BaseSection {
    method constructor (line 18) | constructor(parseTree, content) {
    method ExtractName (line 39) | ExtractName(parseTree) {
    method ExtractIntentNameLine (line 43) | ExtractIntentNameLine(parseTree) {
    method ExtractUtteranceAndEntitiesMap (line 47) | ExtractUtteranceAndEntitiesMap(parseTree) {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/translate-helpers.js
  constant PARSERCONSTS (line 7) | const PARSERCONSTS = require('./../utils/enums/parserconsts');
  constant NEWLINE (line 12) | const NEWLINE = require('os').EOL;
  constant MAX_TRANSLATE_BATCH_SIZE (line 13) | const MAX_TRANSLATE_BATCH_SIZE = 25;
  constant MAX_CHAR_IN_REQUEST (line 14) | const MAX_CHAR_IN_REQUEST = 4990;
  class translateLine (line 375) | class translateLine{
    method constructor (line 376) | constructor(text, localize, idx) {

FILE: parsers/LU/JS/packages/lu/src/parser/lufile/visitor.js
  class Visitor (line 5) | class Visitor {
    method visitNormalIntentStringContext (line 10) | static visitNormalIntentStringContext(ctx) {
    method recurselyResolveTokenizedUtterance (line 39) | static recurselyResolveTokenizedUtterance(tokUtt, entities, errorMsgs,...
    method tokenizeUtterance (line 84) | static tokenizeUtterance(exp) {

FILE: parsers/LU/JS/packages/lu/src/parser/luis/luConverter.js
  constant NEWLINE (line 1) | const NEWLINE = require('os').EOL;

FILE: parsers/LU/JS/packages/lu/src/parser/luis/luis.js
  class Luis (line 6) | class Luis {
    method constructor (line 7) | constructor(LuisJSON = null){
    method parseToLuContent (line 31) | parseToLuContent(){
    method parseToLU (line 37) | parseToLU(){
    method validate (line 41) | validate() {

FILE: parsers/LU/JS/packages/lu/src/parser/luis/luisBuilder.js
  class LuisBuilder (line 10) | class LuisBuilder {
    method fromJson (line 18) | static fromJson(luisJson) {
    method fromContentAsync (line 28) | static async fromContentAsync(luContent) {
    method fromLUAsync (line 39) | static async fromLUAsync(luArray, luSearchFn) {

FILE: parsers/LU/JS/packages/lu/src/parser/luis/luisGen.js
  class LuisGen (line 4) | class LuisGen extends Luis{
    method constructor (line 5) | constructor(){
    method getInstancesList (line 9) | getInstancesList() {

FILE: parsers/LU/JS/packages/lu/src/parser/luis/luisGenBuilder.js
  class LuisGenBuilder (line 6) | class LuisGenBuilder {
    method build (line 7) | static build(luisApp) {

FILE: parsers/LU/JS/packages/lu/src/parser/luis/luisValidator.js
  class validateLUISBlobEntity (line 372) | class validateLUISBlobEntity{
    method constructor (line 373) | constructor(name, type, roles) {

FILE: parsers/LU/JS/packages/lu/src/parser/qna/alterations/alterations.js
  class Alterations (line 8) | class Alterations {
    method constructor (line 9) | constructor(alterations = null) {
    method parseToLuContent (line 19) | parseToLuContent() {

FILE: parsers/LU/JS/packages/lu/src/parser/qna/alterations/qnaConverter.js
  constant NEWLINE (line 1) | const NEWLINE = require('os').EOL;

FILE: parsers/LU/JS/packages/lu/src/parser/qna/qnamaker/kb.js
  class KB (line 8) | class KB {
    method constructor (line 9) | constructor(qnaJSON = null) {
    method parseToLuContent (line 22) | parseToLuContent() {

FILE: parsers/LU/JS/packages/lu/src/parser/qna/qnamaker/qnaContext.js
  class qnaContext (line 5) | class qnaContext {
    method constructor (line 12) | constructor(isContextOnly, prompts) {

FILE: parsers/LU/JS/packages/lu/src/parser/qna/qnamaker/qnaConverter.js
  constant NEWLINE (line 1) | const NEWLINE = require('os').EOL;
  constant QNA_GENERIC_SOURCE (line 4) | const QNA_GENERIC_SOURCE = "custom editorial";

FILE: parsers/LU/JS/packages/lu/src/parser/qna/qnamaker/qnaFiles.js
  class qnaFile (line 5) | class qnaFile {
    method constructor (line 13) | constructor(fileUri, fileName) {

FILE: parsers/LU/JS/packages/lu/src/parser/qna/qnamaker/qnaList.js
  class qnaList (line 8) | class qnaList {
    method constructor (line 27) | constructor(id, answer, source, questions, metadata, context) {

FILE: parsers/LU/JS/packages/lu/src/parser/qna/qnamaker/qnaMakerBuilder.js
  class QnABuilder (line 12) | class QnABuilder{
    method fromKB (line 19) | static async fromKB(kbJson) {
    method fromAlterations (line 29) | static async fromAlterations(alterationsJson) {
    method fromKbAndAlterations (line 40) | static async fromKbAndAlterations(kbJson, alterationsJson) {
    method fromContent (line 50) | static async fromContent(qnaContent) {
    method fromQna (line 62) | static async fromQna(qnaObjArray, qnaSearchFn) {

FILE: parsers/LU/JS/packages/lu/src/parser/qna/qnamaker/qnaMetaData.js
  class qnaMetaData (line 5) | class qnaMetaData {
    method constructor (line 12) | constructor(name, value) {

FILE: parsers/LU/JS/packages/lu/src/parser/qna/qnamaker/qnaPrompt.js
  class qnaPrompt (line 5) | class qnaPrompt {
    method constructor (line 21) | constructor(displayText, qnaId, qna, contextOnly = false, displayOrder...

FILE: parsers/LU/JS/packages/lu/src/parser/qna/qnamaker/qnamaker.js
  class QnAMaker (line 10) | class QnAMaker {
    method constructor (line 11) | constructor(kb = null, alterations = null){
    method parseToQnAContent (line 16) | parseToQnAContent() {
    method parseToQNA (line 22) | parseToQNA() {

FILE: parsers/LU/JS/packages/lu/src/parser/qnabuild/builder.ts
  class Builder (line 26) | class Builder {
    method constructor (line 29) | constructor(handler: any) {
    method loadContents (line 33) | async loadContents(
    method build (line 142) | async build(
    method getEndpointKeys (line 292) | async getEndpointKeys(subscriptionkey: string, endpoint: string) {
    method importUrlReference (line 299) | async importUrlReference(
    method importFileReference (line 332) | async importFileReference(
    method writeDialogAssets (line 366) | async writeDialogAssets(contents: any[], force: boolean, out: string) {
    method generateDeclarativeAssets (line 396) | generateDeclarativeAssets(recognizers: Array<Recognizer>, multiRecogni...
    method initQnaFromContent (line 422) | async initQnaFromContent(content: any, botName: string, suffix: string) {
    method updateKB (line 429) | async updateKB(currentKB: any, qnaBuildCore: QnaBuildCore, recognizer:...
    method createKB (line 454) | async createKB(currentKB: any, qnaBuildCore: QnaBuildCore, recognizers...
    method createUrlKB (line 484) | async createUrlKB(qnaBuildCore: QnaBuildCore, url: string, kbName: str...
    method createFileKB (line 500) | async createFileKB(qnaBuildCore: QnaBuildCore, fileName: string, fileU...
    method getKBOperationStatus (line 519) | async getKBOperationStatus(qnaBuildCore: QnaBuildCore, operationId: st...
    method publishKB (line 536) | async publishKB(qnaBuildCore: QnaBuildCore, recognizer: Recognizer, kb...
    method resolveMergedQnAContentIds (line 544) | async resolveMergedQnAContentIds(contents: Map<string, any>, objects: ...

FILE: parsers/LU/JS/packages/lu/src/parser/qnabuild/core.ts
  constant NEWLINE (line 9) | const NEWLINE = require('os').EOL
  class QnaBuildCore (line 11) | class QnaBuildCore {
    method constructor (line 14) | constructor(subscriptionkey: string, endpoint: string) {
    method getKBList (line 18) | public async getKBList() {
    method getKB (line 29) | public async getKB(kbId: string) {
    method importKB (line 40) | public async importKB(kbPayload: any) {
    method getOperationStatus (line 51) | public async getOperationStatus(operationId: string) {
    method exportKB (line 62) | public async exportKB(kbId: string, environment: string) {
    method updateKB (line 73) | public async updateKB(kbId: string, replaceKb: any) {
    method replaceKB (line 84) | public async replaceKB(kbId: string, replaceKb: any) {
    method publishKB (line 92) | public async publishKB(kbId: string) {
    method replaceAlt (line 100) | public async replaceAlt(altJson: any) {
    method getEndpointKeys (line 108) | public async getEndpointKeys() {
    method deleteKB (line 119) | public async deleteKB(kbId: string) {
    method isKBEqual (line 127) | public isKBEqual(kbA: any, kbB: any): boolean {
    method isQnaListEqual (line 157) | private isQnaListEqual(qnaListA: any, qnaListB: any) {
    method parseToQnAContent (line 164) | private parseToQnAContent(qnaList: any) {

FILE: parsers/LU/JS/packages/lu/src/parser/qnabuild/cross-trained-recognizer.ts
  class CrossTrainedRecognizer (line 6) | class CrossTrainedRecognizer {
    method constructor (line 11) | constructor(dialogPath: string, recognizers: any, schema?: string) {
    method save (line 17) | save(): string {
    method getDialogPath (line 30) | getDialogPath(): string {

FILE: parsers/LU/JS/packages/lu/src/parser/qnabuild/multi-language-recognizer.ts
  class MultiLanguageRecognizer (line 8) | class MultiLanguageRecognizer {
    method constructor (line 14) | constructor(dialogPath: string, recognizers: any, schema?: string) {
    method save (line 21) | save(): string {
    method getDialogPath (line 35) | getDialogPath(): string {

FILE: parsers/LU/JS/packages/lu/src/parser/qnabuild/recognizer.ts
  class Recognizer (line 9) | class Recognizer {
    method load (line 10) | static load(qnaFile: string, targetFileName: string, dialogPath: strin...
    method constructor (line 34) | constructor(private readonly qnaFile: string, targetFileName: string, ...
    method save (line 43) | save(): string {
    method getKBId (line 59) | getKBId(): string {
    method setKBId (line 63) | setKBId(kbId: string) {
    method getDialogPath (line 67) | getDialogPath(): string {
    method getQnaPath (line 71) | getQnaPath() {

FILE: parsers/LU/JS/packages/lu/src/parser/qnabuild/serviceBase.js
  class ServiceBase (line 31) | class ServiceBase {
    method constructor (line 37) | constructor(rootEndpoint, subscriptionkey) {
    method createRequest (line 51) | createRequest(relativeEndpoint, method, data) {
    method commonHeaders (line 66) | commonHeaders(subscriptionKey) {
    method getUserAgent (line 74) | getUserAgent() {

FILE: parsers/LU/JS/packages/lu/src/parser/qnabuild/settings.ts
  class Settings (line 6) | class Settings {
    method constructor (line 10) | constructor(settingsPath: string, qna: any) {
    method save (line 15) | save(): string {
    method getSettingsPath (line 23) | getSettingsPath(): string {

FILE: parsers/LU/JS/packages/lu/src/parser/test/testhelper.ts
  function test (line 7) | async function test(
  function compareIntent (line 79) | function compareIntent(predictedIntents: any[], utterance: any) {
  function compareEntity (line 88) | function compareEntity(predictedEntities: any[], utterance: any) {
  function ParseEntitiyResult (line 103) | function ParseEntitiyResult(entities: any, result: any) {

FILE: parsers/LU/JS/packages/lu/src/parser/utils/exception.js
  method constructor (line 12) | constructor(errCode, text, diagnostics) {

FILE: parsers/LU/JS/packages/lu/src/parser/utils/helpers.js
  constant NEWLINE (line 9) | const NEWLINE = require('os').EOL;
  constant ANY_NEWLINE (line 10) | const ANY_NEWLINE = /\r\n|\r|\n/g;
  method sanitizeNewLines (line 20) | sanitizeNewLines(fileContent) {

FILE: parsers/LU/JS/packages/lu/src/utils/filehelper.ts
  function getLuObjects (line 20) | async function getLuObjects(stdin: string, input: string | undefined, re...
  function getLuFiles (line 36) | async function getLuFiles(input: string | undefined, recurse = false, ex...
  function getContentFromFile (line 53) | async function getContentFromFile(file: string) {
  function generateNewFilePath (line 70) | async function generateNewFilePath(outFileName: string, inputfile: strin...
  function generateNewTranslatedFilePath (line 92) | async function generateNewTranslatedFilePath(fileName: string, translate...
  function validatePath (line 109) | function validatePath(outputPath: string, defaultFileName: string, force...
  function enumerateFileName (line 130) | function enumerateFileName(filePath: string): string {
  function detectLuContent (line 148) | async function detectLuContent(stdin: string, input: string) {
  function getFilesContent (line 170) | async function getFilesContent(input: string, extType: string) {
  function getConfigContent (line 189) | async function getConfigContent(input: string) {
  function getConfigFile (line 195) | async function getConfigFile(input: string): Promise<string> {
  function getParsedObjects (line 214) | function getParsedObjects(contents: {id: string, content: string}[]) {
  function getConfigObject (line 223) | function getConfigObject(configContent: any, intentName: string, verbose...
  function parseJSON (line 281) | function parseJSON(input: string, appType: string) {
  function getCultureFromPath (line 289) | function getCultureFromPath(file: string): string | null {
  function isAllFilesSectionEmpty (line 312) | function isAllFilesSectionEmpty(contents: Lu[]): boolean {

FILE: parsers/LU/JS/packages/lu/src/utils/textfilereader.ts
  function readTextFile (line 11) | async function readTextFile(file: any): Promise<string> {

FILE: parsers/LU/JS/packages/lu/test/commands/luis/convert.test.js
  constant NEWLINE (line 3) | const NEWLINE = require('os').EOL
  function sanitizeExampleJson (line 23) | function sanitizeExampleJson(fileContent) {

FILE: parsers/LU/JS/packages/lu/test/fixtures/generate/ClosedLists.cs
  class ContosoApp (line 15) | public partial class ContosoApp: IRecognizerConvert
    type Intent (line 23) | public enum Intent {
    class _Entities (line 28) | public class _Entities
      class _Instance (line 37) | public class _Instance
    method Convert (line 52) | public void Convert(dynamic result)
    method OnError (line 67) | private static void OnError(object sender, ErrorEventArgs args)
    method TopIntent (line 74) | public (Intent intent, double score) TopIntent()

FILE: parsers/LU/JS/packages/lu/test/fixtures/generate/CompositeEntities.cs
  class ContosoApp (line 15) | public partial class ContosoApp: IRecognizerConvert
    type Intent (line 23) | public enum Intent {
    class _Entities (line 28) | public class _Entities
      class _Instance (line 44) | public class _Instance
    method Convert (line 66) | public void Convert(dynamic result)
    method OnError (line 81) | private static void OnError(object sender, ErrorEventArgs args)
    method TopIntent (line 88) | public (Intent intent, double score) TopIntent()

FILE: parsers/LU/JS/packages/lu/test/fixtures/generate/ContosoApp.cs
  class ContosoApp (line 15) | public partial class ContosoApp: IRecognizerConvert
    type Intent (line 23) | public enum Intent {
    class _Entities (line 39) | public class _Entities
      class _InstanceAddress (line 112) | public class _InstanceAddress
      class AddressClass (line 119) | public class AddressClass
      class _InstanceComposite1 (line 130) | public class _InstanceComposite1
      class Composite1Class (line 143) | public class Composite1Class
      class _InstanceComposite2 (line 160) | public class _InstanceComposite2
      class Composite2Class (line 169) | public class Composite2Class
      class _Instance (line 183) | public class _Instance
    method Convert (line 259) | public void Convert(dynamic result)
    method OnError (line 274) | private static void OnError(object sender, ErrorEventArgs args)
    method TopIntent (line 281) | public (Intent intent, double score) TopIntent()

FILE: parsers/LU/JS/packages/lu/test/fixtures/generate/FlightBooking.cs
  class FlightBooking (line 15) | public partial class FlightBooking: IRecognizerConvert
    type Intent (line 23) | public enum Intent {
    class _Entities (line 32) | public class _Entities
      class _InstanceFrom (line 42) | public class _InstanceFrom
      class FromClass (line 46) | public class FromClass
      class _InstanceTo (line 54) | public class _InstanceTo
      class ToClass (line 58) | public class ToClass
      class _Instance (line 67) | public class _Instance
    method Convert (line 83) | public void Convert(dynamic result)
    method OnError (line 98) | private static void OnError(object sender, ErrorEventArgs args)
    method TopIntent (line 105) | public (Intent intent, double score) TopIntent()

FILE: parsers/LU/JS/packages/lu/test/fixtures/generate/FlightBooking.ts
  type GeneratedIntents (line 11) | interface GeneratedIntents {
  type GeneratedInstanceFrom (line 18) | interface GeneratedInstanceFrom {
  type From (line 21) | interface From {
  type GeneratedInstanceTo (line 26) | interface GeneratedInstanceTo {
  type To (line 29) | interface To {
  type GeneratedInstance (line 34) | interface GeneratedInstance {
  type GeneratedEntities (line 41) | interface GeneratedEntities {
  type FlightBooking (line 60) | interface FlightBooking {

FILE: parsers/LU/JS/packages/lu/test/fixtures/generate/Intents.cs
  class ContosoApp (line 15) | public partial class ContosoApp: IRecognizerConvert
    type Intent (line 23) | public enum Intent {
    class _Entities (line 39) | public class _Entities
      class _Instance (line 43) | public class _Instance
    method Convert (line 55) | public void Convert(dynamic result)
    method OnError (line 70) | private static void OnError(object sender, ErrorEventArgs args)
    method TopIntent (line 77) | public (Intent intent, double score) TopIntent()

FILE: parsers/LU/JS/packages/lu/test/fixtures/generate/NamespaceClass.cs
  class NameOfTheClass (line 15) | public partial class NameOfTheClass: IRecognizerConvert
    type Intent (line 23) | public enum Intent {
    class _Entities (line 28) | public class _Entities
      class _Instance (line 44) | public class _Instance
    method Convert (line 66) | public void Convert(dynamic result)
    method OnError (line 81) | private static void OnError(object sender, ErrorEventArgs args)
    method TopIntent (line 88) | public (Intent intent, double score) TopIntent()

FILE: parsers/LU/JS/packages/lu/test/fixtures/generate/PatternEntities.cs
  class ContosoApp (line 15) | public partial class ContosoApp: IRecognizerConvert
    type Intent (line 23) | public enum Intent {
    class _Entities (line 28) | public class _Entities
      class _Instance (line 39) | public class _Instance
    method Convert (line 56) | public void Convert(dynamic result)
    method OnError (line 71) | private static void OnError(object sender, ErrorEventArgs args)
    method TopIntent (line 78) | public (Intent intent, double score) TopIntent()

FILE: parsers/LU/JS/packages/lu/test/fixtures/generate/PrebuiltEntities.cs
  class ContosoApp (line 15) | public partial class ContosoApp: IRecognizerConvert
    type Intent (line 23) | public enum Intent {
    class _Entities (line 28) | public class _Entities
      class _Instance (line 72) | public class _Instance
    method Convert (line 122) | public void Convert(dynamic result)
    method OnError (line 137) | private static void OnError(object sender, ErrorEventArgs args)
    method TopIntent (line 144) | public (Intent intent, double score) TopIntent()

FILE: parsers/LU/JS/packages/lu/test/fixtures/generate/RegexEntities.cs
  class ContosoApp (line 15) | public partial class ContosoApp: IRecognizerConvert
    type Intent (line 23) | public enum Intent {
    class _Entities (line 28) | public class _Entities
      class _Instance (line 32) | public class _Instance
    method Convert (line 44) | public void Convert(dynamic result)
    method OnError (line 59) | private static void OnError(object sender, ErrorEventArgs args)
    method TopIntent (line 66) | public (Intent intent, double score) TopIntent()

FILE: parsers/LU/JS/packages/lu/test/fixtures/generate/SimpleEntities.cs
  class ContosoApp (line 15) | public partial class ContosoApp: IRecognizerConvert
    type Intent (line 23) | public enum Intent {
    class _Entities (line 28) | public class _Entities
      class _Instance (line 44) | public class _Instance
    method Convert (line 66) | public void Convert(dynamic result)
    method OnError (line 81) | private static void OnError(object sender, ErrorEventArgs args)
    method TopIntent (line 88) | public (Intent intent, double score) TopIntent()

FILE: parsers/LU/JS/packages/lu/test/fixtures/generate/closed-lists.ts
  type GeneratedIntents (line 11) | interface GeneratedIntents {
  type GeneratedInstance (line 14) | interface GeneratedInstance {
  type GeneratedEntities (line 20) | interface GeneratedEntities {
  type ContosoApp (line 38) | interface ContosoApp {

FILE: parsers/LU/JS/packages/lu/test/fixtures/generate/composite-entities.ts
  type GeneratedIntents (line 11) | interface GeneratedIntents {
  type GeneratedInstance (line 14) | interface GeneratedInstance {
  type GeneratedEntities (line 27) | interface GeneratedEntities {
  type ContosoApp (line 52) | interface ContosoApp {

FILE: parsers/LU/JS/packages/lu/test/fixtures/generate/contoso-app.ts
  type GeneratedIntents (line 11) | interface GeneratedIntents {
  type GeneratedInstanceAddress (line 25) | interface GeneratedInstanceAddress {
  type Address (line 31) | interface Address {
  type GeneratedInstanceComposite1 (line 39) | interface GeneratedInstanceComposite1 {
  type Composite1 (line 51) | interface Composite1 {
  type GeneratedInstanceComposite2 (line 65) | interface GeneratedInstanceComposite2 {
  type Composite2 (line 73) | interface Composite2 {
  type GeneratedInstance (line 83) | interface GeneratedInstance {
  type GeneratedEntities (line 150) | interface GeneratedEntities {
  type ContosoApp (line 227) | interface ContosoApp {

FILE: parsers/LU/JS/packages/lu/test/fixtures/generate/intents.ts
  type GeneratedIntents (line 11) | interface GeneratedIntents {
  type GeneratedInstance (line 25) | interface GeneratedInstance {
  type GeneratedEntities (line 28) | interface GeneratedEntities {
  type ContosoApp (line 43) | interface ContosoApp {

FILE: parsers/LU/JS/packages/lu/test/fixtures/generate/pattern-entities.ts
  type GeneratedIntents (line 11) | interface GeneratedIntents {
  type GeneratedInstance (line 14) | interface GeneratedInstance {
  type GeneratedEntities (line 22) | interface GeneratedEntities {
  type ContosoApp (line 42) | interface ContosoApp {

FILE: parsers/LU/JS/packages/lu/test/fixtures/generate/prebuilt-entities.ts
  type GeneratedIntents (line 11) | interface GeneratedIntents {
  type GeneratedInstance (line 14) | interface GeneratedInstance {
  type GeneratedEntities (line 55) | interface GeneratedEntities {
  type ContosoApp (line 108) | interface ContosoApp {

FILE: parsers/LU/JS/packages/lu/test/fixtures/generate/regex-entities.ts
  type GeneratedIntents (line 11) | interface GeneratedIntents {
  type GeneratedInstance (line 14) | interface GeneratedInstance {
  type GeneratedEntities (line 17) | interface GeneratedEntities {
  type ContosoApp (line 32) | interface ContosoApp {

FILE: parsers/LU/JS/packages/lu/test/fixtures/generate/simple-entities.ts
  type GeneratedIntents (line 11) | interface GeneratedIntents {
  type GeneratedInstance (line 14) | interface GeneratedInstance {
  type GeneratedEntities (line 27) | interface GeneratedEntities {
  type ContosoApp (line 52) | interface ContosoApp {

FILE: parsers/LU/JS/packages/lu/test/parser/cross-train/crossTrainer.test.js
  constant NEWLINE (line 7) | const NEWLINE = require('os').EOL

FILE: parsers/LU/JS/packages/lu/test/parser/lubuild/lubuild.test.js
  constant NEWLINE (line 4) | const NEWLINE = require('os').EOL

FILE: parsers/LU/JS/packages/lu/test/parser/lufile/helpers.test.js
  constant LUDOWN_ROOT (line 10) | const LUDOWN_ROOT = path.join(__dirname, './../../fixtures/');
  function resolvePath (line 11) | function resolvePath(relativePath) {

FILE: parsers/LU/JS/packages/lu/test/parser/lufile/luis.boundary.test.js
  constant POSSIBLE_CHARS (line 10) | const POSSIBLE_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstu...

FILE: parsers/LU/JS/packages/lu/test/parser/lufile/lutranslator.test.js
  constant NEWLINE (line 11) | const NEWLINE = require('os').EOL;
  constant TRANSLATE_KEY (line 12) | const TRANSLATE_KEY = 'd825d5ac21d643f89761de3679fd0fb3';

FILE: parsers/LU/JS/packages/lu/test/parser/lufile/parseFileContents.regexEntity.test.js
  constant TRANSLATE_KEY (line 11) | const TRANSLATE_KEY = process.env.TRANSLATOR_KEY;

FILE: parsers/LU/JS/packages/lu/test/parser/lufile/sectionapi.test.js
  constant NEWLINE (line 10) | const NEWLINE = require('os').EOL;

FILE: parsers/LU/JS/packages/lu/test/parser/qnabuild/qnabuild.test.js
  constant NEWLINE (line 5) | const NEWLINE = require('os').EOL

FILE: schemas/skills/SchemaManifestTests/ValidateSchemaTests.cs
  class ValidateSchemaTests (line 24) | public class ValidateSchemaTests
    method GetManifestAndSamples (line 40) | public static TheoryData<string, string> GetManifestAndSamples()
    method ValidateManifestSamplesAgainstSchemasUsingNJsonSchemaAsync (line 59) | [Theory]
    method ValidateManifestSamplesAgainstSchemasUsingNewtonsoftSchemaAsync (line 77) | [Theory]
    method GetSchemaAsync (line 97) | private static async Task<JsonSchema> GetSchemaAsync(string schemaPath)
Condensed preview — 790 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,553K chars).
[
  {
    "path": ".editorconfig",
    "chars": 141,
    "preview": "root = true\n\n[*]\ninsert_final_newline = true\n\n[*.json]\nindent_style = space\nindent_size = 4\n\n[*.schema]\nindent_style = s"
  },
  {
    "path": ".gitattributes",
    "chars": 2581,
    "preview": "###############################################################################\r\n# Set default behavior to automatically"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 528,
    "preview": "# Lines starting with '#' are comments.\n# Each line is a file pattern followed by one or more owners.\n\n# More details ar"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bot-framework-bug.md",
    "chars": 1166,
    "preview": "---\nname: Bug\nabout: Report a new Bot Framework bug.\ntitle: \"\"\nlabels: \"needs-triage, bug\"\nassignees: \"\"\n---\n\n### [Githu"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bot-framework-feature-request.md",
    "chars": 1817,
    "preview": "---\nname: Feature Request\nabout: Create a new Bot Framework feature request.\ntitle: \"\"\nlabels: \"needs-triage, feature-re"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 429,
    "preview": "Fixes #<!-- If this addresses a specific issue, please provide the issue number here -->\n\n## Proposed Changes\n<!-- Pleas"
  },
  {
    "path": ".github/issue_template.md",
    "chars": 1148,
    "preview": "## This is not for asking questions or filing bugs\n\nTo get help with an issue with your bot\n* [\"How To\"](https://stackov"
  },
  {
    "path": ".gitignore",
    "chars": 424,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 444,
    "preview": "# Microsoft Open Source Code of Conduct\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://op"
  },
  {
    "path": "Common/Telemetry/README.md",
    "chars": 1152,
    "preview": "\n\n# Telemetry Analytics\n\nBot Analytics provides telemetry for analyzing conversation activities.\n\n## Requirements\n\nTo en"
  },
  {
    "path": "Common/Transcripts/CoreExtensionsTests/ConversationStateTest.chat",
    "chars": 230,
    "preview": "bot=bot\nuser=user\n\nuser:start test\nbot:bot message\nuser:set foo\nuser:read\nbot:value:foo\nuser:delete\nuser:read\nbot:value:"
  },
  {
    "path": "Common/Transcripts/CoreExtensionsTests/CustomStateTest.chat",
    "chars": 230,
    "preview": "bot=bot\nuser=user\n\nuser:start test\nbot:bot message\nuser:set foo\nuser:read\nbot:value:foo\nuser:delete\nuser:read\nbot:value:"
  },
  {
    "path": "Common/Transcripts/CoreExtensionsTests/UserStateTest.chat",
    "chars": 230,
    "preview": "bot=bot\nuser=user\n\nuser:start test\nbot:bot message\nuser:set foo\nuser:read\nbot:value:foo\nuser:delete\nuser:read\nbot:value:"
  },
  {
    "path": "Common/Transcripts/CoreTests/BotAdapted_Bracketing.chat",
    "chars": 254,
    "preview": "bot=bot\nuser=user\n\nbot:before message\nbot:conversationUpdate\nbot:after message\nuser:use middleware\nbot:before message\nbo"
  },
  {
    "path": "Common/Transcripts/DialogsTests/AttachmentPrompt.chat",
    "chars": 121,
    "preview": "user=User\nbot=Bot\n\nUser: hello\nBot: please add an attachment.\nUser: [Attachment=ContentAttachment.json]\nBot: some conten"
  },
  {
    "path": "Common/Transcripts/DialogsTests/ChoicePrompt.chat",
    "chars": 457,
    "preview": "user=user\nbot=bot\n\nuser: Hello!\nbot: favorite color? (1) red, (2) green, or (3) blue\nuser: red\nbot: Bot received the cho"
  },
  {
    "path": "Common/Transcripts/DialogsTests/ConfirmPrompt.chat",
    "chars": 216,
    "preview": "user=User\nbot=Bot\n\nUser: hello\nBot: Please confirm.\nUser: hello\nBot: Please confirm, say 'yes' or 'no' or something like"
  },
  {
    "path": "Common/Transcripts/DialogsTests/ContentAttachment.json",
    "chars": 14,
    "preview": "\"some content\""
  },
  {
    "path": "Common/Transcripts/DialogsTests/DateTimePrompt.chat",
    "chars": 331,
    "preview": "user=User\nbot=Bot\n\nUser: hello\nBot: What date would you like?\nUser: cat\nBot: Sorry, but that is not a date. What date wo"
  },
  {
    "path": "Common/Transcripts/DialogsTests/NumberPrompt.chat",
    "chars": 313,
    "preview": "user=User\nbot=Bot\n\nUser: hello\nBot: Enter a number.\nUser: hello\nBot: You must enter a valid positive number less than 10"
  },
  {
    "path": "Common/Transcripts/DialogsTests/TextPrompt.chat",
    "chars": 167,
    "preview": "user=User\nbot=Bot\n\nUser: hello\nBot: Enter some text.\nUser: hi\nBot: Make sure the text is greater than three characters.\n"
  },
  {
    "path": "Common/Transcripts/DialogsTests/Waterfall.chat",
    "chars": 87,
    "preview": "user=User\nbot=Bot\n\nUser: hello\nBot: step1\nUser: hello\nBot: step2\nUser: hello\nBot: step3"
  },
  {
    "path": "Common/Transcripts/DialogsTests/WaterfallNested.chat",
    "chars": 140,
    "preview": "user=User\nbot=Bot\n\nUser: hello\nBot: step1\nBot: step1.1\nUser: hello\nBot: step1.2\nUser: hello\nBot: step2\nBot: step2.1\nUser"
  },
  {
    "path": "Common/Transcripts/DialogsTests/WaterfallPrompt.chat",
    "chars": 283,
    "preview": "user=User\nbot=Bot\n\nUser: hello\nBot: step1\nBot: Enter a number.\nUser: hello again\nBot: It must be a number\nUser: 42\nBot: "
  },
  {
    "path": "Common/Transcripts/LuisTests/LuisMiddleware.chat",
    "chars": 198,
    "preview": "user=User\nbot=Bot\n\nuser:test\nbot:default message\nuser:add imax theater to my upcoming events\nbot:intent:Calendar_Add\nuse"
  },
  {
    "path": "Common/Transcripts/QnATests/QnAMiddleware.chat",
    "chars": 163,
    "preview": "user=User\nbot=Bot\n\nuser:random text\nbot:default message\nuser:hi\nbot:hello\nuser:test\nbot:message\nuser:tests\nbot:message\nu"
  },
  {
    "path": "Common/Transcripts/README.md",
    "chars": 1529,
    "preview": "# Bot Builder SDK v4 - Transcript Files\n\nThis folder contains the transcript files (.chat files) used in BotBuilder-v4 f"
  },
  {
    "path": "Common/Transcripts/TranslationTests/LocaleConvertToEnglish.chat",
    "chars": 311,
    "preview": "user=User\nbot=Bot\n\nuser:set language fr-ca\nuser:Set a meeting on 2018-10-04\nbot:message: Set a meeting on 10/4/2018\nuser"
  },
  {
    "path": "Common/Transcripts/TranslationTests/TranslateToEnglish.chat",
    "chars": 180,
    "preview": "user=User\nbot=Bot\n\nuser:set language es-es\nuser:Hola\nbot:message: Hello\nuser:set language fr-fr\nuser:Salut\nbot:message: "
  },
  {
    "path": "Common/Transcripts/TranslationTests/TranslateToUserLanguage.chat",
    "chars": 181,
    "preview": "user=User\nbot=Bot\n\nuser:set language es-es\nuser:Hola\nbot:mensaje: Hola\nuser:set language fr-fr\nuser:Salut\nbot:message: B"
  },
  {
    "path": "Common/badges/BotBuilderBadge.md",
    "chars": 4367,
    "preview": "[![BotBuilder](\nhttps://img.shields.io/badge/Powered%20By-BotBuilder-blue.svg?colorA=black&label=Powered%20By&logo=data%"
  },
  {
    "path": "Contributing.md",
    "chars": 1471,
    "preview": "# Instructions for Contributing Code\r\n\r\n## Contributing bug fixes and features\r\n\r\nThe Bot Framework team is currently ac"
  },
  {
    "path": "LICENSE",
    "chars": 1076,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2016 Microsoft\n\nPermission is hereby granted, free of charge, to any person obtaini"
  },
  {
    "path": "Orchestrator/README.md",
    "chars": 8443,
    "preview": "# Orchestrator\n\nConversational AI applications today are built using disparate technologies to fulfill language understa"
  },
  {
    "path": "Orchestrator/Samples/CLI/ModelTuning/README.md",
    "chars": 4932,
    "preview": "# Improve Language Model with BF CLI\n\nThe following sample illustrates how to evaluate and improve a simple language mod"
  },
  {
    "path": "Orchestrator/Samples/CLI/ModelTuning/common.fixed.lu",
    "chars": 844,
    "preview": "# Help\n- help\n- i need help\n- please help\n- can you please help\n- what do you do\n- what is this bot for\n\n\n# BuySurface\n-"
  },
  {
    "path": "Orchestrator/Samples/CLI/ModelTuning/common.lu",
    "chars": 741,
    "preview": "# Help\n- help\n- i need help\n- please help\n- can you please help\n- what do you do\n- what is this bot for\n\n\n# BuySurface\n-"
  },
  {
    "path": "Orchestrator/Samples/CLI/ModelTuning/common.test.lu",
    "chars": 531,
    "preview": "# Help\n- help\n- do you have help\n- any assistance in this bot?\n\n\n# BuySurface\n- Looking for a computer made by MSFT\n- wh"
  },
  {
    "path": "Orchestrator/Samples/CLI/ModelTuning/demo.cmd",
    "chars": 2271,
    "preview": "@echo off\n@echo ORCHESTRATOR EVALUATION DEMO\n\n@rem set SEED for different test sets\nset SEED=common\nset BLU=generated\\%S"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/.gitignore",
    "chars": 140,
    "preview": "# Assets generated by luis:build, luis:cross-train\n**/model\n**/[Gg]enerated\n**/*.blu\n*.json\n**/*.targets\n**/*.props\n**/*"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/AdapterWithErrorHandler.cs",
    "chars": 2285,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System;\nusing Mi"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/BotServices.cs",
    "chars": 2514,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing Microsoft.Bot.Bu"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/Bots/DispatchBot.cs",
    "chars": 6294,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System.Collectio"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/CognitiveModels/HomeAutomation.lu",
    "chars": 2626,
    "preview": "\n> LUIS application information\n> !# @app.name = Home Automation\n> !# @app.desc = Home Automation LUIS application - Bot"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/CognitiveModels/QnAMaker.qna",
    "chars": 339,
    "preview": "# ? hi\n```\nhello\n```\n\n# ? greetings\n- good morning\n- good evening\n```\nHello!\n```\n\n# ? What are you?\n- What?\n- What do y"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/CognitiveModels/Weather.lu",
    "chars": 2048,
    "preview": "\n> LUIS application information\n> !# @app.name = Weather\n> !# @app.desc = Weather LUIS application - Bot Builder Samples"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/Controllers/BotController.cs",
    "chars": 886,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System.Threading"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/IBotServices.cs",
    "chars": 524,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing Microsoft.Bot.Bu"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/OrchestratorConfig.cs",
    "chars": 197,
    "preview": "namespace Microsoft.BotBuilderSamples\n{\n    public class OrchestratorConfig\n    {\n        public string SnapshotFile { "
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/Program.cs",
    "chars": 730,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing Microsoft.AspNet"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/README.md",
    "chars": 6310,
    "preview": "# NLP with Orchestrator\n\nBot Framework v4 NLP with Orchestrator (with entity recognition) bot sample\n\nThis bot has been "
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/Startup.cs",
    "chars": 2631,
    "preview": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License.\n\nusing System.IO;\nusing"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/nlp-with-entities.csproj",
    "chars": 1341,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n    <Lang"
  },
  {
    "path": "Orchestrator/Samples/dotnet/nlp-with-entities/wwwroot/default.html",
    "chars": 19033,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-wid"
  },
  {
    "path": "Orchestrator/docs/BFOrchestratorInteractive.md",
    "chars": 31569,
    "preview": "\r\n# Interactive\r\n\r\n[BF Orchestrator CLI][1] has an \"interactive\" command which enables a user to\r\ndynamically interact w"
  },
  {
    "path": "Orchestrator/docs/BFOrchestratorReport.md",
    "chars": 12978,
    "preview": "# Report Interpretation\r\n\r\nThe [BF Orchestrator CLI][1] has a \"test\" command for evaluating the performance of an Orches"
  },
  {
    "path": "Orchestrator/docs/BFOrchestratorUsage.md",
    "chars": 8893,
    "preview": "# BF Orchestrator Command Usage\n\n[BF Orchestrator Command ][1] is used to manage Orchestrator language understanding ass"
  },
  {
    "path": "Orchestrator/docs/DispatchMigrationExample.md",
    "chars": 19943,
    "preview": "# Example Migration from LUIS Dispatch to Orchestrator\n\nThe following article describes how to migrate a legacy *dispatc"
  },
  {
    "path": "Orchestrator/docs/FAQ.md",
    "chars": 4787,
    "preview": "# Frequently Asked Questions\n\n### What are the primary scenarios supported by Orchestrator?\nPrimary scenario currently s"
  },
  {
    "path": "Orchestrator/docs/LICENSE.md",
    "chars": 11652,
    "preview": "# MICROSOFT SOFTWARE LICENSE TERMS\n\nMICROSOFT ORCHESTRATOR FOR AZURE BOT SERVICE\n\nPurpose – For use with Azure Services."
  },
  {
    "path": "Orchestrator/docs/LUFormat.md",
    "chars": 965,
    "preview": "# LU Format in Orchestrator\n\n\n\nOrchestrator Recognizer is used today only for routing intents to subsequent skills or ot"
  },
  {
    "path": "Orchestrator/docs/NLRModels.md",
    "chars": 10889,
    "preview": "# Prebuilt Language Models\n\nPrebuilt language models have been trained towards more sophisticated tasks for both monolin"
  },
  {
    "path": "Orchestrator/docs/Overview.md",
    "chars": 13279,
    "preview": "# Technical Overview\n\nThe Orchestrator is a replacement of the [Bot Framework Dispatcher][1] used in chat bots since 201"
  },
  {
    "path": "Orchestrator/docs/package/README.md",
    "chars": 1439,
    "preview": "# Microsoft.Bot.Builder.AI.Orchestrator\n\nEmbedded recognizer package for detecting and routing user intents. \n\n## Gettin"
  },
  {
    "path": "Orchestrator/v0.1/nlr_versions.json",
    "chars": 1168,
    "preview": "{\n  \"version\": \"0.1\",\n  \"default\": \"pretrained.20200924.microsoft.dte.00.06.en.onnx\",\n  \"models\": {\n    \"pretrained.2020"
  },
  {
    "path": "Orchestrator/v0.1/nlr_versions.schema",
    "chars": 7494,
    "preview": "{\n    \"$schema\": \"http://json-schema.org/draft-07/schema\",\n    \"$id\": \"https://schemas.botframework.com/schemas/orchestr"
  },
  {
    "path": "Orchestrator/v0.2/nlr_versions.json",
    "chars": 3327,
    "preview": "{\n  \"version\": \"0.2\",\n  \"defaults\": {\n    \"en_intent\": \"pretrained.20200924.microsoft.dte.00.06.en.onnx\",\n    \"multiling"
  },
  {
    "path": "Orchestrator/v0.2/nlr_versions.schema",
    "chars": 5912,
    "preview": "{\n    \"$schema\": \"http://json-schema.org/draft-07/schema\",\n    \"$id\": \"https://schemas.botframework.com/schemas/orchestr"
  },
  {
    "path": "README.md",
    "chars": 19435,
    "preview": "# ARCHIVE NOTICE:\n\nThe Bot Framework SDK is being retired with final long term support ending December 2025. This means "
  },
  {
    "path": "SECURITY.md",
    "chars": 2757,
    "preview": "<!-- BEGIN MICROSOFT SECURITY.MD V0.0.7 BLOCK -->\n\n## Security\n\nMicrosoft takes the security of our software products an"
  },
  {
    "path": "codeql3000.yml",
    "chars": 33,
    "preview": "variables:\n  Codeql.Enabled: true"
  },
  {
    "path": "docs/BF Labeling Guide.md",
    "chars": 16968,
    "preview": "\n# Bot Framework Labeling Guidelines <!-- omit in toc -->\n\nLabels help us organize and prioritize work. We use the same "
  },
  {
    "path": "docs/umlDiagrams/ActivityFlow/BFServiceAndBotDetails/BFServiceAndBotDetails_DiagramSource.md",
    "chars": 1133,
    "preview": "```mermaid\n\n    sequenceDiagram\n    \n    participant BFS as Bot Framework Service\n    participant Bot\n\n    Note over Bot"
  },
  {
    "path": "docs/umlDiagrams/ActivityFlow/BotFrameworkAdapterFlow/BFAdapterActivityFlow_DiagramSource.md",
    "chars": 1237,
    "preview": "```mermaid\n\nsequenceDiagram\n\n    participant Channel\n    participant BFS as Bot Framework Service\n    participant CoreSD"
  },
  {
    "path": "docs/umlDiagrams/ActivityFlow/CustomAdapterFlow/BufferingWithCustomAdapter_DiagramSource.md",
    "chars": 918,
    "preview": "```mermaid\n    sequenceDiagram\n\n    participant Alexa\n    participant SDK as BF SDK\n    participant Bot\n\n    Alexa ->> S"
  },
  {
    "path": "docs/umlDiagrams/ActivityFlow/CustomAdapterFlow/CustomAdapterActivityFlow_DiagramSource.md",
    "chars": 949,
    "preview": "```mermaid\n\nsequenceDiagram\n\n    participant Channel\n    participant CoreSDK as Core BF SDK (1)\n    participant Bot as B"
  },
  {
    "path": "docs/umlDiagrams/ActivityFlow/DetailedSdkFlow/DetailedSdkFlow.md",
    "chars": 291,
    "preview": "## Activity Flow\n\n### *Modeled after EchoBot example code in ['How bots work'](https://docs.microsoft.com/en-us/azure/bo"
  },
  {
    "path": "docs/umlDiagrams/ActivityFlow/DetailedSdkFlow/DetailedSdkFlow_DiagramSource.md",
    "chars": 3369,
    "preview": "```mermaid\n    sequenceDiagram\n            participant Channel\n            participant BFS as Bot Framework Service\n    "
  },
  {
    "path": "docs/umlDiagrams/ActivityFlow/GeneralActivityFlow.md",
    "chars": 291,
    "preview": "## Activity Flow\n\n### *Modeled after EchoBot example code in ['How bots work'](https://docs.microsoft.com/en-us/azure/bo"
  },
  {
    "path": "docs/umlDiagrams/ActivityFlow/GeneralActivityFlow_DiagramSource.md",
    "chars": 3369,
    "preview": "```mermaid\n    sequenceDiagram\n            participant Channel\n            participant BFS as Bot Framework Service\n    "
  },
  {
    "path": "docs/umlDiagrams/ActivityFlow/README.md",
    "chars": 9460,
    "preview": "# Activity Flow in the Bot Framework\n\nThis section contains diagrams that illustrate the participants involved when Acti"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AddingAuthenticationToYourBot/AddAuthenticationToYourBotViaABS/DetailedView_DiagramSource.md",
    "chars": 512,
    "preview": "```mermaid\n    graph LR\n    \n    subgraph Channel-to-Bot Access\n        Channel --- AAD1([AAD App Registration 1*])\n    "
  },
  {
    "path": "docs/umlDiagrams/Authentication/AddingAuthenticationToYourBot/AddAuthenticationToYourBotViaABS/HigherLevel_DiagramSource.md",
    "chars": 219,
    "preview": "```mermaid\n    graph LR\n        Channel --- AAD1([AAD App Registration 1])\n        AAD1  --- Bot(Bot)\n        \n        P"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AddingAuthenticationToYourBot/UserAuthenticationWithinAConversation/AuthenticationDocExample_Goal_DiagramSource.md",
    "chars": 83,
    "preview": "```mermaid\ngraph LR\n\nUser -- \"#quot;Please check my email#quot;\" --> Bot(Bot)\n\n```\n"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AddingAuthenticationToYourBot/UserAuthenticationWithinAConversation/AuthenticationDocExample_OAuthFlow_HasTokenInStorage_DiagramSource.md",
    "chars": 751,
    "preview": "```mermaid\nsequenceDiagram\n\nparticipant User\nparticipant BFCS as BF Channel Service\nparticipant BFTS as BF Token Service"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AddingAuthenticationToYourBot/UserAuthenticationWithinAConversation/AuthenticationDocExample_OAuthFlow_NoTokenToStart_DiagramSource.md",
    "chars": 2291,
    "preview": "### Bot does not have token yet, OAuth flow\n\n```mermaid\nsequenceDiagram\n\nparticipant User\nparticipant BFCS as BF Channel"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/AdapterSavedAsTurnContextMember_DiagramSource.md",
    "chars": 82,
    "preview": "```mermaid\n    graph LR\n        Adapter -- stored as member in --> TurnContext\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/BotFrameworkAdapterCreatesOAuthClient_DiagramSource.md",
    "chars": 542,
    "preview": "#### `BotFrameworkAdapter` Creates `OAuthClient`\n``` mermaid\n    graph LR\n        BotFrameworkAdapter -. with .-> AppCre"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/BotFrameworkAdapterCreatesTokenApiClient_DiagramSource.md",
    "chars": 483,
    "preview": "#### `BotFrameworkAdapter` Creates `TokenApiClient`\n``` mermaid\n    graph LR\n        BotFrameworkAdapter -. with .-> App"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/BuildAppCredentialsParticipants_DiagramSource.md",
    "chars": 244,
    "preview": "#### Participants Involved in Building `AppCredentials`\n\n```mermaid\n    classDiagram\n        BotFrameworkAdapter *-- ICr"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/CSharp_AppCredentialsClassDiagram_DiagramSource.md",
    "chars": 634,
    "preview": "#### `AppCredentials` Class Diagram\n\n```mermaid\n    classDiagram\n        class ServiceClientCredentials {\n        }\n    "
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/CSharp_OAuthPromptAndTokenProvider_DiagramSource.md",
    "chars": 975,
    "preview": "`OAuthPrompt` uses a `BotFrameworkAdapter` that implements `ICredentialTokenProvider` to acquire tokens.\n\n```mermaid\n   "
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/CSharp_UseAppCredentialsToCreateOAuthClient_DiagramSource.md",
    "chars": 429,
    "preview": "#### Use `AppCredentials` to create an `OAuthClient`\n- The `OAuthPrompt`'s `ICredentialTokenProvider` creates an `OAuthC"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/CreatingOAuthClientInMoreDetail.md",
    "chars": 348,
    "preview": "A more formal flow chart on the logic of creating an `OAuthClient`\n\n#### Creating `OAuthClient` Flow Chart\n![Create OAut"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/CreatingOAuthClientInMoreDetail_DiagramSource.md",
    "chars": 934,
    "preview": "#### Creating `OAuthClient` Flow Chart\n```mermaid\n    graph TD\n        Start((Start)) --> OAuthScope[get OAuthScope] -- "
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/GetUserTokenSequenceDiagram.md",
    "chars": 1447,
    "preview": "```mermaid\n    sequenceDiagram\n        participant OAuthPrompt\n        participant BFA as BotFrameworkAdapter\n        pa"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/JS_AppCredentialsClassDiagram_DiagramSource.md",
    "chars": 558,
    "preview": "#### `AppCredentials` Class Diagram\n\n```mermaid\n    classDiagram\n        class ServiceClientCredentials {\n        }\n    "
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/JS_OAuthPromptAndTokenProvider_DiagramSource.md",
    "chars": 857,
    "preview": "`OAuthPrompt` uses a `BotFrameworkAdapter` that implements `ExtendedUserTokenProvider` to acquire tokens.\n\n```mermaid\n  "
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/JS_UseAppCredentialsToCreateTokenApiClient_DiagramSource.md",
    "chars": 457,
    "preview": "#### Use `AppCredentials` to create a `TokenApiClient`\n- The `OAuthPrompt`'s `ExtendedUserTokenProvider` creates a `Toke"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/OAuthClientClassDiagram_DiagramSource.md",
    "chars": 1452,
    "preview": "#### `OAuthClient` Class Diagram\n\n```mermaid\n    classDiagram\n        class OAuthClient {\n            - OAuthPromptSetti"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/OAuthPromptClassDiagrams.md",
    "chars": 8269,
    "preview": "Class diagrams and flow charts exlaining the structure of `OAuthPrompt` authentication and authorization in the Bot Fram"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/ProcessActivityCreatesTurnContext_DiagramSource.md",
    "chars": 190,
    "preview": "```mermaid\n    graph LR\n        BotEndpoint[\"#quot;api/messages#quot; endpoint in controller\"] -- calls --> adapter.Proc"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/TakesAdapterFromTurnContext_DiagramSource.md",
    "chars": 327,
    "preview": "`OAuthPrompt` has various methods* that uses `BotAdapter` within its logic:\n```mermaid\n    graph LR\n    OAuthPrompt -- t"
  },
  {
    "path": "docs/umlDiagrams/Authentication/AuthArchitectureInBotFramework/OAuthPrompt/TokenApiClientClassDiagram_DiagramSource.md",
    "chars": 952,
    "preview": "#### `TokenApiClient` Class Diagram\n```mermaid\n    classDiagram\n        class TokenApiClient {\n            + botSignIn\n "
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/AuthenticateRequestOverview_DiagramSource.md",
    "chars": 835,
    "preview": "### Higher Level View of Channel's Token Authentication in the Bot Framework SDK \n\n```mermaid\n    sequenceDiagram\n      "
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/AuthenticateRequest_DiagramSource.md",
    "chars": 1715,
    "preview": "```mermaid\n    sequenceDiagram\n        participant JwtTokenValidation\n        participant ChannelValidation as ChannelVa"
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/ChannelActingOnBehalfOfSelf_DiagramSource.md",
    "chars": 469,
    "preview": "```mermaid\n    sequenceDiagram\n        participant Channel\n        participant Connector\n        participant Bot\n\n      "
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/ChannelActivingOnBehalfOfUser_DiagramSource.md",
    "chars": 604,
    "preview": "```mermaid\n    sequenceDiagram\n        participant User\n        participant Channel\n        participant Connector\n      "
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/ChannelToABSLayerToBot_DiagramSource.md",
    "chars": 188,
    "preview": "```mermaid\n    graph LR\n        Teams --- Connector\n        Slack --- Connector([Connector])\n        Cortana --- Connect"
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/HigherLevel_TokenAuthentication_DiagramSource.md",
    "chars": 722,
    "preview": "```mermaid\n    sequenceDiagram\n        participant WebServer\n        participant Adapter\n        participant JwtTokenVal"
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/JwtTokenValidationClassDiagram_DiagramSource.md",
    "chars": 693,
    "preview": "```mermaid\n    classDiagram\n        JwtTokenValidation .. ChannelValidation\n        JwtTokenValidation .. EnterpriseChan"
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/README.md",
    "chars": 10039,
    "preview": "# Channel-to-Bot Authentication and Authorization\n\n### *Prerequisite*\nIt is helpful to read the [Authentication](https:/"
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/SimpleChannelWithTokenToBot_DiagramSource.md",
    "chars": 65,
    "preview": "```mermaid\n    graph LR\n        Channel -- Token --> Bot(Bot)\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/TokenSignatureParticipants_DiagramSource.md",
    "chars": 368,
    "preview": "```mermaid\n    graph LR\n\n        Connector --signs token with --> Private{Private Key}\n\n        Bot -- gets location of "
  },
  {
    "path": "docs/umlDiagrams/Authentication/ChannelToBot/WhyHelloBot_DiagramSource.md",
    "chars": 89,
    "preview": "```mermaid\n    graph LR\n        Channel -- \"#quot;Why hello, Bot!#quot;\" --> Bot(Bot)\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/HighLevelAuthFlow/AuthServerAuthenticatesUser_DiagramSource.md",
    "chars": 104,
    "preview": "```mermaid\n    graph LR\n    User -- Authenticates Identity at --> AuthServer[/Authorization Server\\]\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/HighLevelAuthFlow/AuthServerIssuesTokenToBot_DiagramSource.md",
    "chars": 171,
    "preview": "```mermaid\n    graph LR\n        AuthServer[/Authorization Server\\] -- Issues Token --> Bot(Bot) -- Makes Request with To"
  },
  {
    "path": "docs/umlDiagrams/Authentication/HighLevelAuthFlow/GiveBotAccessToProtectedResource_DiagramSource.md",
    "chars": 103,
    "preview": "```mermaid\n    graph  LR\n    User --> Bot(Bot) -- Token --> ProtectedResource{{Protected Resource}}\n```"
  },
  {
    "path": "docs/umlDiagrams/Authentication/HighLevelAuthFlow/HighLevelAuthFlowSequenceDiagram_DiagramSource.md",
    "chars": 1884,
    "preview": "```mermaid\n    sequenceDiagram\n\n    participant User\n    participant Bot\n    participant Azure\n    Note over Azure: Azur"
  },
  {
    "path": "docs/umlDiagrams/Authentication/OAuthPrompt/OAuthPrompt_BeginDialog_DiagramSource.md",
    "chars": 678,
    "preview": "# `OAuthPrompt.BeginDialogAsync()` Flow\n\n```mermaid\n    graph TD\n        Start((Start)) --> PromptOptions\n        \n     "
  },
  {
    "path": "docs/umlDiagrams/Authentication/OAuthPrompt/OAuthPrompt_ContinueDialog_DetailedView_DiagramSource.md",
    "chars": 2213,
    "preview": "## Detailed View\n\n```mermaid\n    graph TD\n        Start((Start)) --> ResponseType{What Type is the Activity?}\n        su"
  },
  {
    "path": "docs/umlDiagrams/Authentication/OAuthPrompt/OAuthPrompt_ContinueDialog_HigherLevel_DiagramSource.md",
    "chars": 716,
    "preview": "# `OAuthPrompt.ContinueDialogAsync()` Flow\n\n## Higher Level\n\n```mermaid\n    graph TD\n    Start((Start)) --> RecognizeTok"
  },
  {
    "path": "docs/umlDiagrams/Authentication/OAuthPrompt/README.md",
    "chars": 1735,
    "preview": "## `OAuthPrompt` Behavioral Flow Charts\n\n- In order to access a **protected resource**, the **bot** must send the **user"
  },
  {
    "path": "docs/umlDiagrams/Authentication/README.md",
    "chars": 14055,
    "preview": "# Authentication in Bot Framework\nHow authentication is integrated into the Bot Framework.\n\n- [High Level Authorization "
  },
  {
    "path": "dri/.gitignore",
    "chars": 52,
    "preview": "__pycache__\nbotreport_*\nmembers-do-not-check-in.txt\n"
  },
  {
    "path": "dri/README.md",
    "chars": 2672,
    "preview": "# Git Stats for Bot Framework\r\n\r\nCommand line tool to view active/aging issues associated with the Bot Framework Github "
  },
  {
    "path": "dri/helpers.py",
    "chars": 4263,
    "preview": "# Copyright (c) Microsoft Corporation. All rights reserved.\n# Licensed under the MIT License.\n\n\"\"\"\nhelpers.py\n\nPerforms "
  },
  {
    "path": "dri/output.py",
    "chars": 2860,
    "preview": "# Copyright (c) Microsoft Corporation. All rights reserved.\n# Licensed under the MIT License.\n\n\"\"\"\noutput.py\n\nOutput fun"
  },
  {
    "path": "dri/report.py",
    "chars": 7861,
    "preview": "# Copyright (c) Microsoft Corporation. All rights reserved.\n# Licensed under the MIT License.\n\"\"\"\nreport.py\n\nGenerates r"
  },
  {
    "path": "dri/requirements.txt",
    "chars": 63,
    "preview": "PyGithub>=1.43.8\r\njsonpickle>=1.2\r\ncolorama>=0.4.1\r\nsix>=1.12.0"
  },
  {
    "path": "parsers/LU/ANTLR/LUFileLexer.g4",
    "chars": 3125,
    "preview": "lexer grammar LUFileLexer;\n\n// fragments\nfragment A: 'a' | 'A';\nfragment B: 'b' | 'B';\nfragment C: 'c' | 'C';\nfragment D"
  },
  {
    "path": "parsers/LU/ANTLR/LUFileParser.g4",
    "chars": 4092,
    "preview": "parser grammar LUFileParser;\n\noptions { tokenVocab=LUFileLexer; }\n\nfile\n\t: paragraph+? EOF\n\t;\n\nparagraph\n    : newline\n "
  },
  {
    "path": "parsers/LU/JS/build/bf-cli-build-test-steps.yml",
    "chars": 2431,
    "preview": "steps:\n- bash: |\n    short_hash=`git rev-parse --short=7 HEAD`  ## At least 7 digits, more if needed for uniqueness\n    "
  },
  {
    "path": "parsers/LU/JS/build/botframework-cli-azure-devops.yml",
    "chars": 615,
    "preview": "#\n# Build Botframework-CLI Azure DevOps bits on Windows agent\n#\n\n# \"name\" here defines the build number format. Build nu"
  },
  {
    "path": "parsers/LU/JS/build/botframework-cli-beta.yml",
    "chars": 737,
    "preview": "#\n# Build Botframework-CLI daily bits on Windows agent\n#\n\n# \"name\" here defines the build number format. Build number is"
  },
  {
    "path": "parsers/LU/JS/build/botframework-cli-daily.yml",
    "chars": 720,
    "preview": "#\n# Build Botframework-CLI daily bits on Windows agent\n#\n\n# \"name\" here defines the build number format. Build number is"
  },
  {
    "path": "parsers/LU/JS/build/botframework-cli-mac.yml",
    "chars": 644,
    "preview": "#\n# Build Botframework-CLI on Mac (Linux) agent\n#\n\n# \"name\" here defines the build number format. Build number is access"
  },
  {
    "path": "parsers/LU/JS/build/botframework-cli-rc.yml",
    "chars": 601,
    "preview": "#\n# Build Botframework-CLI RC bits on Windows agent\n#\n\n# \"name\" here defines the build number format. Build number is ac"
  },
  {
    "path": "parsers/LU/JS/build/botframework-cli-version.yml",
    "chars": 38,
    "preview": "variables:\n  releaseVersion: '4.11.0'\n"
  },
  {
    "path": "parsers/LU/JS/build/botframework-cli.yml",
    "chars": 3910,
    "preview": "#\n# Build Botframework-CLI on Windows agent\n#\n\n# \"name\" here defines the build number format. Build number is accessed v"
  },
  {
    "path": "parsers/LU/JS/common/config/rush/.npmrc",
    "chars": 597,
    "preview": "# Rush uses this file to configure the package registry, regardless of whether the\n# package manager is PNPM, NPM, or Ya"
  },
  {
    "path": "parsers/LU/JS/common/config/rush/command-line.json",
    "chars": 13096,
    "preview": "/**\n * This configuration file defines custom commands for the \"rush\" command-line.\n * For full documentation, please se"
  },
  {
    "path": "parsers/LU/JS/common/config/rush/common-versions.json",
    "chars": 1899,
    "preview": "/**\n * This configuration file specifies NPM dependency version selections that affect all projects\n * in a Rush repo.  "
  },
  {
    "path": "parsers/LU/JS/common/config/rush/experiments.json",
    "chars": 762,
    "preview": "/**\n * This configuration file allows repo maintainers to enable and disable experimental\n * Rush features. For full doc"
  },
  {
    "path": "parsers/LU/JS/common/config/rush/pnpmfile.js",
    "chars": 1295,
    "preview": "\"use strict\";\n\n/**\n * When using the PNPM package manager, you can use pnpmfile.js to workaround\n * dependencies that ha"
  },
  {
    "path": "parsers/LU/JS/common/config/rush/version-policies.json",
    "chars": 4318,
    "preview": "/**\n * This is configuration file is used for advanced publishing configurations with Rush.\n * For full documentation, p"
  },
  {
    "path": "parsers/LU/JS/common/scripts/install-run-rush.js",
    "chars": 3552,
    "preview": "\"use strict\";\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See the @m"
  },
  {
    "path": "parsers/LU/JS/common/scripts/install-run-rushx.js",
    "chars": 975,
    "preview": "\"use strict\";\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See the @m"
  },
  {
    "path": "parsers/LU/JS/common/scripts/install-run.js",
    "chars": 17501,
    "preview": "\"use strict\";\n// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See the @m"
  },
  {
    "path": "parsers/LU/JS/common/scripts/version-and-pack.js",
    "chars": 5037,
    "preview": "// @ts-check\n// Ensure using node 12 because of recursive mkdir\nif (\n    !process.env.GEN_CLDR_DATA_IGNORE_NODE_VERSION "
  },
  {
    "path": "parsers/LU/JS/packages/lu/.editorconfig",
    "chars": 171,
    "preview": "root = true\n\n[*]\nindent_style = space\nindent_size = 2\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newli"
  },
  {
    "path": "parsers/LU/JS/packages/lu/.gitignore",
    "chars": 113,
    "preview": "*-debug.log\n*-error.log\n/.nyc_output\n/dist\n/lib\n/tmp\n/yarn.lock\nnode_modules\n**/.antlr\n**/java_generated\n\nresults"
  },
  {
    "path": "parsers/LU/JS/packages/lu/.nycrc",
    "chars": 344,
    "preview": "{\n  \"extension\": [\n    \".ts\",\n    \".js\"\n  ],\n  \"include\": [\n    \"src\"\n  ],\n  \"exclude\": [\n    \"**/node_modules/**\",\n    "
  },
  {
    "path": "parsers/LU/JS/packages/lu/README.md",
    "chars": 2953,
    "preview": "\nThis package is intended for Microsoft use only. It is not designed to be consumed as an independent package.\n\n# Consum"
  },
  {
    "path": "parsers/LU/JS/packages/lu/package.json",
    "chars": 1835,
    "preview": "{\n  \"name\": \"@microsoft/bf-lu-parser\",\n  \"version\": \"1.0.0\",\n  \"author\": \"Microsoft\",\n  \"bugs\": \"https://github.com/micr"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/index.ts",
    "chars": 123,
    "preview": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport default "
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/composerindex.js",
    "chars": 370,
    "preview": "module.exports = {\n    parser: {\n        parseFile: require('./lufile/parseFileContents').parseFile,\n        validateLUI"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/converters/helpers/writer.js",
    "chars": 2794,
    "preview": "const fs = require(\"fs\");\nclass Writer {\n    constructor() {\n        this.indentSize = 4;\n        this.indentLevel = 0;\n"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/converters/luistocsconverter.js",
    "chars": 11728,
    "preview": "const parse_multi_platform_luis_1 = require(\"./../luis/propertyHelper\");\nconst LuisGenBuilder = require('./../luis/luisG"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/converters/luistotsconverter.js",
    "chars": 6207,
    "preview": "const parse_multi_platform_luis_1 = require('./../luis/propertyHelper');\nconst LuisGenBuilder = require('./../luis/luisG"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/cross-train/confighelper.js",
    "chars": 3511,
    "preview": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst fs = requ"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/cross-train/cross-train.js",
    "chars": 2075,
    "preview": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst fs = requ"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/cross-train/crossTrainer.js",
    "chars": 25541,
    "preview": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst helpers ="
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/index.js",
    "chars": 1681,
    "preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst modules = "
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lu/lu.js",
    "chars": 1029,
    "preview": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst translate"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lu/luMerger.js",
    "chars": 24370,
    "preview": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst fs = requ"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lu/luOptions.js",
    "chars": 584,
    "preview": "class LuOptions {\n    constructor(id = '', includeInCollate = true, language = '', path = ''){\n        this.id = id ? id"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lu/qna.js",
    "chars": 1045,
    "preview": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst translate"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lu/qnaOptions.js",
    "chars": 586,
    "preview": "class QnAOptions {\n    constructor(id = '', includeInCollate = true, language = '', path = ''){\n        this.id = id ? i"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lubuild/builder.ts",
    "chars": 20937,
    "preview": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {LuBuild"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lubuild/core.ts",
    "chars": 12850,
    "preview": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {Cogniti"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lubuild/cross-trained-recognizer.ts",
    "chars": 753,
    "preview": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport class Cr"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lubuild/multi-language-recognizer.ts",
    "chars": 895,
    "preview": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nconst path = re"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lubuild/recognizer.ts",
    "chars": 2102,
    "preview": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {Setting"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lubuild/settings.ts",
    "chars": 481,
    "preview": "/*!\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\n\nexport class Se"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/LUFileLexer.g4",
    "chars": 3125,
    "preview": "lexer grammar LUFileLexer;\n\n// fragments\nfragment A: 'a' | 'A';\nfragment B: 'b' | 'B';\nfragment C: 'c' | 'C';\nfragment D"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/LUFileParser.g4",
    "chars": 4092,
    "preview": "parser grammar LUFileParser;\n\noptions { tokenVocab=LUFileLexer; }\n\nfile\n\t: paragraph+? EOF\n\t;\n\nparagraph\n    : newline\n "
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/baseSection.js",
    "chars": 493,
    "preview": "class BaseSection {\n    constructor(parameters) {\n        this.Errors = [];\n        this.SectionType = '';\n        this."
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/classes/filesToParse.js",
    "chars": 494,
    "preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nclass FileToPars"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/classes/hclasses.js",
    "chars": 5056,
    "preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst readerObj "
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/classes/parserObject.js",
    "chars": 1795,
    "preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst QnA = requ"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/diagnostic.js",
    "chars": 2913,
    "preview": "/**\n * Diagnostic class\n */\nclass Diagnostic {\n    constructor(range, message, severity = DiagnosticSeverity.ERROR) {\n  "
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/entitySection.js",
    "chars": 3996,
    "preview": "const EntitySectionContext = require('./generated/LUFileParser').LUFileParser.EntitySectionContext;\nconst DiagnosticSeve"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileLexer.interp",
    "chars": 24575,
    "preview": "token literal names:\nnull\nnull\nnull\nnull\nnull\nnull\nnull\nnull\nnull\n'$'\n'@'\nnull\nnull\nnull\nnull\nnull\nnull\n'='\n','\nnull\nnul"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileLexer.js",
    "chars": 39806,
    "preview": "// Generated from ../LUFileLexer.g4 by ANTLR 4.8\n// jshint ignore: start\nvar antlr4 = require('antlr4/index');\n\n\n\nvar se"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileLexer.tokens",
    "chars": 646,
    "preview": "WS=1\nNEWLINE=2\nQNA_SOURCE_INFO=3\nMODEL_INFO=4\nCOMMENT=5\nQNA=6\nHASH=7\nDASH=8\nDOLLAR=9\nAT=10\nIMPORT=11\nFILTER_MARK=12\nQNA_"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileParser.interp",
    "chars": 22561,
    "preview": "token literal names:\nnull\nnull\nnull\nnull\nnull\nnull\nnull\nnull\nnull\n'$'\n'@'\nnull\nnull\nnull\nnull\nnull\nnull\n'='\n','\nnull\nnul"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileParser.js",
    "chars": 210827,
    "preview": "// Generated from ../LUFileParser.g4 by ANTLR 4.8\n// jshint ignore: start\nvar antlr4 = require('antlr4/index');\nvar LUFi"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileParser.tokens",
    "chars": 646,
    "preview": "WS=1\nNEWLINE=2\nQNA_SOURCE_INFO=3\nMODEL_INFO=4\nCOMMENT=5\nQNA=6\nHASH=7\nDASH=8\nDOLLAR=9\nAT=10\nIMPORT=11\nFILTER_MARK=12\nQNA_"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileParserListener.js",
    "chars": 16157,
    "preview": "// Generated from ../LUFileParser.g4 by ANTLR 4.8\n// jshint ignore: start\nvar antlr4 = require('antlr4/index');\n\n// This"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/generated/LUFileParserVisitor.js",
    "chars": 10296,
    "preview": "// Generated from ../LUFileParser.g4 by ANTLR 4.8\n// jshint ignore: start\nvar antlr4 = require('antlr4/index');\n\n// This"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/importSection.js",
    "chars": 1924,
    "preview": "const ImportSectionContext = require('./generated/LUFileParser').LUFileParser.ImportSectionContext;\nconst BuildDiagnosti"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/luErrorListener.js",
    "chars": 1556,
    "preview": "const antlr4 = require('antlr4');\nconst Position = require('./diagnostic').Position;\nconst Range = require('./diagnostic"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/luParser.js",
    "chars": 16478,
    "preview": "const antlr4 = require('antlr4');\nconst LUFileLexer = require('./generated/LUFileLexer').LUFileLexer;\nconst LUFileParser"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/luResource.js",
    "chars": 290,
    "preview": "class LUResource {\n  /**\n   * @param {any[]} sections\n   * @param {string} content\n   * @param {any[]} errors\n   */\n  co"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/modelInfoSection.js",
    "chars": 997,
    "preview": "const ModelInfoSectionContext = require('./generated/LUFileParser').LUFileParser.ModelInfoSectionContext;\nconst LUSectio"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/nestedIntentSection.js",
    "chars": 2068,
    "preview": "const NestedIntentSectionContext = require('./generated/LUFileParser').LUFileParser.NestedIntentSectionContext\nconst Sim"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/newEntitySection.js",
    "chars": 5305,
    "preview": "const NewEntitySectionContext = require('./generated/LUFileParser').LUFileParser.NewEntitySectionContext;\nconst Diagnost"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/parseFileContents.js",
    "chars": 118823,
    "preview": "/**\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License.\n */\nconst LUISObjNam"
  },
  {
    "path": "parsers/LU/JS/packages/lu/src/parser/lufile/qnaSection.js",
    "chars": 6615,
    "preview": "const QnaSectionContext = require('./generated/LUFileParser').LUFileParser.QnaSectionContext;\nconst LUSectionTypes = req"
  }
]

// ... and 590 more files (download for full content)

About this extraction

This page contains the full source code of the microsoft/botframework-sdk GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 790 files (4.8 MB), approximately 1.3M tokens, and a symbol index with 616 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!