master c1f80d7cdb75 cached
280 files
5.3 MB
1.4M tokens
1270 symbols
1 requests
Download .txt
Showing preview only (5,801K chars total). Download the full file or copy to clipboard to get everything.
Repository: dsuryd/dotnetify-react-demo-vs2017
Branch: master
Commit: c1f80d7cdb75
Files: 280
Total size: 5.3 MB

Directory structure:
gitextract_j6oj_ypb/

├── .gitattributes
├── .gitignore
├── LICENSE
├── MicrofrontendTemplate/
│   ├── .gitignore
│   ├── .template.config/
│   │   └── template.json
│   ├── Microfrontend.sln
│   ├── Portal/
│   │   ├── Portal.csproj
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── appsettings.json
│   │   ├── client/
│   │   │   ├── auth.js
│   │   │   ├── components/
│   │   │   │   ├── App.js
│   │   │   │   ├── Landing.js
│   │   │   │   ├── Login.js
│   │   │   │   └── Portal.js
│   │   │   ├── index.js
│   │   │   └── loader.js
│   │   ├── package.json
│   │   ├── run.bat
│   │   ├── server/
│   │   │   ├── Controllers/
│   │   │   │   └── LoginController.cs
│   │   │   ├── Program.cs
│   │   │   └── Startup.cs
│   │   ├── tempkey.rsa
│   │   ├── webpack.config.js
│   │   └── wwwroot/
│   │       ├── 404.html
│   │       └── index.html
│   ├── README.md
│   ├── ReactDashboardApp/
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── README.md
│   │   ├── ReactDashboardApp.csproj
│   │   ├── appsettings.json
│   │   ├── client/
│   │   │   ├── components/
│   │   │   │   ├── ActivitiesCard.js
│   │   │   │   ├── Dashboard.js
│   │   │   │   └── InfoCard.js
│   │   │   └── index.js
│   │   ├── package.json
│   │   ├── run.bat
│   │   ├── server/
│   │   │   ├── Program.cs
│   │   │   ├── Services/
│   │   │   │   └── MockLiveDataService.cs
│   │   │   ├── Startup.cs
│   │   │   └── ViewModels/
│   │   │       └── Dashboard.cs
│   │   ├── webpack.config.js
│   │   └── wwwroot/
│   │       └── index.html
│   ├── ReactFormApp/
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── README.md
│   │   ├── ReactFormApp.csproj
│   │   ├── appsettings.json
│   │   ├── client/
│   │   │   ├── components/
│   │   │   │   ├── AddressForm.js
│   │   │   │   ├── BasicInfoForm.js
│   │   │   │   ├── Form.js
│   │   │   │   └── NewCustomerDialog.js
│   │   │   └── index.js
│   │   ├── package.json
│   │   ├── run.bat
│   │   ├── server/
│   │   │   ├── Program.cs
│   │   │   ├── Services/
│   │   │   │   ├── Customer.cs
│   │   │   │   ├── CustomerFormData.cs
│   │   │   │   └── CustomerRepository.cs
│   │   │   ├── Startup.cs
│   │   │   └── ViewModels/
│   │   │       ├── AddressForm.cs
│   │   │       ├── CustomerForm.cs
│   │   │       ├── NewCustomerForm.cs
│   │   │       ├── PersonForm.cs
│   │   │       └── PhoneForm.cs
│   │   ├── webpack.config.js
│   │   └── wwwroot/
│   │       └── index.html
│   ├── ReactTodoApp/
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── README.md
│   │   ├── ReactTodoApp.csproj
│   │   ├── appsettings.json
│   │   ├── client/
│   │   │   ├── components/
│   │   │   │   └── TodoList.js
│   │   │   └── index.js
│   │   ├── package.json
│   │   ├── run.bat
│   │   ├── server/
│   │   │   ├── Program.cs
│   │   │   ├── Startup.cs
│   │   │   └── ViewModels/
│   │   │       └── TodoList.cs
│   │   ├── webpack.config.js
│   │   └── wwwroot/
│   │       └── index.html
│   ├── Shared/
│   │   ├── IdentityServer/
│   │   │   ├── IdentityServerClient.cs
│   │   │   ├── IdentityServerConfig.cs
│   │   │   └── IdentityServerSettings.cs
│   │   └── Shared.csproj
│   ├── VueTodoApp/
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── README.md
│   │   ├── VueTodoApp.csproj
│   │   ├── appsettings.json
│   │   ├── client/
│   │   │   ├── components/
│   │   │   │   └── TodoList.vue
│   │   │   └── index.js
│   │   ├── package.json
│   │   ├── run.bat
│   │   ├── server/
│   │   │   ├── Program.cs
│   │   │   ├── Startup.cs
│   │   │   └── ViewModels/
│   │   │       └── TodoList.cs
│   │   ├── webpack.config.js
│   │   └── wwwroot/
│   │       └── index.html
│   ├── global.json
│   ├── heroku-deploy/
│   │   ├── Portal/
│   │   │   ├── Dockerfile
│   │   │   ├── appsettings.json
│   │   │   ├── build.bat
│   │   │   ├── deploy.bat
│   │   │   └── excludedfiles.txt
│   │   ├── ReactDashboardApp/
│   │   │   ├── Dockerfile
│   │   │   ├── appsettings.json
│   │   │   ├── build.bat
│   │   │   ├── deploy.bat
│   │   │   └── excludedfiles.txt
│   │   └── nginx/
│   │       ├── Dockerfile
│   │       ├── deploy.bat
│   │       └── nginx.conf
│   ├── nginx/
│   │   ├── .gitignore
│   │   ├── conf/
│   │   │   ├── fastcgi.conf
│   │   │   ├── fastcgi_params
│   │   │   ├── koi-utf
│   │   │   ├── koi-win
│   │   │   ├── mime.types
│   │   │   ├── nginx.conf
│   │   │   ├── scgi_params
│   │   │   ├── uwsgi_params
│   │   │   └── win-utf
│   │   ├── contrib/
│   │   │   ├── README
│   │   │   ├── geo2nginx.pl
│   │   │   ├── unicode2nginx/
│   │   │   │   ├── koi-utf
│   │   │   │   ├── unicode-to-nginx.pl
│   │   │   │   └── win-utf
│   │   │   └── vim/
│   │   │       ├── ftdetect/
│   │   │       │   └── nginx.vim
│   │   │       ├── ftplugin/
│   │   │       │   └── nginx.vim
│   │   │       ├── indent/
│   │   │       │   └── nginx.vim
│   │   │       └── syntax/
│   │   │           └── nginx.vim
│   │   ├── docs/
│   │   │   ├── CHANGES
│   │   │   ├── CHANGES.ru
│   │   │   ├── LICENSE
│   │   │   ├── OpenSSL.LICENSE
│   │   │   ├── PCRE.LICENCE
│   │   │   ├── README
│   │   │   └── zlib.LICENSE
│   │   ├── html/
│   │   │   ├── 50x.html
│   │   │   └── index.html
│   │   ├── run.bat
│   │   └── stop.bat
│   └── run.bat
├── README.md
├── ReactTemplate/
│   ├── README.md
│   ├── content/
│   │   ├── .gitignore
│   │   ├── .template.config/
│   │   │   └── template.json
│   │   ├── client/
│   │   │   ├── app.tsx
│   │   │   ├── auth.ts
│   │   │   ├── components/
│   │   │   │   ├── BasePage.tsx
│   │   │   │   ├── Header.tsx
│   │   │   │   ├── Sidebar.tsx
│   │   │   │   ├── dashboard/
│   │   │   │   │   ├── InfoBox.tsx
│   │   │   │   │   ├── RecentActivities.tsx
│   │   │   │   │   ├── ServerUsage.tsx
│   │   │   │   │   ├── Traffic.tsx
│   │   │   │   │   └── Utilization.tsx
│   │   │   │   └── table/
│   │   │   │       ├── InlineEdit.tsx
│   │   │   │       └── Pagination.tsx
│   │   │   ├── routes.tsx
│   │   │   ├── styles/
│   │   │   │   ├── app.css
│   │   │   │   ├── styles.ts
│   │   │   │   └── theme-default.ts
│   │   │   └── views/
│   │   │       ├── App.tsx
│   │   │       ├── AppLayout.tsx
│   │   │       ├── Dashboard.tsx
│   │   │       ├── FormPage.tsx
│   │   │       ├── LoginPage.tsx
│   │   │       └── TablePage.tsx
│   │   ├── package.json
│   │   ├── projectName.csproj
│   │   ├── projectName.sln
│   │   ├── server/
│   │   │   ├── AuthServer.cs
│   │   │   ├── Program.cs
│   │   │   ├── Services/
│   │   │   │   ├── EmployeeService.cs
│   │   │   │   ├── MockLiveDataService.cs
│   │   │   │   └── employees.json
│   │   │   └── ViewModels/
│   │   │       ├── AppLayout.cs
│   │   │       ├── Dashboard.cs
│   │   │       ├── Form.cs
│   │   │       └── Table.cs
│   │   ├── tsconfig.json
│   │   ├── webpack.config.js
│   │   └── wwwroot/
│   │       ├── 404.html
│   │       └── index.html
│   └── template.nuspec
└── _archive/
    ├── HelloWorld/
    │   ├── HelloWorld.cs
    │   ├── HelloWorld.csproj
    │   ├── HelloWorld.sln
    │   ├── Program.cs
    │   ├── Properties/
    │   │   └── launchSettings.json
    │   ├── Startup.cs
    │   ├── package.json
    │   ├── src/
    │   │   ├── HelloWorld.jsx
    │   │   └── app.js
    │   ├── webpack.config.js
    │   └── wwwroot/
    │       ├── bundle.js
    │       └── index.html
    ├── LiveChart/
    │   ├── IISPublishingSteps.md
    │   ├── LiveChart.cs
    │   ├── LiveChart.csproj
    │   ├── LiveChart.sln
    │   ├── Program.cs
    │   ├── Properties/
    │   │   └── launchSettings.json
    │   ├── Startup.cs
    │   ├── compilerconfig.json
    │   ├── compilerconfig.json.defaults
    │   ├── package.json
    │   ├── src/
    │   │   ├── LiveChart.jsx
    │   │   └── app.js
    │   ├── webpack.config.js
    │   └── wwwroot/
    │       ├── bundle.js
    │       └── index.html
    ├── README.md
    ├── ReactTemplateTS/
    │   ├── .editorconfig
    │   ├── README.md
    │   ├── content/
    │   │   ├── .babelrc
    │   │   ├── .gitignore
    │   │   ├── .template.config/
    │   │   │   └── template.json
    │   │   ├── client/
    │   │   │   ├── app.tsx
    │   │   │   ├── auth.tsx
    │   │   │   ├── components/
    │   │   │   │   ├── BasePage.tsx
    │   │   │   │   ├── Header.tsx
    │   │   │   │   ├── Sidebar.tsx
    │   │   │   │   ├── dashboard/
    │   │   │   │   │   ├── InfoBox.tsx
    │   │   │   │   │   ├── RecentActivities.tsx
    │   │   │   │   │   ├── ServerUsage.tsx
    │   │   │   │   │   ├── Traffic.tsx
    │   │   │   │   │   └── Utilization.tsx
    │   │   │   │   └── table/
    │   │   │   │       ├── InlineEdit.tsx
    │   │   │   │       └── Pagination.tsx
    │   │   │   ├── routes.tsx
    │   │   │   ├── styles/
    │   │   │   │   ├── app.css
    │   │   │   │   ├── styles.ts
    │   │   │   │   └── theme-default.ts
    │   │   │   └── views/
    │   │   │       ├── App.tsx
    │   │   │       ├── AppLayout.tsx
    │   │   │       ├── Dashboard.tsx
    │   │   │       ├── FormPage.tsx
    │   │   │       ├── LoginPage.tsx
    │   │   │       └── TablePage.tsx
    │   │   ├── dotnetify_react_template.csproj
    │   │   ├── dotnetify_react_template.sln
    │   │   ├── images.d.ts
    │   │   ├── package.json
    │   │   ├── server/
    │   │   │   ├── AuthServer.cs
    │   │   │   ├── Program.cs
    │   │   │   ├── Services/
    │   │   │   │   ├── EmployeeService.cs
    │   │   │   │   ├── MockLiveDataService.cs
    │   │   │   │   └── employees.json
    │   │   │   ├── Startup.cs
    │   │   │   └── ViewModels/
    │   │   │       ├── AppLayout.cs
    │   │   │       ├── Dashboard.cs
    │   │   │       ├── Form.cs
    │   │   │       └── Table.cs
    │   │   ├── tsconfig.json
    │   │   ├── webpack.config.js
    │   │   └── wwwroot/
    │   │       └── index.html
    │   └── template.nuspec
    └── Routing/
        ├── DotNetify.ServerSideRender.cs
        ├── Program.cs
        ├── Properties/
        │   └── launchSettings.json
        ├── Routing.csproj
        ├── Routing.sln
        ├── Startup.cs
        ├── ViewModels/
        │   ├── Index.cs
        │   ├── Page1.cs
        │   └── Page2.cs
        ├── compilerconfig.json
        ├── compilerconfig.json.defaults
        ├── package.json
        ├── src/
        │   ├── Index.js
        │   ├── Index.jsx
        │   ├── app.js
        │   └── app.server.js
        ├── webpack.config.js
        └── wwwroot/
            ├── Index.html
            ├── Page1.js
            ├── Page1.jsx
            ├── Page2.js
            ├── Page2.jsx
            ├── Page3.html
            └── bundle.js

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

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

###############################################################################
# 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: .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/
[Ll]og/

# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUNIT
*.VisualState.xml
TestResult.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# DNX
project.lock.json
artifacts/

*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# JustCode is a .NET coding add-in
.JustCode

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm

# SQL Server files
*.mdf
*.ldf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio Code
.vscode/

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# JetBrains Rider
.idea/
*.sln.iml

/ReactTemplate/content/wwwroot/dist

**/Typings
**/*.tgz

================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "{}"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright {yyyy} {name of copyright owner}

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: MicrofrontendTemplate/.gitignore
================================================
### App ###
dist/

### Code ###
# Visual Studio Code - https://code.visualstudio.com/
.settings/
.vscode/
jsconfig.json

### Node ###
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage

# nyc test coverage
.nyc_output

# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# Bower dependency directory (https://bower.io/)
bower_components

# node-waf configuration
.lock-wscript

# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules/
jspm_packages/

# Typescript v1 declaration files
typings/

# Optional npm cache directory
.npm

# Optional eslint cache
.eslintcache

# Optional REPL history
.node_repl_history

# Output of 'npm pack'
#*.tgz

# Yarn Integrity file
.yarn-integrity

# dotenv environment variables file
.env


### VisualStudio ###
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

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

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

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

# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUNIT
*.VisualState.xml
TestResult.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/

*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# JustCode is a .NET coding add-in
.JustCode

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# Visual Studio code coverage results
*.coverage
*.coveragexml

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Uncomment the next line to ignore your web deploy settings.
# By default, sensitive information, such as encrypted password
# should be stored in the .pubxml.user file.
#*.pubxml
*.pubxml.user
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm

# SQL Server files
*.mdf
*.ldf
*.ndf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat

# Typescript v1 declaration files

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# JetBrains Rider
.idea/
*.sln.iml

# CodeRush
.cr/

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Telerik's JustMock configuration file
*.jmconfig

# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

### VisualStudio Patch ###
# By default, sensitive information, such as encrypted password
# should be stored in the .pubxml.user file.

ASP.NET Demo/WebApplication.Knockout/Scripts/lib

# End of https://www.gitignore.io/api/node,code,visualstudio

================================================
FILE: MicrofrontendTemplate/Microfrontend.sln
================================================

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28307.572
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Portal", "Portal\Portal.csproj", "{3A4AEABB-3F8D-4442-B844-5C63975AFF76}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReactDashboardApp", "ReactDashboardApp\ReactDashboardApp.csproj", "{B90BE04D-66A7-44B7-AEFF-CD41AA38CEFF}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReactFormApp", "ReactFormApp\ReactFormApp.csproj", "{D0EB7EA1-5ACF-4E55-A637-63AA19F6A785}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Shared", "Shared\Shared.csproj", "{6FF33A2C-7C94-4943-8F3F-24BAB26447F6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ReactTodoApp", "ReactTodoApp\ReactTodoApp.csproj", "{4B835F6E-C512-48B3-86CD-C41298A6B04D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VueTodoApp", "VueTodoApp\VueTodoApp.csproj", "{8C57EFD7-FD0E-4B9F-9CA8-2B7866F0DE5E}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Any CPU = Debug|Any CPU
		Release|Any CPU = Release|Any CPU
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{3A4AEABB-3F8D-4442-B844-5C63975AFF76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{3A4AEABB-3F8D-4442-B844-5C63975AFF76}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{3A4AEABB-3F8D-4442-B844-5C63975AFF76}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{3A4AEABB-3F8D-4442-B844-5C63975AFF76}.Release|Any CPU.Build.0 = Release|Any CPU
		{B90BE04D-66A7-44B7-AEFF-CD41AA38CEFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{B90BE04D-66A7-44B7-AEFF-CD41AA38CEFF}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{B90BE04D-66A7-44B7-AEFF-CD41AA38CEFF}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{B90BE04D-66A7-44B7-AEFF-CD41AA38CEFF}.Release|Any CPU.Build.0 = Release|Any CPU
		{D0EB7EA1-5ACF-4E55-A637-63AA19F6A785}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{D0EB7EA1-5ACF-4E55-A637-63AA19F6A785}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{D0EB7EA1-5ACF-4E55-A637-63AA19F6A785}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{D0EB7EA1-5ACF-4E55-A637-63AA19F6A785}.Release|Any CPU.Build.0 = Release|Any CPU
		{6FF33A2C-7C94-4943-8F3F-24BAB26447F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{6FF33A2C-7C94-4943-8F3F-24BAB26447F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{6FF33A2C-7C94-4943-8F3F-24BAB26447F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{6FF33A2C-7C94-4943-8F3F-24BAB26447F6}.Release|Any CPU.Build.0 = Release|Any CPU
		{4B835F6E-C512-48B3-86CD-C41298A6B04D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{4B835F6E-C512-48B3-86CD-C41298A6B04D}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{4B835F6E-C512-48B3-86CD-C41298A6B04D}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{4B835F6E-C512-48B3-86CD-C41298A6B04D}.Release|Any CPU.Build.0 = Release|Any CPU
		{8C57EFD7-FD0E-4B9F-9CA8-2B7866F0DE5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{8C57EFD7-FD0E-4B9F-9CA8-2B7866F0DE5E}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{8C57EFD7-FD0E-4B9F-9CA8-2B7866F0DE5E}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{8C57EFD7-FD0E-4B9F-9CA8-2B7866F0DE5E}.Release|Any CPU.Build.0 = Release|Any CPU
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
	GlobalSection(ExtensibilityGlobals) = postSolution
		SolutionGuid = {BA286E46-A723-4519-AC1B-4D323C6C5AD9}
	EndGlobalSection
EndGlobal


================================================
FILE: MicrofrontendTemplate/Portal/Portal.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RootNamespace>Portal</RootNamespace>
  </PropertyGroup>
  <ItemGroup>
    <Folder Include="wwwroot\" />
    <Folder Include="wwwroot\dist\" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="IdentityServer4.AspNetIdentity" Version="2.5.2" />
    <PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="3.0.0" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\Shared\Shared.csproj" />
  </ItemGroup>
    <!-- In development, the dist files won't exist on the first run or when cloning to
         a different machine, so rebuild them if not already present. -->  
  <Target Name="DebugRunWebpack" BeforeTargets="Build" Condition=" '$(Configuration)' == 'Debug' And !Exists('wwwroot\dist') ">
    <!-- Ensure Node.js is installed -->
    <Exec Command="node --version" ContinueOnError="true">
      <Output TaskParameter="ExitCode" PropertyName="ErrorCode" />
    </Exec>
    <Error Condition="'$(ErrorCode)' != '0'" Text="Node.js is required to build and run this project." />
    <!-- Build JS resources -->
    <Message Importance="high" Text="Performing first-run Webpack build..." />
    <Exec Command="npm install" />
    <Exec Command="npm run build" />
  </Target>
  <Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">
    <!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
    <Exec Command="npm install" />
    <Exec Command="npm run prod" />
    <!-- Include the newly-built files in the publish output -->
    <ItemGroup>
      <DistFiles Include="wwwroot\**" />
      <ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
        <RelativePath>%(DistFiles.Identity)</RelativePath>
        <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
      </ResolvedFileToPublish>
    </ItemGroup>
  </Target>
</Project>

================================================
FILE: MicrofrontendTemplate/Portal/Properties/launchSettings.json
================================================
{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:5000/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "dev": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:5000/"
    },
    "prod": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Production"
      },
      "applicationUrl": "http://localhost:5000/"
    }
  }
}

================================================
FILE: MicrofrontendTemplate/Portal/appsettings.json
================================================
{
  "IdentityServer": {
    "Uri": "http://localhost:5000"
  }
}

================================================
FILE: MicrofrontendTemplate/Portal/client/auth.js
================================================
const url = '/api/login';

export const signIn = (username, password) => {
  return fetch(url, {
    method: 'post',
    body: 'username=' + username + '&password=' + password,
    headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' }
  })
    .then(response => {
      if (!response.ok) throw new Error(response.status);
      return response.json();
    })
    .then(token => window.sessionStorage.setItem('access_token', token.access_token));
};

export const signOut = () => {
  window.sessionStorage.removeItem('access_token');
  window.location.href = '/';
};

export const validateToken = token => {
  return fetch(url + '/validate', {
    method: 'post',
    body: 'token=' + token,
    headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' }
  }).then(response => response.ok);
};

export const getAccessToken = () => {
  return window.sessionStorage.getItem('access_token');
};

export const getAuthHeaders = _ => ({
  headers: { Authorization: 'Bearer ' + getAccessToken() },
  exceptionHandler: _ => signOut()
});


================================================
FILE: MicrofrontendTemplate/Portal/client/components/App.js
================================================
import { Fragment, useState, useEffect } from 'react';
import { getAccessToken, validateToken } from '../auth';
import Portal from './Portal';
import Landing from './Landing';

export const CompanyLogo = styled.a`
  display: flex;
  align-items: center;
  margin-left: 1rem;
  background-image: url(https://dotnetify.net/content/images/dotnetify-logo.png);
  background-size: 100% 100%;
  width: 200px;
  height: 39px;
`;

const App = _ => {
  const [ accessToken ] = useState(getAccessToken());
  const [ validatingToken, setValidatingToken ] = useState(null);
  const [ loggedIn, setLoggedIn ] = useState(false);

  useEffect(() => {
    if (validatingToken === null) {
      setValidatingToken(!!accessToken);
      if (accessToken) {
        validateToken(accessToken).then(valid => {
          setLoggedIn(valid);
          setValidatingToken(false);
        });
      }
    }
  });

  if (validatingToken !== false) return <Fragment />;
  return loggedIn ? <Portal /> : <Landing onLoggedIn={() => setLoggedIn(true)} />;
};

export default App;


================================================
FILE: MicrofrontendTemplate/Portal/client/components/Landing.js
================================================
import { Main, Header, Alert, Panel, Section, withTheme } from 'dotnetify-elements';
import { CompanyLogo } from './App';
import Login from './Login';

const imagePanelCss = `
  position: relative;
  margin-bottom: 6rem;
  img { width: 100vw; height: 400px; }
  a {
    position: relative;
    color: #fff;
    font-size: 8pt;
    float: right;
    margin-top: -1rem;
    padding-right: .5rem;
  }
`;

const Landing = ({ onLoggedIn }) => (
  <Main>
    <Header>
      <CompanyLogo href="https://dotnetify.net" />
    </Header>
    <Section>
      {/* 
      Why using Panel instead pf div? Think of Panels as super-divs: flex by default, automatically 
      add gaps between child elements, support scss-like syntax for nesting styles, and support many
      shorthands to make manipulating layout easier!
       */}
      <Panel>
        <Panel css={imagePanelCss}>
          <div>
            <img src="/landing.jpg" />
            <a href="https://www.freepik.com/free-photos-vectors/background">Background photo created by kjpargeter - www.freepik.com </a>
          </div>
          <Panel horizontal css="position: absolute; top: 2rem">
            <Panel right css="padding: 0 5%">
              <Login onAuthenticated={onLoggedIn} />
            </Panel>
            <Panel css="padding-right: 10%">
              <h3>Welcome to your homepage!</h3>
              <Alert success>
                <h5>Getting Started</h5>
                To sign in, enter username <b>guest</b> with password <b>dotnetify</b>.
              </Alert>
              <Alert>
                <h5>Micro-Frontend Demo</h5>
                This is an SPA that's dynamically composed of smaller, independently deployable apps written in <i>React</i> and <i>Vue</i>;
                each communicates with a cross-platform <i>.NET Core (C#)</i> back-end, using <i>SignalR</i> to facilitate real-time update.
              </Alert>
            </Panel>
          </Panel>
        </Panel>
        <Panel horizontal>
          <Panel right flex="20%">
            <h4>About</h4>
          </Panel>
          <Panel flex="80%" css="padding-right: 10%; > * { padding: 2rem; border-left: 4px solid orange }">
            <div>
              <p>
                <i>DotNetify</i> glues all these together with simple, lightweight, yet powerful abstractions that make developing complex
                web applications a breeze! For documentation, visit{' '}
                <b>
                  <a href="https://dotnetify.net">https://dotnetify.net</a>
                </b>
              </p>
              <p>
                Like this project? Leave a star on{' '}
                <b>
                  <a href="https://github.com/dsuryd/dotNetify">the project's Github page</a>
                </b>
                . Use the issues forum to ask questions, report bugs, or suggest new features.
              </p>
            </div>
          </Panel>
        </Panel>
      </Panel>
    </Section>
  </Main>
);

export default withTheme(Landing);


================================================
FILE: MicrofrontendTemplate/Portal/client/components/Login.js
================================================
import { useState } from 'react';
import { signIn } from '../auth';
import { Alert, Button, Form, Panel, PasswordField, TextField, VMContext, withTheme } from 'dotnetify-elements';

const outerPanelCss = `
  width: 25rem;
  padding: 3rem; 
  background-color: #f5f5f5;
  border-radius: 5px;
  box-shadow: 0 20px 40px -20px rgba(0,0,0,.5);
`;

const Login = ({ onAuthenticated }) => {
  const [ loginError, setLoginError ] = useState();

  const handleLogin = ({ User, Password }) => {
    setLoginError(null);
    signIn(User, Password)
      .then(_ => {
        onAuthenticated();
      })
      .catch(error => {
        if (error.message == '401') setLoginError('Invalid username and/or password');
        else setLoginError(`Unexpected error: ${error.message}`);
      });
  };

  return (
    <VMContext vm="LoginVM" options={{ appId: 'portal' }}>
      <Panel css={outerPanelCss}>
        <h3>Sign In To Get Started</h3>
        <Form onSubmit={handleLogin}>
          <Panel>
            <TextField id="User" label="Username:" />
            <PasswordField id="Password" label="Password:" />
            <Alert danger>{loginError}</Alert>
            <Button stretch submit enable={true} label="Sign In" css="margin-top: 1rem" />
          </Panel>
        </Form>
      </Panel>
    </VMContext>
  );
};

window.LoginVM = {
  onConnect() {
    return {
      User: 'guest',
      User__validation: [
        {
          Type: 'Required',
          Message: 'Username is required',
          Category: 'Error'
        }
      ],
      Password: '',
      Password__attr: { Placeholder: 'Type dotnetify' },
      Password__validation: [
        {
          Type: 'Required',
          Message: 'Password is required',
          Category: 'Error'
        }
      ]
    };
  }
};

export default withTheme(Login);


================================================
FILE: MicrofrontendTemplate/Portal/client/components/Portal.js
================================================
import {
  Main,
  Header,
  Nav,
  NavDrawerButton,
  NavMenu,
  NavMenuTarget,
  Button,
  Panel,
  Section,
  VMContext,
  withTheme
} from 'dotnetify-elements';
import { CompanyLogo } from './App';
import { signOut } from '../auth';

const Portal = _ => (
  <VMContext vm="PortalVM" options={{ appId: 'portal-app' }}>
    <Main>
      <Header>
        <NavDrawerButton css="margin-left: .5rem" />
        <CompanyLogo href="https://dotnetify.net" />
      </Header>
      <Nav>
        <Panel>
          <NavMenu id="NavMenu" />
          <Panel flex bottom padding="1rem">
            <Button stretch label="Logout" onClick={_ => signOut()} />
          </Panel>
        </Panel>
      </Nav>
      <Section>
        <NavMenuTarget />
      </Section>
    </Main>
  </VMContext>
);

window.PortalVM = new class {
  apps = [];
  initialState = { NavMenu: [] };

  onConnect() {
    return this.initialState;
  }

  addApp(newApp) {
    if (this.apps.find(x => x.id === newApp.id)) return;

    this.apps.push(newApp);

    // Set the root component to global window variable to be discovered by dotNetify routing.
    // Note that the component can be React component, Vue component, or web component.
    window[newApp.id] = newApp.rootComponent;

    const homeTemplate = this.apps.length > 0 ? { Id: 'Home', UrlPattern: '', ViewUrl: this.apps[0].id } : {};
    const templates = this.apps.map(app => ({ Id: app.id, UrlPattern: app.routePath, ViewUrl: app.id }));
    const NavMenu = this.apps.map(app => ({ Route: { TemplateId: app.id, Path: app.routePath }, Label: app.label }));
    const state = {
      RoutingState: {
        Templates: [ homeTemplate, ...templates ],
        Root: '/'
      },
      NavMenu
    };

    if (this.$pushUpdate) this.$pushUpdate(state);
    else this.initialState = state;
  }
}();

export function updatePortal(app) {
  window.PortalVM.addApp(app);
}
export default withTheme(Portal);


================================================
FILE: MicrofrontendTemplate/Portal/client/index.js
================================================
import { createWebComponent } from 'dotnetify-elements/web-components/Core';
import loader from './loader';
import App from './components/App';

let useApiGateway = process.env.NODE_ENV !== 'development';

loader(
  [
    {
      id: 'react-dashboard-app',
      label: 'React Dashboard',
      routePath: 'dashboard',
      baseUrl: useApiGateway ? 'http://localhost:8080/app1' : 'http://localhost:5060',
      moduleUrl: '/dist/app.js'
    },
    {
      id: 'react-form-app',
      label: 'React Form',
      routePath: 'form',
      baseUrl: useApiGateway ? 'http://localhost:8080/app2' : 'http://localhost:5070',
      moduleUrl: '/dist/app.js'
    },
    {
      id: 'react-todo-app',
      label: 'React Todo',
      routePath: 'react-todo',
      baseUrl: useApiGateway ? 'http://localhost:8080/app3' : 'http://localhost:5010',
      moduleUrl: '/dist/app.js'
    },
    {
      id: 'vue-todo-app',
      label: 'Vue Todo',
      routePath: 'vue-todo',
      baseUrl: useApiGateway ? 'http://localhost:8080/app4' : 'http://localhost:5020',
      moduleUrl: '/dist/app.js'
    }
  ],
  // External dependencies from script tags.
  ['dotnetify', 'dotNetifyElements', 'styled']
);

createWebComponent(App, 'my-portal');


================================================
FILE: MicrofrontendTemplate/Portal/client/loader.js
================================================
import dotnetify from 'dotnetify';
import { getAccessToken } from './auth';
import { updatePortal } from './components/Portal';

//dotnetify.debug = true;

export default (apps, externalDeps) => {
  // Intercept initial view model connection to override which hub server it should connect with.
  // ***IMPORTANT***: Each app module would need to set the 'appId' option on its VM connect.
  //                  For example: dotnetify.react.connect("MyVM", { appId: 'my-app' })
  dotnetify.connectHandler = vmConnectArgs => {
    const appId = vmConnectArgs.options && vmConnectArgs.options.appId;
    if (!appId) {
      console.error(`'${vmConnectArgs.vmId}' needs 'appId' option to participate in the Portal.`);
      return;
    }

    const app = apps.find(x => x.id === appId);
    if (app) {
      app.hub = app.hub || dotnetify.createHub(app.baseUrl);
      return {
        ...vmConnectArgs,
        hub: app.hub,
        options: { ...vmConnectArgs.options, headers: { Authorization: 'Bearer ' + getAccessToken() } }
      };
    }
  };

  // Register the external dependencies from the script tags to SystemJS.
  externalDeps.forEach(x => SystemJS.set(x, SystemJS.newModule({ ...window[x] })));

  // Use SystemJS to import the app modules.
  function importApp(app) {
    const appUrl = app.baseUrl + app.moduleUrl;
    return SystemJS.import(appUrl)
      .then(module => {
        if (module.default) updatePortal({ ...app, rootComponent: module.default });
      })
      .catch(err => {
        SystemJS.delete(appUrl);
        console.error(`${err}. Retrying in 5 seconds...`);
        setTimeout(() => importApp(app), 5000);
      });
  }

  apps.map(app => importApp(app));
};


================================================
FILE: MicrofrontendTemplate/Portal/package.json
================================================
{
  "version": "1.0.0",
  "name": "portal",
  "private": true,
  "scripts": {
    "build": "webpack",
    "prod": "webpack --mode production"
  },
  "babel": {
    "presets": [
      "env",
      "react"
    ],
    "plugins": [
      "babel-plugin-styled-components",
      "babel-plugin-transform-class-properties",
      "babel-plugin-transform-object-rest-spread"
    ]
  },
  "dependencies": {
    "dotnetify": "^4.0.0",
    "dotnetify-elements": "^1.1.0",
    "react": "^16.9.0",
    "react-dom": "^16.9.0",
    "styled-components": "^4.3.2",
    "systemjs": "~0.21.6"
  },
  "devDependencies": {
    "aspnet-webpack": "~3.0.0",
    "babel-core": "~6.26.3",
    "babel-loader": "~7.1.4",
    "babel-plugin-styled-components": "~1.5.1",
    "babel-plugin-transform-class-properties": "~6.24.1",
    "babel-plugin-transform-object-rest-spread": "~6.26.0",
    "babel-preset-env": "~1.7.0",
    "babel-preset-react": "~6.24.1",
    "copy-webpack-plugin": "^5.0.4",
    "css-loader": "~0.28.11",
    "file-loader": "~1.1.11",
    "style-loader": "~0.21.0",
    "url-loader": "~1.0.1",
    "webpack": "~4.12.0",
    "webpack-bundle-analyzer": "^3.0.3",
    "webpack-cli": "~3.0.8",
    "webpack-dev-middleware": "~3.1.3",
    "webpack-hot-middleware": "~2.22.2"
  }
}


================================================
FILE: MicrofrontendTemplate/Portal/run.bat
================================================
@echo off
if not exist node_modules call npm i
if "%1" == "prod" goto :prod
call npm run build
dotnet run
exit

:prod
call npm run prod
dotnet run --launch-profile prod


================================================
FILE: MicrofrontendTemplate/Portal/server/Controllers/LoginController.cs
================================================
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Shared;
using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace Portal
{
   [Route("api/[controller]")]
   [ApiController]
   public class LoginController : ControllerBase
   {
      private readonly IHttpClientFactory _httpClientFactory;
      private readonly IdentityServerSettings _identityServerSettings;

      public LoginController(IHttpClientFactory httpClientFactory, IOptions<IdentityServerSettings> identityServerOptions)
      {
         _httpClientFactory = httpClientFactory;
         _identityServerSettings = identityServerOptions.Value;
      }

      [HttpPost]
      public async Task<object> Post([FromForm] string username, [FromForm] string password)
      {
         if (username != "guest" || password != "dotnetify")
            return Unauthorized();

         using (var client = _httpClientFactory.CreateClient())
         {
            var tokenResponse = await IdentityServerClient.RequestClientCredentialsTokenAsync(client, _identityServerSettings);
            return new
            {
               access_token = tokenResponse.AccessToken,
               expires_in = tokenResponse.ExpiresIn
            };
         }
      }

      [HttpPost]
      [Route("[action]")]
      public async Task<IActionResult> Validate([FromForm]string token)
      {
         using (var client = _httpClientFactory.CreateClient())
         {
            var response = await IdentityServerClient.IntrospectTokenAsync(client, _identityServerSettings, token);
            if (response.IsError)
               throw new Exception(response.Error);

            return response.IsActive ? new OkResult() : (IActionResult)Unauthorized();
         }
      }
   }
}

================================================
FILE: MicrofrontendTemplate/Portal/server/Program.cs
================================================
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;

namespace Portal
{
   public class Program
   {
      public static void Main(string[] args)
      {
         BuildWebHost(args).Run();
      }

      public static IWebHost BuildWebHost(string[] args) =>
          WebHost.CreateDefaultBuilder(args)
              .ConfigureAppConfiguration((_, config) => config.AddJsonFile("appsettings.json"))
              .UseStartup<Startup>()
              .Build();
   }
}

================================================
FILE: MicrofrontendTemplate/Portal/server/Startup.cs
================================================
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.SpaServices.Webpack;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Shared;
using System.Collections.Generic;
using System.IO;

namespace Portal
{
   public class Startup
   {
      private readonly IConfiguration _config;

      public Startup(IConfiguration config)
      {
         _config = config;
      }

      public void ConfigureServices(IServiceCollection services)
      {
         var identityServerSettings = _config.GetSection(IdentityServerSettings.SectionName);
         var identityServerUri = identityServerSettings.GetValue<string>(nameof(IdentityServerSettings.Uri));

         services.AddOptions();
         services.Configure<IdentityServerSettings>(identityServerSettings);

         services.AddControllers();

         services.AddIdentityServer()
           .AddDeveloperSigningCredential()
           .AddInMemoryApiResources(IdentityServerConfig.GetApiResources())
           .AddInMemoryClients(IdentityServerConfig.GetClients());

         services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddIdentityServerAuthentication(options =>
            {
               options.Authority = identityServerUri;
               options.RequireHttpsMetadata = false;
               options.ApiName = IdentityServerConfig.MyClientId;
            });

         services.AddAuthorization();

         services.AddHttpClient();
         services.AddResponseCompression();
      }

      public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
      {
         if (env.IsDevelopment())
         {
#pragma warning disable 618
            app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
            {
               HotModuleReplacement = true,
               HotModuleReplacementClientOptions = new Dictionary<string, string> { { "reload", "true" } },
            });
#pragma warning restore 618
         }

         app.UseIdentityServer();

         app.UseRouting();
         app.UseEndpoints(endpoints => endpoints.MapControllers());

         app.UseResponseCompression();
         app.UseFileServer();
         app.Run(async (context) =>
         {
            using (var reader = new StreamReader(File.OpenRead("wwwroot/index.html")))
               await context.Response.WriteAsync(reader.ReadToEnd());
         });
      }
   }
}

================================================
FILE: MicrofrontendTemplate/Portal/tempkey.rsa
================================================
{"KeyId":"0ba2028548bfe91576a5940388a7cdbb","Parameters":{"D":"UkWCmbhxnXgJc4SiqAk+6xS0V48iNAt7n/TBICboACMdc+ocGvcR5mqBnRVbRg6S8W+an8JpccDYZtf734TPjV2eRtH2udHlsSeOGlGaa/Mbs1uohglSqwC4i6YMIZQL2E0hRcRpR/YFAK2pYhf3NBI7LQojbmg7ghcsybjK1KFrNTFgI28bkk3f87sf1oJX91Le13tVXpf0mdwP7eEj+cJ+8YK/mV42KEeAHbuQpr920nWy5vi1fO+tqDJvoeq4hyyW21FXlwjxhC0rVI/lcED3dgzok5qXMJniqzyiw7X1noLwtc08QvpqOtoNOaDQALOV2mBWgJmBcloHTHqEUQ==","DP":"W1kMQ859BP9u5Ngu3uz3shu+vVAXIUsjviMe3Pfnj9HlDzZ2zaUEpaQAbvzbaOvwn1vwXwKFvyO7cTpykwi0gYTj9RSYdmRj36CQWQfc9bkiWpOYTPSt5pNusATMDVgQWrmE63MMZg2dpVd5kxWRYebMoQO0lW+YRvACibLPap0=","DQ":"bte4YhkaV6cJdi4UlQBsDreW55EvrwTd982iuxYZ00sleZoSoIgjE7Wesnt1x8gwzWycmJ469ExsblZ4sXSFgB+/51nXi6axTjTbo4mJDgePypMf84fzBGsQmf7b+yMhB1gHdzfpngZ9JCbTv9LZGTuM1mKSY6vGKvpLrzbjvcs=","Exponent":"AQAB","InverseQ":"fZl7/xHyDdh9PH/paje6da8nOXvV7EY4oeI4mjoX/fSq/Eu2/3GNOPBUpHqGHszNNxjDL3hv/E+wep/HI3m6XwingH7AS9DUPRDnBsjVUG+kSuOSCruWzfVLIzMK5xhE+pMVsLn9dBL/pgm5rLBOaq/TSz8KS0gF3K9ONUXmYz4=","Modulus":"uTw8FFxFAOTeA0o/XSdtRRbBhhlYOPhc+Vq8rLsVxIEEP4ev1fQU8dyKHEZuokNpksFhnfbdLIWhS2SH/7l+ERKATYmQlcyQQxkTin+aGWC0dNwvt9QIMxw1uNriRSoEQn9c7yD0ZONfXBZ2aVa6fGgfy7MsJ6TnAgdgt0NWjb8S/s7ehGNE+2PixKZsp7KqX0wIRTzh2hy0qafzY2o3yT5NMajxXJSCEUTZtmgfZxOKVAtIK1YsYGCzimVoCyPemUSY43etvjv9MsHQ3X/WnsHkQ8wYyzyU24O7aj/HHalekKoPM4Ckd9vVy6ebjflkye8A8UGn8BcwXwF62HDMuQ==","P":"y09WRKLTgBCWRHcIvQDo2U6v3ndaewVP8VCZ2QGEcK9zPQJvNos58RZByVgXAIiKyHNzz4xO9HMy7+XhwhfjBDzEAxCnS9XfLAwIOIv9IJ7JI5wUhbhsCoOIMYz2k7o4ZTaK1RHAZ7fWksMvghrrmXu8ZQ+BorvNfkFJVstFyhs=","Q":"6T27LxHMkV33tUvdeFXSTuv/oaO4bN16PUx0fo5a1pbegt55XAIqsQHJeM4VnIJvBwXgj9VrOrDxBZrf0dDTxonosr3hazoUV7zPwybPR1wMzqpILHNspEcoSwY0o257MxPCJj+95bbrtgXvCkE41t27pSbktGOaoBsD3g7FMbs="}}

================================================
FILE: MicrofrontendTemplate/Portal/webpack.config.js
================================================
'use strict';

const path = require('path');
const webpack = require('webpack');
const CopyPlugin = require('copy-webpack-plugin');

module.exports = {
  mode: 'development',
  entry: {
    app: './client/index.js'
  },
  output: {
    filename: '[name].js',
    path: __dirname + '/wwwroot/dist',
    publicPath: '/dist/',
    libraryTarget: 'umd'
  },
  resolve: {
    modules: [ 'client', 'node_modules' ],
    extensions: [ '.js', '.jsx' ]
  },
  module: {
    rules: [
      { test: /\.jsx?$/, use: 'babel-loader', exclude: /node_modules/ },
      { test: /\.css$/, use: [ 'css-loader?minimize' ] },
      { test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader' }
    ]
  },
  externals: {
    dotnetify: 'dotnetify',
    'dotnetify-elements': 'dotNetifyElements',
    react: 'React',
    'react-dom': 'ReactDOM',
    'styled-components': 'styled'
  },
  devtool: 'source-map',
  plugins: [
    new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /en/),
    new CopyPlugin([
      { from: 'node_modules/dotnetify/dist/dotnetify-react.min.js' },
      { from: 'node_modules/dotnetify/dist/dotnetify-vue.min.js' },
      { from: 'node_modules/dotnetify-elements/lib', to: 'lib/' },
      { from: 'node_modules/dotnetify-elements/web-components', to: 'web-components/' },
      { from: 'node_modules/styled-components/dist/styled-components.min.js' },
      { from: 'node_modules/systemjs/dist/system.js' }
    ])
  ]
};


================================================
FILE: MicrofrontendTemplate/Portal/wwwroot/404.html
================================================
<h2>Page not found (404)</h2>
<p>Redirecting to home page...</p>
<script>setTimeout(function() {(window.location.href = '/')}, 2000)</script></p>


================================================
FILE: MicrofrontendTemplate/Portal/wwwroot/index.html
================================================
<!DOCTYPE html>
<html>
    <head>
       <title>DotNetify Micro-Frontend Demo</title>
       <meta charset="utf-8">
       <meta name="viewport" content="initial-scale=1, width=device-width"/>
       <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
       <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />
       <style>
          body { height: 100vh }
       </style>
    </head>
    <body>
      <my-portal />

        <!-- Polyfills for IE 11 -->
        <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.26.0/polyfill.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/2.2.10/webcomponents-bundle.js"></script>        
    
        <script src="https://unpkg.com/react@latest/umd/react.production.min.js"></script>
        <script src="https://unpkg.com/react-dom@latest/umd/react-dom.production.min.js"></script>  
        <script src="https://cdn.jsdelivr.net/npm/@aspnet/signalr@1/dist/browser/signalr.min.js"></script>

        <script src="/dist/styled-components.min.js"></script>        
        <script src="/dist/dotnetify-react.min.js"></script> 
        <script src="/dist/system.js"></script>        
        
        <script src="/dist/lib/basic-web-components.bundle.js"></script> 
        <script src="/dist/web-components/chart.js"></script> 
        <script src="/dist/web-components/datagrid.js"></script> 
        <script src="/dist/app.js"></script>  

    </body>
</html>

================================================
FILE: MicrofrontendTemplate/README.md
================================================
<p align="center"><img width="300px" src="https://dotnetify.net/content/images/dotnetify-logo.png"></p>

## DotNetify - Micro-Frontend Demo

### How to Run

If on Windows, type `run` from the command prompt to start the portal and the nginx API gateway.  Wait until the portal app started, then type `run apps` to start all the apps. Alternatively, you can start them one at a time by going to an app's folder and type `run prod`.  Open the website at http://localhost:8080.  

If not on Windows, you can't use the Windows-based nginx from this repo.  Either install one for your system and copy the configuration `conf/nginx.conf`, or just run the portal and the apps in development mode below.

### Running In Dev Mode

Go the the Portal folder and type `npm i` followed by `dotnet run`.  Then go to each app's folder and do the same thing.  They will start in development mode. Open the website at http://localhost:5000.  

In development mode, authentication is disabled so you can run the app as stand-alone, and hot module reload is also enabled.  The app's port is specified in `Properties/launchsettings.json`.


================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/Properties/launchSettings.json
================================================
{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:5060/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "dev": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:5060/"
    },
    "prod": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Production"
      },
      "applicationUrl": "http://localhost:5060/"
    }
  }
}

================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/README.md
================================================
## How to run:

Start the Portal first (app requires an auth server), then execute `run.bat [dev|prod]`.


================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/ReactDashboardApp.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RootNamespace>ReactDashboardApp</RootNamespace>
  </PropertyGroup>
  <ItemGroup>
    <Folder Include="wwwroot\" />
    <Folder Include="wwwroot\dist\" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="DotNetify.Elements" Version="1.3.0" />
    <PackageReference Include="DotNetify.SignalR" Version="4.0.0" />
    <PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="3.0.0" />
    <PackageReference Include="Microsoft.Extensions.Http" Version="3.1.4" />
    <PackageReference Include="System.Reactive" Version="3.1.1" />
    <PackageReference Include="Bogus" Version="22.1.3" />    
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\Shared\Shared.csproj" />
  </ItemGroup>
    <!-- In development, the dist files won't exist on the first run or when cloning to
         a different machine, so rebuild them if not already present. -->  
  <Target Name="DebugRunWebpack" BeforeTargets="Build" Condition=" '$(Configuration)' == 'Debug' And !Exists('wwwroot\dist') ">
    <!-- Ensure Node.js is installed -->
    <Exec Command="node --version" ContinueOnError="true">
      <Output TaskParameter="ExitCode" PropertyName="ErrorCode" />
    </Exec>
    <Error Condition="'$(ErrorCode)' != '0'" Text="Node.js is required to build and run this project." />
    <!-- Build JS resources -->
    <Message Importance="high" Text="Performing first-run Webpack build..." />
    <Exec Command="npm install" />
    <Exec Command="npm run build" />
  </Target>
  <Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">
    <!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
    <Exec Command="npm install" />
    <Exec Command="npm run prod" />
    <!-- Include the newly-built files in the publish output -->
    <ItemGroup>
      <DistFiles Include="wwwroot\**" />
      <ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
        <RelativePath>%(DistFiles.Identity)</RelativePath>
        <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
      </ResolvedFileToPublish>
    </ItemGroup>
  </Target>
</Project>

================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/appsettings.json
================================================
{
  "IdentityServer": {
    "Uri": "http://localhost:5000"
  }
}

================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/client/components/ActivitiesCard.js
================================================
import React from 'react';
import styled from 'styled-components';
import { Card, Cell, Element, Panel } from 'dotnetify-elements';

const panelCss = `
   overflow-x: hidden;
   .cell { border: none; }
   .cell-body { padding: .5rem 0 }
`;

const statusColors = [ '', 'silver', 'limegreen', 'red', 'gray', 'orange' ];
const userIconColors = [ '#00ce6f', '#a95df0', '#2ea7eb' ];

const UserIcon = styled.span`
  width: 25px;
  height: 25px;
  border-radius: 50%;
  color: white;
  background: ${props => props.color};
  font-weight: bold;
  margin-right: 1rem;
  text-align: center;
`;

const StatusIcon = styled.span`
  height: 14px;
  width: 14px;
  margin-left: 1rem;
  background-color: ${props => statusColors[props.status]};
  border-radius: 50%;
  display: inline-block;
`;

const Activity = ({ person }) => {
  const initial = person.PersonName[0].toUpperCase();
  const iconColor = userIconColors[initial.charCodeAt(0) % 3];
  return (
    <Panel horizontal css={panelCss}>
      <Cell flex>
        <UserIcon color={iconColor}>{initial}</UserIcon>
        {person.PersonName}
      </Cell>
      <Cell flex right middle>
        {person.Status}
        <StatusIcon status={person.StatusId} />
      </Cell>
    </Panel>
  );
};

export default class ActivitiesCard extends Element {
  render() {
    const activities = this.value || [];
    return (
      <Card horizontal>
        <h4>Activities</h4>
        {activities.map((person, idx) => <Activity key={idx} person={person} />)}
      </Card>
    );
  }
}


================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/client/components/Dashboard.js
================================================
import React from 'react';
import { Card, Frame, Panel, VMContext, withTheme } from 'dotnetify-elements';
import { BarChart, LineChart, PieChart } from 'dotnetify-elements';
import InfoCard from './InfoCard';
import ActivitiesCard from './ActivitiesCard';

const infoPanelCss = `
   flex: 1 1 20%;
   @media (max-width: 1280px) { flex: 1 1 40%; }    
   @media (max-width: 880px) { flex: 1 1 100%; }       
`;

/* You can access the 'vm' object from VMContext by handling the 'onConnected' event. */
const handleConnected = (vm, initialState) => console.log(vm, initialState);

const Dashboard = _ => (
  <VMContext vm="Dashboard" options={{ appId: 'react-dashboard-app' }} onConnected={handleConnected}>
    <Frame css="max-width: calc(100% - 3rem)">
      <Panel horizontal wrap childProps={{ css: infoPanelCss }}>
        <Panel>
          <InfoCard id="Download" color="#1c8adb" />
        </Panel>
        <Panel>
          <InfoCard id="Upload" color="#5cb85c" />
        </Panel>
        <Panel>
          <InfoCard id="Latency" color="#f0ad4e" />
        </Panel>
        <Panel>
          <InfoCard id="Users" color="#d9534f" />
        </Panel>
      </Panel>
      <Panel>
        <Card>
          <Panel horizontal>
            <Panel flex="70%">
              <h4>Network Traffic</h4>
              <LineChart id="Traffic" height="75px" />
            </Panel>
            <Panel flex="30%">
              <h4>Utilization</h4>
              <PieChart id="Utilization" />
            </Panel>
          </Panel>
        </Card>
        <Panel horizontal>
          <Panel flex="40%">
            <ActivitiesCard flex id="RecentActivities" />
          </Panel>
          <Panel flex="60%">
            <Card flex>
              <h4>Server Usage</h4>
              <BarChart id="ServerUsage" height="70px" />
            </Card>
          </Panel>
        </Panel>
      </Panel>
    </Frame>
  </VMContext>
);

export default withTheme(Dashboard);


================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/client/components/InfoCard.js
================================================
import React from 'react';
import styled from 'styled-components';
import { Card, CardImage, Element } from 'dotnetify-elements';

const InfoIcon = styled.i.attrs(props => ({
   className: 'material-icons'
}))`
   font-size: 3rem;
   padding: 1.5rem;
   color: white;   
   background: ${props => props.color};
   opacity: .8;
`;

const cardCss = `
   .card-body { padding: .5rem 1.5rem }
   h3 { font: 600 2rem Helvetica; }
   @media (max-width: 1550px) and (min-width: 1280px) { 
      h3 { font-size: 1.25rem } 
   }    
`;

export default class InfoCard extends Element {
   render() {
      const { color, icon, label } = this.attrs;
      return (
         <Card horizontal css={cardCss}>
            <CardImage>
               <InfoIcon color={color}>{icon}</InfoIcon>
            </CardImage>
            <label>{label}</label>
            <h3>{this.value}</h3>
         </Card>
      );
   }
}


================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/client/index.js
================================================
import { createWebComponent } from 'dotnetify-elements/web-components/Core';
import Dashboard from './components/Dashboard';

const elementName = 'react-dashboard-app';
createWebComponent(Dashboard, elementName);

export default document.createElement(elementName);


================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/package.json
================================================
{
  "version": "1.0.0",
  "name": "react-dashboard-app",
  "private": true,
  "scripts": {
    "build": "webpack",
    "prod": "webpack --mode production"
  },
  "babel": {
    "presets": [
      "env",
      "react"
    ],
    "plugins": [
      "babel-plugin-styled-components",
      "babel-plugin-transform-class-properties",
      "babel-plugin-transform-object-rest-spread"
    ]
  },
  "dependencies": {
    "dotnetify": "^4.0.0",
    "dotnetify-elements": "^1.1.0",
    "react": "^16.9.0",
    "react-dom": "^16.9.0",
    "styled-components": "^4.3.2"
  },
  "devDependencies": {
    "aspnet-webpack": "~3.0.0",
    "babel-core": "~6.26.3",
    "babel-loader": "~7.1.4",
    "babel-plugin-styled-components": "~1.5.1",
    "babel-plugin-transform-class-properties": "~6.24.1",
    "babel-plugin-transform-object-rest-spread": "~6.26.0",
    "babel-preset-env": "~1.7.0",
    "babel-preset-react": "~6.24.1",
    "copy-webpack-plugin": "^5.0.4",
    "css-loader": "~0.28.11",
    "file-loader": "~1.1.11",
    "style-loader": "~0.21.0",
    "url-loader": "~1.0.1",
    "webpack": "~4.12.0",
    "webpack-bundle-analyzer": "^3.4.1",
    "webpack-cli": "~3.0.8",
    "webpack-dev-middleware": "~3.1.3",
    "webpack-hot-middleware": "~2.22.2"
  }
}


================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/run.bat
================================================
@echo off
if not exist node_modules call npm i
if "%1" == "prod" goto :prod
call npm run build
dotnet run
exit

:prod
call npm run prod
dotnet run --launch-profile prod


================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/server/Program.cs
================================================
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace ReactDashboardApp
{
   public class Program
   {
      public static void Main(string[] args)
      {
         BuildWebHost(args).Run();
      }

      public static IWebHost BuildWebHost(string[] args) =>
          WebHost.CreateDefaultBuilder(args)
              .UseStartup<Startup>()
              .Build();
   }
}

================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/server/Services/MockLiveDataService.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using Bogus;

namespace ReactDashboardApp
{
   public interface ILiveDataService
   {
      IObservable<string> Download { get; }
      IObservable<string> Upload { get; }
      IObservable<string> Latency { get; }
      IObservable<int> Users { get; }
      IObservable<int[]> Traffic { get; }
      IObservable<int[]> ServerUsage { get; }
      IObservable<int[]> Utilization { get; }
      IObservable<Activity> RecentActivity { get; }
   }

   public class Activity
   {
      private static readonly Dictionary<int, string> _activities = new Dictionary<int, string> {
            {1, "Offline"},
            {2, "Active"},
            {3, "Busy"},
            {4, "Away"},
            {5, "In a Call"}
        };

      public int Id { get; set; }
      public string PersonName { get; set; }
      public int StatusId { get; set; }
      public string Status => _activities[StatusId];
   }

   public class Customer
   {
      public int Id { get; set;}
      public string Name { get; set; }
   }

   public class MockLiveDataService : ILiveDataService
   {
      private readonly Random _random = new Random();

      public IObservable<string> Download { get; }

      public IObservable<string> Upload { get; }

      public IObservable<string> Latency { get; }

      public IObservable<int> Users { get; }

      public IObservable<int[]> Traffic { get; }

      public IObservable<int[]> ServerUsage { get; }

      public IObservable<int[]> Utilization { get; }

      public IObservable<Activity> RecentActivity { get; }

      public MockLiveDataService()
      {
         Download = Observable
            .Interval(TimeSpan.FromMilliseconds(900))
            .StartWith(0)
            .Select(_ => $"{Math.Round(_random.Next(15, 30) + _random.NextDouble(), 1)} Mb/s");

         Upload = Observable
            .Interval(TimeSpan.FromMilliseconds(800))
            .StartWith(0)
            .Select(_ => $"{Math.Round(_random.Next(5, 7) + _random.NextDouble(), 1)} Mb/s");

         Latency = Observable
            .Interval(TimeSpan.FromSeconds(1))
            .StartWith(0)
            .Select(_ => $"{_random.Next(50, 200)} ms");

         Users = Observable
            .Interval(TimeSpan.FromMilliseconds(1200))
            .StartWith(0)
            .Select(_ => _random.Next(200, 300));

         Traffic = Observable
            .Interval(TimeSpan.FromMilliseconds(600))
            .StartWith(0)
            .Select(_ => Enumerable.Range(1, 7).Select(i => _random.Next(1000, 10000)).ToArray());

         ServerUsage = Observable
            .Interval(TimeSpan.FromMilliseconds(400))
            .StartWith(0)
            .Select(_ => Enumerable.Range(1, 10).Select(i => _random.Next(1, 100)).ToArray());

         Utilization = Observable
            .Interval(TimeSpan.FromMilliseconds(800))
            .StartWith(0)
            .Select(_ => Enumerable.Range(1, 3).Select(i => _random.Next(1, 100)).ToArray());

         RecentActivity = Observable
            .Interval(TimeSpan.FromSeconds(2))
            .StartWith(0)
            .Select(_ => GetRandomCustomer())
            .Select(customer => new Activity
            {
               Id = customer.Id,
               PersonName = customer.Name,
               StatusId = _random.Next(1, 6)
            })
            .StartWith(
               Enumerable.Range(1, 4)
               .Select(_ => GetRandomCustomer())
               .Select(customer => new Activity
               {
                  Id = customer.Id,
                  PersonName = customer.Name,
                  StatusId = _random.Next(1, 6)
               })
               .ToArray()
            );
      }
      
      private Customer GetRandomCustomer() 
      {
         return new Faker<Customer>()
            .CustomInstantiator(f => new Customer { Id = f.Random.Number(0, 100) })
            .RuleFor(o => o.Name, f => f.Person.FullName)
            .Generate();
      }
   }
}


================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/server/Startup.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using DotNetify;
using DotNetify.Security;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.SpaServices.Webpack;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.IdentityModel.Tokens;
using Shared;

namespace ReactDashboardApp
{
   public class Startup
   {
      private readonly IConfiguration _config;

      public Startup(IConfiguration config)
      {
         _config = config;
      }

      public void ConfigureServices(IServiceCollection services)
      {
         services.AddCors();
         services.AddMemoryCache();
         services.AddSignalR();
         services.AddDotNetify();
         services.AddResponseCompression();

         services.AddHttpClient();
         services.AddTransient<ILiveDataService, MockLiveDataService>();
      }

      public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
      {
         app.UseCors(builder => builder
            .AllowAnyMethod()
            .AllowAnyHeader()
            .SetIsOriginAllowed(_ => true)
            .AllowCredentials());

         app.UseRouting();
         app.UseEndpoints(endpoints => endpoints.MapHub<DotNetifyHub>("/dotnetify"));
         app.UseDotNetify(config =>
         {
            if (env.IsProduction())
            {
               IEnumerable<SecurityKey> keys;
               var httpClientFactory = app.ApplicationServices.GetRequiredService<IHttpClientFactory>();
               using (var client = httpClientFactory.CreateClient())
               {
                  var identityServerSettings = _config.GetSection(IdentityServerSettings.SectionName).Get<IdentityServerSettings>();
                  keys = IdentityServerClient.GetIssuerSigningKeysAsync(client, identityServerSettings).GetAwaiter().GetResult();
               }

               // Middleware to do authenticate token in incoming request headers.
               config.UseJwtBearerAuthentication(new TokenValidationParameters
               {
                  IssuerSigningKeys = keys,
                  ValidateIssuerSigningKey = true,
                  ValidateAudience = false,
                  ValidateIssuer = false,
                  ValidateLifetime = true,
                  ClockSkew = TimeSpan.FromSeconds(0)
               });

               // Filter to check whether user has permission to access view models with [Authorize] attribute.
               config.UseFilter<AuthorizeFilter>();
            }
            else
               config.UseDeveloperLogging();
         });

         if (env.IsDevelopment())
         {
#pragma warning disable 618
            app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
            {
               HotModuleReplacement = true,
               HotModuleReplacementClientOptions = new Dictionary<string, string> { { "reload", "true" } },
            });
#pragma warning restore
         }

         app.UseResponseCompression();
         app.UseFileServer();
         app.Run(async (context) =>
         {
            using (var reader = new StreamReader(File.OpenRead("wwwroot/index.html")))
               await context.Response.WriteAsync(reader.ReadToEnd());
         });
      }
   }
}

================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/server/ViewModels/Dashboard.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using DotNetify;
using DotNetify.Elements;
using DotNetify.Routing;
using DotNetify.Security;

namespace ReactDashboardApp
{
  [Authorize]
   public class Dashboard : BaseVM, IRoutable
   {
      private IDisposable _subscription;

      public RoutingState RoutingState { get; set; } = new RoutingState();
      
      public Dashboard(ILiveDataService liveDataService)
      {
         AddProperty<string>("Download")
            .WithAttribute(new { Label = "Download", Icon = "cloud_download" })
            .SubscribeTo(liveDataService.Download);

         AddProperty<string>("Upload")
            .WithAttribute(new { Label = "Upload", Icon = "cloud_upload" })
            .SubscribeTo(liveDataService.Upload);         
         
         AddProperty<string>("Latency")
            .WithAttribute(new { Label = "Latency", Icon = "network_check" })
            .SubscribeTo(liveDataService.Latency);         

         AddProperty<int>("Users")
            .WithAttribute(new { Label = "Users", Icon = "face" })
            .SubscribeTo(liveDataService.Users);         
         
         AddProperty<int[]>("Traffic").SubscribeTo(liveDataService.Traffic);

         AddProperty<int[]>("Utilization")
            .WithAttribute(new ChartAttribute { Labels = new string[] { "Memory", "Disk", "Network" } })
            .SubscribeTo(liveDataService.Utilization);

         AddProperty<int[]>("ServerUsage").SubscribeTo(liveDataService.ServerUsage)
            .WithAttribute(new ChartAttribute { Labels = new string[] { "dns", "sql", "nethst", "w2k", "ubnt", "uat", "ftp", "smtp", "exch", "demo" } });

         AddProperty<Activity[]>("RecentActivities")
            .SubscribeTo(liveDataService.RecentActivity.Select(value =>
            {
               var activities = new Queue<Activity>(Get<Activity[]>("RecentActivities")?.Reverse() ?? new Activity[] { });
               activities.Enqueue(value);
               if (activities.Count > 4)
                  activities.Dequeue();

               return activities.Reverse().ToArray();
            }));

         // Regulate data update interval to no less than every 200 msecs.
         _subscription = Observable
            .Interval(TimeSpan.FromMilliseconds(200))
            .StartWith(0)
            .Subscribe(_ => PushUpdates());
      }

      public override void Dispose()
      {
         _subscription?.Dispose();
         base.Dispose();
      }
   }
}


================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/webpack.config.js
================================================
'use strict';

const webpack = require('webpack');
const CopyPlugin = require('copy-webpack-plugin');

module.exports = {
  mode: 'development',
  entry: {
    app: './client/index.js'
  },
  output: {
    filename: '[name].js',
    path: __dirname + '/wwwroot/dist',
    publicPath: '/dist/',
    libraryTarget: 'umd'
  },
  resolve: {
    modules: [ 'client', 'node_modules' ],
    extensions: [ '.js', '.jsx' ]
  },
  module: {
    rules: [
      { test: /\.jsx?$/, use: 'babel-loader', exclude: /node_modules/ },
      { test: /\.css$/, use: [ 'css-loader?minimize' ] },
      { test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader' }
    ]
  },
  externals: {
    dotnetify: 'dotnetify',
    'dotnetify-elements': 'dotNetifyElements',
    'styled-components': 'styled'
  },
  devtool: 'source-map',
  plugins: [
    new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /en/),
    new CopyPlugin([
      { from: 'node_modules/dotnetify/dist/dotnetify-react.min.js' },
      { from: 'node_modules/dotnetify-elements/lib/dotnetify-elements.bundle.js' },
      { from: 'node_modules/styled-components/dist/styled-components.min.js' }
    ])
  ]
};


================================================
FILE: MicrofrontendTemplate/ReactDashboardApp/wwwroot/index.html
================================================
<!DOCTYPE html>
<html>
    <head>
       <title>React Dashboard App</title>
       <meta charset="utf-8">
       <meta name="viewport" content="initial-scale=1, width=device-width"/>
       <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
       <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />
    </head>
    <body>
        <react-dashboard-app />
    
        <script src="https://unpkg.com/react@latest/umd/react.production.min.js"></script>
        <script src="https://unpkg.com/react-dom@latest/umd/react-dom.production.min.js"></script>  
        <script src="https://cdn.jsdelivr.net/npm/@aspnet/signalr@1/dist/browser/signalr.min.js"></script>

        <script src="/dist/styled-components.min.js"></script>
        <script src="/dist/dotnetify-react.min.js"></script> 
        <script src="/dist/dotnetify-elements.bundle.js"></script> 
        <script src="/dist/app.js"></script>
    </body>
</html>

================================================
FILE: MicrofrontendTemplate/ReactFormApp/Properties/launchSettings.json
================================================
{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:5070/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "dev": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:5070/"
    },
    "prod": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Production"
      },
      "applicationUrl": "http://localhost:5070/"
    }
  }
}

================================================
FILE: MicrofrontendTemplate/ReactFormApp/README.md
================================================
## How to run:

Start the Portal first (app requires an auth server), then execute `run.bat [dev|prod]`.


================================================
FILE: MicrofrontendTemplate/ReactFormApp/ReactFormApp.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RootNamespace>ReactFormApp</RootNamespace>
  </PropertyGroup>
  <ItemGroup>
    <Folder Include="wwwroot\" />
    <Folder Include="wwwroot\dist\" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="DotNetify.Elements" Version="1.3.0" />
    <PackageReference Include="DotNetify.SignalR" Version="4.0.0" />
    <PackageReference Include="Microsoft.AspNetCore.SpaServices" Version="3.0.0" />
    <PackageReference Include="Microsoft.Extensions.Http" Version="3.1.4" />
    <PackageReference Include="System.Reactive" Version="3.1.1" />
    <PackageReference Include="Bogus" Version="22.1.3" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\Shared\Shared.csproj" />
  </ItemGroup>  
    <!-- In development, the dist files won't exist on the first run or when cloning to
         a different machine, so rebuild them if not already present. -->  
  <Target Name="DebugRunWebpack" BeforeTargets="Build" Condition=" '$(Configuration)' == 'Debug' And !Exists('wwwroot\dist') ">
    <!-- Ensure Node.js is installed -->
    <Exec Command="node --version" ContinueOnError="true">
      <Output TaskParameter="ExitCode" PropertyName="ErrorCode" />
    </Exec>
    <Error Condition="'$(ErrorCode)' != '0'" Text="Node.js is required to build and run this project." />
    <!-- Build JS resources -->
    <Message Importance="high" Text="Performing first-run Webpack build..." />
    <Exec Command="npm install" />
    <Exec Command="npm run build" />
  </Target>
  <Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">
    <!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
    <Exec Command="npm install" />
    <Exec Command="npm run prod" />
    <!-- Include the newly-built files in the publish output -->
    <ItemGroup>
      <DistFiles Include="wwwroot\**" />
      <ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
        <RelativePath>%(DistFiles.Identity)</RelativePath>
        <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
      </ResolvedFileToPublish>
    </ItemGroup>
  </Target>
</Project>

================================================
FILE: MicrofrontendTemplate/ReactFormApp/appsettings.json
================================================
{
  "IdentityServer": {
    "Uri": "http://localhost:5000"
  }
}

================================================
FILE: MicrofrontendTemplate/ReactFormApp/client/components/AddressForm.js
================================================
import React from 'react';
import { Cell, DropdownList, Form, NumberField, Panel, TextField, VMContext } from 'dotnetify-elements';

const AddressForm = () => (
  <Panel>
    <Cell header="Primary Address">
      <VMContext vm="AddressForm" options={{ appId: 'react-form-app' }}>
        <Form id="Address">
          <Panel flex childProps={{ horizontal: true }}>
            <TextField id="Address1" />
            <TextField id="Address2" />
            <TextField id="City" />
            <DropdownList id="State" />
            <NumberField id="ZipCode" />
          </Panel>
        </Form>
      </VMContext>s
    </Cell>
  </Panel>
);

export default AddressForm;


================================================
FILE: MicrofrontendTemplate/ReactFormApp/client/components/BasicInfoForm.js
================================================
import React from 'react';
import { Cell, DropdownList, Form, Panel, TextField, VMContext } from 'dotnetify-elements';

const BasicInfoForm = () => (
  <Panel horizontal noGap>
    <Panel horizontal>
      <Cell header="Person" flex>
        <VMContext vm="PersonForm" options={{ appId: 'react-form-app' }}>
          <Form id="Person">
            <Panel childProps={{ horizontal: true }}>
              <TextField id="FullName" plainText />
              <DropdownList id="Prefix" />
              <TextField id="FirstName" />
              <TextField id="MiddleName" />
              <TextField id="LastName" />
              <DropdownList id="Suffix" />
            </Panel>
          </Form>
        </VMContext>
      </Cell>
      <Cell header="Phone" flex borders="top, right, bottom">
        <VMContext vm="PhoneForm" options={{ appId: 'react-form-app' }}>
          <Form id="Phone">
            <Panel childProps={{ horizontal: true }}>
              <TextField id="Work" />
              <TextField id="Home" />
              <TextField id="Mobile" />
              <DropdownList id="Primary" />
            </Panel>
          </Form>
        </VMContext>
      </Cell>
    </Panel>
  </Panel>
);

export default BasicInfoForm;


================================================
FILE: MicrofrontendTemplate/ReactFormApp/client/components/Form.js
================================================
import React from 'react';
import BasicInfoForm from './BasicInfoForm';
import AddressForm from './AddressForm';
import NewCustomerDialog from './NewCustomerDialog';
import { Button, DataGrid, Form, Frame, Panel, Tab, TabItem, VMContext, withTheme } from 'dotnetify-elements';

class CustomerForm extends React.Component {
  state = { editable: false, edit: false, openDialog: false };

  handleSelect = value => this.setState({ editable: value ? true : false });
  toggleEdit = _ => this.setState({ edit: !this.state.edit });
  toggleDialog = _ => this.setState({ openDialog: !this.state.openDialog });

  render() {
    const { editable, edit, openDialog } = this.state;
    const canEdit = editable && !edit;
    return (
      <VMContext vm="CustomerForm" options={{ appId: 'react-form-app' }}>
        <Frame css="max-width: calc(100% - 3rem)">
          <DataGrid id="Contacts" onSelect={this.handleSelect} enable={!edit} />
          <Form plainText={!edit}>
            <Panel>
              {/* Toolbar */}
              <Panel horizontal>
                <Panel horizontal>
                  <Button label="Edit" enable={canEdit} onClick={this.toggleEdit} />
                  <Button label="Update" id="Submit" submit show={edit} onClick={this.toggleEdit} />
                  <Button label="Cancel" cancel secondary show={edit} onClick={this.toggleEdit} />
                </Panel>
                <Panel horizontal right>
                  <Button label="New Customer" onClick={this.toggleDialog} enable={!edit} />
                </Panel>
              </Panel>
              {/* Edit forms */}
              <Tab margin="1.5rem 0 0 0">
                <TabItem label="Basic Info">
                  <BasicInfoForm />
                </TabItem>
                <TabItem label="Address">
                  <AddressForm />
                </TabItem>
              </Tab>
            </Panel>
          </Form>
        </Frame>
        <NewCustomerDialog open={openDialog} onClose={this.toggleDialog} />
      </VMContext>
    );
  }
}

export default withTheme(CustomerForm);


================================================
FILE: MicrofrontendTemplate/ReactFormApp/client/components/NewCustomerDialog.js
================================================
import React from 'react';
import { Button, DropdownList, Form, Modal, NumberField, Panel, Tab, TabItem, TextField, VMContext } from 'dotnetify-elements';

export default class NewCustomerDialog extends React.Component {
  state = { activeTab: 'Person' };

  handleClose = _ => this.props.onClose();
  handleSubmitError = data => this.setState({ activeTab: data.failedForms[0].formId });
  handleActivate = tab => this.setState({ activeTab: tab });

  render() {
    const { open } = this.props;
    const { activeTab } = this.state;
    return (
      <VMContext vm="NewCustomerForm" options={{ appId: 'react-form-app' }}>
        <Modal header="New Customer" open={open} large onSubmitError={this.handleSubmitError}>
          <Tab active={activeTab} onActivate={this.handleActivate}>
            <TabItem itemKey="Person" label="Person">
              <VMContext vm="PersonForm" options={{ appId: 'react-form-app' }}>
                <Form id="Person">
                  <Panel>
                    <DropdownList id="Prefix" />
                    <TextField id="FirstName" />
                    <TextField id="MiddleName" />
                    <TextField id="LastName" />
                    <DropdownList id="Suffix" />
                  </Panel>
                </Form>
              </VMContext>
            </TabItem>
            <TabItem itemKey="Phone" label="Phone">
              <VMContext vm="PhoneForm" options={{ appId: 'react-form-app' }}>
                <Form id="Phone">
                  <Panel>
                    <TextField id="Work" />
                    <TextField id="Home" />
                    <TextField id="Mobile" />
                    <DropdownList id="Primary" />
                  </Panel>
                </Form>
              </VMContext>
            </TabItem>
            <TabItem itemKey="Address" label="Address">
              <VMContext vm="AddressForm" options={{ appId: 'react-form-app' }}>
                <Form id="Address">
                  <Panel>
                    <TextField id="Address1" />
                    <TextField id="Address2" />
                    <TextField id="City" />
                    <DropdownList id="State" />
                    <NumberField id="ZipCode" />
                  </Panel>
                </Form>
              </VMContext>
            </TabItem>
          </Tab>
          <footer>
            <Panel horizontal right>
              <Button label="Cancel" cancel secondary onClick={this.handleClose} />
              <Button label="Submit" id="Submit" submit onClick={this.handleClose} />
            </Panel>
          </footer>
        </Modal>
      </VMContext>
    );
  }
}


================================================
FILE: MicrofrontendTemplate/ReactFormApp/client/index.js
================================================
import { createWebComponent } from 'dotnetify-elements/web-components/Core';
import Form from './components/Form';

const elementName = 'react-form-app';
createWebComponent(Form, elementName);

export default document.createElement(elementName);


================================================
FILE: MicrofrontendTemplate/ReactFormApp/package.json
================================================
{
  "version": "1.0.0",
  "name": "react-form-app",
  "private": true,
  "scripts": {
    "build": "webpack",
    "prod": "webpack --mode production"
  },
  "babel": {
    "presets": [
      "env",
      "react"
    ],
    "plugins": [
      "babel-plugin-styled-components",
      "babel-plugin-transform-class-properties",
      "babel-plugin-transform-object-rest-spread"
    ]
  },
  "dependencies": {
    "dotnetify": "^4.0.0",
    "dotnetify-elements": "^1.1.0",
    "react": "^16.9.0",
    "react-dom": "^16.9.0",
    "styled-components": "^4.3.2"
  },
  "devDependencies": {
    "aspnet-webpack": "~3.0.0",
    "babel-core": "~6.26.3",
    "babel-loader": "~7.1.4",
    "babel-plugin-styled-components": "~1.5.1",
    "babel-plugin-transform-class-properties": "~6.24.1",
    "babel-plugin-transform-object-rest-spread": "~6.26.0",
    "babel-preset-env": "~1.7.0",
    "babel-preset-react": "~6.24.1",
    "copy-webpack-plugin": "^5.0.4",
    "css-loader": "~0.28.11",
    "file-loader": "~1.1.11",
    "style-loader": "~0.21.0",
    "url-loader": "~1.0.1",
    "webpack": "~4.12.0",
    "webpack-bundle-analyzer": "^3.4.1",
    "webpack-cli": "~3.0.8",
    "webpack-dev-middleware": "~3.1.3",
    "webpack-hot-middleware": "~2.22.2"
  }
}


================================================
FILE: MicrofrontendTemplate/ReactFormApp/run.bat
================================================
@echo off
if not exist node_modules call npm i
if "%1" == "prod" goto :prod
call npm run build
dotnet run
exit

:prod
call npm run prod
dotnet run --launch-profile prod


================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/Program.cs
================================================
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace ReactFormApp
{
   public class Program
   {
      public static void Main(string[] args)
      {
         BuildWebHost(args).Run();
      }

      public static IWebHost BuildWebHost(string[] args) =>
          WebHost.CreateDefaultBuilder(args)
              .UseStartup<Startup>()
              .Build();
   }
}

================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/Services/Customer.cs
================================================
using System;
using System.ComponentModel;

namespace ReactFormApp
{
   #region Enums

   public enum NamePrefix
   {
      [Description("")] None,
      [Description("Mr.")] Mr,
      [Description("Mrs.")] Mrs,
      [Description("Ms.")] Ms
   }

   public enum NameSuffix
   {
      [Description("")] None,
      [Description("Jr.")] Jr,
      [Description("Sr.")] Sr,
      [Description("II")] Second,
      [Description("III")] Third,
      [Description("IV")] Fourth
   }

   public enum PrimaryPhone
   {
      [Description("")] None,
      [Description("Work")] Work,
      [Description("Home")] Home,
      [Description("Mobile")] Mobile
   }

   public enum State
   {
      [Description("")] Unknown,
      [Description("Alabama")] AL, [Description("Alaska")] AK, [Description("Arkansas")] AR, [Description("Arizona")] AZ,
      [Description("California")] CA, [Description("Colorado")] CO, [Description("Connecticut")] CT, [Description("D.C.")] DC,
      [Description("Delaware")] DE, [Description("Florida")] FL, [Description("Georgia")] GA, [Description("Hawaii")] HI,
      [Description("Iowa")] IA, [Description("Idaho")] ID, [Description("Illinois")] IL, [Description("Indiana")] IN,
      [Description("Kansas")] KS, [Description("Kentucky")] KY, [Description("Louisiana")] LA, [Description("Massachusetts")] MA,
      [Description("Maryland")] MD, [Description("Maine")] ME, [Description("Michigan")] MI, [Description("Minnesota")] MN,
      [Description("Missouri")] MO, [Description("Mississippi")] MS, [Description("Montana")] MT, [Description("North Carolina")] NC,
      [Description("North Dakota")] ND, [Description("Nebraska")] NE, [Description("New Hampshire")] NH, [Description("New Jersey")] NJ,
      [Description("New Mexico")] NM, [Description("Nevada")] NV, [Description("New York")] NY, [Description("Oklahoma")] OK,
      [Description("Ohio")] OH, [Description("Oregon")] OR, [Description("Pennsylvania")] PA, [Description("Rhode Island")] RI,
      [Description("South Carolina")] SC, [Description("South Dakota")] SD, [Description("Tennessee")] TN, [Description("Texas")] TX,
      [Description("Utah")] UT, [Description("Virginia")] VA, [Description("Vermont")] VT, [Description("Washington")] WA,
      [Description("Wisconsin")] WI, [Description("West Virginia")] WV, [Description("Wyoming")] WY
   }

   #endregion Enums

   public class Customer
   {
      public int Id { get; set; }
      public NameInfo Name { get; set; }
      public AddressInfo Address { get; set; }
      public PhoneInfo Phone { get; set; }
   }

   public class NameInfo
   {
      public NamePrefix Prefix { get; set; }
      public string FirstName { get; set; }
      public string LastName { get; set; }
      public string MiddleName { get; set; }
      public NameSuffix Suffix { get; set; }

      public string FullName => $"{FirstName} {LastName}";
   }

   public class AddressInfo
   {
      public string Address1 { get; set; }
      public string Address2 { get; set; }
      public string City { get; set; }
      public State State { get; set; }
      public string ZipCode { get; set; }

      public string StreetAddress => $"{Address1} {Address2}".TrimEnd();
   }

   public class PhoneInfo
   {
      public string Work { get; set; }
      public string Home { get; set; }
      public string Mobile { get; set; }
      public PrimaryPhone Primary { get; set; }

      public string PrimaryNumber => Primary == PrimaryPhone.Work ? Work : Primary == PrimaryPhone.Home ? Home : Mobile;
   }
}

================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/Services/CustomerFormData.cs
================================================
using System.Collections.Generic;

namespace ReactFormApp
{
   using StringDictionary = Dictionary<string, string>;

   public class CustomerFormData
   {
      public StringDictionary Person { get; set; }
      public StringDictionary Phone { get; set; }
      public StringDictionary Address { get; set; }
   }
}

================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/Services/CustomerRepository.cs
================================================
using Bogus;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Threading;

namespace ReactFormApp
{
   using StringDictionary = Dictionary<string, string>;

   public interface ICustomerRepository
   {
      IEnumerable<Customer> GetAll();

      Customer Get(int id);

      Customer Add(CustomerFormData formData);

      Customer Update(int id, CustomerFormData formData);
   }

   public class CustomerRepository : ICustomerRepository
   {
      private IList<Customer> _mockData = GenerateMockData();

      public IEnumerable<Customer> GetAll() => _mockData;

      public Customer Get(int id) => _mockData.FirstOrDefault(x => x.Id == id);

      public Customer Add(CustomerFormData formData)
      {
         var customer = new Customer
         {
            Id = _mockData.Max(x => x.Id) + 1,
            Name = new NameInfo(),
            Address = new AddressInfo(),
            Phone = new PhoneInfo()
         };

         Update(customer.Name, formData.Person);
         Update(customer.Address, formData.Address);
         Update(customer.Phone, formData.Phone);

         _mockData.Add(customer);
         return customer;
      }

      public Customer Update(int id, CustomerFormData formData)
      {
         var customer = Get(id);

         Update(customer.Name, formData.Person);
         Update(customer.Address, formData.Address);
         Update(customer.Phone, formData.Phone);
         return customer;
      }

      private void Update(object record, StringDictionary newValues)
      {
         if (newValues != null)
            foreach (var prop in record.GetType().GetProperties().Where(prop => newValues.ContainsKey(prop.Name)))
               prop.SetValue(record, TypeDescriptor.GetConverter(prop.PropertyType).ConvertFromString(newValues[prop.Name]));
      }

      private static IList<Customer> GenerateMockData()
      {
         int id = 0;
         return new Faker<Customer>()
            .CustomInstantiator(f => new Customer { Id = ++id })
            .RuleFor(o => o.Name, f => new NameInfo
            {
               FirstName = f.Person.FirstName,
               LastName = f.Person.LastName,
            })
            .RuleFor(o => o.Address, f => new AddressInfo
            {
               Address1 = f.Address.StreetAddress(),
               Address2 = f.Address.SecondaryAddress(),
               City = f.Address.City(),
               State = (State)Enum.Parse(typeof(State), f.Address.StateAbbr()),
               ZipCode = f.Address.ZipCode("#####")
            })
            .RuleFor(o => o.Phone, f => new PhoneInfo
            {
               Work = f.Phone.PhoneNumber("(###) ###-####"),
               Primary = f.PickRandomWithout(PrimaryPhone.None),
            })
            .Generate(100);
      }
   }
}

================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/Startup.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using DotNetify;
using DotNetify.Security;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.SpaServices.Webpack;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.IdentityModel.Tokens;
using Shared;

namespace ReactFormApp
{
   public class Startup
   {
      private readonly IConfiguration _config;

      public Startup(IConfiguration config)
      {
         _config = config;
      }

      public void ConfigureServices(IServiceCollection services)
      {
         services.AddCors();
         services.AddMemoryCache();
         services.AddSignalR();
         services.AddDotNetify();
         services.AddResponseCompression();

         services.AddHttpClient();
         services.AddScoped<ICustomerRepository, CustomerRepository>();
      }

      public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
      {
         app.UseCors(builder => builder
          .AllowAnyMethod()
          .AllowAnyHeader()
          .SetIsOriginAllowed(_ => true)
          .AllowCredentials());

         app.UseRouting();
         app.UseEndpoints(endpoints => endpoints.MapHub<DotNetifyHub>("/dotnetify"));
         app.UseDotNetify(config =>
         {
            if (env.IsProduction())
            {
               IEnumerable<SecurityKey> keys;
               var httpClientFactory = app.ApplicationServices.GetRequiredService<IHttpClientFactory>();
               using (var client = httpClientFactory.CreateClient())
               {
                  var identityServerSettings = _config.GetSection(IdentityServerSettings.SectionName).Get<IdentityServerSettings>();
                  keys = IdentityServerClient.GetIssuerSigningKeysAsync(client, identityServerSettings).GetAwaiter().GetResult();
               }

               // Middleware to do authenticate token in incoming request headers.
               config.UseJwtBearerAuthentication(new TokenValidationParameters
               {
                  IssuerSigningKeys = keys,
                  ValidateIssuerSigningKey = true,
                  ValidateAudience = false,
                  ValidateIssuer = false,
                  ValidateLifetime = true,
                  ClockSkew = TimeSpan.FromSeconds(0)
               });

               // Filter to check whether user has permission to access view models with [Authorize] attribute.
               config.UseFilter<AuthorizeFilter>();
            }
            else
               config.UseDeveloperLogging();
         });

         if (env.IsDevelopment())
         {
#pragma warning disable 618
            app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
            {
               HotModuleReplacement = true,
               HotModuleReplacementClientOptions = new Dictionary<string, string> { { "reload", "true" } },
            });
#pragma warning restore
         }

         app.UseResponseCompression();
         app.UseFileServer();
         app.Run(async (context) =>
         {
            using (var reader = new StreamReader(File.OpenRead("wwwroot/index.html")))
               await context.Response.WriteAsync(reader.ReadToEnd());
         });
      }
   }
}

================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/AddressForm.cs
================================================
using System.Linq;
using System.Reactive.Linq;
using DotNetify;
using DotNetify.Elements;
using DotNetify.Security;

namespace ReactFormApp
{
   [Authorize]
   public class AddressForm : BaseVM
   {
      public ReactiveProperty<Customer> Customer { get; } = new ReactiveProperty<Customer>();

      public AddressForm()
      {
         AddProperty<string>(nameof(AddressInfo.Address1))
            .WithAttribute(new TextFieldAttribute { Label = "Address 1:" })
            .SubscribeTo(Customer.Select(x => x.Address.Address1));

         AddProperty<string>(nameof(AddressInfo.Address2))
            .WithAttribute(new TextFieldAttribute { Label = "Address 2:" })
            .SubscribeTo(Customer.Select(x => x.Address.Address2));

         AddProperty<string>(nameof(AddressInfo.City))
            .WithAttribute(new TextFieldAttribute { Label = "City:" })
            .SubscribeTo(Customer.Select(x => x.Address.City));

         AddProperty<State>(nameof(AddressInfo.State))
            .WithAttribute(new DropdownListAttribute
            {
               Label = "State:",
               Options = typeof(State).ToDescriptions()
            })
            .SubscribeTo(Customer.Select(x => x.Address.State));

         AddProperty<string>(nameof(AddressInfo.ZipCode))
            .WithAttribute(new TextFieldAttribute { Label = "Zip Code:" })
            .SubscribeTo(Customer.Select(x => x.Address.ZipCode));
      }
   }
}

================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/CustomerForm.cs
================================================
using System;
using System.Linq;
using System.Reactive.Linq;
using DotNetify;
using DotNetify.Elements;
using DotNetify.Security;

namespace ReactFormApp
{
    [Authorize]
    public class CustomerForm : BaseVM
    {
        private readonly ICustomerRepository _customerRepository;
        private readonly ReactiveProperty<int> _selectedContact;

        public class Contact
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public string Phone { get; set; }
            public string Address { get; set; }
            public string City { get; set; }
            public string ZipCode { get; set; }
        }

        public CustomerForm(ICustomerRepository customerRepository)
        {
            _customerRepository = customerRepository;

            _selectedContact = AddProperty<int>("SelectedContact", 1);

            AddProperty("Contacts", customerRepository.GetAll().Select(customer => ToContact(customer)))
               .WithItemKey(nameof(Contact.Id))
               .WithAttribute(new DataGridAttribute
               {
                   RowKey = nameof(Contact.Id),
                   Columns = new DataGridColumn[] {
                  new DataGridColumn(nameof(Contact.Name), "Name") { Sortable = true },
                  new DataGridColumn(nameof(Contact.Phone), "Phone") { Sortable = true },
                  new DataGridColumn(nameof(Contact.Address), "Address") { Sortable = true },
                  new DataGridColumn(nameof(Contact.City), "City") { Sortable = true },
                  new DataGridColumn(nameof(Contact.ZipCode), "ZipCode") { Sortable = true }
                   },
                   Rows = 5
               }.CanSelect(DataGridAttribute.Selection.Single, _selectedContact));

            AddInternalProperty<CustomerFormData>("Submit")
               .SubscribedBy(AddProperty<bool>("SubmitSuccess"), formData => Save(formData));
        }

        public override void OnSubVMCreated(BaseVM subVM)
        {
            // Have sub-forms with 'Customer' property subscribe to the customer data grid's selection changed event.
            var customerPropInfo = subVM.GetType().GetProperty(nameof(Customer));
            if (typeof(ReactiveProperty<Customer>).IsAssignableFrom(customerPropInfo?.PropertyType))
                _selectedContact.SubscribedBy(
                   customerPropInfo.GetValue(subVM) as ReactiveProperty<Customer>,
                   id => _customerRepository.Get(id)
                );

            if (subVM is NewCustomerForm)
                (subVM as NewCustomerForm).NewCustomer.Subscribe(customer => UpdateContact(customer));
        }

        private bool Save(CustomerFormData formData)
        {
            var id = (int)_selectedContact.Value;
            var customer = _customerRepository.Update(id, formData);

            this.UpdateList("Contacts", ToContact(customer));
            _selectedContact.Value = id;
            return true;
        }

        private Contact ToContact(Customer customer) => new Contact
        {
            Id = customer.Id,
            Name = customer.Name.FullName,
            Address = customer.Address.StreetAddress,
            City = customer.Address.City,
            ZipCode = customer.Address.ZipCode,
            Phone = customer.Phone.PrimaryNumber
        };

        private void UpdateContact(Customer newCustomer)
        {
            this.AddList("Contacts", ToContact(newCustomer));
            _selectedContact.OnNext(newCustomer.Id);
        }
    }
}

================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/NewCustomerForm.cs
================================================
using DotNetify;
using DotNetify.Elements;
using DotNetify.Security;
using System.Linq;
using System.Reactive.Linq;

namespace ReactFormApp
{
   [Authorize]
   public class NewCustomerForm : BaseVM
   {
      private readonly ICustomerRepository _customerRepository;

      public ReactiveProperty<Customer> NewCustomer { get; } = new ReactiveProperty<Customer>();

      public NewCustomerForm(ICustomerRepository customerRepository)
      {
         _customerRepository = customerRepository;

         AddInternalProperty<CustomerFormData>("Submit")
            .SubscribedBy(NewCustomer, formData => Save(formData));
      }

      public override void Dispose()
      {
         base.Dispose();
      }

      public Customer Save(CustomerFormData formData)
      {
         return _customerRepository.Add(formData);
      }
   }
}

================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/PersonForm.cs
================================================
using System.Linq;
using System.Reactive.Linq;
using DotNetify;
using DotNetify.Elements;
using DotNetify.Security;

namespace ReactFormApp
{
   [Authorize]
   public class PersonForm : BaseVM
   {
      public ReactiveProperty<Customer> Customer { get; } = new ReactiveProperty<Customer>();

      public PersonForm()
      {
         AddProperty<string>(nameof(NameInfo.FullName))
            .WithAttribute(new TextFieldAttribute { Label = "Name:" })
            .SubscribeTo(Customer.Select(x => x.Name.FullName));

         AddProperty<NamePrefix>(nameof(NameInfo.Prefix))
            .WithAttribute(new DropdownListAttribute { Label = "Prefix:", Options = typeof(NamePrefix).ToDescriptions() })
            .SubscribeTo(Customer.Select(x => x.Name.Prefix));

         AddProperty<string>(nameof(NameInfo.FirstName))
            .WithAttribute(new TextFieldAttribute { Label = "First Name:", MaxLength = 35 })
            .WithRequiredValidation()
            .SubscribeTo(Customer.Select(x => x.Name.FirstName));

         AddProperty<string>(nameof(NameInfo.MiddleName))
            .WithAttribute(new TextFieldAttribute { Label = "Middle Name:", MaxLength = 35 })
            .SubscribeTo(Customer.Select(x => x.Name.MiddleName));

         AddProperty<string>(nameof(NameInfo.LastName))
            .WithAttribute(new TextFieldAttribute { Label = "Last Name:", MaxLength = 35 })
            .WithRequiredValidation()
            .SubscribeTo(Customer.Select(x => x.Name.LastName));

         AddProperty<NameSuffix>(nameof(NameInfo.Suffix))
            .WithAttribute(new DropdownListAttribute { Label = "Suffix:", Options = typeof(NameSuffix).ToDescriptions() })
            .SubscribeTo(Customer.Select(x => x.Name.Suffix));
      }
   }
}

================================================
FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/PhoneForm.cs
================================================
using System.Linq;
using System.Reactive.Linq;
using DotNetify;
using DotNetify.Elements;
using DotNetify.Security;

namespace ReactFormApp
{
   [Authorize]
   public class PhoneForm : BaseVM
   {
      public ReactiveProperty<Customer> Customer { get; } = new ReactiveProperty<Customer>();

      public PhoneForm()
      {
         AddProperty<string>(nameof(PhoneInfo.Work))
            .WithAttribute(new TextFieldAttribute { Label = "Work:", Mask = "(999) 999-9999" })
            .WithPatternValidation(Pattern.USPhoneNumber)
            .SubscribeTo(Customer.Select(x => x.Phone.Work));

         AddProperty<string>(nameof(PhoneInfo.Home))
            .WithAttribute(new TextFieldAttribute { Label = "Home:", Mask = "(999) 999-9999" })
            .WithPatternValidation(Pattern.USPhoneNumber)
            .SubscribeTo(Customer.Select(x => x.Phone.Home));

         AddProperty<string>(nameof(PhoneInfo.Mobile))
            .WithAttribute(new TextFieldAttribute { Label = "Mobile:", Mask = "(999) 999-9999" })
            .WithPatternValidation(Pattern.USPhoneNumber)
            .SubscribeTo(Customer.Select(x => x.Phone.Mobile));

         AddProperty<PrimaryPhone>(nameof(PhoneInfo.Primary))
            .WithAttribute(new DropdownListAttribute { Label = "Primary Phone:", Options = typeof(PrimaryPhone).ToDescriptions() })
            .SubscribeTo(Customer.Select(x => x.Phone.Primary));
      }
   }
}

================================================
FILE: MicrofrontendTemplate/ReactFormApp/webpack.config.js
================================================
'use strict';

const webpack = require('webpack');
const CopyPlugin = require('copy-webpack-plugin');

module.exports = {
  mode: 'development',
  entry: {
    app: './client/index.js'
  },
  output: {
    filename: '[name].js',
    path: __dirname + '/wwwroot/dist',
    publicPath: '/dist/',
    libraryTarget: 'umd'
  },
  resolve: {
    modules: [ 'client', 'node_modules' ],
    extensions: [ '.js', '.jsx' ]
  },
  module: {
    rules: [
      { test: /\.jsx?$/, use: 'babel-loader', exclude: /node_modules/ },
      { test: /\.css$/, use: [ 'css-loader?minimize' ] },
      { test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader' }
    ]
  },
  externals: {
    dotnetify: 'dotnetify',
    'dotnetify-elements': 'dotNetifyElements',
    'styled-components': 'styled'
  },
  devtool: 'source-map',
  plugins: [
    new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /en/),
    new CopyPlugin([
      { from: 'node_modules/dotnetify/dist/dotnetify-react.min.js' },
      { from: 'node_modules/dotnetify-elements/lib/dotnetify-elements.bundle.js' },
      { from: 'node_modules/styled-components/dist/styled-components.min.js' }
    ])
  ]
};


================================================
FILE: MicrofrontendTemplate/ReactFormApp/wwwroot/index.html
================================================
<!DOCTYPE html>
<html>
    <head>
       <title>React Form App</title>
       <meta charset="utf-8">
       <meta name="viewport" content="initial-scale=1, width=device-width"/>
       <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
       <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />
    </head>
    <body>
        <react-form-app />
    
        <script src="https://unpkg.com/react@latest/umd/react.production.min.js"></script>
        <script src="https://unpkg.com/react-dom@latest/umd/react-dom.production.min.js"></script>  
        <script src="https://cdn.jsdelivr.net/npm/@aspnet/signalr@1/dist/browser/signalr.min.js"></script>

        <script src="/dist/styled-components.min.js"></script>
        <script src="/dist/dotnetify-react.min.js"></script> 
        <script src="/dist/dotnetify-elements.bundle.js"></script> 
        <script src="/dist/app.js"></script>
    </body>
</html>

================================================
FILE: MicrofrontendTemplate/ReactTodoApp/Properties/launchSettings.json
================================================
{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:5010/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "dev": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:5010/"
    },
    "prod": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Production"
      },
      "applicationUrl": "http://localhost:5010/"
    }
  }
}

================================================
FILE: MicrofrontendTemplate/ReactTodoApp/README.md
================================================
## How to run:

Start the Portal first (app requires an auth server), then execute `run.bat [dev|prod]`.


================================================
FILE: MicrofrontendTemplate/ReactTodoApp/ReactTodoApp.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <RootNamespace>ReactTodoApp</RootNamespace>
  </PropertyGroup>
  <ItemGroup>
    <Folder Include="wwwroot\" />
    <Folder Include="wwwroot\dist\" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="DotNetify.Elements" Version="1.0.0" />
    <PackageReference Include="DotNetify.SignalR" Version="3.4.0" />
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="System.Reactive" Version="3.1.1" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\Shared\Shared.csproj" />
  </ItemGroup>
    <!-- In development, the dist files won't exist on the first run or when cloning to
         a different machine, so rebuild them if not already present. -->  
  <Target Name="DebugRunWebpack" BeforeTargets="Build" Condition=" '$(Configuration)' == 'Debug' And !Exists('wwwroot\dist') ">
    <!-- Ensure Node.js is installed -->
    <Exec Command="node --version" ContinueOnError="true">
      <Output TaskParameter="ExitCode" PropertyName="ErrorCode" />
    </Exec>
    <Error Condition="'$(ErrorCode)' != '0'" Text="Node.js is required to build and run this project." />
    <!-- Build JS resources -->
    <Message Importance="high" Text="Performing first-run Webpack build..." />
    <Exec Command="npm install" />
    <Exec Command="npm run build" />
  </Target>
  <Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">
    <!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
    <Exec Command="npm install" />
    <Exec Command="npm run prod" />
    <!-- Include the newly-built files in the publish output -->
    <ItemGroup>
      <DistFiles Include="wwwroot\**" />
      <ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
        <RelativePath>%(DistFiles.Identity)</RelativePath>
        <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
      </ResolvedFileToPublish>
    </ItemGroup>
  </Target>
</Project>

================================================
FILE: MicrofrontendTemplate/ReactTodoApp/appsettings.json
================================================
{
  "IdentityServer": {
    "Uri": "http://localhost:5000"
  }
}

================================================
FILE: MicrofrontendTemplate/ReactTodoApp/client/components/TodoList.js
================================================
import React from 'react';
import dotnetify from 'dotnetify';
import { Alert, Checkbox, Cell, Frame, Panel, TextField, withTheme } from 'dotnetify-elements';

class TodoList extends React.Component {
  constructor() {
    super();
    this.vm = dotnetify.react.connect('TodoList', this, {
      appId: 'react-todo-app',
      exceptionHandler: ex => this.setState({ error: ex })
    });
    this.state = { Todos: [], newTodo: '', editTodoId: 0, editTodo: '', error: null };
  }

  componentDidMount() {
    setTimeout(() => this.todoRef.focus());
  }

  componentWillUnmount() {
    this.vm.$destroy();
  }

  render() {
    const { Todos, ItemsLeft, newTodo, editTodoId, editTodo, error } = this.state;

    // Control the new todo and existing todo input elements.
    const typeTodo = value => this.setState({ newTodo: value });
    const typeEditTodo = value => this.setState({ editTodo: value });

    // Called when focus leaves or Enter keypress on the new todo input.
    const addTodo = (value, { changed }) => {
      if (changed) {
        this.vm.$dispatch({ Add: value });
        setTimeout(() => this.setState({ newTodo: '' }));
      }
    };

    // Called after edit's done / checkbox clicked.
    const updateTodo = todo => {
      this.vm.$dispatch({ Update: todo });
    };

    // Called when existing todo is double-clicked.
    const startEditTodo = id => {
      const todo = this.state.Todos.find(x => x.Id === id);
      this.setState({ editTodoId: id, editTodo: todo.Text });
      setTimeout(() => {
        this.editTodoRef.focus();
        this.editTodoRef.select();
      });
    };

    // Called when focus leaves or Enter keypress on the edited todo input.
    const doneEditTodo = (todo, changed) => {
      this.setState({ editTodoId: 0, editTodo: '' });
      this.todoRef.focus();
      if (changed) updateTodo(todo);
    };

    // Called when the remove icon is clicked.
    const removeTodo = id => this.vm.$dispatch({ Remove: id });

    if (error) return <h4>{error.message}</h4>;

    return (
      <Frame middle css="width: calc(100% - 3rem)">
        <h2>
          <img src="https://www.dotnetify.net/content/images/reactlogo.svg" width="35px" height="35px" />&nbsp;
          <span>Multicast Todo List</span>
        </h2>
        <Panel css="width: 50%; padding-top: 1rem">
          <TextField
            value={newTodo}
            placeholder="What do you want to do?"
            onChange={typeTodo}
            onDone={addTodo}
            onInputRef={ref => (this.todoRef = ref)}
          />
          <div>
            {Todos.map(todo => (
              <Cell key={todo.Id} css=".cell-body { padding: 0 }" tabIndex="0">
                {todo.Id !== editTodoId ? (
                  <Panel horizontal apart middle padding=".5rem">
                    <Panel onDoubleClick={_ => startEditTodo(todo.Id)}>
                      <Checkbox
                        label={todo.Text}
                        value={todo.Done}
                        onChange={val => updateTodo({ ...todo, Done: val })}
                      />
                    </Panel>
                    <i className="material-icons" style={{ cursor: 'pointer' }} onClick={_ => removeTodo(todo.Id)}>
                      cancel
                    </i>
                  </Panel>
                ) : (
                  <TextField
                    css="width: 100%"
                    value={editTodo}
                    onChange={typeEditTodo}
                    onDone={(value, { changed }) => doneEditTodo({ ...todo, Text: value }, changed)}
                    onInputRef={ref => (this.editTodoRef = ref)}
                  />
                )}
              </Cell>
            ))}
          </div>
          <Alert success={ItemsLeft === 0} warning={ItemsLeft > 0}>
            {ItemsLeft} item{ItemsLeft > 1 && 's'} left
          </Alert>
        </Panel>
      </Frame>
    );
  }
}

export default withTheme(TodoList);


================================================
FILE: MicrofrontendTemplate/ReactTodoApp/client/index.js
================================================
import { createWebComponent } from 'dotnetify-elements/web-components/Core';
import TodoList from './components/TodoList';

const elementName = 'react-todo-app';
createWebComponent(TodoList, elementName);

export default document.createElement(elementName);


================================================
FILE: MicrofrontendTemplate/ReactTodoApp/package.json
================================================
{
  "version": "1.0.0",
  "name": "react-todo-app",
  "private": true,
  "scripts": {
    "build": "webpack",
    "prod": "webpack --mode production"
  },
  "babel": {
    "presets": [
      "env",
      "react"
    ],
    "plugins": [
      "babel-plugin-styled-components",
      "babel-plugin-transform-class-properties",
      "babel-plugin-transform-object-rest-spread"
    ]
  },
  "dependencies": {
    "dotnetify": "^4.0.0",
    "dotnetify-elements": "^1.1.0",
    "react": "^16.9.0",
    "react-dom": "^16.9.0",
    "styled-components": "^4.3.2"
  },
  "devDependencies": {
    "aspnet-webpack": "~3.0.0",
    "babel-core": "~6.26.3",
    "babel-loader": "~7.1.4",
    "babel-plugin-styled-components": "~1.5.1",
    "babel-plugin-transform-class-properties": "~6.24.1",
    "babel-plugin-transform-object-rest-spread": "~6.26.0",
    "babel-preset-env": "~1.7.0",
    "babel-preset-react": "~6.24.1",
    "copy-webpack-plugin": "^5.0.4",
    "css-loader": "~0.28.11",
    "file-loader": "~1.1.11",
    "style-loader": "~0.21.0",
    "url-loader": "~1.0.1",
    "webpack": "~4.12.0",
    "webpack-bundle-analyzer": "^3.0.3",
    "webpack-cli": "~3.0.8",
    "webpack-dev-middleware": "~3.1.3",
    "webpack-hot-middleware": "~2.22.2"
  }
}


================================================
FILE: MicrofrontendTemplate/ReactTodoApp/run.bat
================================================
@echo off
if not exist node_modules call npm i
if "%1" == "prod" goto :prod
call npm run build
dotnet run
exit

:prod
call npm run prod
dotnet run --launch-profile prod


================================================
FILE: MicrofrontendTemplate/ReactTodoApp/server/Program.cs
================================================
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace ReactTodoApp
{
   public class Program
   {
      public static void Main(string[] args)
      {
         BuildWebHost(args).Run();
      }

      public static IWebHost BuildWebHost(string[] args) =>
          WebHost.CreateDefaultBuilder(args)
              .UseStartup<Startup>()
              .Build();
   }
}

================================================
FILE: MicrofrontendTemplate/ReactTodoApp/server/Startup.cs
================================================
using DotNetify;
using DotNetify.Security;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.SpaServices.Webpack;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using Shared;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;

namespace ReactTodoApp
{
   public class Startup
   {
      private readonly IConfiguration _config;

      public Startup(IConfiguration config)
      {
         _config = config;
      }

      public void ConfigureServices(IServiceCollection services)
      {
         services.AddCors();
         services.AddMemoryCache();
         services.AddSignalR();
         services.AddDotNetify();
      }

      public void Configure(IApplicationBuilder app, IHostingEnvironment env)
      {
         app.UseCors(builder => builder
               .AllowAnyMethod()
               .AllowAnyHeader()
               .AllowAnyOrigin()
               .AllowCredentials());

         app.UseWebSockets();
         app.UseSignalR(routes => routes.MapDotNetifyHub());
         app.UseDotNetify(config =>
         {
            if (env.IsProduction())
            {
               IEnumerable<SecurityKey> keys;
               using (var client = HttpClientFactory.Create())
               {
                  var identityServerSettings = _config.GetSection(IdentityServerSettings.SectionName).Get<IdentityServerSettings>();
                  keys = IdentityServerClient.GetIssuerSigningKeysAsync(client, identityServerSettings).GetAwaiter().GetResult();
               }

               // Middleware to do authenticate token in incoming request headers.
               config.UseJwtBearerAuthentication(new TokenValidationParameters
               {
                  IssuerSigningKeys = keys,
                  ValidateIssuerSigningKey = true,
                  ValidateAudience = false,
                  ValidateIssuer = false,
                  ValidateLifetime = true,
                  ClockSkew = TimeSpan.FromSeconds(0)
               });

               // Filter to check whether user has permission to access view models with [Authorize] attribute.
               config.UseFilter<AuthorizeFilter>();
            }
            else
               config.UseDeveloperLogging();
         });

         if (env.IsDevelopment())
         {
            app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
            {
               HotModuleReplacement = true,
               HotModuleReplacementClientOptions = new Dictionary<string, string> { { "reload", "true" } },
            });
         }

         app.UseFileServer();
         app.Run(async (context) =>
         {
            using (var reader = new StreamReader(File.OpenRead("wwwroot/index.html")))
               await context.Response.WriteAsync(reader.ReadToEnd());
         });
      }
   }
}

================================================
FILE: MicrofrontendTemplate/ReactTodoApp/server/ViewModels/TodoList.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using DotNetify;
using DotNetify.Security;

namespace ReactTodoApp
{
   [Authorize]
   public class TodoList : MulticastVM
   {
      private static List<Todo> _todos = new List<Todo>();
      
      public class Todo
      {
         public int Id { get; set; }
         public string Text { get; set; }
         public bool Done { get; set; }
      }

      public List<Todo> Todos => _todos;

      public string Todos_itemKey => nameof(Todo.Id);

      public int ItemsLeft => Todos.Count(x => !x.Done);

      public Action<string> Add => text =>
      {
         var todo = new Todo { Id = text.GetHashCode(), Text = text };
         if(!Todos.Any(x => x.Id == todo.Id))
         {
            Todos.Add(todo);
            this.AddList(nameof(Todos), todo);
            Changed(nameof(ItemsLeft));
         }
      };

      public Action<Todo> Update => update =>
      {
         var todo = Todos.Find(x => x.Id == update.Id);
         if(todo != null)
         {
            if(string.IsNullOrWhiteSpace(update.Text))
               Remove(update.Id);
            else
            {
               todo.Text = update.Text;
               todo.Done = update.Done;
               this.UpdateList(nameof(Todos), todo);
               Changed(nameof(ItemsLeft));
            }
         }
      };

      public Action<int> Remove => id =>
      {
         var todo = Todos.Find(x => x.Id == id);
         if(todo != null)
         {
            Todos.Remove(todo);
            this.RemoveList(nameof(Todos), id);
            Changed(nameof(ItemsLeft));
         }
      };
   }
}

================================================
FILE: MicrofrontendTemplate/ReactTodoApp/webpack.config.js
================================================
'use strict';

const webpack = require('webpack');
const CopyPlugin = require('copy-webpack-plugin');

module.exports = {
  mode: 'development',
  entry: {
    app: './client/index.js'
  },
  output: {
    filename: '[name].js',
    path: __dirname + '/wwwroot/dist',
    publicPath: '/dist/',
    libraryTarget: 'umd'
  },
  resolve: {
    modules: [ 'client', 'node_modules' ],
    extensions: [ '.js', '.jsx' ]
  },
  module: {
    rules: [
      { test: /\.jsx?$/, use: 'babel-loader', exclude: /node_modules/ },
      { test: /\.css$/, use: [ 'css-loader?minimize' ] },
      { test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader' }
    ]
  },
  externals: {
    dotnetify: 'dotnetify',
    'dotnetify-elements': 'dotNetifyElements',
    'styled-components': 'styled'
  },
  devtool: 'source-map',
  plugins: [
    new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /en/),
    new CopyPlugin([
      { from: 'node_modules/dotnetify/dist/dotnetify-react.min.js' },
      { from: 'node_modules/dotnetify-elements/lib/basic-elements.bundle.js' },
      { from: 'node_modules/styled-components/dist/styled-components.min.js' }
    ])
  ]
};


================================================
FILE: MicrofrontendTemplate/ReactTodoApp/wwwroot/index.html
================================================
<!DOCTYPE html>
<html>
    <head>
       <title>ReactTodoApp</title>
       <meta charset="utf-8">
       <meta name="viewport" content="initial-scale=1, width=device-width"/>
       <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
       <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />
    </head>
    <body style="height: 100vh">
        <react-todo-app />

        <!-- Polyfills for IE 11 -->
        <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.26.0/polyfill.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/2.2.10/webcomponents-bundle.js"></script>        
        
        <script src="https://unpkg.com/react@latest/umd/react.development.js"></script>
        <script src="https://unpkg.com/react-dom@latest/umd/react-dom.development.js"></script>  
        <script src="https://cdn.jsdelivr.net/npm/@aspnet/signalr@1/dist/browser/signalr.min.js"></script>

        <script src="/dist/styled-components.min.js"></script>
        <script src="/dist/dotnetify-react.min.js"></script> 
        <script src="/dist/basic-elements.bundle.js"></script> 
        <script src="/dist/app.js"></script>
    </body>
</html>

================================================
FILE: MicrofrontendTemplate/Shared/IdentityServer/IdentityServerClient.cs
================================================
using IdentityModel;
using IdentityModel.Client;
using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Security.Cryptography;
using System.Threading.Tasks;

namespace Shared
{
   public class IdentityServerClient
   {
      public static async Task<TokenResponse> RequestClientCredentialsTokenAsync(HttpClient client, IdentityServerSettings settings)
      {
         var disco = await client.GetDiscoveryDocumentAsync(settings.Uri);
         return await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
         {
            Address = disco.TokenEndpoint,
            ClientId = IdentityServerConfig.MyClientId,
            ClientSecret = IdentityServerConfig.MyClientSecret,
            Scope = IdentityServerConfig.MyApiResource
         });
      }

      public static async Task<IntrospectionResponse> IntrospectTokenAsync(HttpClient client, IdentityServerSettings settings, string token)
      {
         var disco = await client.GetDiscoveryDocumentAsync(settings.Uri);
         return await client.IntrospectTokenAsync(new TokenIntrospectionRequest
         {
            Address = disco.IntrospectionEndpoint,
            Token = token,
            ClientId = IdentityServerConfig.MyApiResource,
            ClientSecret = IdentityServerConfig.MyClientSecret
         });
      }

      public static async Task<IEnumerable<SecurityKey>> GetIssuerSigningKeysAsync(HttpClient client, IdentityServerSettings settings)
      {
         var disco = await client.GetDiscoveryDocumentAsync(settings.Uri);
         if(disco?.KeySet == null)
            throw new Exception("Failed to get signing keys. Make sure the Portal is running.");

         var keys = new List<SecurityKey>();
         foreach(var webKey in disco.KeySet.Keys)
         {
            var key = new RsaSecurityKey(new RSAParameters
            {
               Exponent = Base64Url.Decode(webKey.E),
               Modulus = Base64Url.Decode(webKey.N)
            });

            key.KeyId = webKey.Kid;
            keys.Add(key);
         }

         return keys;
      }
   }
}

================================================
FILE: MicrofrontendTemplate/Shared/IdentityServer/IdentityServerConfig.cs
================================================
using System.Collections.Generic;
using IdentityServer4.Models;

namespace Shared
{
   public class IdentityServerConfig
   {
      public static readonly string MyClientId = "dotNetifyDemo";
      public static readonly string MyClientSecret = "secret";
      public static readonly string MyApiResource = "demo";

      public static IEnumerable<Client> GetClients()
      {
         return new List<Client>
            {
                new Client
                {
                    ClientId = MyClientId,
                    AllowedGrantTypes = GrantTypes.ClientCredentials,
                    ClientSecrets = { new Secret(MyClientSecret.Sha256()) },
                    AllowedScopes = { MyApiResource }
                }
            };
      }

      public static IEnumerable<ApiResource> GetApiResources()
      {
         return new List<ApiResource>
         {
            new ApiResource(MyApiResource, "DotNetify Demo") { ApiSecrets = { new Secret(MyClientSecret.Sha256()) } }
         };
      }
   }
}

================================================
FILE: MicrofrontendTemplate/Shared/IdentityServer/IdentityServerSettings.cs
================================================
namespace Shared
{
   public class IdentityServerSettings
   {
      public static readonly string SectionName = "IdentityServer";

      public string Uri { get; set; }
   }
}

================================================
FILE: MicrofrontendTemplate/Shared/Shared.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="IdentityServer4" Version="2.5.3" />
    <PackageReference Include="IdentityServer4.AccessTokenValidation" Version="2.7.0" />
  </ItemGroup>

</Project>


================================================
FILE: MicrofrontendTemplate/VueTodoApp/Properties/launchSettings.json
================================================
{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:5020/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "dev": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:5020/"
    },
    "prod": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Production"
      },
      "applicationUrl": "http://localhost:5020/"
    }
  }
}

================================================
FILE: MicrofrontendTemplate/VueTodoApp/README.md
================================================
## How to run:

Start the Portal first (app requires an auth server), then execute `run.bat [dev|prod]`.


================================================
FILE: MicrofrontendTemplate/VueTodoApp/VueTodoApp.csproj
================================================
<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <RootNamespace>VueTodoApp</RootNamespace>
  </PropertyGroup>
  <ItemGroup>
    <Folder Include="wwwroot\" />
    <Folder Include="wwwroot\dist\" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="DotNetify.Elements" Version="1.0.0" />
    <PackageReference Include="DotNetify.SignalR" Version="4.0.0" />
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="System.Reactive" Version="3.1.1" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\Shared\Shared.csproj" />
  </ItemGroup>
    <!-- In development, the dist files won't exist on the first run or when cloning to
         a different machine, so rebuild them if not already present. -->  
  <Target Name="DebugRunWebpack" BeforeTargets="Build" Condition=" '$(Configuration)' == 'Debug' And !Exists('wwwroot\dist') ">
    <!-- Ensure Node.js is installed -->
    <Exec Command="node --version" ContinueOnError="true">
      <Output TaskParameter="ExitCode" PropertyName="ErrorCode" />
    </Exec>
    <Error Condition="'$(ErrorCode)' != '0'" Text="Node.js is required to build and run this project." />
    <!-- Build JS resources -->
    <Message Importance="high" Text="Performing first-run Webpack build..." />
    <Exec Command="npm install" />
    <Exec Command="npm run build" />
  </Target>
  <Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">
    <!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
    <Exec Command="npm install" />
    <Exec Command="npm run prod" />
    <!-- Include the newly-built files in the publish output -->
    <ItemGroup>
      <DistFiles Include="wwwroot\**" />
      <ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
        <RelativePath>%(DistFiles.Identity)</RelativePath>
        <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
      </ResolvedFileToPublish>
    </ItemGroup>
  </Target>
</Project>

================================================
FILE: MicrofrontendTemplate/VueTodoApp/appsettings.json
================================================
{
  "IdentityServer": {
    "Uri": "http://localhost:5000"
  }
}

================================================
FILE: MicrofrontendTemplate/VueTodoApp/client/components/TodoList.vue
================================================
<template>
  <h4 v-if="error">{{error.message}}</h4>
  <d-frame v-else middle="true" css="width: calc(100% - 3rem)">
    <h2>
      <img src="https://www.dotnetify.net/content/images/vuelogo.png" width="45px" height="45px" />
      <span>Multicast Todo List</span>
    </h2>

    <d-panel css="width: 50%; padding-top: 1rem">
      <d-text-field
        placeholder="What do you want to do?"
        @onDone="addTodo"
        @onInputRef="setTodoRef($event)"
      />
      <div>
        <d-panel
          v-for="todo in Todos"
          :key="todo.Id"
          css="padding: 0; border: 1px solid #ddd"
          tabindex="0"
        >
          <d-panel
            v-if="todo.Id !== editTodoId"
            horizontal="true"
            apart="true"
            middle="true"
            padding=".5rem"
          >
            <d-panel @dblclick="startEditTodo(todo)">
              <d-checkbox :label="todo.Text" :value="todo.Done" @click="toggleTodo($event, todo)" />
            </d-panel>
            <i class="material-icons" style="cursor: pointer" @click="removeTodo(todo.Id)">cancel</i>
          </d-panel>
          <d-text-field
            v-else
            @onDone="doneEditTodo($event, todo)"
            @onInputRef="setEditTodoRef($event, todo)"
            css="width: 100%"
          />
        </d-panel>
      </div>
      <d-alert :success="noItemLeft" :warning="hasItems" :text="itemsLeft" css="p { margin: 0 }"></d-alert>
    </d-panel>
  </d-frame>
</template>

<script>
import dotnetify from 'dotnetify/vue';

export default {
  created() {
    this.vm = dotnetify.vue.connect("TodoList", this, { appId: 'vue-todo-app', exceptionHandler: ex => this.error = ex });
  },
  destroyed() {
    this.vm.$destroy();
  },
  data() {
    return {
      Todos: [],
      ItemsLeft: 0,
      editTodoId: 0,
      error: null
    }
  },
  computed: {
    hasItems() { return `${this.ItemsLeft > 0}` },
    noItemLeft() { return `${this.ItemsLeft === 0}` },
    itemsLeft() { return `${this.ItemsLeft} item${this.ItemsLeft > 1 ? 's' : ''} left` }
  },
  methods: {
    // Called when focus leaves or Enter keypress on the new todo input.
    addTodo(e) {
      const [value, { changed }] = e.detail;
      if (changed) {
        this.vm.$dispatch({ Add: value });

        setTimeout(() => {
          this.todoRef.value = '';
          this.todoRef.focus();
        })
      }
    },

    // Called when existing todo is double-clicked.
    startEditTodo(todo) {
      this.editTodoId = todo.Id
    },

    // Called when focus leaves or Enter keypress on the edited todo input.
    doneEditTodo(e, todo) {
      const [value, { changed }] = e.detail;
      if (changed && todo.Text !== value) {
        todo.Text = value;
        this.updateTodo(todo);
      }
      this.editTodoId = 0;
      this.todoRef.focus();
    },

    toggleTodo(e, todo) {
      e.preventDefault();
      todo.Done = !todo.Done;
      this.updateTodo(todo);
    },

    // Called after edit's done / checkbox clicked.
    updateTodo(todo) {
      this.vm.$dispatch({ Update: { Id: todo.Id, Text: todo.Text, Done: todo.Done } });
    },

    // Called when the remove icon is clicked.
    removeTodo(id) {
      this.vm.$dispatch({ Remove: id });
    },

    // Called when the todo input element ref is received.
    setTodoRef(e) {
      const [ref] = e.detail;
      if (this.todoRef !== ref) {
        this.todoRef = ref;
        this.todoRef.focus();
      }
    },

    // Called when the edit todo input element ref is received.
    setEditTodoRef(e, todo) {
      const [ref] = e.detail;
      if (this.editTodoRef !== ref) {
        this.editTodoRef = ref;
        this.editTodoRef.value = todo.Text;
        this.editTodoRef.focus();
        this.editTodoRef.select();
      }
    }
  }
}
</script>

================================================
FILE: MicrofrontendTemplate/VueTodoApp/client/index.js
================================================
import Vue from 'vue';
import vueCustomElement from 'vue-custom-element';
import TodoList from './components/TodoList.vue';

const elementName = 'vue-todo-app';

Vue.use(vueCustomElement);
Vue.customElement(elementName, TodoList, {
  shadow: false, // Don't use shadow-DOM so global css can affect the inner Vue component.
  destroyTimeout: 1 // Immediately destroy the Vue component when the custom element is detached.
});

export default document.createElement(elementName);


================================================
FILE: MicrofrontendTemplate/VueTodoApp/package.json
================================================
{
  "version": "1.0.0",
  "name": "vue-todo-app",
  "private": true,
  "scripts": {
    "build": "webpack",
    "prod": "webpack --mode production"
  },
  "dependencies": {
    "dotnetify": "^4.0.0",
    "dotnetify-elements": "^1.1.0",
    "vue": "^2.5.22",
    "vue-custom-element": "^3.2.9"
  },
  "devDependencies": {
    "aspnet-webpack": "~3.0.0",
    "babel-core": "~6.26.3",
    "babel-loader": "~7.1.4",
    "babel-preset-env": "~1.7.0",
    "copy-webpack-plugin": "^5.0.4",
    "css-loader": "^3.2.0",
    "node-sass": "~4.9.4",
    "sass-loader": "~7.1.0",
    "url-loader": "~1.0.1",
    "vue-loader": "^15.4.2",
    "vue-template-compiler": "^2.5.22",
    "webpack": "~4.12.0",
    "webpack-bundle-analyzer": "^3.0.3",
    "webpack-cli": "~3.0.8",
    "webpack-dev-middleware": "~3.1.3",
    "webpack-hot-middleware": "~2.22.2"
  }
}


================================================
FILE: MicrofrontendTemplate/VueTodoApp/run.bat
================================================
@echo off
if not exist node_modules call npm i
if "%1" == "prod" goto :prod
call npm run build
dotnet run
exit

:prod
call npm run prod
dotnet run --launch-profile prod


================================================
FILE: MicrofrontendTemplate/VueTodoApp/server/Program.cs
================================================
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace VueTodoApp
{
   public class Program
   {
      public static void Main(string[] args)
      {
         BuildWebHost(args).Run();
      }

      public static IWebHost BuildWebHost(string[] args) =>
          WebHost.CreateDefaultBuilder(args)
              .UseStartup<Startup>()
              .Build();
   }
}

================================================
FILE: MicrofrontendTemplate/VueTodoApp/server/Startup.cs
================================================
using DotNetify;
using DotNetify.Security;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.SpaServices.Webpack;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using Shared;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;

namespace VueTodoApp
{
   public class Startup
   {
      private readonly IConfiguration _config;

      public Startup(IConfiguration config)
      {
         _config = config;
      }

      public void ConfigureServices(IServiceCollection services)
      {
         services.AddCors();
         services.AddMemoryCache();
         services.AddSignalR();
         services.AddDotNetify();
      }

      public void Configure(IApplicationBuilder app, IHostingEnvironment env)
      {
         app.UseCors(builder => builder
            .AllowAnyMethod()
            .AllowAnyHeader()
            .AllowAnyOrigin()
            .AllowCredentials());

         app.UseWebSockets();
         app.UseSignalR(routes => routes.MapDotNetifyHub());
         app.UseDotNetify(config =>
         {
            if (env.IsProduction())
            {
               IEnumerable<SecurityKey> keys;
               using (var client = HttpClientFactory.Create())
               {
                  var identityServerSettings = _config.GetSection(IdentityServerSettings.SectionName).Get<IdentityServerSettings>();
                  keys = IdentityServerClient.GetIssuerSigningKeysAsync(client, identityServerSettings).GetAwaiter().GetResult();
               }

               // Middleware to do authenticate token in incoming request headers.
               config.UseJwtBearerAuthentication(new TokenValidationParameters
               {
                  IssuerSigningKeys = keys,
                  ValidateIssuerSigningKey = true,
                  ValidateAudience = false,
                  ValidateIssuer = false,
                  ValidateLifetime = true,
                  ClockSkew = TimeSpan.FromSeconds(0)
               });

               // Filter to check whether user has permission to access view models with [Authorize] attribute.
               config.UseFilter<AuthorizeFilter>();
            }
            else
               config.UseDeveloperLogging();
         });

         if (env.IsDevelopment())
         {
            app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
            {
               HotModuleReplacement = true,
               HotModuleReplacementClientOptions = new Dictionary<string, string> { { "reload", "true" } },
            });
         }

         app.UseFileServer();
         app.Run(async (context) =>
         {
            using (var reader = new StreamReader(File.OpenRead("wwwroot/index.html")))
               await context.Response.WriteAsync(reader.ReadToEnd());
         });
      }
   }
}

================================================
FILE: MicrofrontendTemplate/VueTodoApp/server/ViewModels/TodoList.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Linq;
using DotNetify;
using DotNetify.Security;

namespace VueTodoApp
{
   [Authorize]
   public class TodoList : MulticastVM
   {
      private static List<Todo> _todos = new List<Todo>();

      public class Todo
      {
         public int Id { get; set; }
         public string Text { get; set; }
         public bool Done { get; set; }
      }

      public List<Todo> Todos => _todos;

      public string Todos_itemKey => nameof(Todo.Id);

      public int ItemsLeft => Todos.Count(x => !x.Done);

      public Action<string> Add => text =>
      {
         var todo = new Todo { Id = text.GetHashCode(), Text = text };
         if (!Todos.Any(x => x.Id == todo.Id))
         {
            Todos.Add(todo);
            this.AddList(nameof(Todos), todo);
            Changed(nameof(ItemsLeft));
         }
      };

      public Action<Todo> Update => update =>
      {
         var todo = Todos.Find(x => x.Id == update.Id);
         if (todo != null)
         {
            if (string.IsNullOrWhiteSpace(update.Text))
               Remove(update.Id);
            else
            {
               todo.Text = update.Text;
               todo.Done = update.Done;
               this.UpdateList(nameof(Todos), todo);
               Changed(nameof(ItemsLeft));
            }
         }
      };

      public Action<int> Remove => id =>
      {
         var todo = Todos.Find(x => x.Id == id);
         if (todo != null)
         {
            Todos.Remove(todo);
            this.RemoveList(nameof(Todos), id);
            Changed(nameof(ItemsLeft));
         }
      };
   }
}

================================================
FILE: MicrofrontendTemplate/VueTodoApp/webpack.config.js
================================================
'use strict';

const webpack = require('webpack');
const CopyPlugin = require('copy-webpack-plugin');
const { VueLoaderPlugin } = require('vue-loader');

module.exports = {
  mode: 'development',
  entry: {
    app: './client/index.js'
  },
  output: {
    filename: '[name].js',
    path: __dirname + '/wwwroot/dist',
    publicPath: '/dist/',
    libraryTarget: 'umd'
  },
  resolve: {
    modules: [ 'client', 'node_modules' ],
    alias: { vue$: 'vue/dist/vue.esm.js' }
  },
  module: {
    rules: [
      { test: /\.vue$/, use: 'vue-loader' },
      { test: /\.js?$/, loader: 'babel-loader', query: { presets: [ 'env' ] } },
      { test: /\.scss$/, use: [ 'vue-style-loader', 'css-loader', 'sass-loader' ] },
      { test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader' }
    ]
  },
  externals: {
    'dotnetify-elements': 'dotNetifyElements'
  },
  devtool: 'source-map',
  plugins: [
    new VueLoaderPlugin(),
    new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /en/),
    new CopyPlugin([
      { from: 'node_modules/dotnetify/dist/dotnetify-vue.min.js' },
      { from: 'node_modules/dotnetify-elements/lib/basic-web-components.bundle.js' }
    ])
  ]
};


================================================
FILE: MicrofrontendTemplate/VueTodoApp/wwwroot/index.html
================================================
<!DOCTYPE html>
<html>
    <head>
       <title>VueTodoApp</title>
       <meta charset="utf-8">
       <meta name="viewport" content="initial-scale=1, width=device-width"/>
       <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
       <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" />
    </head>
    <body style="height: 100vh">
        <vue-todo-app></vue-todo-app>
    
        <script src="https://cdn.jsdelivr.net/npm/vue"></script>
        <script src="https://unpkg.com/react@latest/umd/react.production.min.js"></script>
        <script src="https://unpkg.com/react-dom@latest/umd/react-dom.production.min.js"></script>  
        <script src="https://cdnjs.cloudflare.com/ajax/libs/styled-components/4.3.2/styled-components.min.js"></script>        
        <script src="https://cdn.jsdelivr.net/npm/@aspnet/signalr@1/dist/browser/signalr.min.js"></script>

        <script src="/dist/dotnetify-vue.min.js"></script> 
        <script src="/dist/basic-web-components.bundle.js"></script> 
        <script src="/dist/app.js"></script>
    </body>
</html>

================================================
FILE: MicrofrontendTemplate/global.json
================================================
{
  "sdk": {
    "version": "3.1.201"
  }
}


================================================
FILE: MicrofrontendTemplate/heroku-deploy/Portal/Dockerfile
================================================
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
LABEL stage=build
WORKDIR /src
COPY ./__tmp__ .

# Install node.js
RUN apt-get update -yq \
    && apt-get install curl gnupg -yq \
    && curl -sL https://deb.nodesource.com/setup_12.x | bash \
    && apt-get install nodejs -yq
    
RUN dotnet publish ./Portal/Portal.csproj -c Release -o /app

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build /app .
ARG aspnetenv=Production

ENV ASPNETCORE_ENVIRONMENT ${aspnetenv}
CMD ASPNETCORE_URLS=http://*:$PORT dotnet Portal.dll

================================================
FILE: MicrofrontendTemplate/heroku-deploy/Portal/appsettings.json
================================================
{
  "IdentityServer": {
    "Uri": "http://dotnetify-mfe.herokuapp.com"
  }
}


================================================
FILE: MicrofrontendTemplate/heroku-deploy/Portal/build.bat
================================================
@echo off
set env=Production
if "%1"=="" goto :next
set env=%1
:next

echo --- Copy source code
xcopy ..\..\Portal\*.* .\__tmp__\Portal\ /q /s /e /d /y /exclude:excludedfiles.txt
xcopy ..\..\Shared\*.* .\__tmp__\Shared\ /q /s /e /d /y /exclude:excludedfiles.txt

echo --- Remove any existing image
docker rmi portal -f

echo --- Build a new image
docker build -t portal -f ./Dockerfile . --build-arg aspnetenv=%env%

echo --- Remove build images
docker image prune -f --filter label=stage=build
rd __tmp__ /q /s

echo --- Run a container on port 5000
docker run -it --rm -p:5000:80 --name portal_5000 portal

================================================
FILE: MicrofrontendTemplate/heroku-deploy/Portal/deploy.bat
================================================
@echo off

echo --- Copy source code
xcopy ..\..\Portal\*.* .\__tmp__\Portal\ /q /s /e /d /y /exclude:excludedfiles.txt
xcopy ..\..\Shared\*.* .\__tmp__\Shared\ /q /s /e /d /y /exclude:excludedfiles.txt

xcopy appsettings.json .\__tmp__\Portal\ /q /y

call heroku container:push web -a dotnetify-portal
call heroku container:release web -a dotnetify-portal

rd __tmp__ /q /s


================================================
FILE: MicrofrontendTemplate/heroku-deploy/Portal/excludedfiles.txt
================================================
.vssscc
.vspscc
.log
.user
\obj\
\bin\
\Properties\
\node_modules\
\coverage\
\wwwroot\dist\

================================================
FILE: MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/Dockerfile
================================================
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
LABEL stage=build
WORKDIR /src
COPY ./__tmp__ .

# Install node.js
RUN apt-get update -yq \
    && apt-get install curl gnupg -yq \
    && curl -sL https://deb.nodesource.com/setup_12.x | bash \
    && apt-get install nodejs -yq
    
RUN dotnet publish ./ReactDashboardApp/ReactDashboardApp.csproj -c Release -o /app

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build /app .
ARG aspnetenv=Production

ENV ASPNETCORE_ENVIRONMENT ${aspnetenv}
CMD ASPNETCORE_URLS=http://*:$PORT dotnet ReactDashboardApp.dll

================================================
FILE: MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/appsettings.json
================================================
{
  "IdentityServer": {
    "Uri": "http://dotnetify-mfe.herokuapp.com"
  }
}


================================================
FILE: MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/build.bat
================================================
@echo off
set env=Production
if "%1"=="" goto :next
set env=%1
:next

echo --- Copy source code
xcopy ..\..\ReactDashboardApp\*.* .\__tmp__\ReactDashboardApp\ /q /s /e /d /y /exclude:excludedfiles.txt
xcopy ..\..\Shared\*.* .\__tmp__\Shared\ /q /s /e /d /y /exclude:excludedfiles.txt

echo --- Remove any existing image
docker rmi dashboard -f

echo --- Build a new image
docker build -t portal -f ./Dockerfile . --build-arg aspnetenv=%env%

echo --- Remove build images
docker image prune -f --filter label=stage=build
rd __tmp__ /q /s

echo --- Run a container on port 5060
docker run -it --rm -p:5060:80 --name dashboard_5060 dashboard

================================================
FILE: MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/deploy.bat
================================================
@echo off

echo --- Copy source code
xcopy ..\..\ReactDashboardApp\*.* .\__tmp__\ReactDashboardApp\ /q /s /e /d /y /exclude:excludedfiles.txt
xcopy ..\..\Shared\*.* .\__tmp__\Shared\ /q /s /e /d /y /exclude:excludedfiles.txt

xcopy appsettings.json .\__tmp__\ReactDashboardApp\ /q /y

call heroku container:push web -a dotnetify-dashboard
call heroku container:release web -a dotnetify-dashboard

rd __tmp__ /q /s


================================================
FILE: MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/excludedfiles.txt
================================================
.vssscc
.vspscc
.log
.user
\obj\
\bin\
\Properties\
\node_modules\
\coverage\
\wwwroot\dist\

================================================
FILE: MicrofrontendTemplate/heroku-deploy/nginx/Dockerfile
================================================
FROM nginx:alpine
COPY ./nginx.conf /etc/nginx
CMD sed -i -e 's/$PORT/'"$PORT"'/g' /etc/nginx/nginx.conf && nginx -g 'daemon off;'

================================================
FILE: MicrofrontendTemplate/heroku-deploy/nginx/deploy.bat
================================================
@echo off

call heroku container:push web -a dotnetify-mfe
call heroku container:release web -a dotnetify-mfe



================================================
FILE: MicrofrontendTemplate/heroku-deploy/nginx/nginx.conf
================================================

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    server {
        listen        $PORT;
        server_name   localhost;

        location / {
          proxy_pass http://dotnetify-portal.herokuapp.com;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection $http_connection;
          proxy_set_header Host dotnetify-portal.herokuapp.com;
          proxy_cache_bypass $http_upgrade;
        }

        location /app1 {
          rewrite ^/app1/(.*) /$1 break;
          proxy_pass http://dotnetify-dashboard.herokuapp.com;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection $http_connection;
          proxy_set_header Host dotnetify-dashboard.herokuapp.com;
          proxy_cache_bypass $http_upgrade;          
        }

    #     location /app2 {
    #       rewrite ^/app2/(.*) /$1 break;
    #       proxy_pass http://hostip:5070;
    #       proxy_http_version 1.1;
    #       proxy_set_header Upgrade $http_upgrade;
    #       proxy_set_header Connection $http_connection;
    #       proxy_set_header Host $host;
    #       proxy_cache_bypass $http_upgrade;          
    #     }

    #     location /app3 {
    #       rewrite ^/app3/(.*) /$1 break;
    #       proxy_pass http://hostip:5010;
    #       proxy_http_version 1.1;
    #       proxy_set_header Upgrade $http_upgrade;
    #       proxy_set_header Connection $http_connection;
    #       proxy_set_header Host $host;
    #       proxy_cache_bypass $http_upgrade;          
    #     }

    #     location /app4 {
    #       rewrite ^/app4/(.*) /$1 break;
    #       proxy_pass http://hostip:5020;
    #       proxy_http_version 1.1;
    #       proxy_set_header Upgrade $http_upgrade;
    #       proxy_set_header Connection $http_connection;
    #       proxy_set_header Host $host;
    #       proxy_cache_bypass $http_upgrade;          
    #     }
    }
}


================================================
FILE: MicrofrontendTemplate/nginx/.gitignore
================================================
logs

================================================
FILE: MicrofrontendTemplate/nginx/conf/fastcgi.conf
================================================

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;


================================================
FILE: MicrofrontendTemplate/nginx/conf/fastcgi_params
================================================

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;


================================================
FILE: MicrofrontendTemplate/nginx/conf/koi-utf
================================================

# This map is not a full koi8-r <> utf8 map: it does not contain
# box-drawing and some other characters.  Besides this map contains
# several koi8-u and Byelorussian letters which are not in koi8-r.
# If you need a full and standard map, use contrib/unicode2nginx/koi-utf
# map instead.

charset_map  koi8-r  utf-8 {

    80  E282AC ; # euro

    95  E280A2 ; # bullet

    9A  C2A0 ;   # &nbsp;

    9E  C2B7 ;   # &middot;

    A3  D191 ;   # small yo
    A4  D194 ;   # small Ukrainian ye

    A6  D196 ;   # small Ukrainian i
    A7  D197 ;   # small Ukrainian yi

    AD  D291 ;   # small Ukrainian soft g
    AE  D19E ;   # small Byelorussian short u

    B0  C2B0 ;   # &deg;

    B3  D081 ;   # capital YO
    B4  D084 ;   # capital Ukrainian YE

    B6  D086 ;   # capital Ukrainian I
    B7  D087 ;   # capital Ukrainian YI

    B9  E28496 ; # numero sign

    BD  D290 ;   # capital Ukrainian soft G
    BE  D18E ;   # capital Byelorussian short U

    BF  C2A9 ;   # (C)

    C0  D18E ;   # small yu
    C1  D0B0 ;   # small a
    C2  D0B1 ;   # small b
    C3  D186 ;   # small ts
    C4  D0B4 ;   # small d
    C5  D0B5 ;   # small ye
    C6  D184 ;   # small f
    C7  D0B3 ;   # small g
    C8  D185 ;   # small kh
    C9  D0B8 ;   # small i
    CA  D0B9 ;   # small j
    CB  D0BA ;   # small k
    CC  D0BB ;   # small l
    CD  D0BC ;   # small m
    CE  D0BD ;   # small n
    CF  D0BE ;   # small o

    D0  D0BF ;   # small p
    D1  D18F ;   # small ya
    D2  D180 ;   # small r
    D3  D181 ;   # small s
    D4  D182 ;   # small t
    D5  D183 ;   # small u
    D6  D0B6 ;   # small zh
    D7  D0B2 ;   # small v
    D8  D18C ;   # small soft sign
    D9  D18B ;   # small y
    DA  D0B7 ;   # small z
    DB  D188 ;   # small sh
    DC  D18D ;   # small e
    DD  D189 ;   # small shch
    DE  D187 ;   # small ch
    DF  D18A ;   # small hard sign

    E0  D0AE ;   # capital YU
    E1  D090 ;   # capital A
    E2  D091 ;   # capital B
    E3  D0A6 ;   # capital TS
    E4  D094 ;   # capital D
    E5  D095 ;   # capital YE
    E6  D0A4 ;   # capital F
    E7  D093 ;   # capital G
    E8  D0A5 ;   # capital KH
    E9  D098 ;   # capital I
    EA  D099 ;   # capital J
    EB  D09A ;   # capital K
    EC  D09B ;   # capital L
    ED  D09C ;   # capital M
    EE  D09D ;   # capital N
    EF  D09E ;   # capital O

    F0  D09F ;   # capital P
    F1  D0AF ;   # capital YA
    F2  D0A0 ;   # capital R
    F3  D0A1 ;   # capital S
    F4  D0A2 ;   # capital T
    F5  D0A3 ;   # capital U
    F6  D096 ;   # capital ZH
    F7  D092 ;   # capital V
    F8  D0AC ;   # capital soft sign
    F9  D0AB ;   # capital Y
    FA  D097 ;   # capital Z
    FB  D0A8 ;   # capital SH
    FC  D0AD ;   # capital E
    FD  D0A9 ;   # capital SHCH
    FE  D0A7 ;   # capital CH
    FF  D0AA ;   # capital hard sign
}


================================================
FILE: MicrofrontendTemplate/nginx/conf/koi-win
================================================

charset_map  koi8-r  windows-1251 {

    80  88 ; # euro

    95  95 ; # bullet

    9A  A0 ; # &nbsp;

    9E  B7 ; # &middot;

    A3  B8 ; # small yo
    A4  BA ; # small Ukrainian ye

    A6  B3 ; # small Ukrainian i
    A7  BF ; # small Ukrainian yi

    AD  B4 ; # small Ukrainian soft g
    AE  A2 ; # small Byelorussian short u

    B0  B0 ; # &deg;

    B3  A8 ; # capital YO
    B4  AA ; # capital Ukrainian YE

    B6  B2 ; # capital Ukrainian I
    B7  AF ; # capital Ukrainian YI

    B9  B9 ; # numero sign

    BD  A5 ; # capital Ukrainian soft G
    BE  A1 ; # capital Byelorussian short U

    BF  A9 ; # (C)

    C0  FE ; # small yu
    C1  E0 ; # small a
    C2  E1 ; # small b
    C3  F6 ; # small ts
    C4  E4 ; # small d
    C5  E5 ; # small ye
    C6  F4 ; # small f
    C7  E3 ; # small g
    C8  F5 ; # small kh
    C9  E8 ; # small i
    CA  E9 ; # small j
    CB  EA ; # small k
    CC  EB ; # small l
    CD  EC ; # small m
    CE  ED ; # small n
    CF  EE ; # small o

    D0  EF ; # small p
    D1  FF ; # small ya
    D2  F0 ; # small r
    D3  F1 ; # small s
    D4  F2 ; # small t
    D5  F3 ; # small u
    D6  E6 ; # small zh
    D7  E2 ; # small v
    D8  FC ; # small soft sign
    D9  FB ; # small y
    DA  E7 ; # small z
    DB  F8 ; # small sh
    DC  FD ; # small e
    DD  F9 ; # small shch
    DE  F7 ; # small ch
    DF  FA ; # small hard sign

    E0  DE ; # capital YU
    E1  C0 ; # capital A
    E2  C1 ; # capital B
    E3  D6 ; # capital TS
    E4  C4 ; # capital D
    E5  C5 ; # capital YE
    E6  D4 ; # capital F
    E7  C3 ; # capital G
    E8  D5 ; # capital KH
    E9  C8 ; # capital I
    EA  C9 ; # capital J
    EB  CA ; # capital K
    EC  CB ; # capital L
    ED  CC ; # capital M
    EE  CD ; # capital N
    EF  CE ; # capital O

    F0  CF ; # capital P
    F1  DF ; # capital YA
    F2  D0 ; # capital R
    F3  D1 ; # capital S
    F4  D2 ; # capital T
    F5  D3 ; # capital U
    F6  C6 ; # capital ZH
    F7  C2 ; # capital V
    F8  DC ; # capital soft sign
    F9  DB ; # capital Y
    FA  C7 ; # capital Z
    FB  D8 ; # capital SH
    FC  DD ; # capital E
    FD  D9 ; # capital SHCH
    FE  D7 ; # capital CH
    FF  DA ; # capital hard sign
}


================================================
FILE: MicrofrontendTemplate/nginx/conf/mime.types
================================================

types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;

    text/mathml                                      mml;
    text/plain                                       txt;
    text/vnd.sun.j2me.app-descriptor                 jad;
    text/vnd.wap.wml                                 wml;
    text/x-component                                 htc;

    image/png                                        png;
    image/svg+xml                                    svg svgz;
    image/tiff                                       tif tiff;
    image/vnd.wap.wbmp                               wbmp;
    image/webp                                       webp;
    image/x-icon                                     ico;
    image/x-jng                                      jng;
    image/x-ms-bmp                                   bmp;

    font/woff                                        woff;
    font/woff2                                       woff2;

    application/java-archive                         jar war ear;
    application/json                                 json;
    application/mac-binhex40                         hqx;
    application/msword                               doc;
    application/pdf                                  pdf;
    application/postscript                           ps eps ai;
    application/rtf                                  rtf;
    application/vnd.apple.mpegurl                    m3u8;
    application/vnd.google-earth.kml+xml             kml;
    application/vnd.google-earth.kmz                 kmz;
    application/vnd.ms-excel                         xls;
    application/vnd.ms-fontobject                    eot;
    application/vnd.ms-powerpoint                    ppt;
    application/vnd.oasis.opendocument.graphics      odg;
    application/vnd.oasis.opendocument.presentation  odp;
    application/vnd.oasis.opendocument.spreadsheet   ods;
    application/vnd.oasis.opendocument.text          odt;
    application/vnd.openxmlformats-officedocument.presentationml.presentation
                                                     pptx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
                                                     xlsx;
    application/vnd.openxmlformats-officedocument.wordprocessingml.document
                                                     docx;
    application/vnd.wap.wmlc                         wmlc;
    application/x-7z-compressed                      7z;
    application/x-cocoa                              cco;
    application/x-java-archive-diff                  jardiff;
    application/x-java-jnlp-file                     jnlp;
    application/x-makeself                           run;
    application/x-perl                               pl pm;
    application/x-pilot                              prc pdb;
    application/x-rar-compressed                     rar;
    application/x-redhat-package-manager             rpm;
    application/x-sea                                sea;
    application/x-shockwave-flash                    swf;
    application/x-stuffit                            sit;
    application/x-tcl                                tcl tk;
    application/x-x509-ca-cert                       der pem crt;
    application/x-xpinstall                          xpi;
    application/xhtml+xml                            xhtml;
    application/xspf+xml                             xspf;
    application/zip                                  zip;

    application/octet-stream                         bin exe dll;
    application/octet-stream                         deb;
    application/octet-stream                         dmg;
    application/octet-stream                         iso img;
    application/octet-stream                         msi msp msm;

    audio/midi                                       mid midi kar;
    audio/mpeg                                       mp3;
    audio/ogg                                        ogg;
    audio/x-m4a                                      m4a;
    audio/x-realaudio                                ra;

    video/3gpp                                       3gpp 3gp;
    video/mp2t                                       ts;
    video/mp4                                        mp4;
    video/mpeg                                       mpeg mpg;
    video/quicktime                                  mov;
    video/webm                                       webm;
    video/x-flv                                      flv;
    video/x-m4v                                      m4v;
    video/x-mng                                      mng;
    video/x-ms-asf                                   asx asf;
    video/x-ms-wmv                                   wmv;
    video/x-msvideo                                  avi;
}


================================================
FILE: MicrofrontendTemplate/nginx/conf/nginx.conf
================================================

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    server {
        listen       8080;
        server_name  localhost;

        location / {
          proxy_pass http://localhost:5000;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection $http_connection;
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;
        }

        location /app1 {
          rewrite ^/app1/(.*) /$1 break;
          proxy_pass http://localhost:5060;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection $http_connection;
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;          
        }

        location /app2 {
          rewrite ^/app2/(.*) /$1 break;
          proxy_pass http://localhost:5070;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection $http_connection;
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;          
        }

        location /app3 {
          rewrite ^/app3/(.*) /$1 break;
          proxy_pass http://localhost:5010;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection $http_connection;
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;          
        }

        location /app4 {
          rewrite ^/app4/(.*) /$1 break;
          proxy_pass http://localhost:5020;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection $http_connection;
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;          
        }
    }
}


================================================
FILE: MicrofrontendTemplate/nginx/conf/scgi_params
================================================

scgi_param  REQUEST_METHOD     $request_method;
scgi_param  REQUEST_URI        $request_uri;
scgi_param  QUERY_STRING       $query_string;
scgi_param  CONTENT_TYPE       $content_type;

scgi_param  DOCUMENT_URI       $document_uri;
scgi_param  DOCUMENT_ROOT      $document_root;
scgi_param  SCGI               1;
scgi_param  SERVER_PROTOCOL    $server_protocol;
scgi_param  REQUEST_SCHEME     $scheme;
scgi_param  HTTPS              $https if_not_empty;

scgi_param  REMOTE_ADDR        $remote_addr;
scgi_param  REMOTE_PORT        $remote_port;
scgi_param  SERVER_PORT        $server_port;
scgi_param  SERVER_NAME        $server_name;


================================================
FILE: MicrofrontendTemplate/nginx/conf/uwsgi_params
================================================

uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;


================================================
FILE: MicrofrontendTemplate/nginx/conf/win-utf
================================================

# This map is not a full windows-1251 <> utf8 map: it does not
# contain Serbian and Macedonian letters.  If you need a full map,
# use contrib/unicode2nginx/win-utf map instead.

charset_map  windows-1251  utf-8 {

    82  E2809A ; # single low-9 quotation mark

    84  E2809E ; # double low-9 quotation mark
    85  E280A6 ; # ellipsis
    86  E280A0 ; # dagger
    87  E280A1 ; # double dagger
    88  E282AC ; # euro
    89  E280B0 ; # per mille

    91  E28098 ; # left single quotation mark
    92  E28099 ; # right single quotation mark
    93  E2809C ; # left double quotation mark
    94  E2809D ; # right double quotation mark
    95  E280A2 ; # bullet
    96  E28093 ; # en dash
    97  E28094 ; # em dash

    99  E284A2 ; # trade mark sign

    A0  C2A0 ;   # &nbsp;
    A1  D18E ;   # capital Byelorussian short U
    A2  D19E ;   # small Byelorussian short u

    A4  C2A4 ;   # currency sign
    A5  D290 ;   # capital Ukrainian soft G
    A6  C2A6 ;   # borken bar
    A7  C2A7 ;   # section sign
    A8  D081 ;   # capital YO
    A9  C2A9 ;   # (C)
    AA  D084 ;   # capital Ukrainian YE
    AB  C2AB ;   # left-pointing double angle quotation mark
    AC  C2AC ;   # not sign
    AD  C2AD ;   # soft hypen
    AE  C2AE ;   # (R)
    AF  D087 ;   # capital Ukrainian YI

    B0  C2B0 ;   # &deg;
    B1  C2B1 ;   # plus-minus sign
    B2  D086 ;   # capital Ukrainian I
    B3  D196 ;   # small Ukrainian i
    B4  D291 ;   # small Ukrainian soft g
    B5  C2B5 ;   # micro sign
    B6  C2B6 ;   # pilcrow sign
    B7  C2B7 ;   # &middot;
    B8  D191 ;   # small yo
    B9  E28496 ; # numero sign
    BA  D194 ;   # small Ukrainian ye
    BB  C2BB ;   # right-pointing double angle quotation mark

    BF  D197 ;   # small Ukrainian yi

    C0  D090 ;   # capital A
    C1  D091 ;   # capital B
    C2  D092 ;   # capital V
    C3  D093 ;   # capital G
    C4  D094 ;   # capital D
    C5  D095 ;   # capital YE
    C6  D096 ;   # capital ZH
    C7  D097 ;   # capital Z
    C8  D098 ;   # capital I
    C9  D099 ;   # capital J
    CA  D09A ;   # capital K
    CB  D09B ;   # capital L
    CC  D09C ;   # capital M
    CD  D09D ;   # capital N
    CE  D09E ;   # capital O
    CF  D09F ;   # capital P

    D0  D0A0 ;   # capital R
    D1  D0A1 ;   # capital S
    D2  D0A2 ;   # capital T
    D3  D0A3 ;   # capital U
    D4  D0A4 ;   # capital F
    D5  D0A5 ;   # capital KH
    D6  D0A6 ;   # capital TS
    D7  D0A7 ;   # capital CH
    D8  D0A8 ;   # capital SH
    D9  D0A9 ;   # capital SHCH
    DA  D0AA ;   # capital hard sign
    DB  D0AB ;   # capital Y
    DC  D0AC ;   # capital soft sign
    DD  D0AD ;   # capital E
    DE  D0AE ;   # capital YU
    DF  D0AF ;   # capital YA

    E0  D0B0 ;   # small a
    E1  D0B1 ;   # small b
    E2  D0B2 ;   # small v
    E3  D0B3 ;   # small g
    E4  D0B4 ;   # small d
    E5  D0B5 ;   # small ye
    E6  D0B6 ;   # small zh
    E7  D0B7 ;   # small z
    E8  D0B8 ;   # small i
    E9  D0B9 ;   # small j
    EA  D0BA ;   # small k
    EB  D0BB ;   # small l
    EC  D0BC ;   # small m
    ED  D0BD ;   # small n
    EE  D0BE ;   # small o
    EF  D0BF ;   # small p

    F0  D180 ;   # small r
    F1  D181 ;   # small s
    F2  D182 ;   # small t
    F3  D183 ;   # small u
    F4  D184 ;   # small f
    F5  D185 ;   # small kh
    F6  D186 ;   # small ts
    F7  D187 ;   # small ch
    F8  D188 ;   # small sh
    F9  D189 ;   # small shch
    FA  D18A ;   # small hard sign
    FB  D18B ;   # small y
    FC  D18C ;   # small soft sign
    FD  D18D ;   # small e
    FE  D18E ;   # small yu
    FF  D18F ;   # small ya
}


================================================
FILE: MicrofrontendTemplate/nginx/contrib/README
================================================

geo2nginx.pl 		by Andrei Nigmatulin

	The perl script to convert CSV geoip database ( free download
	at http://www.maxmind.com/app/geoip_country ) to format, suitable
	for use by the ngx_http_geo_module.


unicode2nginx		by Maxim Dounin

	The perl script to convert unicode mappings ( available
	at http://www.unicode.org/Public/MAPPINGS/ ) to the nginx
	configuration file format.
	Two generated full maps for windows-1251 and koi8-r.


vim			by Evan Miller

	Syntax highlighting of nginx configuration for vim, to be
	placed into ~/.vim/.



================================================
FILE: MicrofrontendTemplate/nginx/contrib/geo2nginx.pl
================================================
#!/usr/bin/perl -w

# (c) Andrei Nigmatulin, 2005
#
# this script provided "as is", without any warranties. use it at your own risk.
#
# special thanx to Andrew Sitnikov for perl port
#
# this script converts CSV geoip database (free download at http://www.maxmind.com/app/geoip_country)
# to format, suitable for use with nginx_http_geo module (http://sysoev.ru/nginx)
#
# for example, line with ip range
#
#   "62.16.68.0","62.16.127.255","1041253376","1041268735","RU","Russian Federation"
#
# will be converted to four subnetworks:
#
#   62.16.68.0/22 RU;
#   62.16.72.0/21 RU;
#   62.16.80.0/20 RU;
#   62.16.96.0/19 RU;


use warnings;
use strict;

while( <STDIN> ){
	if (/"[^"]+","[^"]+","([^"]+)","([^"]+)","([^"]+)"/){
		print_subnets($1, $2, $3);
	}
}

sub  print_subnets {
	my ($a1, $a2, $c) = @_;
	my $l;
    while ($a1 <= $a2) {
		for ($l = 0; ($a1 & (1 << $l)) == 0 && ($a1 + ((1 << ($l + 1)) - 1)) <= $a2; $l++){};
		print long2ip($a1) . "/" . (32 - $l) . " " . $c . ";\n";
    	$a1 += (1 << $l);
	}
}

sub long2ip {
	my $ip = shift;

	my $str = 0;

	$str = ($ip & 255);

	$ip >>= 8;
	$str = ($ip & 255).".$str";

	$ip >>= 8;
	$str = ($ip & 255).".$str";

	$ip >>= 8;
	$str = ($ip & 255).".$str";
}


================================================
FILE: MicrofrontendTemplate/nginx/contrib/unicode2nginx/koi-utf
================================================
charset_map  koi8-r  utf-8 {

    80  E29480 ; #	BOX DRAWINGS LIGHT HORIZONTAL
    81  E29482 ; #	BOX DRAWINGS LIGHT VERTICAL
    82  E2948C ; #	BOX DRAWINGS LIGHT DOWN AND RIGHT
    83  E29490 ; #	BOX DRAWINGS LIGHT DOWN AND LEFT
    84  E29494 ; #	BOX DRAWINGS LIGHT UP AND RIGHT
    85  E29498 ; #	BOX DRAWINGS LIGHT UP AND LEFT
    86  E2949C ; #	BOX DRAWINGS LIGHT VERTICAL AND RIGHT
    87  E294A4 ; #	BOX DRAWINGS LIGHT VERTICAL AND LEFT
    88  E294AC ; #	BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
    89  E294B4 ; #	BOX DRAWINGS LIGHT UP AND HORIZONTAL
    8A  E294BC ; #	BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
    8B  E29680 ; #	UPPER HALF BLOCK
    8C  E29684 ; #	LOWER HALF BLOCK
    8D  E29688 ; #	FULL BLOCK
    8E  E2968C ; #	LEFT HALF BLOCK
    8F  E29690 ; #	RIGHT HALF BLOCK
    90  E29691 ; #	LIGHT SHADE
    91  E29692 ; #	MEDIUM SHADE
    92  E29693 ; #	DARK SHADE
    93  E28CA0 ; #	TOP HALF INTEGRAL
    94  E296A0 ; #	BLACK SQUARE
    95  E28899 ; #	BULLET OPERATOR
    96  E2889A ; #	SQUARE ROOT
    97  E28988 ; #	ALMOST EQUAL TO
    98  E289A4 ; #	LESS-THAN OR EQUAL TO
    99  E289A5 ; #	GREATER-THAN OR EQUAL TO
    9A  C2A0 ; #	NO-BREAK SPACE
    9B  E28CA1 ; #	BOTTOM HALF INTEGRAL
    9C  C2B0 ; #	DEGREE SIGN
    9D  C2B2 ; #	SUPERSCRIPT TWO
    9E  C2B7 ; #	MIDDLE DOT
    9F  C3B7 ; #	DIVISION SIGN
    A0  E29590 ; #	BOX DRAWINGS DOUBLE HORIZONTAL
    A1  E29591 ; #	BOX DRAWINGS DOUBLE VERTICAL
    A2  E29592 ; #	BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
    A3  D191 ; #	CYRILLIC SMALL LETTER IO
    A4  E29593 ; #	BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
    A5  E29594 ; #	BOX DRAWINGS DOUBLE DOWN AND RIGHT
    A6  E29595 ; #	BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
    A7  E29596 ; #	BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
    A8  E29597 ; #	BOX DRAWINGS DOUBLE DOWN AND LEFT
    A9  E29598 ; #	BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
    AA  E29599 ; #	BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
    AB  E2959A ; #	BOX DRAWINGS DOUBLE UP AND RIGHT
    AC  E2959B ; #	BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
    AD  E2959C ; #	BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
    AE  E2959D ; #	BOX DRAWINGS DOUBLE UP AND LEFT
    AF  E2959E ; #	BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
    B0  E2959F ; #	BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
    B1  E295A0 ; #	BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
    B2  E295A1 ; #	BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
    B3  D081 ; #	CYRILLIC CAPITAL LETTER IO
    B4  E295A2 ; #	BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
    B5  E295A3 ; #	BOX DRAWINGS DOUBLE VERTICAL AND LEFT
    B6  E295A4 ; #	BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
    B7  E295A5 ; #	BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
    B8  E295A6 ; #	BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
    B9  E295A7 ; #	BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
    BA  E295A8 ; #	BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
    BB  E295A9 ; #	BOX DRAWINGS DOUBLE UP AND HORIZONTAL
    BC  E295AA ; #	BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
    BD  E295AB ; #	BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
    BE  E295AC ; #	BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
    BF  C2A9 ; #	COPYRIGHT SIGN
    C0  D18E ; #	CYRILLIC SMALL LETTER YU
    C1  D0B0 ; #	CYRILLIC SMALL LETTER A
    C2  D0B1 ; #	CYRILLIC SMALL LETTER BE
    C3  D186 ; #	CYRILLIC SMALL LETTER TSE
    C4  D0B4 ; #	CYRILLIC SMALL LETTER DE
    C5  D0B5 ; #	CYRILLIC SMALL LETTER IE
    C6  D184 ; #	CYRILLIC SMALL LETTER EF
    C7  D0B3 ; #	CYRILLIC SMALL LETTER GHE
    C8  D185 ; #	CYRILLIC SMALL LETTER HA
    C9  D0B8 ; #	CYRILLIC SMALL LETTER I
    CA  D0B9 ; #	CYRILLIC SMALL LETTER SHORT I
    CB  D0BA ; #	CYRILLIC SMALL LETTER KA
    CC  D0BB ; #	CYRILLIC SMALL LETTER EL
    CD  D0BC ; #	CYRILLIC SMALL LETTER EM
    CE  D0BD ; #	CYRILLIC SMALL LETTER EN
    CF  D0BE ; #	CYRILLIC SMALL LETTER O
    D0  D0BF ; #	CYRILLIC SMALL LETTER PE
    D1  D18F ; #	CYRILLIC SMALL LETTER YA
    D2  D180 ; #	CYRILLIC SMALL LETTER ER
    D3  D181 ; #	CYRILLIC SMALL LETTER ES
    D4  D182 ; #	CYRILLIC SMALL LETTER TE
    D5  D183 ; #	CYRILLIC SMALL LETTER U
    D6  D0B6 ; #	CYRILLIC SMALL LETTER ZHE
    D7  D0B2 ; #	CYRILLIC SMALL LETTER VE
    D8  D18C ; #	CYRILLIC SMALL LETTER SOFT SIGN
    D9  D18B ; #	CYRILLIC SMALL LETTER YERU
    DA  D0B7 ; #	CYRILLIC SMALL LETTER ZE
    DB  D188 ; #	CYRILLIC SMALL LETTER SHA
    DC  D18D ; #	CYRILLIC SMALL LETTER E
    DD  D189 ; #	CYRILLIC SMALL LETTER SHCHA
    DE  D187 ; #	CYRILLIC SMALL LETTER CHE
    DF  D18A ; #	CYRILLIC SMALL LETTER HARD SIGN
    E0  D0AE ; #	CYRILLIC CAPITAL LETTER YU
    E1  D090 ; #	CYRILLIC CAPITAL LETTER A
    E2  D091 ; #	CYRILLIC CAPITAL LETTER BE
    E3  D0A6 ; #	CYRILLIC CAPITAL LETTER TSE
    E4  D094 ; #	CYRILLIC CAPITAL LETTER DE
    E5  D095 ; #	CYRILLIC CAPITAL LETTER IE
    E6  D0A4 ; #	CYRILLIC CAPITAL LETTER EF
    E7  D093 ; #	CYRILLIC CAPITAL LETTER GHE
    E8  D0A5 ; #	CYRILLIC CAPITAL LETTER HA
    E9  D098 ; #	CYRILLIC CAPITAL LETTER I
    EA  D099 ; #	CYRILLIC CAPITAL LETTER SHORT I
    EB  D09A ; #	CYRILLIC CAPITAL LETTER KA
    EC  D09B ; #	CYRILLIC CAPITAL LETTER EL
    ED  D09C ; #	CYRILLIC CAPITAL LETTER EM
    EE  D09D ; #	CYRILLIC CAPITAL LETTER EN
    EF  D09E ; #	CYRILLIC CAPITAL LETTER O
    F0  D09F ; #	CYRILLIC CAPITAL LETTER PE
    F1  D0AF ; #	CYRILLIC CAPITAL LETTER YA
    F2  D0A0 ; #	CYRILLIC CAPITAL LETTER ER
    F3  D0A1 ; #	CYRILLIC CAPITAL LETTER ES
    F4  D0A2 ; #	CYRILLIC CAPITAL LETTER TE
    F5  D0A3 ; #	CYRILLIC CAPITAL LETTER U
    F6  D096 ; #	CYRILLIC CAPITAL LETTER ZHE
    F7  D092 ; #	CYRILLIC CAPITAL LETTER VE
    F8  D0AC ; #	CYRILLIC CAPITAL LETTER SOFT SIGN
    F9  D0AB ; #	CYRILLIC CAPITAL LETTER YERU
    FA  D097 ; #	CYRILLIC CAPITAL LETTER ZE
    FB  D0A8 ; #	CYRILLIC CAPITAL LETTER SHA
    FC  D0AD ; #	CYRILLIC CAPITAL LETTER E
    FD  D0A9 ; #	CYRILLIC CAPITAL LETTER SHCHA
    FE  D0A7 ; #	CYRILLIC CAPITAL LETTER CHE
    FF  D0AA ; #	CYRILLIC CAPITAL LETTER HARD SIGN
}


================================================
FILE: MicrofrontendTemplate/nginx/contrib/unicode2nginx/unicode-to-nginx.pl
================================================
#!/usr/bin/perl -w

# Convert unicode mappings to nginx configuration file format.

# You may find useful mappings in various places, including
# unicode.org official site:
#
# http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1251.TXT
# http://www.unicode.org/Public/MAPPINGS/VENDORS/MISC/KOI8-R.TXT

# Needs perl 5.6 or later.

# Written by Maxim Dounin, mdounin@mdounin.ru

###############################################################################

require 5.006;

while (<>) {
	# Skip comments and empty lines

	next if /^#/;
	next if /^\s*$/;
	chomp;

	# Convert mappings

	if (/^\s*0x(..)\s*0x(....)\s*(#.*)/) {
		# Mapping <from-code> <unicode-code> "#" <unicode-name>
		my $cs_code = $1;
		my $un_code = $2;
		my $un_name = $3;

		# Produce UTF-8 sequence from character code;

		my $un_utf8 = join('',
			map { sprintf("%02X", $_) }
			unpack("U0C*", pack("U", hex($un_code)))
		);

		print "    $cs_code  $un_utf8 ; $un_name\n";

	} else {
		warn "Unrecognized line: '$_'";
	}
}

###############################################################################


================================================
FILE: MicrofrontendTemplate/nginx/contrib/unicode2nginx/win-utf
================================================
charset_map  windows-1251  utf-8 {

    80  D082 ; #CYRILLIC CAPITAL LETTER DJE
    81  D083 ; #CYRILLIC CAPITAL LETTER GJE
    82  E2809A ; #SINGLE LOW-9 QUOTATION MARK
    83  D193 ; #CYRILLIC SMALL LETTER GJE
    84  E2809E ; #DOUBLE LOW-9 QUOTATION MARK
    85  E280A6 ; #HORIZONTAL ELLIPSIS
    86  E280A0 ; #DAGGER
    87  E280A1 ; #DOUBLE DAGGER
    88  E282AC ; #EURO SIGN
    89  E280B0 ; #PER MILLE SIGN
    8A  D089 ; #CYRILLIC CAPITAL LETTER LJE
    8B  E280B9 ; #SINGLE LEFT-POINTING ANGLE QUOTATION MARK
    8C  D08A ; #CYRILLIC CAPITAL LETTER NJE
    8D  D08C ; #CYRILLIC CAPITAL LETTER KJE
  
Download .txt
gitextract_j6oj_ypb/

├── .gitattributes
├── .gitignore
├── LICENSE
├── MicrofrontendTemplate/
│   ├── .gitignore
│   ├── .template.config/
│   │   └── template.json
│   ├── Microfrontend.sln
│   ├── Portal/
│   │   ├── Portal.csproj
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── appsettings.json
│   │   ├── client/
│   │   │   ├── auth.js
│   │   │   ├── components/
│   │   │   │   ├── App.js
│   │   │   │   ├── Landing.js
│   │   │   │   ├── Login.js
│   │   │   │   └── Portal.js
│   │   │   ├── index.js
│   │   │   └── loader.js
│   │   ├── package.json
│   │   ├── run.bat
│   │   ├── server/
│   │   │   ├── Controllers/
│   │   │   │   └── LoginController.cs
│   │   │   ├── Program.cs
│   │   │   └── Startup.cs
│   │   ├── tempkey.rsa
│   │   ├── webpack.config.js
│   │   └── wwwroot/
│   │       ├── 404.html
│   │       └── index.html
│   ├── README.md
│   ├── ReactDashboardApp/
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── README.md
│   │   ├── ReactDashboardApp.csproj
│   │   ├── appsettings.json
│   │   ├── client/
│   │   │   ├── components/
│   │   │   │   ├── ActivitiesCard.js
│   │   │   │   ├── Dashboard.js
│   │   │   │   └── InfoCard.js
│   │   │   └── index.js
│   │   ├── package.json
│   │   ├── run.bat
│   │   ├── server/
│   │   │   ├── Program.cs
│   │   │   ├── Services/
│   │   │   │   └── MockLiveDataService.cs
│   │   │   ├── Startup.cs
│   │   │   └── ViewModels/
│   │   │       └── Dashboard.cs
│   │   ├── webpack.config.js
│   │   └── wwwroot/
│   │       └── index.html
│   ├── ReactFormApp/
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── README.md
│   │   ├── ReactFormApp.csproj
│   │   ├── appsettings.json
│   │   ├── client/
│   │   │   ├── components/
│   │   │   │   ├── AddressForm.js
│   │   │   │   ├── BasicInfoForm.js
│   │   │   │   ├── Form.js
│   │   │   │   └── NewCustomerDialog.js
│   │   │   └── index.js
│   │   ├── package.json
│   │   ├── run.bat
│   │   ├── server/
│   │   │   ├── Program.cs
│   │   │   ├── Services/
│   │   │   │   ├── Customer.cs
│   │   │   │   ├── CustomerFormData.cs
│   │   │   │   └── CustomerRepository.cs
│   │   │   ├── Startup.cs
│   │   │   └── ViewModels/
│   │   │       ├── AddressForm.cs
│   │   │       ├── CustomerForm.cs
│   │   │       ├── NewCustomerForm.cs
│   │   │       ├── PersonForm.cs
│   │   │       └── PhoneForm.cs
│   │   ├── webpack.config.js
│   │   └── wwwroot/
│   │       └── index.html
│   ├── ReactTodoApp/
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── README.md
│   │   ├── ReactTodoApp.csproj
│   │   ├── appsettings.json
│   │   ├── client/
│   │   │   ├── components/
│   │   │   │   └── TodoList.js
│   │   │   └── index.js
│   │   ├── package.json
│   │   ├── run.bat
│   │   ├── server/
│   │   │   ├── Program.cs
│   │   │   ├── Startup.cs
│   │   │   └── ViewModels/
│   │   │       └── TodoList.cs
│   │   ├── webpack.config.js
│   │   └── wwwroot/
│   │       └── index.html
│   ├── Shared/
│   │   ├── IdentityServer/
│   │   │   ├── IdentityServerClient.cs
│   │   │   ├── IdentityServerConfig.cs
│   │   │   └── IdentityServerSettings.cs
│   │   └── Shared.csproj
│   ├── VueTodoApp/
│   │   ├── Properties/
│   │   │   └── launchSettings.json
│   │   ├── README.md
│   │   ├── VueTodoApp.csproj
│   │   ├── appsettings.json
│   │   ├── client/
│   │   │   ├── components/
│   │   │   │   └── TodoList.vue
│   │   │   └── index.js
│   │   ├── package.json
│   │   ├── run.bat
│   │   ├── server/
│   │   │   ├── Program.cs
│   │   │   ├── Startup.cs
│   │   │   └── ViewModels/
│   │   │       └── TodoList.cs
│   │   ├── webpack.config.js
│   │   └── wwwroot/
│   │       └── index.html
│   ├── global.json
│   ├── heroku-deploy/
│   │   ├── Portal/
│   │   │   ├── Dockerfile
│   │   │   ├── appsettings.json
│   │   │   ├── build.bat
│   │   │   ├── deploy.bat
│   │   │   └── excludedfiles.txt
│   │   ├── ReactDashboardApp/
│   │   │   ├── Dockerfile
│   │   │   ├── appsettings.json
│   │   │   ├── build.bat
│   │   │   ├── deploy.bat
│   │   │   └── excludedfiles.txt
│   │   └── nginx/
│   │       ├── Dockerfile
│   │       ├── deploy.bat
│   │       └── nginx.conf
│   ├── nginx/
│   │   ├── .gitignore
│   │   ├── conf/
│   │   │   ├── fastcgi.conf
│   │   │   ├── fastcgi_params
│   │   │   ├── koi-utf
│   │   │   ├── koi-win
│   │   │   ├── mime.types
│   │   │   ├── nginx.conf
│   │   │   ├── scgi_params
│   │   │   ├── uwsgi_params
│   │   │   └── win-utf
│   │   ├── contrib/
│   │   │   ├── README
│   │   │   ├── geo2nginx.pl
│   │   │   ├── unicode2nginx/
│   │   │   │   ├── koi-utf
│   │   │   │   ├── unicode-to-nginx.pl
│   │   │   │   └── win-utf
│   │   │   └── vim/
│   │   │       ├── ftdetect/
│   │   │       │   └── nginx.vim
│   │   │       ├── ftplugin/
│   │   │       │   └── nginx.vim
│   │   │       ├── indent/
│   │   │       │   └── nginx.vim
│   │   │       └── syntax/
│   │   │           └── nginx.vim
│   │   ├── docs/
│   │   │   ├── CHANGES
│   │   │   ├── CHANGES.ru
│   │   │   ├── LICENSE
│   │   │   ├── OpenSSL.LICENSE
│   │   │   ├── PCRE.LICENCE
│   │   │   ├── README
│   │   │   └── zlib.LICENSE
│   │   ├── html/
│   │   │   ├── 50x.html
│   │   │   └── index.html
│   │   ├── run.bat
│   │   └── stop.bat
│   └── run.bat
├── README.md
├── ReactTemplate/
│   ├── README.md
│   ├── content/
│   │   ├── .gitignore
│   │   ├── .template.config/
│   │   │   └── template.json
│   │   ├── client/
│   │   │   ├── app.tsx
│   │   │   ├── auth.ts
│   │   │   ├── components/
│   │   │   │   ├── BasePage.tsx
│   │   │   │   ├── Header.tsx
│   │   │   │   ├── Sidebar.tsx
│   │   │   │   ├── dashboard/
│   │   │   │   │   ├── InfoBox.tsx
│   │   │   │   │   ├── RecentActivities.tsx
│   │   │   │   │   ├── ServerUsage.tsx
│   │   │   │   │   ├── Traffic.tsx
│   │   │   │   │   └── Utilization.tsx
│   │   │   │   └── table/
│   │   │   │       ├── InlineEdit.tsx
│   │   │   │       └── Pagination.tsx
│   │   │   ├── routes.tsx
│   │   │   ├── styles/
│   │   │   │   ├── app.css
│   │   │   │   ├── styles.ts
│   │   │   │   └── theme-default.ts
│   │   │   └── views/
│   │   │       ├── App.tsx
│   │   │       ├── AppLayout.tsx
│   │   │       ├── Dashboard.tsx
│   │   │       ├── FormPage.tsx
│   │   │       ├── LoginPage.tsx
│   │   │       └── TablePage.tsx
│   │   ├── package.json
│   │   ├── projectName.csproj
│   │   ├── projectName.sln
│   │   ├── server/
│   │   │   ├── AuthServer.cs
│   │   │   ├── Program.cs
│   │   │   ├── Services/
│   │   │   │   ├── EmployeeService.cs
│   │   │   │   ├── MockLiveDataService.cs
│   │   │   │   └── employees.json
│   │   │   └── ViewModels/
│   │   │       ├── AppLayout.cs
│   │   │       ├── Dashboard.cs
│   │   │       ├── Form.cs
│   │   │       └── Table.cs
│   │   ├── tsconfig.json
│   │   ├── webpack.config.js
│   │   └── wwwroot/
│   │       ├── 404.html
│   │       └── index.html
│   └── template.nuspec
└── _archive/
    ├── HelloWorld/
    │   ├── HelloWorld.cs
    │   ├── HelloWorld.csproj
    │   ├── HelloWorld.sln
    │   ├── Program.cs
    │   ├── Properties/
    │   │   └── launchSettings.json
    │   ├── Startup.cs
    │   ├── package.json
    │   ├── src/
    │   │   ├── HelloWorld.jsx
    │   │   └── app.js
    │   ├── webpack.config.js
    │   └── wwwroot/
    │       ├── bundle.js
    │       └── index.html
    ├── LiveChart/
    │   ├── IISPublishingSteps.md
    │   ├── LiveChart.cs
    │   ├── LiveChart.csproj
    │   ├── LiveChart.sln
    │   ├── Program.cs
    │   ├── Properties/
    │   │   └── launchSettings.json
    │   ├── Startup.cs
    │   ├── compilerconfig.json
    │   ├── compilerconfig.json.defaults
    │   ├── package.json
    │   ├── src/
    │   │   ├── LiveChart.jsx
    │   │   └── app.js
    │   ├── webpack.config.js
    │   └── wwwroot/
    │       ├── bundle.js
    │       └── index.html
    ├── README.md
    ├── ReactTemplateTS/
    │   ├── .editorconfig
    │   ├── README.md
    │   ├── content/
    │   │   ├── .babelrc
    │   │   ├── .gitignore
    │   │   ├── .template.config/
    │   │   │   └── template.json
    │   │   ├── client/
    │   │   │   ├── app.tsx
    │   │   │   ├── auth.tsx
    │   │   │   ├── components/
    │   │   │   │   ├── BasePage.tsx
    │   │   │   │   ├── Header.tsx
    │   │   │   │   ├── Sidebar.tsx
    │   │   │   │   ├── dashboard/
    │   │   │   │   │   ├── InfoBox.tsx
    │   │   │   │   │   ├── RecentActivities.tsx
    │   │   │   │   │   ├── ServerUsage.tsx
    │   │   │   │   │   ├── Traffic.tsx
    │   │   │   │   │   └── Utilization.tsx
    │   │   │   │   └── table/
    │   │   │   │       ├── InlineEdit.tsx
    │   │   │   │       └── Pagination.tsx
    │   │   │   ├── routes.tsx
    │   │   │   ├── styles/
    │   │   │   │   ├── app.css
    │   │   │   │   ├── styles.ts
    │   │   │   │   └── theme-default.ts
    │   │   │   └── views/
    │   │   │       ├── App.tsx
    │   │   │       ├── AppLayout.tsx
    │   │   │       ├── Dashboard.tsx
    │   │   │       ├── FormPage.tsx
    │   │   │       ├── LoginPage.tsx
    │   │   │       └── TablePage.tsx
    │   │   ├── dotnetify_react_template.csproj
    │   │   ├── dotnetify_react_template.sln
    │   │   ├── images.d.ts
    │   │   ├── package.json
    │   │   ├── server/
    │   │   │   ├── AuthServer.cs
    │   │   │   ├── Program.cs
    │   │   │   ├── Services/
    │   │   │   │   ├── EmployeeService.cs
    │   │   │   │   ├── MockLiveDataService.cs
    │   │   │   │   └── employees.json
    │   │   │   ├── Startup.cs
    │   │   │   └── ViewModels/
    │   │   │       ├── AppLayout.cs
    │   │   │       ├── Dashboard.cs
    │   │   │       ├── Form.cs
    │   │   │       └── Table.cs
    │   │   ├── tsconfig.json
    │   │   ├── webpack.config.js
    │   │   └── wwwroot/
    │   │       └── index.html
    │   └── template.nuspec
    └── Routing/
        ├── DotNetify.ServerSideRender.cs
        ├── Program.cs
        ├── Properties/
        │   └── launchSettings.json
        ├── Routing.csproj
        ├── Routing.sln
        ├── Startup.cs
        ├── ViewModels/
        │   ├── Index.cs
        │   ├── Page1.cs
        │   └── Page2.cs
        ├── compilerconfig.json
        ├── compilerconfig.json.defaults
        ├── package.json
        ├── src/
        │   ├── Index.js
        │   ├── Index.jsx
        │   ├── app.js
        │   └── app.server.js
        ├── webpack.config.js
        └── wwwroot/
            ├── Index.html
            ├── Page1.js
            ├── Page1.jsx
            ├── Page2.js
            ├── Page2.jsx
            ├── Page3.html
            └── bundle.js
Download .txt
SYMBOL INDEX (1270 symbols across 101 files)

FILE: MicrofrontendTemplate/Portal/client/components/Login.js
  method onConnect (line 46) | onConnect() {

FILE: MicrofrontendTemplate/Portal/client/components/Portal.js
  method onConnect (line 43) | onConnect() {
  method addApp (line 47) | addApp(newApp) {
  function updatePortal (line 72) | function updatePortal(app) {

FILE: MicrofrontendTemplate/Portal/client/loader.js
  function importApp (line 33) | function importApp(app) {

FILE: MicrofrontendTemplate/Portal/server/Controllers/LoginController.cs
  class LoginController (line 10) | [Route("api/[controller]")]
    method LoginController (line 17) | public LoginController(IHttpClientFactory httpClientFactory, IOptions<...
    method Post (line 23) | [HttpPost]
    method Validate (line 40) | [HttpPost]

FILE: MicrofrontendTemplate/Portal/server/Program.cs
  class Program (line 7) | public class Program
    method Main (line 9) | public static void Main(string[] args)
    method BuildWebHost (line 14) | public static IWebHost BuildWebHost(string[] args) =>

FILE: MicrofrontendTemplate/Portal/server/Startup.cs
  class Startup (line 15) | public class Startup
    method Startup (line 19) | public Startup(IConfiguration config)
    method ConfigureServices (line 24) | public void ConfigureServices(IServiceCollection services)
    method Configure (line 53) | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

FILE: MicrofrontendTemplate/ReactDashboardApp/client/components/ActivitiesCard.js
  class ActivitiesCard (line 51) | class ActivitiesCard extends Element {
    method render (line 52) | render() {

FILE: MicrofrontendTemplate/ReactDashboardApp/client/components/InfoCard.js
  class InfoCard (line 23) | class InfoCard extends Element {
    method render (line 24) | render() {

FILE: MicrofrontendTemplate/ReactDashboardApp/server/Program.cs
  class Program (line 6) | public class Program
    method Main (line 8) | public static void Main(string[] args)
    method BuildWebHost (line 13) | public static IWebHost BuildWebHost(string[] args) =>

FILE: MicrofrontendTemplate/ReactDashboardApp/server/Services/MockLiveDataService.cs
  type ILiveDataService (line 9) | public interface ILiveDataService
  class Activity (line 21) | public class Activity
  class Customer (line 37) | public class Customer
  class MockLiveDataService (line 43) | public class MockLiveDataService : ILiveDataService
    method MockLiveDataService (line 63) | public MockLiveDataService()
    method GetRandomCustomer (line 123) | private Customer GetRandomCustomer()

FILE: MicrofrontendTemplate/ReactDashboardApp/server/Startup.cs
  class Startup (line 19) | public class Startup
    method Startup (line 23) | public Startup(IConfiguration config)
    method ConfigureServices (line 28) | public void ConfigureServices(IServiceCollection services)
    method Configure (line 40) | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

FILE: MicrofrontendTemplate/ReactDashboardApp/server/ViewModels/Dashboard.cs
  class Dashboard (line 12) | [Authorize]
    method Dashboard (line 19) | public Dashboard(ILiveDataService liveDataService)
    method Dispose (line 64) | public override void Dispose()

FILE: MicrofrontendTemplate/ReactFormApp/client/components/Form.js
  class CustomerForm (line 7) | class CustomerForm extends React.Component {
    method render (line 14) | render() {

FILE: MicrofrontendTemplate/ReactFormApp/client/components/NewCustomerDialog.js
  class NewCustomerDialog (line 4) | class NewCustomerDialog extends React.Component {
    method render (line 11) | render() {

FILE: MicrofrontendTemplate/ReactFormApp/server/Program.cs
  class Program (line 6) | public class Program
    method Main (line 8) | public static void Main(string[] args)
    method BuildWebHost (line 13) | public static IWebHost BuildWebHost(string[] args) =>

FILE: MicrofrontendTemplate/ReactFormApp/server/Services/Customer.cs
  type NamePrefix (line 8) | public enum NamePrefix
  type NameSuffix (line 16) | public enum NameSuffix
  type PrimaryPhone (line 26) | public enum PrimaryPhone
  type State (line 34) | public enum State
  class Customer (line 54) | public class Customer
  class NameInfo (line 62) | public class NameInfo
  class AddressInfo (line 73) | public class AddressInfo
  class PhoneInfo (line 84) | public class PhoneInfo

FILE: MicrofrontendTemplate/ReactFormApp/server/Services/CustomerFormData.cs
  class CustomerFormData (line 7) | public class CustomerFormData

FILE: MicrofrontendTemplate/ReactFormApp/server/Services/CustomerRepository.cs
  type ICustomerRepository (line 12) | public interface ICustomerRepository
    method GetAll (line 14) | IEnumerable<Customer> GetAll();
    method Get (line 16) | Customer Get(int id);
    method Add (line 18) | Customer Add(CustomerFormData formData);
    method Update (line 20) | Customer Update(int id, CustomerFormData formData);
  class CustomerRepository (line 23) | public class CustomerRepository : ICustomerRepository
    method GetAll (line 27) | public IEnumerable<Customer> GetAll() => _mockData;
    method Get (line 29) | public Customer Get(int id) => _mockData.FirstOrDefault(x => x.Id == id);
    method Add (line 31) | public Customer Add(CustomerFormData formData)
    method Update (line 49) | public Customer Update(int id, CustomerFormData formData)
    method Update (line 59) | private void Update(object record, StringDictionary newValues)
    method GenerateMockData (line 66) | private static IList<Customer> GenerateMockData()

FILE: MicrofrontendTemplate/ReactFormApp/server/Startup.cs
  class Startup (line 19) | public class Startup
    method Startup (line 23) | public Startup(IConfiguration config)
    method ConfigureServices (line 28) | public void ConfigureServices(IServiceCollection services)
    method Configure (line 40) | public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/AddressForm.cs
  class AddressForm (line 9) | [Authorize]
    method AddressForm (line 14) | public AddressForm()

FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/CustomerForm.cs
  class CustomerForm (line 10) | [Authorize]
    class Contact (line 16) | public class Contact
    method CustomerForm (line 26) | public CustomerForm(ICustomerRepository customerRepository)
    method OnSubVMCreated (line 51) | public override void OnSubVMCreated(BaseVM subVM)
    method Save (line 65) | private bool Save(CustomerFormData formData)
    method ToContact (line 75) | private Contact ToContact(Customer customer) => new Contact
    method UpdateContact (line 85) | private void UpdateContact(Customer newCustomer)

FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/NewCustomerForm.cs
  class NewCustomerForm (line 9) | [Authorize]
    method NewCustomerForm (line 16) | public NewCustomerForm(ICustomerRepository customerRepository)
    method Dispose (line 24) | public override void Dispose()
    method Save (line 29) | public Customer Save(CustomerFormData formData)

FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/PersonForm.cs
  class PersonForm (line 9) | [Authorize]
    method PersonForm (line 14) | public PersonForm()

FILE: MicrofrontendTemplate/ReactFormApp/server/ViewModels/PhoneForm.cs
  class PhoneForm (line 9) | [Authorize]
    method PhoneForm (line 14) | public PhoneForm()

FILE: MicrofrontendTemplate/ReactTodoApp/client/components/TodoList.js
  class TodoList (line 5) | class TodoList extends React.Component {
    method constructor (line 6) | constructor() {
    method componentDidMount (line 15) | componentDidMount() {
    method componentWillUnmount (line 19) | componentWillUnmount() {
    method render (line 23) | render() {

FILE: MicrofrontendTemplate/ReactTodoApp/server/Program.cs
  class Program (line 6) | public class Program
    method Main (line 8) | public static void Main(string[] args)
    method BuildWebHost (line 13) | public static IWebHost BuildWebHost(string[] args) =>

FILE: MicrofrontendTemplate/ReactTodoApp/server/Startup.cs
  class Startup (line 18) | public class Startup
    method Startup (line 22) | public Startup(IConfiguration config)
    method ConfigureServices (line 27) | public void ConfigureServices(IServiceCollection services)
    method Configure (line 35) | public void Configure(IApplicationBuilder app, IHostingEnvironment env)

FILE: MicrofrontendTemplate/ReactTodoApp/server/ViewModels/TodoList.cs
  class TodoList (line 10) | [Authorize]
    class Todo (line 15) | public class Todo

FILE: MicrofrontendTemplate/Shared/IdentityServer/IdentityServerClient.cs
  class IdentityServerClient (line 12) | public class IdentityServerClient
    method RequestClientCredentialsTokenAsync (line 14) | public static async Task<TokenResponse> RequestClientCredentialsTokenA...
    method IntrospectTokenAsync (line 26) | public static async Task<IntrospectionResponse> IntrospectTokenAsync(H...
    method GetIssuerSigningKeysAsync (line 38) | public static async Task<IEnumerable<SecurityKey>> GetIssuerSigningKey...

FILE: MicrofrontendTemplate/Shared/IdentityServer/IdentityServerConfig.cs
  class IdentityServerConfig (line 6) | public class IdentityServerConfig
    method GetClients (line 12) | public static IEnumerable<Client> GetClients()
    method GetApiResources (line 26) | public static IEnumerable<ApiResource> GetApiResources()

FILE: MicrofrontendTemplate/Shared/IdentityServer/IdentityServerSettings.cs
  class IdentityServerSettings (line 3) | public class IdentityServerSettings

FILE: MicrofrontendTemplate/VueTodoApp/server/Program.cs
  class Program (line 6) | public class Program
    method Main (line 8) | public static void Main(string[] args)
    method BuildWebHost (line 13) | public static IWebHost BuildWebHost(string[] args) =>

FILE: MicrofrontendTemplate/VueTodoApp/server/Startup.cs
  class Startup (line 18) | public class Startup
    method Startup (line 22) | public Startup(IConfiguration config)
    method ConfigureServices (line 27) | public void ConfigureServices(IServiceCollection services)
    method Configure (line 35) | public void Configure(IApplicationBuilder app, IHostingEnvironment env)

FILE: MicrofrontendTemplate/VueTodoApp/server/ViewModels/TodoList.cs
  class TodoList (line 10) | [Authorize]
    class Todo (line 15) | public class Todo

FILE: ReactTemplate/content/client/auth.ts
  class Auth (line 1) | class Auth {
    method signIn (line 4) | signIn(username: string, password: string): Promise<void> {
    method signOut (line 20) | signOut() {
    method getAccessToken (line 25) | getAccessToken(): string {
    method hasAccessToken (line 29) | hasAccessToken(): boolean {

FILE: ReactTemplate/content/client/components/BasePage.tsx
  type IBasePageProps (line 6) | interface IBasePageProps {
  function BasePage (line 12) | function BasePage({ title, navigation, children }: IBasePageProps) {

FILE: ReactTemplate/content/client/components/Header.tsx
  type IHeaderProps (line 35) | interface IHeaderProps {
  function Header (line 40) | function Header({ styles, onSidebarToggle }: IHeaderProps) {

FILE: ReactTemplate/content/client/components/Sidebar.tsx
  type ISidebarProps (line 60) | interface ISidebarProps {
  function Sidebar (line 69) | function Sidebar({ vm, logoTitle, open, userName, userAvatarUrl, menus }...

FILE: ReactTemplate/content/client/components/dashboard/InfoBox.tsx
  type IInfoBoxProps (line 40) | interface IInfoBoxProps {
  function InfoBox (line 47) | function InfoBox({ icon, color, title, value }: IInfoBoxProps) {

FILE: ReactTemplate/content/client/components/dashboard/RecentActivities.tsx
  class ActivityModel (line 29) | class ActivityModel {
  type IRecentActivitiesProps (line 35) | interface IRecentActivitiesProps {
  function RecentActivities (line 40) | function RecentActivities({ vm, data }: IRecentActivitiesProps) {

FILE: ReactTemplate/content/client/components/dashboard/ServerUsage.tsx
  type IServerUsageProps (line 42) | interface IServerUsageProps {
  function ServerUsage (line 47) | function ServerUsage(props: IServerUsageProps) {

FILE: ReactTemplate/content/client/components/dashboard/Traffic.tsx
  type ITrafficProps (line 36) | interface ITrafficProps {
  function Traffic (line 40) | function Traffic(props: ITrafficProps) {

FILE: ReactTemplate/content/client/components/dashboard/Utilization.tsx
  type IUtilizationProps (line 46) | interface IUtilizationProps {
  function Utilization (line 51) | function Utilization(props: IUtilizationProps) {

FILE: ReactTemplate/content/client/components/table/InlineEdit.tsx
  type IInlineEditProps (line 6) | interface IInlineEditProps {
  class InlineEditState (line 11) | class InlineEditState {
  class InlineEdit (line 17) | class InlineEdit extends React.Component<IInlineEditProps, InlineEditSta...
    method constructor (line 20) | constructor(props: IInlineEditProps) {
    method render (line 24) | render() {

FILE: ReactTemplate/content/client/components/table/Pagination.tsx
  type IPaginationProps (line 15) | interface IPaginationProps {
  function Pagination (line 22) | function Pagination(props: IPaginationProps) {

FILE: ReactTemplate/content/client/views/App.tsx
  function App (line 6) | function App() {

FILE: ReactTemplate/content/client/views/AppLayout.tsx
  class AppLayoutModel (line 12) | class AppLayoutModel {
  type IAppLayoutProps (line 19) | interface IAppLayoutProps {
  class AppLayout (line 23) | class AppLayout extends React.Component<IAppLayoutProps, AppLayoutModel> {
    method constructor (line 27) | constructor(props: IAppLayoutProps) {
    method componentWillUnmount (line 41) | componentWillUnmount() {
    method componentDidUpdate (line 45) | componentDidUpdate(prevProps: IAppLayoutProps) {
    method render (line 49) | render() {

FILE: ReactTemplate/content/client/views/Dashboard.tsx
  class DashboardModel (line 18) | class DashboardModel {
  class Dashboard (line 31) | class Dashboard extends React.Component<any, DashboardModel> {
    method constructor (line 36) | constructor(props: any) {
    method componentWillUnmount (line 47) | componentWillUnmount() {
    method render (line 51) | render() {

FILE: ReactTemplate/content/client/views/FormPage.tsx
  class EmployeeModel (line 28) | class EmployeeModel {
  class FormPageModel (line 34) | class FormPageModel {
  class FormPageState (line 41) | class FormPageState extends FormPageModel {
  class FormPage (line 45) | class FormPage extends React.Component<any, FormPageState> {
    method constructor (line 51) | constructor(props: any) {
    method componentWillUnmount (line 58) | componentWillUnmount() {
    method render (line 62) | render() {

FILE: ReactTemplate/content/client/views/LoginPage.tsx
  type ILoginPageProps (line 46) | interface ILoginPageProps {
  function LoginPage (line 50) | function LoginPage({ onAuthenticated }: ILoginPageProps) {

FILE: ReactTemplate/content/client/views/TablePage.tsx
  class EmployeeModel (line 31) | class EmployeeModel {
  class TablePageModel (line 37) | class TablePageModel {
  class TablePageState (line 45) | class TablePageState extends TablePageModel {
  class TablePage (line 49) | class TablePage extends React.Component<any, TablePageState> {
    method constructor (line 54) | constructor(props: any) {
    method componentWillUnmount (line 60) | componentWillUnmount() {
    method render (line 64) | render() {

FILE: ReactTemplate/content/server/AuthServer.cs
  class AuthServer (line 11) | public static class AuthServer
    method AddAuthenticationServer (line 16) | public static void AddAuthenticationServer(this IServiceCollection ser...

FILE: ReactTemplate/content/server/Services/EmployeeService.cs
  type IEmployeeService (line 6) | public interface IEmployeeService
    method GetAll (line 8) | IList<EmployeeModel> GetAll();
    method GetById (line 10) | EmployeeModel GetById(int id);
    method Add (line 12) | int Add(EmployeeModel record);
    method Update (line 14) | void Update(EmployeeModel record);
    method Delete (line 16) | void Delete(int id);
  class EmployeeModel (line 19) | public class EmployeeModel
  class EmployeeService (line 28) | public class EmployeeService : IEmployeeService
    method EmployeeService (line 33) | public EmployeeService()
    method GetAll (line 39) | public IList<EmployeeModel> GetAll() => _employees;
    method GetById (line 41) | public EmployeeModel GetById(int id) => _employees.FirstOrDefault(i =>...
    method Add (line 43) | public int Add(EmployeeModel record)
    method Update (line 50) | public void Update(EmployeeModel record)
    method Delete (line 57) | public void Delete(int id) => _employees.Remove(_employees.FirstOrDefa...
    method GetEmbeddedResource (line 59) | private string GetEmbeddedResource(string resourceName)

FILE: ReactTemplate/content/server/Services/MockLiveDataService.cs
  type ILiveDataService (line 5) | public interface ILiveDataService
  class Activity (line 17) | public class Activity
  class MockLiveDataService (line 24) | public class MockLiveDataService : ILiveDataService
    method MockLiveDataService (line 52) | public MockLiveDataService(IEmployeeService employeeService)
    method GetRandomEmployee (line 112) | private EmployeeModel GetRandomEmployee(IEmployeeService employeeService)

FILE: ReactTemplate/content/server/ViewModels/AppLayout.cs
  class AppLayout (line 8) | [Authorize]
    type Route (line 11) | private enum Route
    method AppLayout (line 33) | public AppLayout(IPrincipalAccessor principalAccessor)

FILE: ReactTemplate/content/server/ViewModels/Dashboard.cs
  class Dashboard (line 8) | [Authorize]
    class Activity (line 13) | public class Activity
    method Dashboard (line 25) | public Dashboard(ILiveDataService liveDataService)
    method Dispose (line 58) | public override void Dispose()

FILE: ReactTemplate/content/server/ViewModels/Form.cs
  class Form (line 7) | [Authorize]
    class EmployeeInfo (line 12) | public class EmployeeInfo
    class SavedEmployeeInfo (line 19) | public class SavedEmployeeInfo
    method Form (line 71) | public Form(IEmployeeService employeeService)
    method LoadEmployee (line 82) | private void LoadEmployee(int id)

FILE: ReactTemplate/content/server/ViewModels/Table.cs
  class Table (line 9) | [Authorize]
    class EmployeeInfo (line 15) | public class EmployeeInfo
    method Table (line 117) | public Table(IEmployeeService employeeService)
    method Paginate (line 122) | private IEnumerable<EmployeeInfo> Paginate(IEnumerable<EmployeeInfo> e...
    method GetPageCount (line 134) | private int GetPageCount(int records) => (int)Math.Ceiling(records / (...

FILE: _archive/HelloWorld/HelloWorld.cs
  class HelloWorld (line 7) | public class HelloWorld : BaseVM
    class Person (line 9) | public class Person
    method HelloWorld (line 19) | public HelloWorld()
    method Dispose (line 28) | public override void Dispose() => _timer.Dispose();

FILE: _archive/HelloWorld/Program.cs
  class Program (line 13) | public class Program
    method Main (line 15) | public static void Main(string[] args)
    method CreateWebHostBuilder (line 20) | public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>

FILE: _archive/HelloWorld/Startup.cs
  class Startup (line 12) | public class Startup
    method ConfigureServices (line 14) | public void ConfigureServices(IServiceCollection services)
    method Configure (line 21) | public void Configure(IApplicationBuilder app)

FILE: _archive/HelloWorld/src/HelloWorld.jsx
  class HelloWorld (line 4) | class HelloWorld extends React.Component {
    method constructor (line 5) | constructor(props) {
    method render (line 15) | render() {

FILE: _archive/HelloWorld/wwwroot/bundle.js
  function hotDisposeChunk (line 2) | function hotDisposeChunk(chunkId) {
  function hotDownloadUpdateChunk (line 13) | function hotDownloadUpdateChunk(chunkId) {
  function hotDownloadManifest (line 23) | function hotDownloadManifest(requestTimeout) {
  function hotCreateRequire (line 77) | function hotCreateRequire(moduleId) {
  function hotCreateModule (line 153) | function hotCreateModule(moduleId) {
  function hotSetStatus (line 216) | function hotSetStatus(newStatus) {
  function toModuleId (line 233) | function toModuleId(id) {
  function hotCheck (line 238) | function hotCheck(apply) {
  function hotAddUpdateChunk (line 280) | function hotAddUpdateChunk(chunkId, moreModules) {
  function hotEnsureUpdateChunk (line 294) | function hotEnsureUpdateChunk(chunkId) {
  function hotUpdateDownloaded (line 304) | function hotUpdateDownloaded() {
  function hotApply (line 336) | function hotApply(options) {
  function __webpack_require__ (line 708) | function __webpack_require__(moduleId) {

FILE: _archive/LiveChart/LiveChart.cs
  class LiveChart (line 8) | public class LiveChart : BaseVM
    method LiveChart (line 13) | public LiveChart()
    method Dispose (line 28) | public override void Dispose() => _subscription.Dispose();

FILE: _archive/LiveChart/Program.cs
  class Program (line 13) | public class Program
    method Main (line 15) | public static void Main(string[] args)
    method CreateWebHostBuilder (line 20) | public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>

FILE: _archive/LiveChart/Startup.cs
  class Startup (line 12) | public class Startup
    method ConfigureServices (line 14) | public void ConfigureServices(IServiceCollection services)
    method Configure (line 21) | public void Configure(IApplicationBuilder app)

FILE: _archive/LiveChart/src/LiveChart.jsx
  class LiveChart (line 5) | class LiveChart extends React.Component {
    method constructor (line 6) | constructor(props) {
    method componentWillUnmount (line 12) | componentWillUnmount() {
    method shouldComponentUpdate (line 16) | shouldComponentUpdate(_, nextState) {
    method render (line 24) | render() {

FILE: _archive/LiveChart/wwwroot/bundle.js
  function hotDisposeChunk (line 2) | function hotDisposeChunk(chunkId) {
  function hotDownloadUpdateChunk (line 13) | function hotDownloadUpdateChunk(chunkId) {
  function hotDownloadManifest (line 23) | function hotDownloadManifest(requestTimeout) {
  function hotCreateRequire (line 77) | function hotCreateRequire(moduleId) {
  function hotCreateModule (line 153) | function hotCreateModule(moduleId) {
  function hotSetStatus (line 216) | function hotSetStatus(newStatus) {
  function toModuleId (line 233) | function toModuleId(id) {
  function hotCheck (line 238) | function hotCheck(apply) {
  function hotAddUpdateChunk (line 280) | function hotAddUpdateChunk(chunkId, moreModules) {
  function hotEnsureUpdateChunk (line 294) | function hotEnsureUpdateChunk(chunkId) {
  function hotUpdateDownloaded (line 304) | function hotUpdateDownloaded() {
  function hotApply (line 336) | function hotApply(options) {
  function __webpack_require__ (line 708) | function __webpack_require__(moduleId) {

FILE: _archive/ReactTemplateTS/content/client/auth.tsx
  class Auth (line 1) | class Auth {
    method signIn (line 4) | signIn(username, password) {
    method signOut (line 20) | signOut() {
    method getAccessToken (line 25) | getAccessToken() {
    method hasAccessToken (line 29) | hasAccessToken() {

FILE: _archive/ReactTemplateTS/content/client/components/Header.tsx
  type Props (line 15) | type Props = {

FILE: _archive/ReactTemplateTS/content/client/components/Sidebar.tsx
  type Props (line 10) | type Props = {

FILE: _archive/ReactTemplateTS/content/client/components/dashboard/InfoBox.tsx
  type Props (line 6) | type Props = {
  class InfoBox (line 12) | class InfoBox extends React.Component<Props, any> {
    method render (line 13) | render() {

FILE: _archive/ReactTemplateTS/content/client/components/table/InlineEdit.tsx
  type State (line 7) | type State = {
  type Props (line 12) | type Props = {
  class InlineEdit (line 16) | class InlineEdit extends React.Component<Props, State> {
    method constructor (line 17) | constructor(props) {
    method render (line 25) | render() {

FILE: _archive/ReactTemplateTS/content/client/views/App.tsx
  type State (line 6) | type State = {
  type Props (line 9) | type Props = {
  class App (line 12) | class App extends React.Component<any, any> {
    method constructor (line 13) | constructor(props) {
    method render (line 18) | render(): JSX.Element {

FILE: _archive/ReactTemplateTS/content/client/views/AppLayout.tsx
  type State (line 10) | type State = {};
  type Props (line 11) | type Props = {
  class AppLayout (line 17) | class AppLayout extends React.Component<any, any> {
    method constructor (line 19) | constructor(props) {
    method componentWillUnmount (line 34) | componentWillUnmount() {
    method componentWillReceiveProps (line 38) | componentWillReceiveProps(nextProps) {
    method render (line 44) | render() {

FILE: _archive/ReactTemplateTS/content/client/views/Dashboard.tsx
  type State (line 17) | type State = {
  type Props (line 29) | type Props = {};
  class Dashboard (line 30) | class Dashboard extends React.Component<any, State> {
    method constructor (line 33) | constructor(props) {
    method componentWillUnmount (line 53) | componentWillUnmount() {
    method render (line 57) | render() {

FILE: _archive/ReactTemplateTS/content/client/views/FormPage.tsx
  type State (line 14) | type State = {
  type Props (line 21) | type Props = {};
  class FormPage (line 22) | class FormPage extends React.Component<Props, State> {
    method constructor (line 26) | constructor(props) {
    method componentWillUnmount (line 40) | componentWillUnmount() {
    method render (line 44) | render() {

FILE: _archive/ReactTemplateTS/content/client/views/LoginPage.tsx
  type Props (line 9) | type Props = {
  type State (line 12) | type State = {
  class LoginPage (line 17) | class LoginPage extends React.Component<Props, State> {
    method constructor (line 18) | constructor(props) {
    method render (line 23) | render() {

FILE: _archive/ReactTemplateTS/content/client/views/TablePage.tsx
  type Props (line 18) | type Props = {};
  type State (line 19) | type State = {
  class TablePage (line 26) | class TablePage extends React.Component<Props, State> {
    method constructor (line 29) | constructor(state, props) {
    method componentWillUnmount (line 43) | componentWillUnmount() {
    method render (line 47) | render() {

FILE: _archive/ReactTemplateTS/content/server/AuthServer.cs
  class AuthServer (line 13) | public static class AuthServer
    method AddAuthenticationServer (line 18) | public static void AddAuthenticationServer(this IServiceCollection ser...

FILE: _archive/ReactTemplateTS/content/server/Program.cs
  class Program (line 13) | public class Program
    method Main (line 15) | public static void Main(string[] args)
    method BuildWebHost (line 20) | public static IWebHost BuildWebHost(string[] args) =>

FILE: _archive/ReactTemplateTS/content/server/Services/EmployeeService.cs
  type IEmployeeService (line 10) | public interface IEmployeeService
    method GetAll (line 12) | IList<EmployeeModel> GetAll();
    method GetById (line 13) | EmployeeModel GetById(int id);
    method Add (line 14) | int Add(EmployeeModel record);
    method Update (line 15) | void Update(EmployeeModel record);
    method Delete (line 16) | void Delete(int id);
  class EmployeeModel (line 19) | public class EmployeeModel
  class EmployeeService (line 28) | public class EmployeeService : IEmployeeService
    method EmployeeService (line 33) | public EmployeeService()
    method GetAll (line 39) | public IList<EmployeeModel> GetAll() => _employees;
    method GetById (line 41) | public EmployeeModel GetById(int id) => _employees.FirstOrDefault(i =>...
    method Add (line 43) | public int Add(EmployeeModel record)
    method Update (line 50) | public void Update(EmployeeModel record)
    method Delete (line 57) | public void Delete(int id) => _employees.Remove(_employees.FirstOrDefa...
    method GetEmbeddedResource (line 59) | private string GetEmbeddedResource(string resourceName)

FILE: _archive/ReactTemplateTS/content/server/Services/MockLiveDataService.cs
  type ILiveDataService (line 8) | public interface ILiveDataService
  class Activity (line 20) | public class Activity
  class MockLiveDataService (line 27) | public class MockLiveDataService : ILiveDataService
    method MockLiveDataService (line 55) | public MockLiveDataService(IEmployeeService employeeService)
    method GetRandomEmployee (line 115) | private EmployeeModel GetRandomEmployee(IEmployeeService employeeService)

FILE: _archive/ReactTemplateTS/content/server/Startup.cs
  class Startup (line 15) | public class Startup
    method ConfigureServices (line 17) | public void ConfigureServices(IServiceCollection services)
    method Configure (line 29) | public void Configure(IApplicationBuilder app)

FILE: _archive/ReactTemplateTS/content/server/ViewModels/AppLayout.cs
  class AppLayout (line 10) | [Authorize]
    type Route (line 13) | private enum Route
    method AppLayout (line 35) | public AppLayout(IPrincipalAccessor principalAccessor)

FILE: _archive/ReactTemplateTS/content/server/ViewModels/Dashboard.cs
  class Dashboard (line 11) | [Authorize]
    class Activity (line 16) | public class Activity
    method Dashboard (line 28) | public Dashboard(ILiveDataService liveDataService)
    method Dispose (line 61) | public override void Dispose()

FILE: _archive/ReactTemplateTS/content/server/ViewModels/Form.cs
  class Form (line 10) | [Authorize]
    class EmployeeInfo (line 15) | public class EmployeeInfo
    class SavedEmployeeInfo (line 22) | public class SavedEmployeeInfo
    method Form (line 74) | public Form(IEmployeeService employeeService)
    method LoadEmployee (line 85) | private void LoadEmployee(int id)

FILE: _archive/ReactTemplateTS/content/server/ViewModels/Table.cs
  class Table (line 9) | [Authorize]
    class EmployeeInfo (line 15) | public class EmployeeInfo
    method Table (line 116) | public Table(IEmployeeService employeeService)
    method Paginate (line 121) | private IEnumerable<EmployeeInfo> Paginate(IEnumerable<EmployeeInfo> e...
    method GetPageCount (line 133) | private int GetPageCount(int records) => (int)Math.Ceiling(records / (...

FILE: _archive/Routing/DotNetify.ServerSideRender.cs
  class ServerSideRender (line 9) | public static class ServerSideRender
    method GetInitialStates (line 11) | public static string GetInitialStates(ref string path, Type entryVMType)

FILE: _archive/Routing/Program.cs
  class Program (line 6) | public class Program
    method Main (line 8) | public static void Main(string[] args)
    method CreateWebHostBuilder (line 13) | public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>

FILE: _archive/Routing/Startup.cs
  class Startup (line 12) | public class Startup
    method ConfigureServices (line 14) | public void ConfigureServices(IServiceCollection services)
    method Configure (line 22) | public void Configure(IApplicationBuilder app, INodeServices nodeServi...

FILE: _archive/Routing/ViewModels/Index.cs
  class Index (line 8) | public class Index : BaseVM, IRoutable
    method Index (line 19) | public Index()

FILE: _archive/Routing/ViewModels/Page1.cs
  class Page1 (line 8) | public class Page1 : BaseVM, IRoutable
    method Page1 (line 16) | public Page1()

FILE: _archive/Routing/ViewModels/Page2.cs
  class Page2 (line 9) | public class Page2 : BaseVM, IRoutable
    method Page2 (line 19) | public Page2()
  class Page2Item (line 29) | public class Page2Item : BaseVM, IRoutable
    method Page2Item (line 34) | public Page2Item()

FILE: _archive/Routing/src/Index.js
  function defineProperties (line 7) | function defineProperties(target, props) { for (var i = 0; i < props.len...
  function _interopRequireDefault (line 11) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _classCallCheck (line 13) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function _inherits (line 15) | function _inherits(subClass, superClass) { if (typeof superClass !== 'fu...
  function Index (line 30) | function Index(props) {
  function Home (line 84) | function Home() {

FILE: _archive/Routing/src/Index.jsx
  class Index (line 5) | class Index extends React.Component {
    method constructor (line 6) | constructor(props) {
    method componentWillUnmount (line 13) | componentWillUnmount() {
    method render (line 16) | render() {
  class Home (line 33) | class Home extends React.Component {
    method render (line 34) | render() {

FILE: _archive/Routing/wwwroot/Page1.js
  function defineProperties (line 3) | function defineProperties(target, props) { for (var i = 0; i < props.len...
  function _classCallCheck (line 7) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function _inherits (line 9) | function _inherits(subClass, superClass) { if (typeof superClass !== "fu...
  function Page1 (line 14) | function Page1(props) {
  function Page1A (line 81) | function Page1A() {
  function Page1B (line 113) | function Page1B() {

FILE: _archive/Routing/wwwroot/Page1.jsx
  class Page1 (line 1) | class Page1 extends React.Component {
    method constructor (line 2) | constructor(props) {
    method componentWillUnmount (line 8) | componentWillUnmount() {
    method render (line 12) | render() {
  class Page1A (line 36) | class Page1A extends React.Component {
    method render (line 37) | render() {
  class Page1B (line 47) | class Page1B extends React.Component {
    method render (line 48) | render() {

FILE: _archive/Routing/wwwroot/Page2.js
  function defineProperties (line 3) | function defineProperties(target, props) { for (var i = 0; i < props.len...
  function _classCallCheck (line 7) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function _inherits (line 9) | function _inherits(subClass, superClass) { if (typeof superClass !== "fu...
  function Page2 (line 14) | function Page2(props) {
  function Page2Item (line 104) | function Page2Item(props) {

FILE: _archive/Routing/wwwroot/Page2.jsx
  class Page2 (line 1) | class Page2 extends React.Component {
    method constructor (line 2) | constructor(props) {
    method componentWillUnmount (line 22) | componentWillUnmount() {
    method render (line 26) | render() {
  class Page2Item (line 63) | class Page2Item extends React.Component {
    method constructor (line 64) | constructor(props) {
    method componentWillUnmount (line 69) | componentWillUnmount() {
    method render (line 72) | render() {

FILE: _archive/Routing/wwwroot/bundle.js
  function t (line 1) | function t(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{...
  function n (line 1) | function n(){throw new Error("setTimeout has not been defined")}
  function o (line 1) | function o(){throw new Error("clearTimeout has not been defined")}
  function r (line 1) | function r(e){if(c===setTimeout)return setTimeout(e,0);if((c===n||!c)&&s...
  function i (line 1) | function i(e){if(d===clearTimeout)return clearTimeout(e);if((d===o||!d)&...
  function a (line 1) | function a(){m&&f&&(m=!1,f.length?h=f.concat(h):v=-1,h.length&&s())}
  function s (line 1) | function s(){if(!m){var e=r(a);m=!0;for(var t=h.length;t;){for(f=h,h=[];...
  function u (line 1) | function u(e,t){this.fun=e,this.array=t}
  function l (line 1) | function l(){}
  function n (line 1) | function n(e,t,n,r,i,a,s,u){if(o(t),!e){var l;if(void 0===t)l=new Error(...
  function o (line 1) | function o(e){for(var t=arguments.length-1,n="Minified React error #"+e+...
  function o (line 1) | function o(e){return e&&e.__esModule?e:{default:e}}
  function e (line 1) | function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.en...
  function o (line 1) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 1) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 1) | function o(e){if(null===e||void 0===e)throw new TypeError("Object.assign...
  function r (line 1) | function r(){try{if(!Object.assign)return!1;var e=new String("abc");if(e...
  function o (line 6) | function o(e,t){return 1===e.nodeType&&e.getAttribute(m)===String(t)||8=...
  function r (line 6) | function r(e){for(var t;t=e._renderedComponent;)e=t;return e}
  function i (line 6) | function i(e,t){var n=r(e);n._hostNode=t,t[y]=n}
  function a (line 6) | function a(e){var t=e._hostNode;t&&(delete t[y],e._hostNode=null)}
  function s (line 6) | function s(e,n){if(!(e._flags&v.hasCachedChildNodes)){var a=e._renderedC...
  function u (line 6) | function u(e){if(e[y])return e[y];for(var t=[];!e[y];){if(t.push(e),!e.p...
  function l (line 6) | function l(e){var t=u(e);return null!=t&&t._hostNode===e?t:null}
  function c (line 6) | function c(e){if(void 0===e._hostNode&&("production"!==t.env.NODE_ENV?h(...
  function o (line 6) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 6) | function o(e){var t=Function.prototype.toString,n=Object.prototype.hasOw...
  function r (line 6) | function r(e){var t=l(e);if(t){var n=t.childIDs;c(e),n.forEach(r)}}
  function i (line 6) | function i(e,t,n){return"\n    in "+(e||"Unknown")+(t?" (at "+t.fileName...
  function a (line 6) | function a(e){return null==e?"#empty":"string"==typeof e||"number"==type...
  function s (line 6) | function s(e){var n,o=N.getDisplayName(e),r=N.getElement(e),a=N.getOwner...
  function o (line 6) | function o(e){return function(){return e}}
  function o (line 6) | function o(){O.ReactReconcileTransaction&&w||("production"!==t.env.NODE_...
  function r (line 6) | function r(){this.reinitializeTransaction(),this.dirtyComponentsLength=n...
  function i (line 6) | function i(e,t,n,r,i,a){return o(),w.batchedUpdates(e,t,n,r,i,a)}
  function a (line 6) | function a(e,t){return e._mountOrder-t._mountOrder}
  function s (line 6) | function s(e){var n=e.dirtyComponentsLength;n!==g.length&&("production"!...
  function u (line 6) | function u(e){if(o(),!w.isBatchingUpdates)return void w.batchedUpdates(u...
  function l (line 6) | function l(e,n){w.isBatchingUpdates||("production"!==t.env.NODE_ENV?y(!1...
  function o (line 6) | function o(e,n,o,r){"production"!==t.env.NODE_ENV&&(delete this.nativeEv...
  function r (line 6) | function r(e,n){function o(e){return i(a?"setting the method":"setting t...
  function o (line 6) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 6) | function o(e,t){return(e&t)===t}
  function o (line 6) | function o(e){if("production"!==t.env.NODE_ENV&&f.call(e,"ref")){var n=O...
  function r (line 6) | function r(e){if("production"!==t.env.NODE_ENV&&f.call(e,"key")){var n=O...
  function i (line 6) | function i(e,n){var o=function(){s||(s=!0,"production"!==t.env.NODE_ENV&...
  function a (line 6) | function a(e,n){var o=function(){u||(u=!0,"production"!==t.env.NODE_ENV&...
  function o (line 6) | function o(e){for(var t=arguments.length-1,n="Minified React error #"+e+...
  function o (line 6) | function o(e,t,n){return n?[e,t]:e}
  function o (line 6) | function o(e){if(v){var t=e.node,n=e.children;if(n.length)for(var o=0;o<...
  function r (line 6) | function r(e,t){e.parentNode.replaceChild(t.node,e),o(t)}
  function i (line 6) | function i(e,t){v?e.children.push(t):e.node.appendChild(t.node)}
  function a (line 6) | function a(e,t){v?e.html=t:d(e.node,t)}
  function s (line 6) | function s(e,t){v?e.text=t:f(e.node,t)}
  function u (line 6) | function u(){return this.node.nodeName}
  function l (line 6) | function l(e){return{node:e,children:[],html:null,text:null,toString:u}}
  function o (line 6) | function o(){r.attachRefs(this,this._currentElement)}
  function o (line 6) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 6) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 6) | function o(e,t){return e===t?0!==e||0!==t||1/e==1/t:e!==e&&t!==t}
  function r (line 6) | function r(e,t){if(o(e,t))return!0;if("object"!=typeof e||null===e||"obj...
  function o (line 6) | function o(e){return"button"===e||"input"===e||"select"===e||"textarea"=...
  function r (line 6) | function r(e,t,n){switch(e){case"onClick":case"onClickCapture":case"onDo...
  function o (line 6) | function o(e,t,n){var o=t.dispatchConfig.phasedRegistrationNames[n];retu...
  function r (line 6) | function r(e,n,r){"production"!==t.env.NODE_ENV&&"production"!==t.env.NO...
  function i (line 6) | function i(e){e&&e.dispatchConfig.phasedRegistrationNames&&h.traverseTwo...
  function a (line 6) | function a(e){if(e&&e.dispatchConfig.phasedRegistrationNames){var t=e._t...
  function s (line 6) | function s(e,t,n){if(n&&n.dispatchConfig.registrationName){var o=n.dispa...
  function u (line 6) | function u(e){e&&e.dispatchConfig.registrationName&&s(e._targetInst,null...
  function l (line 6) | function l(e){v(e,i)}
  function c (line 6) | function c(e){v(e,a)}
  function d (line 6) | function d(e,t,n,o){h.traverseEnterLeave(n,o,s,e,t)}
  function p (line 6) | function p(e){v(e,u)}
  function o (line 6) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
  function o (line 6) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 6) | function o(){if(u)for(var e in l){var n=l[e],o=u.indexOf(e);if(o>-1||("p...
  function r (line 6) | function r(e,n,o){c.eventNameDispatchConfigs.hasOwnProperty(o)&&("produc...
  function i (line 6) | function i(e,n,o){if(c.registrationNameModules[e]&&("production"!==t.env...
  function o (line 6) | function o(e){return Object.prototype.hasOwnProperty.call(e,m)||(e[m]=f+...
  function o (line 6) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
  function o (line 6) | function o(e){var t=""+e,n=i.exec(t);if(!n)return t;var o,r="",a=0,s=0;f...
  function r (line 6) | function r(e){return"boolean"==typeof e||"number"==typeof e?""+e:o(e)}
  function o (line 6) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 6) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 6) | function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a ...
  function i (line 6) | function i(e,t){if(!e)throw new ReferenceError("this hasn't been initial...
  function a (line 6) | function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("S...
  function e (line 6) | function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.en...
  function t (line 6) | function t(e){r(this,t);var n=i(this,(t.__proto__||Object.getPrototypeOf...
  function t (line 6) | function t(){return r(this,t),i(this,(t.__proto__||Object.getPrototypeOf...
  function o (line 6) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 6) | function o(e){return"string"==typeof e&&r.test(e)}
  function o (line 6) | function o(e){return e.charAt(0).toUpperCase()+e.slice(1)}
  function n (line 6) | function n(e){if(e&&"object"==typeof e){var t=e.which||e.keyCode||e.char...
  function o (line 9) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 9) | function r(){if(!A){var e=document.createElement("style");e.innerHTML="\...
  function i (line 9) | function i(){R||(N.default.on(window,"keydown",function(e){L="tab"===(0,...
  function t (line 9) | function t(){var e,n,o,r;(0,f.default)(this,t);for(var i=arguments.lengt...
  function o (line 9) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 9) | function r(e,t,n){return e<t?t:e>n?n:e}
  function i (line 9) | function i(e){var t=e.type,n=e.values;if(t.indexOf("rgb")>-1)for(var o=0...
  function a (line 9) | function a(e){if(4===e.length){for(var t="#",n=1;n<e.length;n++)t+=e.cha...
  function s (line 9) | function s(t){if("#"===t.charAt(0))return s(a(t));var n=t.indexOf("(");"...
  function u (line 9) | function u(e,t){var n=l(e),o=l(t),r=(Math.max(n,o)+.05)/(Math.min(n,o)+....
  function l (line 9) | function l(e){if(e=s(e),e.type.indexOf("rgb")>-1){var t=e.values.map(fun...
  function c (line 9) | function c(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[...
  function d (line 9) | function d(e,t){return e=s(e),t=r(t,0,1),"rgb"!==e.type&&"hsl"!==e.type|...
  function p (line 9) | function p(e,t){if(e=s(e),t=r(t,0,1),e.type.indexOf("hsl")>-1)e.values[2...
  function f (line 9) | function f(e,t){if(e=s(e),t=r(t,0,1),e.type.indexOf("hsl")>-1)e.values[2...
  function o (line 9) | function o(e,t){return Array.isArray(t)&&(t=t[1]),t?t.nextSibling:e.firs...
  function r (line 9) | function r(e,t,n){c.insertTreeBefore(e,t,n)}
  function i (line 9) | function i(e,t,n){Array.isArray(t)?s(e,t[0],t[1],n):y(e,t,n)}
  function a (line 9) | function a(e,t){if(Array.isArray(t)){var n=t[1];t=t[0],u(e,t,n),e.remove...
  function s (line 9) | function s(e,t,n,o){for(var r=t;;){var i=r.nextSibling;if(y(e,r,o),r===n...
  function u (line 9) | function u(e,t,n){for(;;){var o=t.nextSibling;if(o===n)break;e.removeChi...
  function l (line 9) | function l(e,n,o){var r=e.parentNode,i=e.nextSibling;i===n?o&&y(r,docume...
  function o (line 9) | function o(e){return"topMouseUp"===e||"topTouchEnd"===e||"topTouchCancel...
  function r (line 9) | function r(e){return"topMouseMove"===e||"topTouchMove"===e}
  function i (line 9) | function i(e){return"topMouseDown"===e||"topTouchStart"===e}
  function a (line 9) | function a(e,t,n,o){var r=e.type||"unknown-event";e.currentTarget=_.getN...
  function s (line 9) | function s(e,n){var o=e._dispatchListeners,r=e._dispatchInstances;if("pr...
  function u (line 9) | function u(e){var n=e._dispatchListeners,o=e._dispatchInstances;if("prod...
  function l (line 9) | function l(e){var t=u(e);return e._dispatchInstances=null,e._dispatchLis...
  function c (line 9) | function c(e){"production"!==t.env.NODE_ENV&&h(e);var n=e._dispatchListe...
  function d (line 9) | function d(e){return!!e._dispatchListeners}
  function o (line 9) | function o(e){var t={"=":"=0",":":"=2"};return"$"+(""+e).replace(/[=:]/g...
  function r (line 9) | function r(e){var t=/(=0|=2)/g,n={"=0":"=","=2":":"};return(""+("."===e[...
  function o (line 9) | function o(e){null!=e.checkedLink&&null!=e.valueLink&&("production"!==t....
  function r (line 9) | function r(e){o(e),(null!=e.value||null!=e.onChange)&&("production"!==t....
  function i (line 9) | function i(e){o(e),(null!=e.checked||null!=e.onChange)&&("production"!==...
  function a (line 9) | function a(e){if(e){var t=e.getName();if(t)return" Check the render meth...
  function n (line 9) | function n(e,t,n){try{t(n)}catch(e){null===o&&(o=e)}}
  function o (line 9) | function o(e){c.enqueueUpdate(e)}
  function r (line 9) | function r(e){var t=typeof e;if("object"!==t)return t;var n=e.constructo...
  function i (line 9) | function i(e,n){var o=u.get(e);if(!o){if("production"!==t.env.NODE_ENV){...
  function o (line 9) | function o(e){var t,n=e.keyCode;return"charCode"in e?0===(t=e.charCode)&...
  function o (line 9) | function o(e){var t=this,n=t.nativeEvent;if(n.getModifierState)return n....
  function r (line 9) | function r(e){return o}
  function o (line 9) | function o(e){var t=e.target||e.srcElement||window;return t.correspondin...
  function o (line 23) | function o(e,t){if(!i.canUseDOM||t&&!("addEventListener"in document))ret...
  function o (line 23) | function o(e,t){var n=null===e||!1===e,o=null===t||!1===t;if(n||o)return...
  function o (line 23) | function o(e,t,n){this.props=e,this.context=t,this.refs=s,this.updater=n...
  function o (line 23) | function o(e,n){if("production"!==t.env.NODE_ENV){var o=e.constructor;"p...
  function o (line 23) | function o(e){var t=e&&(r&&e[r]||e[i]);if("function"==typeof t)return t}
  function n (line 23) | function n(e){return(n="function"==typeof Symbol&&"symbol"==typeof Symbo...
  function o (line 23) | function o(t){return"function"==typeof Symbol&&"symbol"===n(Symbol.itera...
  function o (line 23) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 23) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 23) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 23) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 23) | function r(e){return(0,a.default)(e)}
  function e (line 30) | function e(){throw new Error("Dynamic requires are not currently support...
  function o (line 30) | function o(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.ca...
  function r (line 30) | function r(e,t){return t={exports:{}},e(t,t.exports),t.exports}
  function i (line 30) | function i(e,t){function n(){this.constructor=e}C(e,t),e.prototype=null=...
  function a (line 30) | function a(e,t){var n={};for(var o in e)Object.prototype.hasOwnProperty....
  function s (line 30) | function s(e,t,n,o){var r,i=arguments.length,a=i<3?t:null===o?o=Object.g...
  function u (line 30) | function u(e,t){return function(n,o){t(n,o,e)}}
  function l (line 30) | function l(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect....
  function c (line 30) | function c(e,t,n,o){return new(n||(n=Promise))(function(r,i){function a(...
  function d (line 30) | function d(e,t){function n(e){return function(t){return o([e,t])}}functi...
  function p (line 30) | function p(e,t){for(var n in e)t.hasOwnProperty(n)||(t[n]=e[n])}
  function f (line 30) | function f(e){var t="function"==typeof Symbol&&e[Symbol.iterator],n=0;re...
  function h (line 30) | function h(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!...
  function m (line 30) | function m(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(h(argume...
  function v (line 30) | function v(e){return this instanceof v?(this.v=e,this):new v(e)}
  function y (line 30) | function y(e,t,n){function o(e){c[e]&&(l[e]=function(t){return new Promi...
  function g (line 30) | function g(e){function t(t,r){e[t]&&(n[t]=function(n){return(o=!o)?{valu...
  function b (line 30) | function b(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.async...
  function _ (line 30) | function _(e,t){return Object.defineProperty?Object.defineProperty(e,"ra...
  function E (line 30) | function E(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n ...
  function w (line 30) | function w(e){return e&&e.__esModule?e:{default:e}}
  function t (line 37) | function t(e){var t=typeof e;return null!==e&&("object"===t||"function"=...
  function o (line 37) | function o(e){return"function"==typeof e}
  function r (line 37) | function r(e){$=e}
  function i (line 37) | function i(e){Y=e}
  function a (line 37) | function a(){return function(){return n.nextTick(d)}}
  function s (line 37) | function s(){return void 0!==K?function(){K(d)}:c()}
  function u (line 37) | function u(){var e=0,t=new J(d),n=document.createTextNode("");return t.o...
  function l (line 37) | function l(){var e=new MessageChannel;return e.port1.onmessage=d,functio...
  function c (line 37) | function c(){var e=setTimeout;return function(){return e(d,1)}}
  function d (line 37) | function d(){for(var e=0;e<z;e+=2){(0,ee[e])(ee[e+1]),ee[e]=void 0,ee[e+...
  function p (line 37) | function p(){try{var t=e,n=t("vertx");return K=n.runOnLoop||n.runOnConte...
  function f (line 37) | function f(e,t){var n=this,o=new this.constructor(m);void 0===o[ne]&&R(o...
  function h (line 37) | function h(e){var t=this;if(e&&"object"==typeof e&&e.constructor===t)ret...
  function m (line 37) | function m(){}
  function v (line 37) | function v(){return new TypeError("You cannot resolve a promise with its...
  function y (line 37) | function y(){return new TypeError("A promises callback cannot return tha...
  function g (line 37) | function g(e){try{return e.then}catch(e){return ae.error=e,ae}}
  function b (line 37) | function b(e,t,n,o){try{e.call(t,n,o)}catch(e){return e}}
  function _ (line 37) | function _(e,t,n){Y(function(e){var o=!1,r=b(n,t,function(n){o||(o=!0,t!...
  function E (line 37) | function E(e,t){t._state===re?T(e,t._result):t._state===ie?N(e,t._result...
  function w (line 37) | function w(e,t,n){t.constructor===e.constructor&&n===f&&t.constructor.re...
  function C (line 37) | function C(e,n){e===n?N(e,v()):t(n)?w(e,n,g(n)):T(e,n)}
  function k (line 37) | function k(e){e._onerror&&e._onerror(e._result),S(e)}
  function T (line 37) | function T(e,t){e._state===oe&&(e._result=t,e._state=re,0!==e._subscribe...
  function N (line 37) | function N(e,t){e._state===oe&&(e._state=ie,e._result=t,Y(k,e))}
  function O (line 37) | function O(e,t,n,o){var r=e._subscribers,i=r.length;e._onerror=null,r[i]...
  function S (line 37) | function S(e){var t=e._subscribers,n=e._state;if(0!==t.length){for(var o...
  function D (line 37) | function D(){this.error=null}
  function M (line 37) | function M(e,t){try{return e(t)}catch(e){return se.error=e,se}}
  function P (line 37) | function P(e,t,n,r){var i=o(n),a=void 0,s=void 0,u=void 0,l=void 0;if(i)...
  function I (line 37) | function I(e,t){try{t(function(t){C(e,t)},function(t){N(e,t)})}catch(t){...
  function A (line 37) | function A(){return ue++}
  function R (line 37) | function R(e){e[ne]=ue++,e._state=void 0,e._result=void 0,e._subscribers...
  function L (line 37) | function L(){return new Error("Array Methods must be provided an Array")}
  function L (line 37) | function L(){return new Error("Array Methods must be provided an Array")}
  function j (line 37) | function j(e){return new le(this,e).promise}
  function F (line 37) | function F(e){var t=this;return new t(q(e)?function(n,o){for(var r=e.len...
  function V (line 37) | function V(e){var t=this,n=new t(m);return N(n,e),n}
  function W (line 37) | function W(){throw new TypeError("You must pass a resolver function as t...
  function B (line 37) | function B(){throw new TypeError("Failed to construct 'Promise': Please ...
  function U (line 37) | function U(){var e=void 0;if(void 0!==x)e=x;else if("undefined"!=typeof ...
  function e (line 37) | function e(e,t){this._instanceConstructor=e,this.promise=new e(m),this.p...
  function e (line 37) | function e(t){this[ne]=A(),this._result=this._state=void 0,this._subscri...
  function t (line 37) | function t(t,n){var o=this.constructor,r=this,i=o.prototype;return r=e.c...
  function t (line 37) | function t(t){var n=this.constructor;void 0===t&&(t="A timeout occurred....
  function e (line 37) | function e(e,t,n){this.statusCode=e,this.statusText=t,this.content=n}
  function e (line 37) | function e(){}
  function t (line 37) | function t(t){var n=e.call(this)||this;return n.logger=t,n}
  function e (line 37) | function e(){}
  function e (line 37) | function e(){}
  function e (line 37) | function e(){}
  function n (line 37) | function n(e,t){var n=null;return e instanceof ArrayBuffer?(n="Binary da...
  function o (line 37) | function o(e){var t=new Uint8Array(e),n="";return t.forEach(function(e){...
  function r (line 37) | function r(e,t,o,r,i,a,s){return T.__awaiter(this,void 0,void 0,function...
  function i (line 37) | function i(e){return void 0===e?new l(O.LogLevel.Information):null===e?I...
  function e (line 37) | function e(){}
  function e (line 37) | function e(e){this.observers=[],this.cancelCallback=e}
  function e (line 37) | function e(e,t){this.subject=e,this.observer=t}
  function e (line 37) | function e(e){this.minimumLogLevel=e}
  function e (line 37) | function e(e,t,o){var r=this;A.Arg.isRequired(e,"connection"),A.Arg.isRe...
  function e (line 37) | function e(){this.isAborted=!1}
  function e (line 37) | function e(e,t,o,r,i){this.httpClient=e,this.accessTokenFactory=t||funct...
  function e (line 37) | function e(e,t,n,o){this.httpClient=e,this.accessTokenFactory=t||functio...
  function e (line 37) | function e(e,t,n){this.logger=t,this.accessTokenFactory=e||function(){re...
  function n (line 37) | function n(e,t){return!e||0!=(t&e)}
  function e (line 37) | function e(e,t){void 0===t&&(t={}),this.features={},A.Arg.isRequired(e,"...
  function e (line 37) | function e(){this.name=n,this.version=1,this.transferFormat=L.TransferFo...
  function n (line 37) | function n(e){return void 0!==e.log}
  function e (line 37) | function e(){}
  function o (line 37) | function o(e){try{e.focus()}catch(e){}}
  function o (line 37) | function o(e){if(void 0===(e=e||("undefined"!=typeof document?document:v...
  function o (line 37) | function o(e,t){-1===e.indexOf(t)&&e.push(t)}
  function r (line 37) | function r(e,t){if(Array.isArray(t))for(var n=0,r=t.length;n<r;++n)o(e,t...
  function o (line 37) | function o(e){return e instanceof Object&&!Array.isArray(e)}
  function o (line 37) | function o(e,t,n,o,r){for(var i=0,a=e.length;i<a;++i){var s=e[i](t,n,o,r...
  function o (line 37) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 37) | function o(e){return e&&e.__esModule?e:{default:e}}
  function t (line 37) | function t(){return(0,d.default)(this,t),(0,m.default)(this,(t.__proto__...
  function o (line 37) | function o(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}
  function o (line 37) | function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a ...
  function e (line 37) | function e(t){o(this,e),this._callbacks=null,this._contexts=null,this._a...
  function o (line 37) | function o(e){return!!p.hasOwnProperty(e)||!d.hasOwnProperty(e)&&(c.test...
  function r (line 37) | function r(e,t){return null==t||e.hasBooleanValue&&!t||e.hasNumericValue...
  function o (line 37) | function o(){if(this._rootNodeID&&this._wrapperState.pendingUpdate){this...
  function r (line 37) | function r(e){if(e){var t=e.getName();if(t)return" Check the render meth...
  function i (line 37) | function i(e,n){var o=e._currentElement._owner;l.checkPropTypes("select"...
  function a (line 37) | function a(e,t,n){var o,r,i=c.getNodeFromInstance(e).options;if(t){for(o...
  function s (line 37) | function s(e){var t=this._currentElement.props,n=l.executeOnChange(t,e);...
  function o (line 37) | function o(e){return u||("production"!==t.env.NODE_ENV?s(!1,"There is no...
  function r (line 37) | function r(e){return new l(e)}
  function i (line 37) | function i(e){return e instanceof l}
  function o (line 37) | function o(e){return i(document.documentElement,e)}
  function o (line 37) | function o(e,t){for(var n=Math.min(e.length,t.length),o=0;o<n;o++)if(e.c...
  function r (line 37) | function r(e){return e?e.nodeType===W?e.documentElement:e.firstChild:null}
  function i (line 37) | function i(e){return e.getAttribute&&e.getAttribute(j)||""}
  function a (line 37) | function a(e,t,n,o,r){var i;if(C.logTopLevelRenders){var a=e._currentEle...
  function s (line 37) | function s(e,t,n,o){var r=D.ReactReconcileTransaction.getPooled(!n&&x.us...
  function u (line 37) | function u(e,n,o){for("production"!==t.env.NODE_ENV&&T.debugTool.onBegin...
  function l (line 37) | function l(e){var t=r(e);if(t){var n=E.getInstanceFromNode(t);return!(!n...
  function c (line 37) | function c(e){var t=r(e);return!(!t||!p(t)||E.getInstanceFromNode(t))}
  function d (line 37) | function d(e){return!(!e||e.nodeType!==V&&e.nodeType!==W&&e.nodeType!==B)}
  function p (line 37) | function p(e){return d(e)&&(e.hasAttribute(F)||e.hasAttribute(j))}
  function f (line 37) | function f(e){var t=r(e),n=t&&E.getInstanceFromNode(t);return n&&!n._hos...
  function h (line 37) | function h(e){var t=f(e);return t?t._hostContainerInfo._topLevelWrapper:...
  function o (line 37) | function o(e,n){return null==n&&("production"!==t.env.NODE_ENV?i(!1,"acc...
  function o (line 37) | function o(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)}
  function o (line 37) | function o(e){for(var t;(t=e._renderedNodeType)===r.COMPOSITE;)e=e._rend...
  function o (line 37) | function o(){return!i&&r.canUseDOM&&(i="textContent"in document.document...
  function o (line 37) | function o(e){if(e){var t=e.getName();if(t)return" Check the render meth...
  function r (line 37) | function r(e){return"function"==typeof e&&void 0!==e.prototype&&"functio...
  function i (line 37) | function i(e,n){var s;if(null===e||!1===e)s=l.create(i);else if("object"...
  function o (line 37) | function o(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input...
  function o (line 37) | function o(e,t){return e&&"object"==typeof e&&null!=e.key?d.escape(e.key...
  function r (line 37) | function r(e,n,i,v){var y=typeof e;if("undefined"!==y&&"boolean"!==y||(e...
  function i (line 37) | function i(e,t,n){return null==e?0:r(e,"",t,n)}
  function o (line 37) | function o(e){return e&&"object"==typeof e&&"default"in e?e.default:e}
  function r (line 37) | function r(e,t,n){return Object.defineProperty(e,t,n)}
  function i (line 37) | function i(e){return y({},x,e)}
  function a (line 37) | function a(e,t,n){var o=[e,t];return o.push(w?n:n.capture),o}
  function s (line 37) | function s(e,t,n,o){e.addEventListener.apply(e,a(t,n,o))}
  function u (line 37) | function u(e,t,n,o){e.removeEventListener.apply(e,a(t,n,o))}
  function l (line 37) | function l(e,t){var n=(e.children,e.target,v(e,["children","target"]));O...
  function c (line 37) | function c(t,n){return"production"!==e.env.NODE_ENV&&E(n,"react-event-li...
  function t (line 37) | function t(){return d(this,t),f(this,(t.__proto__||Object.getPrototypeOf...
  function r (line 37) | function r(e){return e&&e.__esModule?e:{default:e}}
  function i (line 37) | function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a ...
  function a (line 37) | function a(e,t){if(!e)throw new ReferenceError("this hasn't been initial...
  function s (line 37) | function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("S...
  function t (line 37) | function t(n,o){i(this,t);var r=a(this,e.call(this,n,o));return r.perfor...
  function o (line 37) | function o(){if(u.current){var e=u.current.getName();if(e)return" Check ...
  function r (line 37) | function r(e){var t=o();if(!t){var n="string"==typeof e?e:e.displayName|...
  function i (line 37) | function i(e,n){if(e._store&&!e._store.validated&&null==e.key){e._store....
  function a (line 37) | function a(e,t){if("object"==typeof e)if(Array.isArray(e))for(var n=0;n<...
  function s (line 37) | function s(e){var n=e.type;if("function"==typeof n){var o=n.displayName|...
  function o (line 37) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 37) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 37) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 37) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 37) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 37) | function o(e){return e&&e.__esModule?e:{default:e}}
  function t (line 37) | function t(){return(0,s.default)(this,t),(0,d.default)(this,(t.__proto__...
  function n (line 37) | function n(e){if(void 0===e)throw new ReferenceError("this hasn't been i...
  function n (line 37) | function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a ...
  function n (line 37) | function n(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.en...
  function o (line 37) | function o(e,t,o){return t&&n(e.prototype,t),o&&n(e,o),e}
  function n (line 37) | function n(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enume...
  function o (line 37) | function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("S...
  function o (line 37) | function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[...
  function o (line 37) | function o(e,t){if(null==e)return{};var n,o,i=r(e,t);if(Object.getOwnPro...
  function n (line 37) | function n(e,t){if(null==e)return{};var n,o,r={},i=Object.keys(e);for(o=...
  function o (line 37) | function o(e,t){return!t||"object"!==r(t)&&"function"!=typeof t?i(e):t}
  function n (line 37) | function n(t,o){return e.exports=n=Object.setPrototypeOf||function(e,t){...
  function e (line 42) | function e(e){function t(t){var n=e.match(t);return n&&n.length>1&&n[1]|...
  function t (line 42) | function t(e){return e.split(".").length}
  function n (line 42) | function n(e,t){var n,o=[];if(Array.prototype.map)return Array.prototype...
  function o (line 42) | function o(e){for(var o=Math.max(t(e[0]),t(e[1])),r=n(e,function(e){var ...
  function r (line 42) | function r(t,n,r){var i=s;"string"==typeof n&&(r=n,n=void 0),void 0===n&...
  function i (line 42) | function i(e,t,n){return!r(e,t,n)}
  function o (line 42) | function o(e){return e}
  function r (line 42) | function r(e,n,r){function d(e,n,o){for(var r in n)n.hasOwnProperty(r)&&...
  function r (line 42) | function r(t,n){return function(){n.apply(t,e.makeArray(arguments))}}
  function i (line 42) | function i(t,n){var o,i,a,s,u;for(o in t)if(t.hasOwnProperty(o)){if(i=t[...
  function r (line 42) | function r(t,n,r){this.$vmId=t,this.$component=n,this.$vmArg=r&&r.vmArg,...
  function o (line 42) | function o(e){return e.replace(r,function(e,t){return t.toUpperCase()})}
  function o (line 42) | function o(e){return r(e.replace(i,"ms-"))}
  function o (line 42) | function o(e,t){return!(!e||!t)&&(e===t||!r(e)&&(r(t)?o(e,t.parentNode):...
  function o (line 42) | function o(e){var n=e.length;if((Array.isArray(e)||"object"!=typeof e&&"...
  function r (line 42) | function r(e){return!!e&&("object"==typeof e||"function"==typeof e)&&"le...
  function i (line 42) | function i(e){return r(e)?Array.isArray(e)?e.slice():o(e):[e]}
  function o (line 42) | function o(e){var t=e.match(c);return t&&t[1].toLowerCase()}
  function r (line 42) | function r(e,n){var r=l;l||("production"!==t.env.NODE_ENV?u(!1,"createNo...
  function o (line 42) | function o(e){return a||("production"!==t.env.NODE_ENV?i(!1,"Markup wrap...
  function o (line 42) | function o(e){return e.Window&&e instanceof e.Window?{x:e.pageXOffset||e...
  function o (line 42) | function o(e){return e.replace(r,"-$1").toLowerCase()}
  function o (line 42) | function o(e){return r(e).replace(i,"-ms-")}
  function o (line 42) | function o(e){var t=e?e.ownerDocument||e:document,n=t.defaultView||windo...
  function o (line 42) | function o(e){return r(e)&&3==e.nodeType}
  function o (line 42) | function o(e){var t={};return function(n){return t.hasOwnProperty(n)||(t...
  function o (line 42) | function o(e){return e in a?a[e]:a[e]=e.replace(r,"-$&").toLowerCase().r...
  function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 42) | function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a ...
  function i (line 42) | function i(e){var t=e.prefixMap,n=e.plugins,o=arguments.length>1&&void 0...
  function e (line 42) | function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.en...
  function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 42) | function r(e,t,n,o){var r=o.browserName,i=o.browserVersion,s=o.cssPrefix...
  function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 42) | function r(e,t,n,o){var r=o.browserName,i=o.browserVersion,u=o.cssPrefix...
  function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 42) | function r(e,t,n,o){var r=o.browserName,i=o.browserVersion,l=o.cssPrefix...
  function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 42) | function r(e,t,n,o){var r=o.browserName,i=o.browserVersion,l=o.cssPrefix...
  function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 42) | function r(e,t,n,o){var r=o.browserName,i=o.browserVersion,u=o.cssPrefix...
  function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 42) | function r(e,t,n,o){var r=o.cssPrefix,i=o.keepUnprefixed;if(s.hasOwnProp...
  function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 42) | function r(e,t,n,o){var r=o.cssPrefix,i=o.keepUnprefixed,l=o.requiresPre...
  function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 42) | function r(e){function t(e){for(var r in e){var i=e[r];if((0,p.default)(...
  function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 42) | function r(e,t){if("string"==typeof t&&!(0,a.default)(t)&&t.indexOf("cal...
  function o (line 42) | function o(e,t){if("display"===e&&r.hasOwnProperty(t))return r[t]}
  function o (line 42) | function o(e,t,n){i.hasOwnProperty(e)&&(n[i[e]]=r[t]||t)}
  function o (line 42) | function o(e,t,n){"flexDirection"===e&&"string"==typeof t&&(t.indexOf("c...
  function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 42) | function r(e,t){if("string"==typeof t&&!(0,a.default)(t)&&u.test(t))retu...
  function o (line 42) | function o(e,t){if(i.hasOwnProperty(e)&&a.hasOwnProperty(t))return r.map...
  function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 42) | function r(e,t){if((0,l.default)(e))return e;for(var n=e.split(/,(?![^()...
  function i (line 42) | function i(e,t,n,o){if("string"==typeof t&&p.hasOwnProperty(e)){var i=r(...
  function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 42) | function r(e){if(e.firefox)return"firefox";if(e.mobile||e.tablet){if(e.i...
  function i (line 42) | function i(e){var t=s.default._detect(e);t.yandexbrowser&&(t=s.default._...
  function o (line 42) | function o(e,t,n){var o="keyframes";return"chrome"===e&&t<43||("safari"=...
  function o (line 42) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 42) | function r(e,t,n){if(e.hasOwnProperty(t))for(var o=e[t],r=0,i=o.length;r...
  function o (line 42) | function o(e){var t=a[e]={};return r.each(e.split(i),function(e,n){t[n]=...
  function n (line 42) | function n(e){return null==e?String(e):c[l.call(e)]||"object"}
  function o (line 42) | function o(e){return"function"===u.type(e)}
  function r (line 42) | function r(e){return"array"===u.type(e)}
  function i (line 42) | function i(e,t,n){var r,i=0,a=e.length,s=void 0===a||o(e);if(n)if(s){for...
  function a (line 42) | function a(e){return!(!e||"object"!==u.type(e))}
  function s (line 42) | function s(){var e,t,n,o,r,i,a=arguments[0]||{},s=1,l=arguments.length,c...
  function a (line 60) | function a(e,t){t=t||ae;var n=t.createElement("script");n.text=e,t.head....
  function s (line 60) | function s(e){var t=!!e&&"length"in e&&e.length,n=be.type(e);return"func...
  function u (line 60) | function u(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerC...
  function l (line 60) | function l(e,t,n){return be.isFunction(t)?be.grep(e,function(e,o){return...
  function c (line 60) | function c(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}
  function d (line 60) | function d(e){var t={};return be.each(e.match(Ae)||[],function(e,n){t[n]...
  function p (line 60) | function p(e){return e}
  function f (line 60) | function f(e){throw e}
  function h (line 60) | function h(e,t,n,o){var r;try{e&&be.isFunction(r=e.promise)?r.call(e).do...
  function m (line 60) | function m(){ae.removeEventListener("DOMContentLoaded",m),n.removeEventL...
  function v (line 60) | function v(){this.expando=be.expando+v.uid++}
  function y (line 60) | function y(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?...
  function g (line 60) | function g(e,t,n){var o;if(void 0===n&&1===e.nodeType)if(o="data-"+t.rep...
  function b (line 60) | function b(e,t,n,o){var r,i=1,a=20,s=o?function(){return o.cur()}:functi...
  function _ (line 60) | function _(e){var t,n=e.ownerDocument,o=e.nodeName,r=Ye[o];return r||(t=...
  function E (line 60) | function E(e,t){for(var n,o,r=[],i=0,a=e.length;i<a;i++)o=e[i],o.style&&...
  function w (line 60) | function w(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElem...
  function x (line 60) | function x(e,t){for(var n=0,o=e.length;n<o;n++)Ve.set(e[n],"globalEval",...
  function C (line 60) | function C(e,t,n,o,r){for(var i,a,s,u,l,c,d=t.createDocumentFragment(),p...
  function k (line 60) | function k(){return!0}
  function T (line 60) | function T(){return!1}
  function N (line 60) | function N(){try{return ae.activeElement}catch(e){}}
  function O (line 60) | function O(e,t,n,o,r,i){var a,s;if("object"==typeof t){"string"!=typeof ...
  function S (line 60) | function S(e,t){return u(e,"table")&&u(11!==t.nodeType?t:t.firstChild,"t...
  function D (line 60) | function D(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}
  function M (line 60) | function M(e){var t=st.exec(e.type);return t?e.type=t[1]:e.removeAttribu...
  function P (line 60) | function P(e,t){var n,o,r,i,a,s,u,l;if(1===t.nodeType){if(Ve.hasData(e)&...
  function I (line 60) | function I(e,t){var n=t.nodeName.toLowerCase();"input"===n&&Ge.test(e.ty...
  function A (line 60) | function A(e,t,n,o){t=le.apply([],t);var r,i,s,u,l,c,d=0,p=e.length,f=p-...
  function R (line 60) | function R(e,t,n){for(var o,r=t?be.filter(t,e):e,i=0;null!=(o=r[i]);i++)...
  function L (line 60) | function L(e,t,n){var o,r,i,a,s=e.style;return n=n||dt(e),n&&(a=n.getPro...
  function j (line 60) | function j(e,t){return{get:function(){return e()?void delete this.get:(t...
  function F (line 60) | function F(e){if(e in yt)return e;for(var t=e[0].toUpperCase()+e.slice(1...
  function V (line 60) | function V(e){var t=be.cssProps[e];return t||(t=be.cssProps[e]=F(e)||e),t}
  function W (line 60) | function W(e,t,n){var o=qe.exec(t);return o?Math.max(0,o[2]-(n||0))+(o[3...
  function B (line 60) | function B(e,t,n,o,r){var i,a=0;for(i=n===(o?"border":"content")?4:"widt...
  function U (line 60) | function U(e,t,n){var o,r=dt(e),i=L(e,t,r),a="border-box"===be.css(e,"bo...
  function H (line 60) | function H(e,t,n,o,r){return new H.prototype.init(e,t,n,o,r)}
  function q (line 60) | function q(){bt&&(!1===ae.hidden&&n.requestAnimationFrame?n.requestAnima...
  function z (line 60) | function z(){return n.setTimeout(function(){gt=void 0}),gt=be.now()}
  function K (line 60) | function K(e,t){var n,o=0,r={height:e};for(t=t?1:0;o<4;o+=2-t)n=ze[o],r[...
  function $ (line 60) | function $(e,t,n){for(var o,r=(X.tweeners[t]||[]).concat(X.tweeners["*"]...
  function Y (line 60) | function Y(e,t,n){var o,r,i,a,s,u,l,c,d="width"in t||"height"in t,p=this...
  function G (line 60) | function G(e,t){var n,o,r,i,a;for(n in e)if(o=be.camelCase(n),r=t[o],i=e...
  function X (line 60) | function X(e,t,n){var o,r,i=0,a=X.prefilters.length,s=be.Deferred().alwa...
  function J (line 60) | function J(e){return(e.match(Ae)||[]).join(" ")}
  function Q (line 60) | function Q(e){return e.getAttribute&&e.getAttribute("class")||""}
  function Z (line 60) | function Z(e,t,n,o){var r;if(Array.isArray(t))be.each(t,function(t,r){n|...
  function ee (line 60) | function ee(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var ...
  function te (line 60) | function te(e,t,n,o){function r(s){var u;return i[s]=!0,be.each(e[s]||[]...
  function ne (line 60) | function ne(e,t){var n,o,r=be.ajaxSettings.flatOptions||{};for(n in t)vo...
  function oe (line 60) | function oe(e,t,n){for(var o,r,i,a,s=e.contents,u=e.dataTypes;"*"===u[0]...
  function re (line 60) | function re(e,t,n,o){var r,i,a,s,u,l={},c=e.dataTypes.slice();if(c[1])fo...
  function t (line 70) | function t(e,t,n,o){var r,i,a,s,u,l,c,p=t&&t.ownerDocument,h=t?t.nodeTyp...
  function n (line 70) | function n(){function e(n,o){return t.push(n+" ")>x.cacheLength&&delete ...
  function o (line 70) | function o(e){return e[W]=!0,e}
  function r (line 70) | function r(e){var t=I.createElement("fieldset");try{return!!e(t)}catch(e...
  function i (line 70) | function i(e,t){for(var n=e.split("|"),o=n.length;o--;)x.attrHandle[n[o]...
  function a (line 70) | function a(e,t){var n=t&&e,o=n&&1===e.nodeType&&1===t.nodeType&&e.source...
  function s (line 70) | function s(e){return function(t){return"input"===t.nodeName.toLowerCase(...
  function u (line 70) | function u(e){return function(t){var n=t.nodeName.toLowerCase();return("...
  function l (line 70) | function l(e){return function(t){return"form"in t?t.parentNode&&!1===t.d...
  function c (line 70) | function c(e){return o(function(t){return t=+t,o(function(n,o){for(var r...
  function d (line 70) | function d(e){return e&&void 0!==e.getElementsByTagName&&e}
  function p (line 70) | function p(){}
  function f (line 70) | function f(e){for(var t=0,n=e.length,o="";t<n;t++)o+=e[t].value;return o}
  function h (line 70) | function h(e,t,n){var o=t.dir,r=t.next,i=r||o,a=n&&"parentNode"===i,s=H+...
  function m (line 70) | function m(e){return e.length>1?function(t,n,o){for(var r=e.length;r--;)...
  function v (line 70) | function v(e,n,o){for(var r=0,i=n.length;r<i;r++)t(e,n[r],o);return o}
  function y (line 70) | function y(e,t,n,o,r){for(var i,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(i...
  function g (line 70) | function g(e,t,n,r,i,a){return r&&!r[W]&&(r=g(r)),i&&!i[W]&&(i=g(i,a)),o...
  function b (line 70) | function b(e){for(var t,n,o,r=e.length,i=x.relative[e[0].type],a=i||x.re...
  function _ (line 70) | function _(e,n){var r=n.length>0,i=e.length>0,a=function(o,a,s,u,l){var ...
  function i (line 70) | function i(e,t,o,r){return function(){var s=this,u=arguments,l=function(...
  function e (line 70) | function e(){if(s){s.style.cssText="box-sizing:border-box;position:relat...
  function o (line 70) | function o(e,t,o,s){var l,p,f,_,E,w=t;c||(c=!0,u&&n.clearTimeout(u),r=vo...
  function o (line 70) | function o(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return...
  function r (line 70) | function r(e,t){for(var n=-1,o=Array(e);++n<e;)o[n]=t(n);return o}
  function i (line 70) | function i(e){return function(t){return e(t)}}
  function a (line 70) | function a(e,t){return null==e?void 0:e[t]}
  function s (line 70) | function s(e,t){return function(n){return e(t(n))}}
  function u (line 70) | function u(e,t){return"__proto__"==t?void 0:e[t]}
  function l (line 70) | function l(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var...
  function c (line 70) | function c(){this.__data__=wt?wt(null):{},this.size=0}
  function d (line 70) | function d(e){var t=this.has(e)&&delete this.__data__[e];return this.siz...
  function p (line 70) | function p(e){var t=this.__data__;if(wt){var n=t[e];return n===Ne?void 0...
  function f (line 70) | function f(e){var t=this.__data__;return wt?void 0!==t[e]:ot.call(t,e)}
  function h (line 70) | function h(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[...
  function m (line 70) | function m(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var...
  function v (line 70) | function v(){this.__data__=[],this.size=0}
  function y (line 70) | function y(e){var t=this.__data__,n=L(t,e);return!(n<0)&&(n==t.length-1?...
  function g (line 70) | function g(e){var t=this.__data__,n=L(t,e);return n<0?void 0:t[n][1]}
  function b (line 70) | function b(e){return L(this.__data__,e)>-1}
  function _ (line 70) | function _(e,t){var n=this.__data__,o=L(n,e);return o<0?(++this.size,n.p...
  function E (line 70) | function E(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var...
  function w (line 70) | function w(){this.size=0,this.__data__={hash:new l,map:new(Et||m),string...
  function x (line 70) | function x(e){var t=Z(this,e).delete(e);return this.size-=t?1:0,t}
  function C (line 70) | function C(e){return Z(this,e).get(e)}
  function k (line 70) | function k(e){return Z(this,e).has(e)}
  function T (line 70) | function T(e,t){var n=Z(this,e),o=n.size;return n.set(e,t),this.size+=n....
  function N (line 70) | function N(e){var t=this.__data__=new m(e);this.size=t.size}
  function O (line 70) | function O(){this.__data__=new m,this.size=0}
  function S (line 70) | function S(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n}
  function D (line 70) | function D(e){return this.__data__.get(e)}
  function M (line 70) | function M(e){return this.__data__.has(e)}
  function P (line 70) | function P(e,t){var n=this.__data__;if(n instanceof m){var o=n.__data__;...
  function I (line 70) | function I(e,t){var n=Ot(e),o=!n&&Nt(e),i=!n&&!o&&St(e),a=!n&&!o&&!i&&Dt...
  function A (line 70) | function A(e,t,n){(void 0===n||fe(e[t],n))&&(void 0!==n||t in e)||j(e,t,n)}
  function R (line 70) | function R(e,t,n){var o=e[t];ot.call(e,t)&&fe(o,n)&&(void 0!==n||t in e)...
  function L (line 70) | function L(e,t){for(var n=e.length;n--;)if(fe(e[n][0],t))return n;return-1}
  function j (line 70) | function j(e,t,n){"__proto__"==t&&yt?yt(e,t,{configurable:!0,enumerable:...
  function F (line 70) | function F(e){return null==e?void 0===e?Fe:Re:vt&&vt in Object(e)?te(e):...
  function V (line 70) | function V(e){return be(e)&&F(e)==Me}
  function W (line 70) | function W(e){return!(!ge(e)||ae(e))&&(ve(e)?st:We).test(pe(e))}
  function B (line 70) | function B(e){return be(e)&&ye(e.length)&&!!Ue[F(e)]}
  function U (line 70) | function U(e){if(!ge(e))return ue(e);var t=se(e),n=[];for(var o in e)("c...
  function H (line 70) | function H(e,t,n,o,r){e!==t&&Ct(t,function(i,a){if(ge(i))r||(r=new N),q(...
  function q (line 70) | function q(e,t,n,o,r,i,a){var s=u(e,n),l=u(t,n),c=a.get(l);if(c)return v...
  function z (line 70) | function z(e,t){return Tt(ce(e,t,Ce),e+"")}
  function K (line 70) | function K(e,t){if(t)return e.slice();var n=e.length,o=dt?dt(n):new e.co...
  function $ (line 70) | function $(e){var t=new e.constructor(e.byteLength);return new ct(t).set...
  function Y (line 70) | function Y(e,t){var n=t?$(e.buffer):e.buffer;return new e.constructor(n,...
  function G (line 70) | function G(e,t){var n=-1,o=e.length;for(t||(t=Array(o));++n<o;)t[n]=e[n]...
  function X (line 70) | function X(e,t,n,o){var r=!n;n||(n={});for(var i=-1,a=t.length;++i<a;){v...
  function J (line 70) | function J(e){return z(function(t,n){var o=-1,r=n.length,i=r>1?n[r-1]:vo...
  function Q (line 70) | function Q(e){return function(t,n,o){for(var r=-1,i=Object(t),a=o(t),s=a...
  function Z (line 70) | function Z(e,t){var n=e.__data__;return ie(t)?n["string"==typeof t?"stri...
  function ee (line 70) | function ee(e,t){var n=a(e,t);return W(n)?n:void 0}
  function te (line 70) | function te(e){var t=ot.call(e,vt),n=e[vt];try{e[vt]=void 0;var o=!0}cat...
  function ne (line 70) | function ne(e){return"function"!=typeof e.constructor||se(e)?{}:xt(pt(e))}
  function oe (line 70) | function oe(e,t){var n=typeof e;return!!(t=null==t?De:t)&&("number"==n||...
  function re (line 70) | function re(e,t,n){if(!ge(n))return!1;var o=typeof t;return!!("number"==...
  function ie (line 70) | function ie(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==...
  function ae (line 70) | function ae(e){return!!rt&&rt in e}
  function se (line 70) | function se(e){var t=e&&e.constructor;return e===("function"==typeof t&&...
  function ue (line 70) | function ue(e){var t=[];if(null!=e)for(var n in Object(e))t.push(n);retu...
  function le (line 70) | function le(e){return it.call(e)}
  function ce (line 70) | function ce(e,t,n){return t=bt(void 0===t?e.length-1:t,0),function(){for...
  function de (line 70) | function de(e){var t=0,n=0;return function(){var o=_t(),r=Se-(o-n);if(n=...
  function pe (line 70) | function pe(e){if(null!=e){try{return nt.call(e)}catch(e){}try{return e+...
  function fe (line 70) | function fe(e,t){return e===t||e!==e&&t!==t}
  function he (line 70) | function he(e){return null!=e&&ye(e.length)&&!ve(e)}
  function me (line 70) | function me(e){return be(e)&&he(e)}
  function ve (line 70) | function ve(e){if(!ge(e))return!1;var t=F(e);return t==Ie||t==Ae||t==Pe|...
  function ye (line 70) | function ye(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=De}
  function ge (line 70) | function ge(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}
  function be (line 70) | function be(e){return null!=e&&"object"==typeof e}
  function _e (line 70) | function _e(e){if(!be(e)||F(e)!=Le)return!1;var t=pt(e);if(null===t)retu...
  function Ee (line 70) | function Ee(e){return X(e,we(e))}
  function we (line 70) | function we(e){return he(e)?I(e,!0):U(e)}
  function xe (line 70) | function xe(e){return function(){return e}}
  function Ce (line 70) | function Ce(e){return e}
  function ke (line 70) | function ke(){return!1}
  function e (line 70) | function e(){}
  function n (line 70) | function n(e,t,n){function o(t){var n=m,o=v;return m=v=void 0,C=t,g=e.ap...
  function o (line 70) | function o(e,t,o){var i=!0,a=!0;if("function"!=typeof e)throw new TypeEr...
  function r (line 70) | function r(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}
  function i (line 70) | function i(e){return!!e&&"object"==typeof e}
  function a (line 70) | function a(e){return"symbol"==typeof e||i(e)&&_.call(e)==c}
  function s (line 70) | function s(e){if("number"==typeof e)return e;if(a(e))return l;if(r(e)){v...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 70) | function r(e,t){var n=t.muiTheme,o=n.appBar,r=n.button.iconButtonSize;re...
  function n (line 70) | function n(){var e,t,o,r;(0,h.default)(this,n);for(var i=arguments.lengt...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function t (line 70) | function t(){var e,n,o,r;(0,s.default)(this,t);for(var a=arguments.lengt...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 70) | function r(e,t,n){var o=e.color,r=e.hoverColor,i=t.muiTheme.baseTheme,a=...
  function t (line 70) | function t(){var e,n,o,r;(0,p.default)(this,t);for(var i=arguments.lengt...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 70) | function r(e,t){var n=t.muiTheme.baseTheme;return{root:{boxSizing:"borde...
  function t (line 70) | function t(){var e,n,o,r;(0,p.default)(this,t);for(var i=arguments.lengt...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 70) | function r(e,t,n){var o=e.autoGenerateNestedIndicator,r=e.insetChildren,...
  function t (line 70) | function t(){var e,n,o,r;(0,p.default)(this,t);for(var i=arguments.lengt...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 70) | function r(e,t){var n=t.muiTheme.baseTheme.palette.disabledColor,o=t.mui...
  function t (line 70) | function t(){var e,n,o,r;(0,p.default)(this,t);for(var i=arguments.lengt...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 70) | function r(e,t){var n=e.desktop,o=e.maxHeight,r=e.width,i=t.muiTheme;ret...
  function t (line 70) | function t(e,n){(0,h.default)(this,t);var o=(0,g.default)(this,(t.__prot...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function e (line 70) | function e(){var t=this;(0,i.default)(this,e),this.clear=function(){t.ti...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 70) | function r(e,t){var n=e.rounded,o=e.circle,r=e.transitionEnabled,i=e.zDe...
  function t (line 70) | function t(){return(0,p.default)(this,t),(0,v.default)(this,(t.__proto__...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function t (line 70) | function t(e,n){(0,d.default)(this,t);var o=(0,m.default)(this,(t.__prot...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 70) | function r(e,t,n){var o=e.targetOrigin,r=n.open,i=t.muiTheme,a=o.horizon...
  function t (line 70) | function t(){var e,n,o,r;(0,u.default)(this,t);for(var i=arguments.lengt...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function t (line 70) | function t(){var e,n,o,r;(0,d.default)(this,t);for(var i=arguments.lengt...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 70) | function r(e,t){var n=t.muiTheme,o=n.inkBar,r=n.isRtl;return{root:{left:...
  function t (line 70) | function t(){return(0,u.default)(this,t),(0,p.default)(this,(t.__proto__...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 70) | function r(e,t){var n=t.muiTheme.tabs;return{root:{color:e.selected?n.se...
  function t (line 70) | function t(){var e,n,o,r;(0,p.default)(this,t);for(var i=arguments.lengt...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 70) | function r(e,t){return{tabItemContainer:{width:"100%",backgroundColor:t....
  function n (line 70) | function n(){var e,t,o,r;(0,p.default)(this,n);for(var i=arguments.lengt...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function t (line 70) | function t(){var e,n,o,r;(0,s.default)(this,t);for(var a=arguments.lengt...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function t (line 70) | function t(){return(0,d.default)(this,t),(0,m.default)(this,(t.__proto__...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function t (line 70) | function t(){var e,n,o,r;(0,s.default)(this,t);for(var a=arguments.lengt...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function t (line 70) | function t(){var e,n,o,r;(0,s.default)(this,t);for(var a=arguments.lengt...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 70) | function r(e,t){var n=t.muiTheme.overlay,o={root:{position:"fixed",heigh...
  function t (line 70) | function t(){return(0,p.default)(this,t),(0,v.default)(this,(t.__proto__...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function t (line 70) | function t(){var e,n,o,r;(0,s.default)(this,t);for(var a=arguments.lengt...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function t (line 70) | function t(){return(0,d.default)(this,t),(0,m.default)(this,(t.__proto__...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function t (line 70) | function t(){return(0,d.default)(this,t),(0,m.default)(this,(t.__proto__...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 70) | function r(e,t,n){var o=e.verticalPosition,r=e.horizontalPosition,i=e.to...
  function t (line 70) | function t(){var e,n,o,r;(0,p.default)(this,t);for(var i=arguments.lengt...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function t (line 70) | function t(e,n){(0,l.default)(this,t);var o=(0,f.default)(this,(t.__prot...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 70) | function r(e){for(var t=arguments.length,n=Array(t>1?t-1:0),o=1;o<t;o++)...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 70) | function r(){if("production"!==e.env.NODE_ENV)return function(t){return ...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 70) | function r(e,t,n){return a.default.Children.map(e,function(e){if(!a.defa...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 70) | function r(e){if(e.isRtl)return function(e){if(!0===e.directionInvariant...
  function o (line 70) | function o(e,n,o,s,u){if("production"!==t.env.NODE_ENV)for(var l in e)if...
  function o (line 70) | function o(){}
  function e (line 70) | function e(e,t,n,o,i,a){if(a!==r){var s=new Error("Calling PropTypes val...
  function t (line 70) | function t(){return e}
  function o (line 70) | function o(){return null}
  function u (line 70) | function u(e){var t=e&&(S&&e[S]||e[D]);if("function"==typeof t)return t}
  function l (line 70) | function l(e,t){return e===t?0!==e||1/e==1/t:e!==e&&t!==t}
  function c (line 70) | function c(e){this.message=e,this.stack=""}
  function d (line 70) | function d(e){function o(o,u,l,d,p,f,h){if(d=d||M,f=f||l,h!==i){if(n){va...
  function p (line 70) | function p(e){function t(t,n,o,r,i,a){var s=t[n];if(k(s)!==e)return new ...
  function f (line 70) | function f(){return d(o)}
  function h (line 70) | function h(e){function t(t,n,o,r,a){if("function"!=typeof e)return new c...
  function m (line 70) | function m(){function t(t,n,o,r,i){var a=t[n];if(!e(a)){return new c("In...
  function v (line 70) | function v(e){function t(t,n,o,r,i){if(!(t[n]instanceof e)){var a=e.name...
  function y (line 70) | function y(e){function n(t,n,o,r,i){for(var a=t[n],s=0;s<e.length;s++)if...
  function g (line 70) | function g(e){function t(t,n,o,r,a){if("function"!=typeof e)return new c...
  function b (line 70) | function b(e){function n(t,n,o,r,a){for(var s=0;s<e.length;s++){if(null=...
  function _ (line 70) | function _(){function e(e,t,n,o,r){return x(e[t])?null:new c("Invalid "+...
  function E (line 70) | function E(e){function t(t,n,o,r,a){var s=t[n],u=k(s);if("object"!==u)re...
  function w (line 70) | function w(e){function t(t,n,o,a,s){var u=t[n],l=k(u);if("object"!==l)re...
  function x (line 70) | function x(t){switch(typeof t){case"number":case"string":case"undefined"...
  function C (line 70) | function C(e,t){return"symbol"===e||("Symbol"===t["@@toStringTag"]||"fun...
  function k (line 70) | function k(e){var t=typeof e;return Array.isArray(e)?"array":e instanceo...
  function T (line 70) | function T(e){if(void 0===e||null===e)return""+e;var t=k(e);if("object"=...
  function N (line 70) | function N(e){var t=T(e);switch(t){case"array":case"object":return"an "+...
  function O (line 70) | function O(e){return e.constructor&&e.constructor.name?e.constructor.nam...
  function o (line 70) | function o(){var e=window.opera;return"object"==typeof e&&"function"==ty...
  function r (line 70) | function r(e){return(e.ctrlKey||e.altKey||e.metaKey)&&!(e.ctrlKey&&e.alt...
  function i (line 70) | function i(e){switch(e){case"topCompositionStart":return T.compositionSt...
  function a (line 70) | function a(e,t){return"topKeyDown"===e&&t.keyCode===b}
  function s (line 70) | function s(e,t){switch(e){case"topKeyUp":return-1!==g.indexOf(t.keyCode)...
  function u (line 70) | function u(e){var t=e.detail;return"object"==typeof t&&"data"in t?t.data...
  function l (line 70) | function l(e,t,n,o){var r,l;if(_?r=i(e):O?s(e,n)&&(r=T.compositionEnd):a...
  function c (line 70) | function c(e,t){switch(e){case"topCompositionEnd":return u(t);case"topKe...
  function d (line 70) | function d(e,t){if(O){if("topCompositionEnd"===e||!_&&s(e,t)){var n=O.ge...
  function p (line 70) | function p(e,t,n,o){var r;if(!(r=w?c(e,n):d(e,n)))return null;var i=y.ge...
  function o (line 70) | function o(e){var t=e.nodeName&&e.nodeName.toLowerCase();return"select"=...
  function r (line 70) | function r(e){var t=x.getPooled(N.change,S,e,C(e));b.accumulateTwoPhaseD...
  function i (line 70) | function i(e){g.enqueueEvents(e),g.processEventQueue(!1)}
  function a (line 70) | function a(e,t){O=e,S=t,O.attachEvent("onchange",r)}
  function s (line 70) | function s(){O&&(O.detachEvent("onchange",r),O=null,S=null)}
  function u (line 70) | function u(e,t){if("topChange"===e)return t}
  function l (line 70) | function l(e,t,n){"topFocus"===e?(s(),a(t,n)):"topBlur"===e&&s()}
  function c (line 70) | function c(e,t){O=e,S=t,D=e.value,M=Object.getOwnPropertyDescriptor(e.co...
  function d (line 70) | function d(){O&&(delete O.value,O.detachEvent?O.detachEvent("onpropertyc...
  function p (line 70) | function p(e){if("value"===e.propertyName){var t=e.srcElement.value;t!==...
  function f (line 70) | function f(e,t){if("topInput"===e)return t}
  function h (line 70) | function h(e,t,n){"topFocus"===e?(d(),c(t,n)):"topBlur"===e&&d()}
  function m (line 70) | function m(e,t){if(("topSelectionChange"===e||"topKeyUp"===e||"topKeyDow...
  function v (line 70) | function v(e){return e.nodeName&&"input"===e.nodeName.toLowerCase()&&("c...
  function y (line 70) | function y(e,t){if("topClick"===e)return t}
  function o (line 70) | function o(e){this._root=e,this._startText=this.getText(),this._fallback...
  function o (line 70) | function o(e,o,i,u){var l=void 0===e[i];"production"!==t.env.NODE_ENV&&(...
  function o (line 70) | function o(e){}
  function r (line 70) | function r(e,n){"production"!==t.env.NODE_ENV&&("production"!==t.env.NOD...
  function i (line 70) | function i(e){return!(!e.prototype||!e.prototype.isReactComponent)}
  function a (line 70) | function a(e){return!(!e.prototype||!e.prototype.isPureReactComponent)}
  function s (line 70) | function s(e,t,n){if(0===t)return e();m.debugTool.onBeginLifeCycleTimer(...
  function o (line 70) | function o(e){if(e){var t=e._currentElement._owner||null;if(t){var n=t.g...
  function r (line 70) | function r(e){if("object"==typeof e){if(Array.isArray(e))return"["+e.map...
  function i (line 70) | function i(e,n,o){if(null!=e&&null!=n&&!B(e,n)){var i,a=o._tag,s=o._curr...
  function a (line 70) | function a(e,n){n&&(ie[e._tag]&&(null!=n.children||null!=n.dangerouslySe...
  function s (line 70) | function s(e,n,o,r){if(!(r instanceof L)){"production"!==t.env.NODE_ENV&...
  function u (line 70) | function u(){var e=this;k.putListener(e.inst,e.registrationName,e.listen...
  function l (line 70) | function l(){var e=this;D.postMountWrapper(e)}
  function c (line 70) | function c(){var e=this;I.postMountWrapper(e)}
  function d (line 70) | function d(){var e=this;M.postMountWrapper(e)}
  function p (line 70) | function p(){var e=this;e._rootNodeID||("production"!==t.env.NODE_ENV?V(...
  function f (line 70) | function f(){P.postUpdateWrapper(this)}
  function h (line 70) | function h(e){ue.call(se,e)||(ae.test(e)||("production"!==t.env.NODE_ENV...
  function m (line 70) | function m(e,t){return e.indexOf("-")>=0||null!=t.is}
  function v (line 70) | function v(e){var n=e.type;h(n),this._currentElement=e,this._tag=n.toLow...
  function o (line 70) | function o(e,n){var o={_topLevelWrapper:e,_idCounter:1,_ownerDocument:n?...
  function o (line 70) | function o(){this._rootNodeID&&_.updateWrapper(this)}
  function r (line 70) | function r(e){return"checkbox"===e.type||"radio"===e.type?null!=e.checke...
  function i (line 70) | function i(e){var n=this._currentElement.props,r=l.executeOnChange(n,e);...
  function o (line 70) | function o(e,n,o){if(l.hasOwnProperty(n)&&l[n])return!0;if(c.test(n)){va...
  function r (line 70) | function r(e,n){var r=[];for(var i in n.props){o(n.type,i,e)||r.push(i)}...
  function i (line 70) | function i(e,t){null!=t&&"string"==typeof t.type&&(t.type.indexOf("-")>=...
  function o (line 70) | function o(e,n){null!=n&&("input"!==n.type&&"textarea"!==n.type&&"select...
  function o (line 70) | function o(e){var n="";return i.Children.forEach(e,function(e){null!=e&&...
  function o (line 70) | function o(e,t,n,o){return e===n&&t===o}
  function r (line 70) | function r(e){var t=document.selection,n=t.createRange(),o=n.text.length...
  function i (line 70) | function i(e){var t=window.getSelection&&window.getSelection();if(!t||0=...
  function a (line 70) | function a(e,t){var n,o,r=document.selection.createRange().duplicate();v...
  function s (line 70) | function s(e,t){if(window.getSelection){var n=window.getSelection(),o=e[...
  function o (line 70) | function o(){this._rootNodeID&&h.updateWrapper(this)}
  function r (line 70) | function r(e){var t=this._currentElement.props,n=s.executeOnChange(t,e);...
  function o (line 70) | function o(e,n){"_hostNode"in e||("production"!==t.env.NODE_ENV?l(!1,"ge...
  function r (line 70) | function r(e,n){"_hostNode"in e||("production"!==t.env.NODE_ENV?l(!1,"is...
  function i (line 70) | function i(e){return"_hostNode"in e||("production"!==t.env.NODE_ENV?l(!1...
  function a (line 70) | function a(e,t,n){for(var o=[];e;)o.push(e),e=e._hostParent;var r;for(r=...
  function s (line 70) | function s(e,t,n,r,i){for(var a=e&&t?o(e,t):null,s=[];e&&e!==a;)s.push(e...
  function o (line 70) | function o(e,t){null!=t&&"string"==typeof t.type&&(t.type.indexOf("-")>=...
  function o (line 70) | function o(e,n,o,r,i,a,s,u){try{n.call(o,r,i,a,s,u)}catch(n){"production...
  function r (line 70) | function r(e,t,n,r,i,a){for(var s=0;s<w.length;s++){var u=w[s],l=u[e];l&...
  function i (line 70) | function i(){g.purgeUnmountedComponents(),y.clearHistory()}
  function a (line 70) | function a(e){return e.reduce(function(e,t){var n=g.getOwnerID(t),o=g.ge...
  function s (line 70) | function s(){var e=S,t=O,n=y.getHistory();if(0===N)return S=0,O=[],void ...
  function u (line 70) | function u(e){arguments.length>1&&void 0!==arguments[1]&&arguments[1]&&0...
  function l (line 70) | function l(e,n){0!==N&&(I&&!A&&("production"!==t.env.NODE_ENV&&E(!1,"The...
  function c (line 70) | function c(e,n){0!==N&&(I===n||A||("production"!==t.env.NODE_ENV&&E(!1,"...
  function d (line 70) | function d(){var e={startTime:M,nestedFlushStartTime:_(),debugID:D,timer...
  function p (line 70) | function p(){var e=T.pop(),t=e.startTime,n=e.nestedFlushStartTime,o=e.de...
  function f (line 70) | function f(e){if(!C||!L)return!1;var t=g.getElement(e);return null!=t&&"...
  function h (line 70) | function h(e,t){if(f(e)){var n=e+"::"+t;R=_(),performance.mark(n)}}
  function m (line 70) | function m(e,t){if(f(e)){var n=e+"::"+t,o=g.getDisplayName(e)||"Unknown"...
  function o (line 70) | function o(){this.reinitializeTransaction()}
  function o (line 70) | function o(){x||(x=!0,g.EventEmitter.injectReactEventListener(y),g.Event...
  function o (line 70) | function o(e){r.enqueueEvents(e),r.processEventQueue(!1)}
  function o (line 70) | function o(e){for(;e._hostParent;)e=e._hostParent;var t=d.getNodeFromIns...
  function r (line 70) | function r(e,t){this.topLevelType=e,this.nativeEvent=t,this.ancestors=[]}
  function i (line 70) | function i(e){var t=f(e.nativeEvent),n=d.getClosestInstanceFromNode(t),r...
  function a (line 70) | function a(e){e(h(window))}
  function o (line 70) | function o(e,t,n){return{type:"INSERT_MARKUP",content:e,fromIndex:null,f...
  function r (line 70) | function r(e,t,n){return{type:"MOVE_EXISTING",content:null,fromIndex:e._...
  function i (line 70) | function i(e,t){return{type:"REMOVE_NODE",content:null,fromIndex:e._moun...
  function a (line 70) | function a(e){return{type:"SET_MARKUP",content:e,fromIndex:null,fromNode...
  function s (line 70) | function s(e){return{type:"TEXT_CONTENT",content:e,fromIndex:null,fromNo...
  function u (line 70) | function u(e,t){return t&&(e=e||[],e.push(t)),e}
  function l (line 70) | function l(e,t){d.processChildrenUpdates(e,t)}
  function o (line 70) | function o(e){return!(!e||"function"!=typeof e.attachRef||"function"!=ty...
  function o (line 70) | function o(e){this.reinitializeTransaction(),this.renderToStaticMarkup=!...
  function o (line 70) | function o(e,t,n){"function"==typeof e?e(t.getPublicInstance()):i.addCom...
  function r (line 70) | function r(e,t,n){"function"==typeof e?e(null):i.removeComponentAsRefFro...
  function o (line 70) | function o(e){this.reinitializeTransaction(),this.renderToStaticMarkup=e...
  function o (line 70) | function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a ...
  function r (line 70) | function r(e,n){if("production"!==t.env.NODE_ENV){var o=e.constructor;"p...
  function e (line 70) | function e(t){o(this,e),this.transaction=t}
  function o (line 70) | function o(e){if("selectionStart"in e&&u.hasSelectionCapabilities(e))ret...
  function r (line 70) | function r(e,t){if(g||null==m||m!==c())return null;var n=o(m);if(!y||!p(...
  function o (line 70) | function o(e){return"."+e._rootNodeID}
  function r (line 70) | function r(e){return"button"===e||"input"===e||"select"===e||"textarea"=...
  function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
  function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
  function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
  function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
  function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
  function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
  function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
  function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
  function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
  function o (line 70) | function o(e,t,n,o){return r.call(this,e,t,n,o)}
  function o (line 70) | function o(e){for(var t=1,n=0,o=0,i=e.length,a=-4&i;o<a;){for(var s=Math...
  function o (line 70) | function o(e,o,d,p,f,h){for(var m in e)if(e.hasOwnProperty(m)){var v;try...
  function o (line 70) | function o(e,n,o){if(null==n||"boolean"==typeof n||""===n)return"";if(is...
  function o (line 70) | function o(e){if("production"!==t.env.NODE_ENV){var n=i.current;null!==n...
  function o (line 70) | function o(e,o,r,s){if(e&&"object"==typeof e){var l=e,c=void 0===l[r];"p...
  function r (line 70) | function r(e,n){if(null==e)return e;var r={};return"production"!==t.env....
  function o (line 70) | function o(e){if(e.key){var t=i[e.key]||e.key;if("Unidentified"!==t)retu...
  function o (line 70) | function o(e){var t=e&&(r&&e[r]||e[i]);if("function"==typeof t)return t}
  function o (line 70) | function o(){return r++}
  function o (line 70) | function o(e){for(;e&&e.firstChild;)e=e.firstChild;return e}
  function r (line 70) | function r(e){for(;e;){if(e.nextSibling)return e.nextSibling;e=e.parentN...
  function i (line 70) | function i(e,t){for(var n=o(e),i=0,a=0;n;){if(3===n.nodeType){if(a=i+n.t...
  function o (line 70) | function o(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["We...
  function r (line 70) | function r(e){if(s[e])return s[e];if(!a[e])return e;var t=a[e];for(var n...
  function o (line 70) | function o(e){return'"'+r(e)+'"'}
  function o (line 70) | function o(e){if(!e)return e;var t={};return i.Children.map(e,function(e...
  function r (line 70) | function r(e,t){function n(n){return t.hasOwnProperty(n)?t[n]:e[n]}e=e||...
  function o (line 70) | function o(e){var t={"=":"=0",":":"=2"};return"$"+(""+e).replace(/[=:]/g...
  function r (line 70) | function r(e){var t=/(=0|=2)/g,n={"=0":"=","=2":":"};return(""+("."===e[...
  function o (line 70) | function o(e){return(""+e).replace(_,"$&/")}
  function r (line 70) | function r(e,t){this.func=e,this.context=t,this.count=0}
  function i (line 70) | function i(e,t,n){var o=e.func,r=e.context;o.call(r,t,e.count++)}
  function a (line 70) | function a(e,t,n){if(null==e)return e;var o=r.getPooled(t,n);y(e,i,o),r....
  function s (line 70) | function s(e,t,n,o){this.result=e,this.keyPrefix=t,this.func=n,this.cont...
  function u (line 70) | function u(e,t,n){var r=e.result,i=e.keyPrefix,a=e.func,s=e.context,u=a....
  function l (line 70) | function l(e,t,n,r,i){var a="";null!=n&&(a=o(n)+"/");var l=s.getPooled(t...
  function c (line 70) | function c(e,t,n){if(null==e)return e;var o=[];return l(e,o,null,t,n),o}
  function d (line 70) | function d(e,t,n){return null}
  function p (line 70) | function p(e,t){return y(e,d,null)}
  function f (line 70) | function f(e){var t=[];return l(e,t,null,v.thatReturnsArgument),t}
  function o (line 70) | function o(e){return e}
  function r (line 70) | function r(e,n,o){for(var r in n)n.hasOwnProperty(r)&&"production"!==t.e...
  function i (line 70) | function i(e,n){var o=C.hasOwnProperty(n)?C[n]:null;T.hasOwnProperty(n)&...
  function a (line 70) | function a(e,n){if(n){"function"==typeof n&&("production"!==t.env.NODE_E...
  function s (line 70) | function s(e,n){if(n)for(var o in n){var r=n[o];if(n.hasOwnProperty(o)){...
  function u (line 70) | function u(e,n){e&&n&&"object"==typeof e&&"object"==typeof n||("producti...
  function l (line 70) | function l(e,t){return function(){var n=e.apply(this,arguments),o=t.appl...
  function c (line 70) | function c(e,t){return function(){e.apply(this,arguments),t.apply(this,a...
  function d (line 70) | function d(e,n){var o=n.bind(e);if("production"!==t.env.NODE_ENV){o.__re...
  function p (line 70) | function p(e){for(var t=e.__reactAutoBindPairs,n=0;n<t.length;n+=2){var ...
  function o (line 70) | function o(e,t){return e===t?0!==e||1/e==1/t:e!==e&&t!==t}
  function r (line 70) | function r(e){this.message=e,this.stack=""}
  function i (line 70) | function i(e){function n(n,i,a,s,u,l,c){if(s=s||N,l=l||a,"production"!==...
  function a (line 70) | function a(e){function t(t,n,o,i,a,s){var u=t[n];if(g(u)!==e)return new ...
  function s (line 70) | function s(){return i(C.thatReturns(null))}
  function u (line 70) | function u(e){function t(t,n,o,i,a){if("function"!=typeof e)return new r...
  function l (line 70) | function l(){function e(e,t,n,o,i){var a=e[t];if(!E.isValidElement(a)){r...
  function c (line 70) | function c(e){function t(t,n,o,i,a){if(!(t[n]instanceof e)){var s=w[i],u...
  function d (line 70) | function d(e){function n(t,n,i,a,s){for(var u=t[n],l=0;l<e.length;l++)if...
  function p (line 70) | function p(e){function t(t,n,o,i,a){if("function"!=typeof e)return new r...
  function f (line 70) | function f(e){function n(t,n,o,i,a){for(var s=0;s<e.length;s++){if(null=...
  function h (line 70) | function h(){function e(e,t,n,o,i){if(!v(e[t])){return new r("Invalid "+...
  function m (line 70) | function m(e){function t(t,n,o,i,a){var s=t[n],u=g(s);if("object"!==u){r...
  function v (line 70) | function v(e){switch(typeof e){case"number":case"string":case"undefined"...
  function y (line 70) | function y(e,t){return"symbol"===e||("Symbol"===t["@@toStringTag"]||"fun...
  function g (line 70) | function g(e){var t=typeof e;return Array.isArray(e)?"array":e instanceo...
  function b (line 70) | function b(e){var t=g(e);if("object"===t){if(e instanceof Date)return"da...
  function _ (line 70) | function _(e){return e.constructor&&e.constructor.name?e.constructor.nam...
  function o (line 70) | function o(e,t,n){this.props=e,this.context=t,this.refs=u,this.updater=n...
  function r (line 70) | function r(){}
  function o (line 70) | function o(e,o,d,p,f,h){for(var m in e)if(e.hasOwnProperty(m)){var v;try...
  function o (line 70) | function o(e){return i.isValidElement(e)||("production"!==t.env.NODE_ENV...
  function o (line 70) | function o(e,t){return e&&"object"==typeof e&&null!=e.key?d.escape(e.key...
  function r (line 70) | function r(e,n,i,v){var y=typeof e;if("undefined"!==y&&"boolean"!==y||(e...
  function i (line 70) | function i(e,t,n){return null==e?0:r(e,"",t,n)}
  function o (line 70) | function o(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=argu...
  function o (line 70) | function o(e){return e&&e.__esModule?e:{default:e}}
  function r (line 70) | function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a ...
  function i (line 70) | function i(e,t){if(!e)throw new ReferenceError("this hasn't been initial...
  function a (line 70) | function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("S...
  function n (line 70) | function n(){return r(this,n),i(this,e.apply(this,arguments))}
Condensed preview — 280 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,985K chars).
[
  {
    "path": ".gitattributes",
    "chars": 2518,
    "preview": "###############################################################################\n# Set default behavior to automatically "
  },
  {
    "path": ".gitignore",
    "chars": 4283,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User"
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "MicrofrontendTemplate/.gitignore",
    "chars": 6064,
    "preview": "### App ###\ndist/\n\n### Code ###\n# Visual Studio Code - https://code.visualstudio.com/\n.settings/\n.vscode/\njsconfig.json"
  },
  {
    "path": "MicrofrontendTemplate/Microfrontend.sln",
    "chars": 3500,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.28307.572\nMi"
  },
  {
    "path": "MicrofrontendTemplate/Portal/Portal.csproj",
    "chars": 1995,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n    <RootN"
  },
  {
    "path": "MicrofrontendTemplate/Portal/Properties/launchSettings.json",
    "chars": 832,
    "preview": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      "
  },
  {
    "path": "MicrofrontendTemplate/Portal/appsettings.json",
    "chars": 64,
    "preview": "{\n  \"IdentityServer\": {\n    \"Uri\": \"http://localhost:5000\"\n  }\n}"
  },
  {
    "path": "MicrofrontendTemplate/Portal/client/auth.js",
    "chars": 1074,
    "preview": "const url = '/api/login';\n\nexport const signIn = (username, password) => {\n  return fetch(url, {\n    method: 'post',\n   "
  },
  {
    "path": "MicrofrontendTemplate/Portal/client/components/App.js",
    "chars": 1050,
    "preview": "import { Fragment, useState, useEffect } from 'react';\nimport { getAccessToken, validateToken } from '../auth';\nimport P"
  },
  {
    "path": "MicrofrontendTemplate/Portal/client/components/Landing.js",
    "chars": 3026,
    "preview": "import { Main, Header, Alert, Panel, Section, withTheme } from 'dotnetify-elements';\nimport { CompanyLogo } from './App'"
  },
  {
    "path": "MicrofrontendTemplate/Portal/client/components/Login.js",
    "chars": 1820,
    "preview": "import { useState } from 'react';\nimport { signIn } from '../auth';\nimport { Alert, Button, Form, Panel, PasswordField, "
  },
  {
    "path": "MicrofrontendTemplate/Portal/client/components/Portal.js",
    "chars": 1930,
    "preview": "import {\n  Main,\n  Header,\n  Nav,\n  NavDrawerButton,\n  NavMenu,\n  NavMenuTarget,\n  Button,\n  Panel,\n  Section,\n  VMConte"
  },
  {
    "path": "MicrofrontendTemplate/Portal/client/index.js",
    "chars": 1225,
    "preview": "import { createWebComponent } from 'dotnetify-elements/web-components/Core';\nimport loader from './loader';\nimport App f"
  },
  {
    "path": "MicrofrontendTemplate/Portal/client/loader.js",
    "chars": 1695,
    "preview": "import dotnetify from 'dotnetify';\nimport { getAccessToken } from './auth';\nimport { updatePortal } from './components/P"
  },
  {
    "path": "MicrofrontendTemplate/Portal/package.json",
    "chars": 1268,
    "preview": "{\n  \"version\": \"1.0.0\",\n  \"name\": \"portal\",\n  \"private\": true,\n  \"scripts\": {\n    \"build\": \"webpack\",\n    \"prod\": \"webpa"
  },
  {
    "path": "MicrofrontendTemplate/Portal/run.bat",
    "chars": 169,
    "preview": "@echo off\nif not exist node_modules call npm i\nif \"%1\" == \"prod\" goto :prod\ncall npm run build\ndotnet run\nexit\n\n:prod\nca"
  },
  {
    "path": "MicrofrontendTemplate/Portal/server/Controllers/LoginController.cs",
    "chars": 1773,
    "preview": "using Microsoft.AspNetCore.Mvc;\nusing Microsoft.Extensions.Options;\nusing Shared;\nusing System;\nusing System.Net.Http;\n"
  },
  {
    "path": "MicrofrontendTemplate/Portal/server/Program.cs",
    "chars": 521,
    "preview": "using Microsoft.AspNetCore;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Configuration;\n\nnamespace Po"
  },
  {
    "path": "MicrofrontendTemplate/Portal/server/Startup.cs",
    "chars": 2581,
    "preview": "using Microsoft.AspNetCore.Authentication.JwtBearer;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hos"
  },
  {
    "path": "MicrofrontendTemplate/Portal/tempkey.rsa",
    "chars": 1689,
    "preview": "{\"KeyId\":\"0ba2028548bfe91576a5940388a7cdbb\",\"Parameters\":{\"D\":\"UkWCmbhxnXgJc4SiqAk+6xS0V48iNAt7n/TBICboACMdc+ocGvcR5mqBn"
  },
  {
    "path": "MicrofrontendTemplate/Portal/webpack.config.js",
    "chars": 1429,
    "preview": "'use strict';\n\nconst path = require('path');\nconst webpack = require('webpack');\nconst CopyPlugin = require('copy-webpac"
  },
  {
    "path": "MicrofrontendTemplate/Portal/wwwroot/404.html",
    "chars": 146,
    "preview": "<h2>Page not found (404)</h2>\n<p>Redirecting to home page...</p>\n<script>setTimeout(function() {(window.location.href = "
  },
  {
    "path": "MicrofrontendTemplate/Portal/wwwroot/index.html",
    "chars": 1554,
    "preview": "<!DOCTYPE html>\n<html>\n    <head>\n       <title>DotNetify Micro-Frontend Demo</title>\n       <meta charset=\"utf-8\">\n   "
  },
  {
    "path": "MicrofrontendTemplate/README.md",
    "chars": 1119,
    "preview": "<p align=\"center\"><img width=\"300px\" src=\"https://dotnetify.net/content/images/dotnetify-logo.png\"></p>\n\n## DotNetify - "
  },
  {
    "path": "MicrofrontendTemplate/ReactDashboardApp/Properties/launchSettings.json",
    "chars": 832,
    "preview": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      "
  },
  {
    "path": "MicrofrontendTemplate/ReactDashboardApp/README.md",
    "chars": 105,
    "preview": "## How to run:\n\nStart the Portal first (app requires an auth server), then execute `run.bat [dev|prod]`.\n"
  },
  {
    "path": "MicrofrontendTemplate/ReactDashboardApp/ReactDashboardApp.csproj",
    "chars": 2269,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n    <RootN"
  },
  {
    "path": "MicrofrontendTemplate/ReactDashboardApp/appsettings.json",
    "chars": 64,
    "preview": "{\n  \"IdentityServer\": {\n    \"Uri\": \"http://localhost:5000\"\n  }\n}"
  },
  {
    "path": "MicrofrontendTemplate/ReactDashboardApp/client/components/ActivitiesCard.js",
    "chars": 1520,
    "preview": "import React from 'react';\nimport styled from 'styled-components';\nimport { Card, Cell, Element, Panel } from 'dotnetify"
  },
  {
    "path": "MicrofrontendTemplate/ReactDashboardApp/client/components/Dashboard.js",
    "chars": 1960,
    "preview": "import React from 'react';\nimport { Card, Frame, Panel, VMContext, withTheme } from 'dotnetify-elements';\nimport { BarCh"
  },
  {
    "path": "MicrofrontendTemplate/ReactDashboardApp/client/components/InfoCard.js",
    "chars": 903,
    "preview": "import React from 'react';\nimport styled from 'styled-components';\nimport { Card, CardImage, Element } from 'dotnetify-e"
  },
  {
    "path": "MicrofrontendTemplate/ReactDashboardApp/client/index.js",
    "chars": 266,
    "preview": "import { createWebComponent } from 'dotnetify-elements/web-components/Core';\nimport Dashboard from './components/Dashboa"
  },
  {
    "path": "MicrofrontendTemplate/ReactDashboardApp/package.json",
    "chars": 1254,
    "preview": "{\n  \"version\": \"1.0.0\",\n  \"name\": \"react-dashboard-app\",\n  \"private\": true,\n  \"scripts\": {\n    \"build\": \"webpack\",\n    \""
  },
  {
    "path": "MicrofrontendTemplate/ReactDashboardApp/run.bat",
    "chars": 169,
    "preview": "@echo off\nif not exist node_modules call npm i\nif \"%1\" == \"prod\" goto :prod\ncall npm run build\ndotnet run\nexit\n\n:prod\nca"
  },
  {
    "path": "MicrofrontendTemplate/ReactDashboardApp/server/Program.cs",
    "chars": 394,
    "preview": "using Microsoft.AspNetCore;\nusing Microsoft.AspNetCore.Hosting;\n\nnamespace ReactDashboardApp\n{\n   public class Program\n"
  },
  {
    "path": "MicrofrontendTemplate/ReactDashboardApp/server/Services/MockLiveDataService.cs",
    "chars": 4040,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reactive.Linq;\nusing Bogus;\n\nnamespace R"
  },
  {
    "path": "MicrofrontendTemplate/ReactDashboardApp/server/Startup.cs",
    "chars": 3411,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Net.Http;\nusing DotNetify;\nusing DotNetif"
  },
  {
    "path": "MicrofrontendTemplate/ReactDashboardApp/server/ViewModels/Dashboard.cs",
    "chars": 2524,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reactive.Linq;\nusing DotNetify;\nusing Do"
  },
  {
    "path": "MicrofrontendTemplate/ReactDashboardApp/webpack.config.js",
    "chars": 1154,
    "preview": "'use strict';\n\nconst webpack = require('webpack');\nconst CopyPlugin = require('copy-webpack-plugin');\n\nmodule.exports = "
  },
  {
    "path": "MicrofrontendTemplate/ReactDashboardApp/wwwroot/index.html",
    "chars": 1008,
    "preview": "<!DOCTYPE html>\n<html>\n    <head>\n       <title>React Dashboard App</title>\n       <meta charset=\"utf-8\">\n       <meta "
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/Properties/launchSettings.json",
    "chars": 832,
    "preview": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      "
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/README.md",
    "chars": 105,
    "preview": "## How to run:\n\nStart the Portal first (app requires an auth server), then execute `run.bat [dev|prod]`.\n"
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/ReactFormApp.csproj",
    "chars": 2262,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n    <RootN"
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/appsettings.json",
    "chars": 64,
    "preview": "{\n  \"IdentityServer\": {\n    \"Uri\": \"http://localhost:5000\"\n  }\n}"
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/client/components/AddressForm.js",
    "chars": 672,
    "preview": "import React from 'react';\nimport { Cell, DropdownList, Form, NumberField, Panel, TextField, VMContext } from 'dotnetify"
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/client/components/BasicInfoForm.js",
    "chars": 1241,
    "preview": "import React from 'react';\nimport { Cell, DropdownList, Form, Panel, TextField, VMContext } from 'dotnetify-elements';\n\n"
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/client/components/Form.js",
    "chars": 2088,
    "preview": "import React from 'react';\nimport BasicInfoForm from './BasicInfoForm';\nimport AddressForm from './AddressForm';\nimport "
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/client/components/NewCustomerDialog.js",
    "chars": 2674,
    "preview": "import React from 'react';\nimport { Button, DropdownList, Form, Modal, NumberField, Panel, Tab, TabItem, TextField, VMCo"
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/client/index.js",
    "chars": 246,
    "preview": "import { createWebComponent } from 'dotnetify-elements/web-components/Core';\nimport Form from './components/Form';\n\ncons"
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/package.json",
    "chars": 1249,
    "preview": "{\n  \"version\": \"1.0.0\",\n  \"name\": \"react-form-app\",\n  \"private\": true,\n  \"scripts\": {\n    \"build\": \"webpack\",\n    \"prod\""
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/run.bat",
    "chars": 169,
    "preview": "@echo off\nif not exist node_modules call npm i\nif \"%1\" == \"prod\" goto :prod\ncall npm run build\ndotnet run\nexit\n\n:prod\nca"
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/server/Program.cs",
    "chars": 389,
    "preview": "using Microsoft.AspNetCore;\nusing Microsoft.AspNetCore.Hosting;\n\nnamespace ReactFormApp\n{\n   public class Program\n   {\n"
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/server/Services/Customer.cs",
    "chars": 3528,
    "preview": "using System;\nusing System.ComponentModel;\n\nnamespace ReactFormApp\n{\n   #region Enums\n\n   public enum NamePrefix\n   {\n "
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/server/Services/CustomerFormData.cs",
    "chars": 315,
    "preview": "using System.Collections.Generic;\n\nnamespace ReactFormApp\n{\n   using StringDictionary = Dictionary<string, string>;\n\n  "
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/server/Services/CustomerRepository.cs",
    "chars": 2840,
    "preview": "using Bogus;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Linq;\nusing Syst"
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/server/Startup.cs",
    "chars": 3397,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Net.Http;\nusing DotNetify;\nusing DotNetif"
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/server/ViewModels/AddressForm.cs",
    "chars": 1435,
    "preview": "using System.Linq;\nusing System.Reactive.Linq;\nusing DotNetify;\nusing DotNetify.Elements;\nusing DotNetify.Security;\n\nna"
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/server/ViewModels/CustomerForm.cs",
    "chars": 3556,
    "preview": "using System;\nusing System.Linq;\nusing System.Reactive.Linq;\nusing DotNetify;\nusing DotNetify.Elements;\nusing DotNetify"
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/server/ViewModels/NewCustomerForm.cs",
    "chars": 836,
    "preview": "using DotNetify;\nusing DotNetify.Elements;\nusing DotNetify.Security;\nusing System.Linq;\nusing System.Reactive.Linq;\n\nna"
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/server/ViewModels/PersonForm.cs",
    "chars": 1751,
    "preview": "using System.Linq;\nusing System.Reactive.Linq;\nusing DotNetify;\nusing DotNetify.Elements;\nusing DotNetify.Security;\n\nna"
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/server/ViewModels/PhoneForm.cs",
    "chars": 1415,
    "preview": "using System.Linq;\nusing System.Reactive.Linq;\nusing DotNetify;\nusing DotNetify.Elements;\nusing DotNetify.Security;\n\nna"
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/webpack.config.js",
    "chars": 1154,
    "preview": "'use strict';\n\nconst webpack = require('webpack');\nconst CopyPlugin = require('copy-webpack-plugin');\n\nmodule.exports = "
  },
  {
    "path": "MicrofrontendTemplate/ReactFormApp/wwwroot/index.html",
    "chars": 998,
    "preview": "<!DOCTYPE html>\n<html>\n    <head>\n       <title>React Form App</title>\n       <meta charset=\"utf-8\">\n       <meta name="
  },
  {
    "path": "MicrofrontendTemplate/ReactTodoApp/Properties/launchSettings.json",
    "chars": 832,
    "preview": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      "
  },
  {
    "path": "MicrofrontendTemplate/ReactTodoApp/README.md",
    "chars": 105,
    "preview": "## How to run:\n\nStart the Portal first (app requires an auth server), then execute `run.bat [dev|prod]`.\n"
  },
  {
    "path": "MicrofrontendTemplate/ReactTodoApp/ReactTodoApp.csproj",
    "chars": 2101,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n    <RootN"
  },
  {
    "path": "MicrofrontendTemplate/ReactTodoApp/appsettings.json",
    "chars": 64,
    "preview": "{\n  \"IdentityServer\": {\n    \"Uri\": \"http://localhost:5000\"\n  }\n}"
  },
  {
    "path": "MicrofrontendTemplate/ReactTodoApp/client/components/TodoList.js",
    "chars": 3962,
    "preview": "import React from 'react';\nimport dotnetify from 'dotnetify';\nimport { Alert, Checkbox, Cell, Frame, Panel, TextField, w"
  },
  {
    "path": "MicrofrontendTemplate/ReactTodoApp/client/index.js",
    "chars": 258,
    "preview": "import { createWebComponent } from 'dotnetify-elements/web-components/Core';\nimport TodoList from './components/TodoList"
  },
  {
    "path": "MicrofrontendTemplate/ReactTodoApp/package.json",
    "chars": 1249,
    "preview": "{\n  \"version\": \"1.0.0\",\n  \"name\": \"react-todo-app\",\n  \"private\": true,\n  \"scripts\": {\n    \"build\": \"webpack\",\n    \"prod\""
  },
  {
    "path": "MicrofrontendTemplate/ReactTodoApp/run.bat",
    "chars": 169,
    "preview": "@echo off\nif not exist node_modules call npm i\nif \"%1\" == \"prod\" goto :prod\ncall npm run build\ndotnet run\nexit\n\n:prod\nca"
  },
  {
    "path": "MicrofrontendTemplate/ReactTodoApp/server/Program.cs",
    "chars": 389,
    "preview": "using Microsoft.AspNetCore;\nusing Microsoft.AspNetCore.Hosting;\n\nnamespace ReactTodoApp\n{\n   public class Program\n   {\n"
  },
  {
    "path": "MicrofrontendTemplate/ReactTodoApp/server/Startup.cs",
    "chars": 2992,
    "preview": "using DotNetify;\nusing DotNetify.Security;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusin"
  },
  {
    "path": "MicrofrontendTemplate/ReactTodoApp/server/ViewModels/TodoList.cs",
    "chars": 1679,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reactive.Linq;\nusing DotNetify;\nusing Do"
  },
  {
    "path": "MicrofrontendTemplate/ReactTodoApp/webpack.config.js",
    "chars": 1150,
    "preview": "'use strict';\n\nconst webpack = require('webpack');\nconst CopyPlugin = require('copy-webpack-plugin');\n\nmodule.exports = "
  },
  {
    "path": "MicrofrontendTemplate/ReactTodoApp/wwwroot/index.html",
    "chars": 1285,
    "preview": "<!DOCTYPE html>\n<html>\n    <head>\n       <title>ReactTodoApp</title>\n       <meta charset=\"utf-8\">\n       <meta name=\"v"
  },
  {
    "path": "MicrofrontendTemplate/Shared/IdentityServer/IdentityServerClient.cs",
    "chars": 2153,
    "preview": "using IdentityModel;\nusing IdentityModel.Client;\nusing Microsoft.IdentityModel.Tokens;\nusing System;\nusing System.Colle"
  },
  {
    "path": "MicrofrontendTemplate/Shared/IdentityServer/IdentityServerConfig.cs",
    "chars": 1020,
    "preview": "using System.Collections.Generic;\nusing IdentityServer4.Models;\n\nnamespace Shared\n{\n   public class IdentityServerConfi"
  },
  {
    "path": "MicrofrontendTemplate/Shared/IdentityServer/IdentityServerSettings.cs",
    "chars": 177,
    "preview": "namespace Shared\n{\n   public class IdentityServerSettings\n   {\n      public static readonly string SectionName = \"Ident"
  },
  {
    "path": "MicrofrontendTemplate/Shared/Shared.csproj",
    "chars": 324,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netstandard2.0</TargetFramework>\n  </PropertyG"
  },
  {
    "path": "MicrofrontendTemplate/VueTodoApp/Properties/launchSettings.json",
    "chars": 832,
    "preview": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      "
  },
  {
    "path": "MicrofrontendTemplate/VueTodoApp/README.md",
    "chars": 105,
    "preview": "## How to run:\n\nStart the Portal first (app requires an auth server), then execute `run.bat [dev|prod]`.\n"
  },
  {
    "path": "MicrofrontendTemplate/VueTodoApp/VueTodoApp.csproj",
    "chars": 2099,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n    <RootN"
  },
  {
    "path": "MicrofrontendTemplate/VueTodoApp/appsettings.json",
    "chars": 64,
    "preview": "{\n  \"IdentityServer\": {\n    \"Uri\": \"http://localhost:5000\"\n  }\n}"
  },
  {
    "path": "MicrofrontendTemplate/VueTodoApp/client/components/TodoList.vue",
    "chars": 3804,
    "preview": "<template>\n  <h4 v-if=\"error\">{{error.message}}</h4>\n  <d-frame v-else middle=\"true\" css=\"width: calc(100% - 3rem)\">\n   "
  },
  {
    "path": "MicrofrontendTemplate/VueTodoApp/client/index.js",
    "chars": 478,
    "preview": "import Vue from 'vue';\nimport vueCustomElement from 'vue-custom-element';\nimport TodoList from './components/TodoList.vu"
  },
  {
    "path": "MicrofrontendTemplate/VueTodoApp/package.json",
    "chars": 846,
    "preview": "{\n  \"version\": \"1.0.0\",\n  \"name\": \"vue-todo-app\",\n  \"private\": true,\n  \"scripts\": {\n    \"build\": \"webpack\",\n    \"prod\": "
  },
  {
    "path": "MicrofrontendTemplate/VueTodoApp/run.bat",
    "chars": 169,
    "preview": "@echo off\nif not exist node_modules call npm i\nif \"%1\" == \"prod\" goto :prod\ncall npm run build\ndotnet run\nexit\n\n:prod\nca"
  },
  {
    "path": "MicrofrontendTemplate/VueTodoApp/server/Program.cs",
    "chars": 387,
    "preview": "using Microsoft.AspNetCore;\nusing Microsoft.AspNetCore.Hosting;\n\nnamespace VueTodoApp\n{\n   public class Program\n   {\n  "
  },
  {
    "path": "MicrofrontendTemplate/VueTodoApp/server/Startup.cs",
    "chars": 2978,
    "preview": "using DotNetify;\nusing DotNetify.Security;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusin"
  },
  {
    "path": "MicrofrontendTemplate/VueTodoApp/server/ViewModels/TodoList.cs",
    "chars": 1675,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reactive.Linq;\nusing DotNetify;\nusing Do"
  },
  {
    "path": "MicrofrontendTemplate/VueTodoApp/webpack.config.js",
    "chars": 1178,
    "preview": "'use strict';\n\nconst webpack = require('webpack');\nconst CopyPlugin = require('copy-webpack-plugin');\nconst { VueLoaderP"
  },
  {
    "path": "MicrofrontendTemplate/VueTodoApp/wwwroot/index.html",
    "chars": 1157,
    "preview": "<!DOCTYPE html>\n<html>\n    <head>\n       <title>VueTodoApp</title>\n       <meta charset=\"utf-8\">\n       <meta name=\"vie"
  },
  {
    "path": "MicrofrontendTemplate/global.json",
    "chars": 44,
    "preview": "{\n  \"sdk\": {\n    \"version\": \"3.1.201\"\n  }\n}\n"
  },
  {
    "path": "MicrofrontendTemplate/heroku-deploy/Portal/Dockerfile",
    "chars": 550,
    "preview": "FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build\nLABEL stage=build\nWORKDIR /src\nCOPY ./__tmp__ .\n\n# Install node.js\nR"
  },
  {
    "path": "MicrofrontendTemplate/heroku-deploy/Portal/appsettings.json",
    "chars": 78,
    "preview": "{\n  \"IdentityServer\": {\n    \"Uri\": \"http://dotnetify-mfe.herokuapp.com\"\n  }\n}\n"
  },
  {
    "path": "MicrofrontendTemplate/heroku-deploy/Portal/build.bat",
    "chars": 607,
    "preview": "@echo off\nset env=Production\nif \"%1\"==\"\" goto :next\nset env=%1\n:next\n\necho --- Copy source code\nxcopy ..\\..\\Portal\\*.* ."
  },
  {
    "path": "MicrofrontendTemplate/heroku-deploy/Portal/deploy.bat",
    "chars": 375,
    "preview": "@echo off\n\necho --- Copy source code\nxcopy ..\\..\\Portal\\*.* .\\__tmp__\\Portal\\ /q /s /e /d /y /exclude:excludedfiles.txt\n"
  },
  {
    "path": "MicrofrontendTemplate/heroku-deploy/Portal/excludedfiles.txt",
    "chars": 92,
    "preview": ".vssscc\n.vspscc\n.log\n.user\n\\obj\\\n\\bin\\\n\\Properties\\\n\\node_modules\\\n\\coverage\\\n\\wwwroot\\dist\\"
  },
  {
    "path": "MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/Dockerfile",
    "chars": 583,
    "preview": "FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build\nLABEL stage=build\nWORKDIR /src\nCOPY ./__tmp__ .\n\n# Install node.js\nR"
  },
  {
    "path": "MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/appsettings.json",
    "chars": 78,
    "preview": "{\n  \"IdentityServer\": {\n    \"Uri\": \"http://dotnetify-mfe.herokuapp.com\"\n  }\n}\n"
  },
  {
    "path": "MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/build.bat",
    "chars": 638,
    "preview": "@echo off\nset env=Production\nif \"%1\"==\"\" goto :next\nset env=%1\n:next\n\necho --- Copy source code\nxcopy ..\\..\\ReactDashboa"
  },
  {
    "path": "MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/deploy.bat",
    "chars": 414,
    "preview": "@echo off\n\necho --- Copy source code\nxcopy ..\\..\\ReactDashboardApp\\*.* .\\__tmp__\\ReactDashboardApp\\ /q /s /e /d /y /excl"
  },
  {
    "path": "MicrofrontendTemplate/heroku-deploy/ReactDashboardApp/excludedfiles.txt",
    "chars": 92,
    "preview": ".vssscc\n.vspscc\n.log\n.user\n\\obj\\\n\\bin\\\n\\Properties\\\n\\node_modules\\\n\\coverage\\\n\\wwwroot\\dist\\"
  },
  {
    "path": "MicrofrontendTemplate/heroku-deploy/nginx/Dockerfile",
    "chars": 130,
    "preview": "FROM nginx:alpine\nCOPY ./nginx.conf /etc/nginx\nCMD sed -i -e 's/$PORT/'\"$PORT\"'/g' /etc/nginx/nginx.conf && nginx -g 'da"
  },
  {
    "path": "MicrofrontendTemplate/heroku-deploy/nginx/deploy.bat",
    "chars": 111,
    "preview": "@echo off\n\ncall heroku container:push web -a dotnetify-mfe\ncall heroku container:release web -a dotnetify-mfe\n\n"
  },
  {
    "path": "MicrofrontendTemplate/heroku-deploy/nginx/nginx.conf",
    "chars": 2287,
    "preview": "\nworker_processes  1;\n\nevents {\n    worker_connections  1024;\n}\n\nhttp {\n    log_format  main  '$remote_addr - $remote_us"
  },
  {
    "path": "MicrofrontendTemplate/nginx/.gitignore",
    "chars": 4,
    "preview": "logs"
  },
  {
    "path": "MicrofrontendTemplate/nginx/conf/fastcgi.conf",
    "chars": 1077,
    "preview": "\nfastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;\nfastcgi_param  QUERY_STRING       $query_string;\n"
  },
  {
    "path": "MicrofrontendTemplate/nginx/conf/fastcgi_params",
    "chars": 1007,
    "preview": "\nfastcgi_param  QUERY_STRING       $query_string;\nfastcgi_param  REQUEST_METHOD     $request_method;\nfastcgi_param  CONT"
  },
  {
    "path": "MicrofrontendTemplate/nginx/conf/koi-utf",
    "chars": 2837,
    "preview": "\n# This map is not a full koi8-r <> utf8 map: it does not contain\n# box-drawing and some other characters.  Besides this"
  },
  {
    "path": "MicrofrontendTemplate/nginx/conf/koi-win",
    "chars": 2223,
    "preview": "\ncharset_map  koi8-r  windows-1251 {\n\n    80  88 ; # euro\n\n    95  95 ; # bullet\n\n    9A  A0 ; # &nbsp;\n\n    9E  B7 ; # "
  },
  {
    "path": "MicrofrontendTemplate/nginx/conf/mime.types",
    "chars": 5231,
    "preview": "\ntypes {\n    text/html                                        html htm shtml;\n    text/css                              "
  },
  {
    "path": "MicrofrontendTemplate/nginx/conf/nginx.conf",
    "chars": 2080,
    "preview": "\nworker_processes  1;\n\nevents {\n    worker_connections  1024;\n}\n\nhttp {\n    log_format  main  '$remote_addr - $remote_us"
  },
  {
    "path": "MicrofrontendTemplate/nginx/conf/scgi_params",
    "chars": 636,
    "preview": "\nscgi_param  REQUEST_METHOD     $request_method;\nscgi_param  REQUEST_URI        $request_uri;\nscgi_param  QUERY_STRING  "
  },
  {
    "path": "MicrofrontendTemplate/nginx/conf/uwsgi_params",
    "chars": 664,
    "preview": "\nuwsgi_param  QUERY_STRING       $query_string;\nuwsgi_param  REQUEST_METHOD     $request_method;\nuwsgi_param  CONTENT_TY"
  },
  {
    "path": "MicrofrontendTemplate/nginx/conf/win-utf",
    "chars": 3610,
    "preview": "\n# This map is not a full windows-1251 <> utf8 map: it does not\n# contain Serbian and Macedonian letters.  If you need a"
  },
  {
    "path": "MicrofrontendTemplate/nginx/contrib/README",
    "chars": 543,
    "preview": "\ngeo2nginx.pl \t\tby Andrei Nigmatulin\n\n\tThe perl script to convert CSV geoip database ( free download\n\tat http://www.maxm"
  },
  {
    "path": "MicrofrontendTemplate/nginx/contrib/geo2nginx.pl",
    "chars": 1214,
    "preview": "#!/usr/bin/perl -w\n\n# (c) Andrei Nigmatulin, 2005\n#\n# this script provided \"as is\", without any warranties. use it at yo"
  },
  {
    "path": "MicrofrontendTemplate/nginx/contrib/unicode2nginx/koi-utf",
    "chars": 5991,
    "preview": "charset_map  koi8-r  utf-8 {\n\n    80  E29480 ; #\tBOX DRAWINGS LIGHT HORIZONTAL\n    81  E29482 ; #\tBOX DRAWINGS LIGHT VER"
  },
  {
    "path": "MicrofrontendTemplate/nginx/contrib/unicode2nginx/unicode-to-nginx.pl",
    "chars": 1090,
    "preview": "#!/usr/bin/perl -w\n\n# Convert unicode mappings to nginx configuration file format.\n\n# You may find useful mappings in va"
  },
  {
    "path": "MicrofrontendTemplate/nginx/contrib/unicode2nginx/win-utf",
    "chars": 5339,
    "preview": "charset_map  windows-1251  utf-8 {\n\n    80  D082 ; #CYRILLIC CAPITAL LETTER DJE\n    81  D083 ; #CYRILLIC CAPITAL LETTER "
  },
  {
    "path": "MicrofrontendTemplate/nginx/contrib/vim/ftdetect/nginx.vim",
    "chars": 198,
    "preview": "au BufRead,BufNewFile *.nginx set ft=nginx\nau BufRead,BufNewFile */etc/nginx/* set ft=nginx\nau BufRead,BufNewFile */usr/"
  },
  {
    "path": "MicrofrontendTemplate/nginx/contrib/vim/ftplugin/nginx.vim",
    "chars": 29,
    "preview": "setlocal commentstring=#\\ %s\n"
  },
  {
    "path": "MicrofrontendTemplate/nginx/contrib/vim/indent/nginx.vim",
    "chars": 250,
    "preview": "if exists(\"b:did_indent\")\n    finish\nendif\nlet b:did_indent = 1\n\nsetlocal indentexpr=\n\n\" cindent actually works for ngin"
  },
  {
    "path": "MicrofrontendTemplate/nginx/contrib/vim/syntax/nginx.vim",
    "chars": 129789,
    "preview": "\" Vim syntax file\n\" Language: nginx.conf\n\nif exists(\"b:current_syntax\")\n  finish\nend\n\n\" general syntax\n\nif has(\"patch-7."
  },
  {
    "path": "MicrofrontendTemplate/nginx/docs/CHANGES",
    "chars": 296215,
    "preview": "\nChanges with nginx 1.16.0                                        23 Apr 2019\n\n    *) 1.16.x stable branch.\n\n\nChanges wi"
  },
  {
    "path": "MicrofrontendTemplate/nginx/docs/CHANGES.ru",
    "chars": 305256,
    "preview": "\nИзменения в nginx 1.16.0                                          23.04.2019\n\n    *) Стабильная ветка 1.16.x.\n\n\nИзменен"
  },
  {
    "path": "MicrofrontendTemplate/nginx/docs/LICENSE",
    "chars": 1397,
    "preview": "/* \n * Copyright (C) 2002-2019 Igor Sysoev\n * Copyright (C) 2011-2019 Nginx, Inc.\n * All rights reserved.\n *\n * Redistri"
  },
  {
    "path": "MicrofrontendTemplate/nginx/docs/OpenSSL.LICENSE",
    "chars": 6121,
    "preview": "\n  LICENSE ISSUES\n  ==============\n\n  The OpenSSL toolkit stays under a double license, i.e. both the conditions of\n  th"
  },
  {
    "path": "MicrofrontendTemplate/nginx/docs/PCRE.LICENCE",
    "chars": 3182,
    "preview": "PCRE LICENCE\n------------\n\nPCRE is a library of functions to support regular expressions whose syntax\nand semantics are "
  },
  {
    "path": "MicrofrontendTemplate/nginx/docs/README",
    "chars": 49,
    "preview": "\nDocumentation is available at http://nginx.org\n\n"
  },
  {
    "path": "MicrofrontendTemplate/nginx/docs/zlib.LICENSE",
    "chars": 983,
    "preview": " (C) 1995-2017 Jean-loup Gailly and Mark Adler\n\n  This software is provided 'as-is', without any express or implied\n  wa"
  },
  {
    "path": "MicrofrontendTemplate/nginx/html/50x.html",
    "chars": 494,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n<title>Error</title>\n<style>\n    body {\n        width: 35em;\n        margin: 0 auto;\n     "
  },
  {
    "path": "MicrofrontendTemplate/nginx/html/index.html",
    "chars": 612,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\n    body {\n        width: 35em;\n        margin: 0"
  },
  {
    "path": "MicrofrontendTemplate/nginx/run.bat",
    "chars": 64,
    "preview": "if not exist logs mkdir logs\nif not exist temp mkdir temp\nnginx\n"
  },
  {
    "path": "MicrofrontendTemplate/nginx/stop.bat",
    "chars": 14,
    "preview": "nginx -s stop\n"
  },
  {
    "path": "MicrofrontendTemplate/run.bat",
    "chars": 453,
    "preview": "@echo off\nif \"%1\" == \"apps\" goto :apps\n\ncd nginx\nstart cmd /k run.bat\ncd ..\n\ncd Portal\nstart cmd /k run prod\ncd ..\n@echo"
  },
  {
    "path": "README.md",
    "chars": 898,
    "preview": "<p align=\"center\"><img width=\"300px\" src=\"http://dotnetify.net/content/images/dotnetify-logo.png\"></p>\n\n## DotNetify Rea"
  },
  {
    "path": "ReactTemplate/README.md",
    "chars": 1716,
    "preview": "<p align=\"center\"><img width=\"300px\" src=\"http://dotnetify.net/content/images/dotnetify-logo.png\"></p>\n\n## DotNetify Rea"
  },
  {
    "path": "ReactTemplate/content/.gitignore",
    "chars": 293,
    "preview": "# See https://help.github.com/ignore-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/bin\n/obj\n\n#Vis"
  },
  {
    "path": "ReactTemplate/content/client/app.tsx",
    "chars": 217,
    "preview": "import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './routes';\nimport 'flexboxgrid/css/flexbox"
  },
  {
    "path": "ReactTemplate/content/client/auth.ts",
    "chars": 920,
    "preview": "class Auth {\n  url = '/token';\n\n  signIn(username: string, password: string): Promise<void> {\n    return fetch(this.url,"
  },
  {
    "path": "ReactTemplate/content/client/components/BasePage.tsx",
    "chars": 649,
    "preview": "import React from 'react';\nimport Paper from '@material-ui/core/Paper';\nimport Divider from '@material-ui/core/Divider';"
  },
  {
    "path": "ReactTemplate/content/client/components/Header.tsx",
    "chars": 1993,
    "preview": "import React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport AppBar from '@material-ui/core/"
  },
  {
    "path": "ReactTemplate/content/client/components/Sidebar.tsx",
    "chars": 2672,
    "preview": "import React from 'react';\nimport { RouteLink, IDotnetifyVM } from 'dotnetify';\nimport { makeStyles } from '@material-ui"
  },
  {
    "path": "ReactTemplate/content/client/components/dashboard/InfoBox.tsx",
    "chars": 1302,
    "preview": "import React from \"react\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport Card from \"@material-ui/core/Ca"
  },
  {
    "path": "ReactTemplate/content/client/components/dashboard/RecentActivities.tsx",
    "chars": 2652,
    "preview": "import React from \"react\";\nimport { IDotnetifyVM, RouteType } from \"dotnetify\";\nimport { makeStyles } from \"@material-ui"
  },
  {
    "path": "ReactTemplate/content/client/components/dashboard/ServerUsage.tsx",
    "chars": 1717,
    "preview": "import React from \"react\";\nimport { Chart as ChartJS, CategoryScale, LinearScale, ArcElement, BarElement, Title, Tooltip"
  },
  {
    "path": "ReactTemplate/content/client/components/dashboard/Traffic.tsx",
    "chars": 1595,
    "preview": "import React from \"react\";\nimport { Chart as ChartJS, CategoryScale, LinearScale, PointElement, LineElement, Title, Tool"
  },
  {
    "path": "ReactTemplate/content/client/components/dashboard/Utilization.tsx",
    "chars": 2699,
    "preview": "import React from \"react\";\nimport { Doughnut } from \"react-chartjs-2\";\nimport { makeStyles } from \"@material-ui/core/sty"
  },
  {
    "path": "ReactTemplate/content/client/components/table/InlineEdit.tsx",
    "chars": 2246,
    "preview": "import React from 'react';\nimport EditIcon from '@material-ui/icons/Create';\nimport TextField from '@material-ui/core/Te"
  },
  {
    "path": "ReactTemplate/content/client/components/table/Pagination.tsx",
    "chars": 890,
    "preview": "import React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Paper from '@material-ui/core/P"
  },
  {
    "path": "ReactTemplate/content/client/routes.tsx",
    "chars": 312,
    "preview": "import App from './views/App';\nimport Dashboard from './views/Dashboard';\nimport FormPage from './views/FormPage';\nimpor"
  },
  {
    "path": "ReactTemplate/content/client/styles/app.css",
    "chars": 398,
    "preview": "html {\n  font-family: 'Roboto', sans-serif;\n  -webkit-font-smoothing: antialiased;\n}\n\nbody,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  f"
  },
  {
    "path": "ReactTemplate/content/client/styles/styles.ts",
    "chars": 389,
    "preview": "import React from 'react';\n\nconst styles: { [name: string]: React.CSSProperties } = {\n  navigation: {\n    fontSize: 15,\n"
  },
  {
    "path": "ReactTemplate/content/client/styles/theme-default.ts",
    "chars": 425,
    "preview": "import { blue, pink, grey } from \"@material-ui/core/colors\";\nimport { createTheme } from \"@material-ui/core/styles\";\n\nex"
  },
  {
    "path": "ReactTemplate/content/client/views/App.tsx",
    "chars": 403,
    "preview": "import React from 'react';\nimport LoginPage from './LoginPage';\nimport AppLayout from './AppLayout';\nimport auth from '."
  },
  {
    "path": "ReactTemplate/content/client/views/AppLayout.tsx",
    "chars": 2336,
    "preview": "import React from 'react';\nimport dotnetify, { IDotnetifyVM, RouteTarget } from 'dotnetify';\nimport { ThemeProvider } fr"
  },
  {
    "path": "ReactTemplate/content/client/views/Dashboard.tsx",
    "chars": 3567,
    "preview": "import React from 'react';\nimport dotnetify, { IDotnetifyVM } from 'dotnetify';\nimport { ThemeProvider } from '@material"
  },
  {
    "path": "ReactTemplate/content/client/views/FormPage.tsx",
    "chars": 3598,
    "preview": "import React from 'react';\nimport dotnetify, { IDotnetifyVM, RouteType } from 'dotnetify';\nimport { ThemeProvider } from"
  },
  {
    "path": "ReactTemplate/content/client/views/LoginPage.tsx",
    "chars": 2937,
    "preview": "import React from 'react';\nimport { useState } from 'react';\nimport Card from '@material-ui/core/Card';\nimport Button fr"
  },
  {
    "path": "ReactTemplate/content/client/views/TablePage.tsx",
    "chars": 5051,
    "preview": "import React from 'react';\nimport dotnetify, { IDotnetifyVM } from 'dotnetify';\nimport { ThemeProvider } from '@material"
  },
  {
    "path": "ReactTemplate/content/package.json",
    "chars": 1191,
    "preview": "{\n  \"version\": \"6.0.0\",\n  \"name\": \"projectName__lower\",\n  \"private\": true,\n  \"scripts\": {\n    \"build\": \"webpack\",\n    \"b"
  },
  {
    "path": "ReactTemplate/content/projectName.csproj",
    "chars": 2351,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n    <TypeScriptCo"
  },
  {
    "path": "ReactTemplate/content/projectName.sln",
    "chars": 1091,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26730.16\nMin"
  },
  {
    "path": "ReactTemplate/content/server/AuthServer.cs",
    "chars": 2660,
    "preview": "using System.IdentityModel.Tokens.Jwt;\nusing System.Security.Claims;\nusing System.Text;\nusing AspNet.Security.OpenIdCon"
  },
  {
    "path": "ReactTemplate/content/server/Program.cs",
    "chars": 1502,
    "preview": "using System.Text;\nusing BrunoLau.SpaServices.Webpack;\nusing DotNetify;\nusing DotNetify.Security;\nusing Microsoft.Ident"
  },
  {
    "path": "ReactTemplate/content/server/Services/EmployeeService.cs",
    "chars": 1837,
    "preview": "using System.Text;\nusing Newtonsoft.Json;\n\nnamespace projectName;\n\npublic interface IEmployeeService\n{\n   IList<Employe"
  },
  {
    "path": "ReactTemplate/content/server/Services/MockLiveDataService.cs",
    "chars": 3576,
    "preview": "using System.Reactive.Linq;\n\nnamespace projectName;\n\npublic interface ILiveDataService\n{\n   IObservable<string> Download"
  },
  {
    "path": "ReactTemplate/content/server/Services/employees.json",
    "chars": 1890,
    "preview": "[\n  {\n    \"Id\": 1,\n    \"FirstName\": \"Clive\",\n    \"LastName\": \"Lewis\",\n    \"ReportTo\": 0\n  },\n  {\n    \"Id\": 2,\n    \"Firs"
  },
  {
    "path": "ReactTemplate/content/server/ViewModels/AppLayout.cs",
    "chars": 1565,
    "preview": "using System.Security.Claims;\nusing DotNetify;\nusing DotNetify.Routing;\nusing DotNetify.Security;\n\nnamespace projectName"
  },
  {
    "path": "ReactTemplate/content/server/ViewModels/Dashboard.cs",
    "chars": 2169,
    "preview": "using System.Reactive.Linq;\nusing DotNetify;\nusing DotNetify.Routing;\nusing DotNetify.Security;\n\nnamespace projectName;\n"
  },
  {
    "path": "ReactTemplate/content/server/ViewModels/Form.cs",
    "chars": 2114,
    "preview": "using DotNetify;\nusing DotNetify.Routing;\nusing DotNetify.Security;\n\nnamespace projectName;\n\n[Authorize]\npublic class Fo"
  },
  {
    "path": "ReactTemplate/content/server/ViewModels/Table.cs",
    "chars": 3588,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing DotNetify;\nusing DotNetify.Security;\n\nnamespace"
  },
  {
    "path": "ReactTemplate/content/tsconfig.json",
    "chars": 465,
    "preview": "{\n  \"compilerOptions\": {\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\",\n    \"target\": \"es5\",\n    \"noImplicitAny"
  },
  {
    "path": "ReactTemplate/content/webpack.config.js",
    "chars": 743,
    "preview": "\"use strict\";\n\nconst MiniCssExtractPlugin = require(\"mini-css-extract-plugin\");\n\nmodule.exports = {\n  mode: \"development"
  },
  {
    "path": "ReactTemplate/content/wwwroot/404.html",
    "chars": 556,
    "preview": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Page not found</title>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\""
  },
  {
    "path": "ReactTemplate/content/wwwroot/index.html",
    "chars": 715,
    "preview": "<!DOCTYPE html>\n<html>\n    <head>\n       <title>DotNetify Template</title>\n       <meta charset=\"utf-8\">\n       <meta na"
  },
  {
    "path": "ReactTemplate/template.nuspec",
    "chars": 680,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd\">\n  <me"
  },
  {
    "path": "_archive/HelloWorld/HelloWorld.cs",
    "chars": 666,
    "preview": "using System;\nusing DotNetify;\nusing System.Threading;\n\nnamespace HelloWorld\n{\n   public class HelloWorld : BaseVM\n   {"
  },
  {
    "path": "_archive/HelloWorld/HelloWorld.csproj",
    "chars": 365,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n  </Prope"
  },
  {
    "path": "_archive/HelloWorld/HelloWorld.sln",
    "chars": 962,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26228.4\nMini"
  },
  {
    "path": "_archive/HelloWorld/Program.cs",
    "chars": 606,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing"
  },
  {
    "path": "_archive/HelloWorld/Properties/launchSettings.json",
    "chars": 623,
    "preview": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n     "
  },
  {
    "path": "_archive/HelloWorld/Startup.cs",
    "chars": 1281,
    "preview": "using System.IO;\nusing System.Collections.Generic;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosti"
  },
  {
    "path": "_archive/HelloWorld/package.json",
    "chars": 913,
    "preview": "{\n  \"name\": \"livechart\",\n  \"private\": true,\n  \"scripts\": {\n    \"build\": \"webpack\"\n  },\n  \"babel\": {\n    \"presets\": [\n   "
  },
  {
    "path": "_archive/HelloWorld/src/HelloWorld.jsx",
    "chars": 625,
    "preview": "import React from 'react';\nimport dotnetify from 'dotnetify';\n\nclass HelloWorld extends React.Component {\n   constructo"
  },
  {
    "path": "_archive/HelloWorld/src/app.js",
    "chars": 175,
    "preview": "import React from 'react';\nimport ReactDOM from 'react-dom';\nimport HelloWorld from './HelloWorld.jsx';\n\nReactDOM.rende"
  },
  {
    "path": "_archive/HelloWorld/webpack.config.js",
    "chars": 310,
    "preview": "'use strict';\n\nmodule.exports = {\n\tmode: 'development',\n\tentry: { bundle: './src/app.js' },\n\toutput: {\n\t\tpath: __dirnam"
  },
  {
    "path": "_archive/HelloWorld/wwwroot/bundle.js",
    "chars": 1265644,
    "preview": "/******/ (function(modules) { // webpackBootstrap\n/******/ \tfunction hotDisposeChunk(chunkId) {\n/******/ \t\tdelete instal"
  },
  {
    "path": "_archive/HelloWorld/wwwroot/index.html",
    "chars": 400,
    "preview": "<html>\n<head>\n   <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF8\">\n   <title>DotNetify-React</title>\n<"
  },
  {
    "path": "_archive/LiveChart/IISPublishingSteps.md",
    "chars": 1091,
    "preview": "## IIS Publishing Steps\n\n### Prerequisite:\n\nInstall ASP.NET Core Module for IIS.  You can download it here:<br/>\nhttps:/"
  },
  {
    "path": "_archive/LiveChart/LiveChart.cs",
    "chars": 865,
    "preview": "using System;\nusing System.Reactive.Linq;\nusing Rx = System.Reactive.Linq;\nusing DotNetify;\n\nnamespace LiveChart\n{\n   p"
  },
  {
    "path": "_archive/LiveChart/LiveChart.csproj",
    "chars": 432,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n  </Prope"
  },
  {
    "path": "_archive/LiveChart/LiveChart.sln",
    "chars": 960,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26228.4\nMini"
  },
  {
    "path": "_archive/LiveChart/Program.cs",
    "chars": 605,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing"
  },
  {
    "path": "_archive/LiveChart/Properties/launchSettings.json",
    "chars": 620,
    "preview": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      "
  },
  {
    "path": "_archive/LiveChart/Startup.cs",
    "chars": 1280,
    "preview": "using System.IO;\nusing System.Collections.Generic;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosti"
  }
]

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

About this extraction

This page contains the full source code of the dsuryd/dotnetify-react-demo-vs2017 GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 280 files (5.3 MB), approximately 1.4M tokens, and a symbol index with 1270 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!