diff --git a/README.md b/README.md index 9480a17f..a33290fd 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![](./media/solutions-microsoft-logo-small.png) +![](./media/solutions-microsoft-logo-small.png) # Azure Data SQL Samples Repository This GitHub repository contains code samples that demonstrate how to use Microsoft's Azure Data products including SQL Server, Azure SQL Database, Azure Synapse, and Azure SQL Edge. Each sample includes a README file that explains how to run and use the sample. diff --git a/samples/databases/wide-world-importers/sample-scripts/polybase/DemonstratePolybase.sql b/samples/databases/wide-world-importers/sample-scripts/polybase/DemonstratePolybase.sql deleted file mode 100644 index 2675074f..00000000 --- a/samples/databases/wide-world-importers/sample-scripts/polybase/DemonstratePolybase.sql +++ /dev/null @@ -1,139 +0,0 @@ --- Demonstrate WorldWideImporters Polybase connections --- Requires PolyBase to be installed. - -USE WideWorldImportersDW; -GO - --- WideWorldImporters have customers in a variety of cities but feel they are likely missing --- other important cities. They have decided to try to find other cities have a growth rate of more --- than 20% over the last 3 years, and where they do not have existing customers. --- They have obtained census data (a CSV file) and have loaded it into an Azure storage account. --- They want to combine that data with other data in their main OLTP database to work out where --- they should try to find new customers. - --- First, let's apply Polybase connectivity and set up an external table to point to the data --- in the Azure storage account. - -EXEC [Application].Configuration_ApplyPolybase; -GO - --- In Object Explorer, refresh the WideWorldImporters database, then expand the Tables node. --- Note that SQL Server 2016 added a new entry here for External Tables. Expand that node. --- Expand the dbo.CityPopulationStatistics table, expand the list of columns and note the --- values that are contained. Let's look at the data: - -SELECT CityID, StateProvinceCode, CityName, YearNumber, LatestRecordedPopulation FROM dbo.CityPopulationStatistics; -GO - --- How did that work? First the procedure created an external data source like this: -/* - -CREATE EXTERNAL DATA SOURCE AzureStorage -WITH -( - TYPE=HADOOP, LOCATION = 'wasbs://data@sqldwdatasets.blob.core.windows.net' -); - -*/ --- This shows how to connect to AzureStorage. Next the procedure created an --- external file format to describe the layout of the CSV file: -/* - -CREATE EXTERNAL FILE FORMAT CommaDelimitedTextFileFormat -WITH -( - FORMAT_TYPE = DELIMITEDTEXT, - FORMAT_OPTIONS - ( - FIELD_TERMINATOR = ',' - ) -); - -*/ --- Finally the external table was defined like this: -/* - -CREATE EXTERNAL TABLE dbo.CityPopulationStatistics -( - CityID int NOT NULL, - StateProvinceCode nvarchar(5) NOT NULL, - CityName nvarchar(50) NOT NULL, - YearNumber int NOT NULL, - LatestRecordedPopulation bigint NULL -) -WITH -( - LOCATION = '/', - DATA_SOURCE = AzureStorage, - FILE_FORMAT = CommaDelimitedTextFileFormat, - REJECT_TYPE = VALUE, - REJECT_VALUE = 4 -- skipping 1 header row per file -); - -*/ --- From that point onwards, the external table can be used like a local table. Let's run that --- query that they wanted to use to find out which cities they should be finding new customers --- in. We'll start building the query by grouping the cities from the external table --- and finding those with more than a 20% growth rate for the period: - -WITH PotentialCities -AS -( - SELECT cps.CityName, - cps.StateProvinceCode, - MAX(cps.LatestRecordedPopulation) AS PopulationIn2016, - (MAX(cps.LatestRecordedPopulation) - MIN(cps.LatestRecordedPopulation)) * 100.0 - / MIN(cps.LatestRecordedPopulation) AS GrowthRate - FROM dbo.CityPopulationStatistics AS cps - WHERE cps.LatestRecordedPopulation IS NOT NULL - AND cps.LatestRecordedPopulation <> 0 - GROUP BY cps.CityName, cps.StateProvinceCode -) -SELECT CityName, StateProvinceCode, PopulationIn2016, GrowthRate -FROM PotentialCities -WHERE GrowthRate > 2.0; -GO - --- Now let's combine that with our local city and sales data to exclude those where we already --- have customers. We'll find the 100 most interesting cities based upon population. - -WITH PotentialCities -AS -( - SELECT cps.CityName, - cps.StateProvinceCode, - MAX(cps.LatestRecordedPopulation) AS PopulationIn2016, - (MAX(cps.LatestRecordedPopulation) - MIN(cps.LatestRecordedPopulation)) * 100.0 - / MIN(cps.LatestRecordedPopulation) AS GrowthRate - FROM dbo.CityPopulationStatistics AS cps - WHERE cps.LatestRecordedPopulation IS NOT NULL - AND cps.LatestRecordedPopulation <> 0 - GROUP BY cps.CityName, cps.StateProvinceCode -), -InterestingCities -AS -( - SELECT DISTINCT pc.CityName, - pc.StateProvinceCode, - pc.PopulationIn2016, - FLOOR(pc.GrowthRate) AS GrowthRate - FROM PotentialCities AS pc - INNER JOIN Dimension.City AS c - ON pc.CityName = c.City - WHERE GrowthRate > 2.0 - AND NOT EXISTS (SELECT 1 FROM Fact.Sale AS s WHERE s.[City Key] = c.[City Key]) -) -SELECT TOP(100) CityName, StateProvinceCode, PopulationIn2016, GrowthRate -FROM InterestingCities -ORDER BY PopulationIn2016 DESC; -GO - --- Clean up if required -/* -DROP EXTERNAL TABLE dbo.CityPopulationStatistics; -GO -DROP EXTERNAL FILE FORMAT CommaDelimitedTextFileFormat; -GO -DROP EXTERNAL DATA SOURCE AzureStorage; -GO -*/ diff --git a/samples/databases/wide-world-importers/sample-scripts/polybase/README.md b/samples/databases/wide-world-importers/sample-scripts/polybase/README.md deleted file mode 100644 index ed632cce..00000000 --- a/samples/databases/wide-world-importers/sample-scripts/polybase/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# Sample Querying of External Data Source in WideWorldImportersDW - -This script demonstrates the use of PolyBase to query an external data source. - -Demographics data is available in Azure blob storage. This data is joined with sales data recorded in the local database to determine which would be good candidates for future expansion of the business. - -### Contents - -[About this sample](#about-this-sample)
-[Before you begin](#before-you-begin)
-[Running the sample](#run-this-sample)
-[Sample details](#sample-details)
-[Disclaimers](#disclaimers)
-[Related links](#related-links)
- - - - -## About this sample - - -1. **Applies to:** SQL Server 2016 (or higher), Azure SQL Database -1. **Key features:** PolyBase -1. **Workload:** Analytics -1. **Programming Language:** T-SQL -1. **Authors:** Greg Low, Jos de Bruijn -1. **Update history:** 26 May 2016 - initial revision - - - -## Before you begin - -To run this sample, you need the following prerequisites. - -**Software prerequisites:** - - -1. SQL Server 2016 (or higher) with PolyBase, connected to the internet. -2. SQL Server Management Studio -3. The WideWorldImportersDW database (Full version). - - - -## Running the sample - -1. Execute the sample script. - -2. Inspect external tables in the database. - -3. Review query results. - -## Sample details - -The sample script performs a configuration and runs three queries: - -1. An external table `dbo.CitePopulationStatistics` is created in the database, pointing to a data set in Azure blob storage. - -2. The data in Azure storage is queried through Transact-SQL, showing all the data in the data source. - -3. Cities with a significant growth rate (>= 20%) are identified. - -4. Top cities for potential expansion are identified based on external data as well as sales data in the local database. - - - -## Disclaimers -The code included in this sample is not intended to be used for production purposes. - - - -## Related Links - -For more information, see these articles: -- [Get started with PolyBase](https://msdn.microsoft.com/library/mt163689.aspx) -- [PolyBase: Gaining insights from HDFS and relational data in SQL Server 2016 (video)](https://channel9.msdn.com/Events/DataDriven/SQLServer2016/PolyBase) diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/.gitattributes b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/.gitattributes new file mode 100644 index 00000000..8c405ec3 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/.gitattributes @@ -0,0 +1,10 @@ +* text eol=lf +*.gif -text +*.jpg -text +*.png -text +*.dll -text +*.exe -text +*.nupkg -text +ml/data/*.parquet binary +*.zip binary +*.dacpac binary \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/.gitignore b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/.gitignore new file mode 100644 index 00000000..31aa3f7b --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/.gitignore @@ -0,0 +1,447 @@ +.DS_Store +temp/ + +# Created by https://www.gitignore.io/api/node,visualstudio,visualstudiocode +# Edit at https://www.gitignore.io/?templates=node,visualstudio,visualstudiocode + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# 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 (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://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.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history + +### 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 +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# 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 + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.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 + +# Visual Studio Trace Files +*.e2e + +# 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 + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# 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 + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: 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 +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/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 +*.appx +*.appxbundle +*.appxupload + +# 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 + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# 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 +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- Backup*.rdl + +# 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 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/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# End of https://www.gitignore.io/api/node,visualstudio,visualstudiocode \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/README.md b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/README.md new file mode 100644 index 00000000..14c811b7 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/README.md @@ -0,0 +1,475 @@ +# SQL DB Edge Demo + +## Overview + +The SQL DB Edge demo is based on a Contoso Renewable Energy, a wind turbine farm that leverages SQL DB Edge for data processing onboard the generator. + +The demo will walk you through resolving an alert being raised due to wind turbulence being detected at the device. You will train a model and deploy it to SQL DB Edge that will correct the detected wind wake and ultimately optimize power output. + +We will also look at some of the security features available with SQL DB Edge. + +## Wind Turbine Data Explanation for the Wake Detection model + +The data stored in the database table represents the following: + + +* **RecordId:** _Unique identifier for the entry._ +* **TurbineId:** _Unique identifier for the turbine in scope._ +* **GearboxOilLevel:** _Oil level recorded for the turbine gear box at the time of the reading._ +* **GearboxOilTemp:** _Oil temperature recorded for the turbine gear box at the time of the reading._ +* **GeneratorActivePower:** _Active Power recorded by the turbine generator._ +* **GeneratorSpeed:** _Speed recorded by the turbine generator._ +* **GeneratorTemp:** _Temperature recorded by the turbine generator._ +* **GeneratorTorque:** _Torque recorded by the turbine generator._ +* **GridFrequency:** _Frequency recorded in the grid for the specific wind turbine._ +* **GridVoltage:** _Voltage recorded in the grid for the specific wind turbine._ +* **HydraulicOilPressure:** _Current pressure of the hydraulic oil for the wind turbine._ +* **NacelleAngle:** _Angle of the nacelle at the time of the reading (the housing that contains all the generating components)._ +* **PitchAngle:** _Pitch angle of the blades against the oncoming air stream to obtain the optimal amount of energy._ +* **Vibration:** _Vibration of the wind turbine at the time of the reading._ +* **WindSpeedAverage:** _Average wind speed calculated from the last X records._ +* **Precipitation:** _Flag to represent if rain was present at the time of the reading._ +* **WindTempAverage:** _Average wind temperature calculated from the last X records._ +* **OverallWindDirection:** _Overall wind direction recorded at the time of the reading._ +* **TurbineWindDirection:** _Turbine wind direction recorded at the time of the reading._ +* **TurbineSpeedAverage:** _Average turbine speed calculated from the last X records._ +* **WindSpeedStdDev:** _Standard Deviation of the last X WindSpeedAverage records._ +* **TurbineSpeedStdDev:** _Standard Deviation of the last X TurbineSpeedAverage records._ + +The above dataset definition contains trends that will enable us to detect the existence of wake in a wind turbine. There are two main conditions that influence the presence of wind wake: + +1. Overall wind farm and turbine wind direction are both between 40° - 45° degrees. +1. TurbineSpeedStdDev and WindSpeedStdDev have been too far apart for greater than a minute. + +The wind turbine will experience wake when the turbine wind direction is between 40° - 45° degrees and the values of TurbineSpeedStdDev and WindSpeedStdDev are not similar. For example: +* Wake Present: + * TurbineWindDirection = 43.5° + * TurbineSpeedStdDev = 8.231 + * WindSpeedStdDev = 0.23 +* Wake Not Present: + * TurbineWindDirection = 23.5° + * TurbineSpeedStdDev = 0.921 + * WindSpeedStdDev = 0.213 + + + +## Clone the SQL DB Edge Demo Repository +Git will be used to copy all the files for the demo to your local computer. + +1. Install Git from [here](https://git-scm.com/download) +1. Open a command prompt and navigate to a folder where the repo should be downloaded
+1. Issue the command `https://github.com/SQLSourabh/DemoFiles.git` + +## Azure Resource Deployment + +An Azure Resource Manager (ARM) template will be used to deploy all the required resources in the solution. Click on the link below to start the deployment. + +[![homepage](https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/1-CONTRIBUTION-GUIDE/images/deploytoazure.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fzarmada.blob.core.windows.net%2Farm-deployments-public%2Farm-template-dbedge.json "Deploy template") + +TODO ^^ Need to update the ARM location + +### Deployment of resources + +Follow the steps to deploy the required Azure resources: + +**BASICS** + + - **Subscription**: Select the Subscription. + - **Resource group**: Click on 'Create new' and provide a unique name for the Resource Group + - **Location**: Select the Region where to deploy the resources. Keep in mind that all resources will be deployed to this region so make sure it supports all of the required services. The template has been confirmed to work in West US 2. + +1. Read and accept the `TERMS AND CONDITIONS` by checking the box. +1. Click the `Purchase` button and wait for the deployment to finish. + +## Post Deployment Configuration + +Some resources require some extra configuration. + +#### Upload SQL DACPAC + +The Edge Module will require access the DACPAC package in order to setup the database. + +1. In the [Azure portal](https://portal.azure.com/) select the **Resource Group** you created earlier. +1. Select the **Storage account** resource from the list. +1. Click the **Containers** option in the left menu under **Blob service**. +1. Click the **dacpac** container. +1. Click the **Upload** button. +1. Click the **Select a file** input and select the file under the project folder: `sql/turbine-sensor-db-dacpac.zip`. +1. Click the **Upload** button. +1. Once the file is uploaded, click on it. +1. Click **Generate SAS** tab. +1. Update the **Expiry** year to 2050. +1. Click **Generate SAS token and URL** +1. Copy the value in **Blob SAS URL** and save it for later in the setup. + + +##### SQL Security Setup Information + +As security settings were deployed as part of the DACPAC package, below is a **review** of the security setup within the database. + +1. Create users without a login for simpler testing: + ```sql + /* Create users using the logins created */ + CREATE USER OperatorUser WITHOUT LOGIN; + CREATE USER DataScientistUser WITHOUT LOGIN; + CREATE USER SecurityUser WITHOUT LOGIN; + CREATE USER TurbineUser WITHOUT LOGIN; + ``` + +1. Assigned permissions for each user: + ```sql + /* Grant permissions to users */ + GRANT SELECT ON RealtimeSensorRecord TO OperatorUser; + GRANT SELECT ON RealtimeSensorRecord TO DataScientistUser; + GRANT SELECT ON RealtimeSensorRecord TO SecurityUser; + GRANT SELECT, INSERT ON RealtimeSensorRecord TO TurbineUser; + ``` + > **Note**: All users can SELECT, however the TurbineUser can also INSERT to the table. + +1. For privacy reasons, mask the last 4 digits of the SensorId for the Data Scientist user: + ```sql + /*Mask the last four digits of the serial number (Sensor ID) for the Data Scientist User*/ + ALTER TABLE RealtimeSensorRecord + ALTER COLUMN SensorId varchar(50) MASKED WITH (FUNCTION = 'partial(34,"XXXX",0)'); + DENY UNMASK TO DataScientistUser; + GO + ``` + +1. Add a policy using a filter predicate and a function to manage access to data events: + * We updated the SensorType column as it is required in our function then created a new schema to store it. + + ```sql + /** + * Operator: Can see all events + * Data Scientist: Can see everything BUT Hatch Sensor events + * Security: Can ONLY see Hatch Sensor events + */ + ALTER TABLE RealtimeSensorRecord + ALTER COLUMN SensorType sysname + GO + + CREATE SCHEMA Security; + GO + ``` + * Add the function that will ensure each query is authorized based on Sensor Type/User. + + + ```sql + /** + * Operator: Can see all events + * Data Scientist: Can see everything BUT Hatch Sensor events + * Security: Can ONLY see Hatch Sensor events + */ + CREATE FUNCTION Security.fn_securitypredicate(@SensorType AS sysname) + RETURNS TABLE + WITH SCHEMABINDING + AS + RETURN SELECT 1 AS fn_securitypredicate_result + WHERE + USER_NAME() = 'OperatorUser' OR USER_NAME() = 'dbo' OR + (USER_NAME() = 'DataScientistUser' AND @SensorType <> 'HatchSensor') OR + (USER_NAME() = 'SecurityUser' AND @SensorType = 'HatchSensor'); + ``` + * Add a filter to to use the function. + + + ```sql + CREATE SECURITY POLICY SensorsDataFilter + ADD FILTER PREDICATE Security.fn_securitypredicate(SensorType) + ON dbo.RealtimeSensorRecord + WITH (STATE = ON); + ``` + + + +#### Notebook Setup + +In this section, we will setup our notebook with the required files for the generation of the wind adapt model. + +##### Upload training data file: + +1. In the [Azure portal](https://portal.azure.com/) select the **Resource Group** you created earlier. +1. Select the **Storage account** resource. +1. Click the **Containers** option in the left menu under **Blob service**. +1. Click the **azureml-blobstore-GUID** container. +1. Click the **Upload** button in the top. +1. Click the **Select a file** input and select the `ml\data\TrainingDataset.parquet` from your repo. +1. Click the **Upload** button and wait for the upload to finish. + +##### Notebook files upload +1. Select **Azure Active Directory** option from the main navigation in the Azure Portal: + + ![Azure Active Directory Option](./images/azure-active-directory-option.png) +1. Copy the **Tenant Id** value from the overview as you will need this value later. +1. Go back to the **Resource Group** you created earlier. +1. Select the **Machine Learning** resource. +1. Take note of the following values to be used later in the deployment + * Resource Group + * Workspace Name + * Subscription ID + ![Machine Learning Resource](./images/machine-learning-resource.png) +1. Click the **Launch now** button to open the Machine Learning workspace. +1. Click the **Notebooks** option in the left menu under **Author**. +1. Click the **Create new folder** button at the top of the navigation panel. +1. Enter the name `scripts` for as the folder name and click the **Create** button. +1. Click the **Upload files** button at the top of the navigation panel. +1. Select the 2 files inside the `ml\scripts` folder: + * ml\scripts\train.py + * ml\scripts\utils.py +1. Select the newly created `scripts` folder from the target directory list. +1. Click the **Upload** button and wait for the upload to finish. +1. Click the **Upload files** button again. +1. Select the following 2 files inside the `ml` folder: + * ml\utils.py + * ml\wind-turbine-scikit.ipynb + > **Note**: The `utils.py` is a different file from the previous step. + +1. Select your username folder from the target directory list. +1. Click the **Upload** button. + +##### Notebook configuration + +We need configure values within the notebook before being able to execute it: + +1. Click the `wind-turbine-scikit.ipynb` in the **My files** navigation: +1. Click the **New Compute** button. +1. Enter the name `compute-{your-initials}`. +1. Select **CPU (Central Processing Unit)** from the **Virtual machine type** dropdown. +1. Select the virtual machine size **Standard_D12_v2**. +1. Click the **Create** button and wait for the compute to be created. + > **Note**: This process can take several minutes; wait until status of **compute** is `Running`. +1. Click the **Edit** dropdown and select the **Edit in Jupyter** option. + > **Note**: If required, login with your Azure credentials. +1. Replace the values within the **Setup Azure ML** cell with the values you obtained in the **Notebook files upload** section: + ``` + interactive_auth = InteractiveLoginAuthentication(tenant_id="") + # Get instance of the Workspace and write it to config file + ws = Workspace( + subscription_id = '', + resource_group = '', + workspace_name = '', + auth = interactive_auth) + ``` +1. Click **File** > **Save and Checkpoint** from the menu. +1. Select the **Install requirements** cell and click **Run** from the menu, wait for the script to execute before continuing. +1. Select the **Setup Azure ML** cell and click **Run** from the menu. + > **IMPORTANT**: Observe the output to **authenticate** via the URL provided (https://microsoft.com/devicelogin). + +1. From here, **Run** the remaining cells sequentially until you have executed the notebook. + > **IMPORTANT**: Remember to wait for each cell to execute before continuing. +1. Go back to the azure resource group and click the **Storage Account** resource. +1. Click the **Containers** option in the left menu. +1. Click the container in the list with a name like: `azureml-blobstore-{guid}`. +1. A new file with the name `windturbinewake.model.onnx` will be in the container. +1. Click the `windturbinewake.model.onnx` file +1. Click the **Generate SAS** tab option. +1. Change the **Expiry** Year to 2050. +1. Click the **Generate SAS token and URL** button and wait for the SAS to be generated. +1. Copy the **Blob SAS URL** value for later in the demo usage section. + + > **IMPORTANT**: As this process does take some time, once you have saved your model to blob storage, you will not be required to execute this every time you run through the demo. Showing the notebook flow may be adequate for demo purposes. You will just need the blob SAS for the **SQL DB Edge Demo Usage** section later in the document. + + +#### Device Setup + +In this section, we will set up an Edge device within our IoT Hub instance. + +##### Create a new Edge device + +1. In the [Azure portal](https://portal.azure.com/) select the **Resource Group** you created earlier. +1. Select the **IoT Hub** resource. +1. Click on **IoT Edge** from the left navigation. +1. Click **+ Add an IoT Edge Device**. +1. Enter a **Device ID** and leave all other fields as default. +1. Click **Save**. +1. Once the device has been created, select the device and copy the **Primary Connection String** for later in this setup. + +##### Setup Edge device as a VM + +1. Click on the link below to start the deploy to Azure: + + [![homepage](https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/1-CONTRIBUTION-GUIDE/images/deploytoazure.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Fazure%2Fiotedge-vm-deploy%2Fmaster%2FedgeDeploy.json "Deploy device") + +1. On the newly launched window, fill in the available form fields: + + * **Subscription**: Your subscription. + * **Resource group**: Select the resource group you created earlier. + * **DNS Label Prefix**: Your initials and birth year. + * **Admin Username**: Enter `microsoft` as default. + * **Device Connection String**: The device connection string that you got from previous section. + * **VM Size**: The size of the virtual machine to be deployed. + * **Ubuntu OS Version**: The version of the Ubuntu OS to be installed on the base virtual machine. + * **Location**: The geographic region to deploy the virtual machine into, this value defaults to the location of the selected Resource Group. + * **Authentication Type**: Choose the **password** option. + * **Admin Password or Key**: Enter `M1cr0s0ft2020`. + +1. Accept the **Terms and Conditions**. +1. Select **Purchase** to begin the deployment. + +##### SSH into the VM - Optional +1. Once the deployment is complete, go back to the **Resource Group** you created earlier. +1. Select the **Virtual Machine** resource. + > **Note**: Take note of the machine name, this should be in the format vm-0000000000000. Also, take note of the associated DNS Name, which should be in the format `..cloudapp.azure.com`. + The DNS Name can be obtained from the Overview section of the newly deployed virtual machine within the Azure portal. + ![VM DNS Name](./images/iotedge-vm-dns-name.png) + + +1. If you want to SSH into this VM after setup, use the associated DNS Name with the command: `ssh @`. You can use the password you created in the previous step. + > **IMPORTANT**: There is an optional section at the end of this document showing some example commands. + + +##### Setup Visual Studio Code Development Environment + +1. Install [Visual Studio Code](https://code.visualstudio.com/Download) (VS Code). +1. Install [Docker Community Edition (CE)](https://docs.docker.com/install/#supported-platforms). Don't sign in to Docker Desktop after Docker CE is installed. +1. Install the following extensions for VS Code: + * [Azure Machine Learning](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.vscode-ai) ([Azure Account](https://marketplace.visualstudio.com/items?itemName=ms-vscode.azure-account) will be automatically installed) + * [Azure IoT Hub Toolkit](https://marketplace.visualstudio.com/items?itemName=vsciot-vscode.azure-iot-toolkit) + * [Azure IoT Edge](https://marketplace.visualstudio.com/items?itemName=vsciot-vscode.azure-iot-edge) + * [Docker Extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker) +1. Restart VS Code. +1. Select **[View > Command Palette…]** to open the command palette box, then enter **[Python: Select Interpreter]** command in the command palette box to select your Python interpreter. +1. Enter **[Azure: Sign In]** command in the command palette box to sign in Azure account and select your subscription. + +##### Build and deploy container image to device + +1. Launch Visual Studio Code, and select File > Open Workspace... command to open the `edge\sensor-solution.code-workspace`. +1. Update the .env file with the values for your container registry. + - In the [Azure portal](https://portal.azure.com/) select the **Resource Group** you created earlier. + - Select the **Container Registry** resource. + - Select **Access Keys** from the left navigation. + - Update the following in `edge/SensorSolution/.env` with the following values from **Access Keys** within the Container Registry: + + CONTAINER_REGISTRY_NAME=`` (Ensure this is the login server and NOT the Registry Name) + + CONTAINER_REGISTRY_USER_NAME=`` + + CONTAINER_REGISTRY_PASSWORD=`` + + SQL_PACKAGE=`` (the one you obtained earlier in the setup) + + - Save the file. +1. Sign in to your Azure Container Registry by entering the following command in the Visual Studio Code integrated terminal (replace , , and with your container registry values set in the .env file IN THE PREVIOUS STEP). + + `docker login -u -p ` + + > **IMPORTANT**: Ensure you have `amd64` selected as the architecture in the bottom navigation bar of VS Code. + +1. Right-click on `edge/SensorSolution/deployment.debug.template.json` and select the **Build and Push IoT Edge Solution** command to generate a new `deployment.debug.amd64.json` file in the config folder, build a module image, and push the image to the specified ACR repository. + > **IMPORTANT:** If you have amended code in your module, you will need to increment the version number in `module.json` so the new version will get deployed to the device in the next steps. + + > **Note**: Some red warnings "/usr/bin/find: '/proc/XXX': No such file or directory" and "debconf: delaying package configuration, since apt-utils is not installed" displayed during the building process can be ignored. + +1. Ensure you have the correct Iot Hub selected in VS Code. + - In the Azure IoT Hub extension, click **Select IoT Hub** from the hamburger menu. (Alternatively, select `Azure IoT Hub: Select IoT Hub` from the **Command Palette**) + - Select your **Subscription**. + - Select the **IoT Hub** you created earlier in the setup. +1. Right-click `config\deployment.debug.amd64.json` and select **Create Deployment for a Single Device**. +1. Select the device you created earlier. +1. Wait for deployment to be completed. + +#### Web App Settings + +Follow the next steps to setup the required module twin connection string property. + +1. In the [Azure portal](https://portal.azure.com/) select the **Resource Group** you created earlier. +1. Select the **IoT Hub** resource. +1. Click the **IoT Edge** option in the left menu under **Automatic Device Management**. +1. Click the **device** you created earlier. +1. Click the **SensorModule** from the modules list. +1. Copy the **Connection string (primary key)** value and save for the next step. +1. Go back to your **Resource Group**. +1. Select the **App Service** resource. +1. Click the **Configuration** option in the left menu. +1. Under the **Application settings** find the `IoTHub:ModuleConnectionString` and click it. +1. Paste the module connection string that you got before to the `value` input field. +1. Click the **OK** button. +1. Click the **Save** button on the top to apply the change. + +## SQL DB Edge Demo Usage + +Open the Web App. + +1. In the [Azure portal](https://portal.azure.com/) select the **Resource Group** you created earlier. +1. Select the **App Service** resource. +1. Click **Browse** to go the application on a desktop machine. + +Investigate Turbine Issue +1. Click **view** on the alert. A query is ran against the SQL DB Edge instance. +1. Notice the Operator can't see the Security Alert due to as the permissions we set earlier. +1. You can notice a drop in the **Power Generated** chart. +1. Click the **Environmental** button. +1. You can notice the **Wind Speed and Direction** at the turbine is a lot more turbulent than the rest of the Wind Farm. This could indicate wind wake. + +Now we need to run our notebook in order to generate the Onnx model that we will use to resolve the alert. + +>**Important**: As mentioned earlier in the document, you can choose to run through executing the notebook cells in the `Notebook Setup` section again to obtain the model. Or you can use your Blob URL you created during the initial setup. + +Now we have our wind adapt model, lets update the module to correct the turbine. + +1. Go back to the azure resource group and click the **IoT Hub** resource. +1. Click the **Iot Edge** option in the left menu. +1. Click the created device from previous steps. +1. Click the **SensorModule** from the modules list. +1. Click the **Module Identity Twin** option in the top menu. +1. Find the `properties` section in the json. +1. Find the `desired` section in the json. +1. Find the `OnnxModelUrl` property and update the value with the model Blob URL from the previous section. +1. Click the **Save** button. +1. Go back to the **Web App**. +1. You will notice a notification indicating the alert has been resolved. +1. Click on the **Resfresh** button. +1. Notice the turbine **Wind Speed and Direction** has stabilized. +1. If you go back to the dashboard view. You will notice Unit 34 no longer has an alert. + + +#### Restart the demo + +This steps allows you to restart the demo. + +1. Go back to the azure resource group and click the **IoT Hub** resource. +1. Click the **Iot Edge** option in the left menu. +1. Click the created device from previous steps. +1. Click the **SensorModule** from the modules list. +1. Click the **Module Identity Twin** option in the top menu. +1. Find the `properties` section in the json. +1. Find the `desired` section in the json. +1. Find the `OnnxModelUrl` property set the value as empty. +> **Note**: Since the `Alert` property value was already in `start` we don't need to updated it but the module will set the reported property with this value. + +1. Click the **Save** button. +1. Go back to the **Web App** and refresh. +1. After a short time the alert will appear again. + +# Optional Steps + +This section describe steps that allow us to see extra features of the resources as a reference only. + +## Device VM access + +Here we will see how to run commands into to the device virtual machine from the terminal using SSH connection. + +1. In the [Azure portal](https://portal.azure.com/) select the **Resource Group** you created earlier. +2. Select the **Virtual machine** resource. +3. Copy the **DNS name** to use it for the connection. +4. In a terminal run the following command replacing the **DNS name**:` ssh microsoft@` + > **Note**: The above command is assuming that you use the default Admin username when deploying the VM. + +5. Enter the password to connect. + > **Note**: Default password is: `M1cr0s0ft2020` + +6. Run the following command to see the list of modules running: `sudo iotedge list` + > **Note**: You can should be able to see the `AzureSQLDatabaseEdge` and `SensorModule` we deployed earlier. + +7. Run the following command to see the logs of the **Sensor Module**: `sudo iotedge logs SensorModule` + * Following we will connect with the edge sql server to run a simple query by doing: + * Get the list of containers running with docker: `sudo docker container list`. + * Get the container ID of the `AzureSQLDatabaseEdge` docker image running. + * Connect to the container using the id that you got and the command: `sudo docker exec -it CONTAINERID /bin/sh`. + * Connect to the container using: `/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'Microsoft2020$'`. + * Connect to the database using: `USE [turbine-sensor-db]` and then `go`. + * Query the number of records in the table using: `select count(*) from RealtimeSensorRecord` and `go`. + +# Troubleshooting +### Error when deploying ARM Template +We've seen issues with different subscription types: MSDN, AIRS, etc... not being able to deploy certain resources to certain regions. We've found that deploying to West US 2 works consistently. If you have a deployment error, try deploying to West US 2. The resources inherit their deployment region from the Resource Group location. diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/deployment/arm-template.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/deployment/arm-template.json new file mode 100644 index 00000000..fe3b99e1 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/deployment/arm-template.json @@ -0,0 +1,383 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + }, + "variables": { + "prefix": "sqldbedge", + "uniquePrefix": "[concat(variables('prefix'), substring(uniqueString(resourceGroup().id), 0, 6))]", + "registry": { + "name": "[concat(variables('uniquePrefix'), 'registry')]", + "id": "[concat(resourceGroup().id,'/providers/','Microsoft.Storage/storageAccounts/', concat(variables('uniquePrefix'), 'registry'))]", + "vault": { + "name": "[concat(variables('uniquePrefix'), 'vault')]", + "id": "[concat(resourceGroup().id,'/providers/','Microsoft.Storage/storageAccounts/', concat(variables('uniquePrefix'), 'vault'))]" + } + }, + "storage": { + "name": "[concat(variables('uniquePrefix'), 'storage')]", + "id": "[concat(resourceGroup().id,'/providers/','Microsoft.Storage/storageAccounts/', concat(variables('uniquePrefix'), 'storage'))]" + }, + "ml": { + "name": "[concat(variables('uniquePrefix'), 'ml')]", + "id": "[concat(resourceGroup().id,'/providers/','Microsoft.Storage/storageAccounts/', concat(variables('uniquePrefix'), 'ml'))]" + }, + "insights": { + "component": { + "name": "[concat(variables('uniquePrefix'), 'insightscomp')]", + "id": "[concat(resourceGroup().id,'/providers/','Microsoft.Storage/storageAccounts/', concat(variables('uniquePrefix'), 'insightscomp'))]" + } + }, + "sqldbedgehub": { + "name": "[concat(variables('uniquePrefix'), 'sqldbedgehub')]", + "id": "[concat(resourceGroup().id,'/providers/','Microsoft.Storage/storageAccounts/', concat(variables('uniquePrefix'), 'sqldbedgehub'))]" + }, + "website": { + "name": "[concat(variables('uniquePrefix'), 'app')]", + "serverfarms": { + "name": "[concat(variables('uniquePrefix'), 'serverfarms')]" + } + } + }, + "resources": [ + { + "type": "Microsoft.ContainerRegistry/registries", + "apiVersion": "2019-12-01-preview", + "name": "[variables('registry').name]", + "location": "[resourceGroup().location]", + "sku": { + "name": "Basic", + "tier": "Basic" + }, + "properties": { + "adminUserEnabled": true, + "policies": { + "quarantinePolicy": { + "status": "disabled" + }, + "trustPolicy": { + "type": "Notary", + "status": "disabled" + }, + "retentionPolicy": { + "days": 7, + "status": "disabled" + } + }, + "encryption": { + "status": "disabled" + }, + "dataEndpointEnabled": false + } + }, + { + "type": "microsoft.insights/components", + "apiVersion": "2015-05-01", + "name": "[variables('insights').component.name]", + "location": "[resourceGroup().location]", + "kind": "web", + "properties": { + "Application_Type": "web" + } + }, + { + "type": "Microsoft.Storage/storageAccounts", + "apiVersion": "2019-06-01", + "name": "[variables('storage').name]", + "location": "[resourceGroup().location]", + "sku": { + "name": "Standard_LRS", + "tier": "Standard" + }, + "kind": "StorageV2", + "properties": { + "networkAcls": { + "bypass": "AzureServices", + "virtualNetworkRules": [], + "ipRules": [], + "defaultAction": "Allow" + }, + "supportsHttpsTrafficOnly": false, + "encryption": { + "services": { + "file": { + "keyType": "Account", + "enabled": true + }, + "blob": { + "keyType": "Account", + "enabled": true + } + }, + "keySource": "Microsoft.Storage" + } + } + }, + { + "type": "Microsoft.Storage/storageAccounts/blobServices", + "apiVersion": "2019-06-01", + "name": "[concat(variables('storage').name, '/default')]", + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts', variables('storage').name)]" + ], + "sku": { + "name": "Standard_RAGRS", + "tier": "Standard" + }, + "properties": { + "cors": { + "corsRules": [] + }, + "deleteRetentionPolicy": { + "enabled": false + } + } + }, + { + "type": "Microsoft.Storage/storageAccounts/fileServices", + "apiVersion": "2019-06-01", + "name": "[concat(variables('storage').name, '/default')]", + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts', variables('storage').name)]" + ], + "sku": { + "name": "Standard_RAGRS", + "tier": "Standard" + }, + "properties": { + "cors": { + "corsRules": [] + } + } + }, + { + "type": "Microsoft.Storage/storageAccounts/blobServices/containers", + "apiVersion": "2019-06-01", + "name": "[concat(variables('storage').name, '/default/dacpac')]", + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts/blobServices', variables('storage').name, 'default')]", + "[resourceId('Microsoft.Storage/storageAccounts', variables('storage').name)]" + ], + "properties": { + "publicAccess": "None" + } + }, + { + "type": "Microsoft.KeyVault/vaults", + "apiVersion": "2018-02-14", + "name": "[variables('registry').vault.name]", + "location": "[resourceGroup().location]", + "properties": { + "tenantId": "[subscription().tenantId]", + "enabledForDeployment": true, + "enabledForDiskEncryption": true, + "enabledForTemplateDeployment": true, + "sku": { + "name": "standard", + "family": "A" + }, + "networkAcls": { + "defaultAction": "Allow", + "bypass": "AzureServices" + }, + "accessPolicies": [] + } + }, + { + "type": "Microsoft.MachineLearningServices/workspaces", + "apiVersion": "2018-11-19", + "name": "[variables('ml').name]", + "location": "[resourceGroup().location]", + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts', variables('storage').name)]", + "[resourceId('Microsoft.ContainerRegistry/registries', variables('registry').name)]", + "[resourceId('Microsoft.KeyVault/vaults', variables('registry').vault.name)]", + "[resourceId('microsoft.insights/components', variables('insights').component.name)]" + ], + "sku": { + "name": "Basic", + "tier": "Basic" + }, + "identity": { + "type": "SystemAssigned" + }, + "properties": { + "storageAccount": "[resourceId('Microsoft.Storage/storageAccounts', variables('storage').name)]", + "containerRegistry": "[resourceId('Microsoft.ContainerRegistry/registries', variables('registry').name)]", + "keyVault": "[resourceId('Microsoft.KeyVault/vaults', variables('registry').vault.name)]", + "applicationInsights": "[resourceId('microsoft.insights/components', variables('insights').component.name)]", + "discoveryUrl": "[concat('https://', resourceGroup().location, '.experiments.azureml.net/discovery')]" + } + }, + { + "type": "Microsoft.Devices/IotHubs", + "apiVersion": "2019-11-04", + "name": "[variables('sqldbedgehub').name]", + "location": "[resourceGroup().location]", + "sku": { + "name": "S1", + "tier": "Standard", + "capacity": 1 + }, + "properties": { + "ipFilterRules": [], + "eventHubEndpoints": { + "events": { + "retentionTimeInDays": 1, + "partitionCount": 4 + } + }, + "routing": { + "endpoints": { + "serviceBusQueues": [], + "serviceBusTopics": [], + "eventHubs": [], + "storageContainers": [] + }, + "routes": [], + "fallbackRoute": { + "name": "$fallback", + "source": "DeviceMessages", + "condition": "true", + "endpointNames": [ + "events" + ], + "isEnabled": true + } + }, + "storageEndpoints": {}, + "messagingEndpoints": { + "fileNotifications": { + "lockDurationAsIso8601": "PT1M", + "ttlAsIso8601": "PT1H", + "maxDeliveryCount": 10 + } + }, + "enableFileUploadNotifications": false, + "cloudToDevice": { + "maxDeliveryCount": 10, + "defaultTtlAsIso8601": "PT1H", + "feedback": { + "lockDurationAsIso8601": "PT1M", + "ttlAsIso8601": "PT1H", + "maxDeliveryCount": 10 + } + }, + "features": "None" + } + }, + { + "type": "Microsoft.Web/serverfarms", + "apiVersion": "2018-02-01", + "name": "[variables('website').serverfarms.name]", + "location": "[resourceGroup().location]", + "dependsOn": [ + ], + "sku": { + "name": "D1", + "tier": "Shared", + "size": "D1", + "family": "D", + "capacity": 0 + }, + "kind": "app", + "properties": { + "perSiteScaling": false, + "maximumElasticWorkerCount": 1, + "isSpot": false, + "reserved": false, + "isXenon": false, + "hyperV": false, + "targetWorkerCount": 0, + "targetWorkerSizeId": 0 + } + }, + { + "apiVersion": "2018-02-01", + "name": "[variables('website').name]", + "type": "Microsoft.Web/sites", + "location": "[resourceGroup().location]", + "dependsOn": [ + "[resourceId('Microsoft.Web/serverfarms', variables('website').serverfarms.name)]" + ], + "tags": null, + "properties": { + "name": "[variables('website').name]", + "enabled": true, + "hostNameSslStates": [{ + "name": "[concat(variables('website').name, '.azurewebsites.net')]", + "sslState": "Disabled", + "hostType": "Standard" + }, + { + "name": "[concat(variables('website').name, '.scm.azurewebsites.net')]", + "sslState": "Disabled", + "hostType": "Repository" + } + ], + "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('website').serverfarms.name)]", + "siteConfig": { + "appSettings": [{ + "name": "ApplicationInsightsAgent_EXTENSION_VERSION", + "value": "~2" + }, + { + "name": "XDT_MicrosoftApplicationInsights_Mode", + "value": "default" + }, + { + "name": "DiagnosticServices_EXTENSION_VERSION", + "value": "disabled" + }, + { + "name": "APPINSIGHTS_PROFILERFEATURE_VERSION", + "value": "disabled" + }, + { + "name": "APPINSIGHTS_SNAPSHOTFEATURE_VERSION", + "value": "disabled" + }, + { + "name": "InstrumentationEngine_EXTENSION_VERSION", + "value": "disabled" + }, + { + "name": "SnapshotDebugger_EXTENSION_VERSION", + "value": "disabled" + }, + { + "name": "XDT_MicrosoftApplicationInsights_BaseExtensions", + "value": "disabled" + }, + { + "name": "IoTHub:ModuleConnectionString", + "value": "" + } + ], + "metadata": [{ + "name": "CURRENT_STACK", + "value": "dotnetcore" + }] + }, + "clientAffinityEnabled": true + }, + "resources": [{ + "name": "MSDeploy", + "type": "extensions", + "location": "[resourceGroup().location]", + "apiVersion": "2015-08-01", + "dependsOn": [ + "[concat('Microsoft.Web/sites/', variables('website').name)]" + ], + "tags": { + "displayName": "webDeploy" + }, + "properties": { + "packageUri": "https://zarmada.blob.core.windows.net/sqldbedge-shared/sqldbedgedemo.zip?sp=r&st=2020-04-21T03:07:20Z&se=2050-04-21T11:07:20Z&spr=https&sv=2019-02-02&sr=b&sig=veWrTqH9RqjDeceBszIBtg3ueQlyBxmLd4ZPVrpTXpg%3D", + "dbType": "None", + "connectionString": "" + } + }] + } + ] +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/.env b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/.env new file mode 100644 index 00000000..0c5c3d16 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/.env @@ -0,0 +1,4 @@ +CONTAINER_REGISTRY_NAME= +CONTAINER_REGISTRY_USER_NAME= +CONTAINER_REGISTRY_PASSWORD= +SQL_PACKAGE= \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/.vscode/launch.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/.vscode/launch.json new file mode 100644 index 00000000..c082e012 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/.vscode/launch.json @@ -0,0 +1,43 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "SensorModule Remote Debug (.NET Core)", + "type": "coreclr", + "request": "attach", + "processId": "${command:pickRemoteProcess}", + "pipeTransport": { + "pipeProgram": "docker", + "pipeArgs": [ + "exec", + "-i", + "SensorModule", + "sh", + "-c" + ], + "debuggerPath": "~/vsdbg/vsdbg", + "pipeCwd": "${workspaceFolder}", + "quoteArgs": true + }, + "sourceFileMap": { + "/app": "${workspaceFolder}/modules/SensorModule" + }, + "justMyCode": true + }, + { + "name": "SensorModule Local Debug (.NET Core)", + "type": "coreclr", + "request": "launch", + "program": "${workspaceRoot}/modules/SensorModule/bin/Debug/netcoreapp2.1/SensorModule.dll", + "args": [], + "cwd": "${workspaceRoot}/modules/SensorModule", + "internalConsoleOptions": "openOnSessionStart", + "stopAtEntry": false, + "console": "internalConsole", + "env": { + "EdgeHubConnectionString": "${config:azure-iot-edge.EdgeHubConnectionString}", + "EdgeModuleCACertificateFile": "${config:azure-iot-edge.EdgeModuleCACertificateFile}" + } + } + ] +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/.vscode/settings.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/.vscode/settings.json new file mode 100644 index 00000000..e13a6e88 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "azure-iot-edge.defaultPlatform": { + "platform": "amd64", + "alias": null + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/deployment.debug.template.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/deployment.debug.template.json new file mode 100644 index 00000000..8dd3f2e6 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/deployment.debug.template.json @@ -0,0 +1,122 @@ +{ + "$schema-template": "2.0.0", + "modulesContent": { + "$edgeAgent": { + "properties.desired": { + "schemaVersion": "1.0", + "runtime": { + "type": "docker", + "settings": { + "minDockerVersion": "v1.25", + "loggingOptions": "", + "registryCredentials": { + "sqldbedgecr": { + "username": "$CONTAINER_REGISTRY_USER_NAME", + "password": "$CONTAINER_REGISTRY_PASSWORD", + "address": "$CONTAINER_REGISTRY_NAME" + } + } + } + }, + "systemModules": { + "edgeAgent": { + "type": "docker", + "settings": { + "image": "mcr.microsoft.com/azureiotedge-agent:1.0", + "createOptions": {} + } + }, + "edgeHub": { + "type": "docker", + "status": "running", + "restartPolicy": "always", + "settings": { + "image": "mcr.microsoft.com/azureiotedge-hub:1.0", + "createOptions": { + "HostConfig": { + "PortBindings": { + "5671/tcp": [ + { + "HostPort": "5671" + } + ], + "8883/tcp": [ + { + "HostPort": "8883" + } + ], + "443/tcp": [ + { + "HostPort": "443" + } + ] + } + } + } + } + } + }, + "modules": { + "SensorModule": { + "version": "1.0", + "type": "docker", + "status": "running", + "restartPolicy": "always", + "settings": { + "image": "${MODULES.SensorModule.debug}", + "createOptions": {} + } + }, + "AzureSQLDatabaseEdge": { + "settings": { + "image": "marketplace.azurecr.io/microsoftsqledge-preview/azure-sql-database-edge", + "createOptions": "{\"HostConfig\":{\"CapAdd\":[\"SYS_PTRACE\"],\"Binds\":[\"sqlvolume:/sqlvolume\"],\"PortBindings\":{\"1433/tcp\":[{\"HostPort\":\"1433\"}]},\"Mounts\":[{\"Type\":\"volume\",\"Source\":\"sqlvolume\",\"Target\":\"/var/opt/mssql\"}]},\"User\":\"0:0\",\"Env\":[\"MSSQL_AGENT_ENABLED=TRUE\",\"ClientTransportType=AMQP_TCP_Only\",\"MSSQL_PID=Developer\"]}" + }, + "type": "docker", + "version": "1.0", + "env": { + "ACCEPT_EULA": { + "value": "Y" + }, + "SA_PASSWORD": { + "value": "Microsoft2020$" + }, + "MSSQL_LCID": { + "value": "1033" + }, + "MSSQL_COLLATION": { + "value": "SQL_Latin1_General_CP1_CI_AS" + } + }, + "status": "running", + "restartPolicy": "always" + } + } + } + }, + "$edgeHub": { + "properties.desired": { + "schemaVersion": "1.0", + "routes": { + "SensorModuleToIoTHub": "FROM /messages/modules/SensorModule/outputs/* INTO $upstream" + }, + "storeAndForwardConfiguration": { + "timeToLiveSecs": 7200 + } + } + }, + "SensorModule": { + "properties.desired": { + "SqlConnnectionString": "Server=tcp:AzureSQLDatabaseEdge,1433;Initial Catalog=turbine-sensor-db;Persist Security Info=False;User ID=sa;Password=Microsoft2020$;MultipleActiveResultSets=False;Connection Timeout=30;", + "PushTimeInterval": 5000, + "Alert": "start", + "OnnxModelUrl": "" + } + }, + "AzureSQLDatabaseEdge": { + "properties.desired": { + "SqlPackage": "$SQL_PACKAGE" + } + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/.dockerignore b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/.dockerignore new file mode 100644 index 00000000..a43e8424 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/.dockerignore @@ -0,0 +1,2 @@ +[b|B]in +[O|o]bj \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/.gitignore b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/.gitignore new file mode 100644 index 00000000..1074c051 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/.gitignore @@ -0,0 +1,34 @@ +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +*_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 +.vs + +[Bb]in/ +[Oo]bj/ \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Constants.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Constants.cs new file mode 100644 index 00000000..a9c372bb --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Constants.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using SensorModule.Models; + +namespace SensorModule +{ + public static class Constants + { + public static class Sensors + { + public const string WindSpeedStdDev = "WindSpeedStdDev"; + public const string TurbineSpeedStdDev = "TurbineSpeedStdDev"; + public const string OverallWindDirection = "OverallWindDirection"; + public const string TurbineWindDirection = "TurbineWindDirection"; + public const string WindSpeedAverage = "WindSpeedAverage"; + public const string WindTempAverage = "WindTempAverage"; + public const string GearboxOilLevel = "GearboxOilLevel"; + public const string GearboxOilTemp = "GearboxOilTemp"; + public const string GeneratorActivePower = "GeneratorActivePower"; + public const string GeneratorSpeed = "GeneratorSpeed"; + public const string GeneratorTemp = "GeneratorTemp"; + public const string GeneratorTorque = "GeneratorTorque"; + public const string GridFrequency = "GridFrequency"; + public const string GridVoltage = "GridVoltage"; + public const string HydraulicOilPressure = "HydraulicOilPressure"; + public const string NacelleAngle = "NacelleAngle"; + public const string PitchAngle = "PitchAngle"; + public const string Vibration = "Vibration"; + public const string TurbineSpeedAverage = "TurbineSpeedAverage"; + public const string HatchSensor = "HatchSensor"; + } + + public static List SensorsList = new List{ + new Sensor {Id = Guid.NewGuid(), Type = Sensors.WindSpeedStdDev}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.TurbineSpeedStdDev}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.OverallWindDirection}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.TurbineWindDirection}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.WindSpeedAverage}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.WindTempAverage}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.GearboxOilLevel}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.GearboxOilTemp}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.GeneratorActivePower}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.GeneratorSpeed}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.GeneratorTemp}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.GeneratorTorque}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.GridFrequency}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.GridVoltage}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.HydraulicOilPressure}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.NacelleAngle}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.PitchAngle}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.Vibration}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.TurbineSpeedAverage}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.HatchSensor} + }; + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/DataStore/DatabaseContext.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/DataStore/DatabaseContext.cs new file mode 100644 index 00000000..4348c34d --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/DataStore/DatabaseContext.cs @@ -0,0 +1,29 @@ +using SensorModule; +using SensorModule.Models; +using Microsoft.EntityFrameworkCore; + +namespace SensorModule.DataStore +{ + + public class DatabaseContext : DbContext + { + private string _sqlConnectionString = string.Empty; + + public DatabaseContext(string sqlConnectionString) + { + this._sqlConnectionString = sqlConnectionString; + } + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder.UseSqlServer(_sqlConnectionString); + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity().ToTable("models"); + } + + public DbSet RealtimeWindTurbineRecord { get; set; } + public DbSet RealtimeSensorRecord { get; set; } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/DataStructures/RingBuffer.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/DataStructures/RingBuffer.cs new file mode 100644 index 00000000..b959fc0a --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/DataStructures/RingBuffer.cs @@ -0,0 +1,360 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace SensorModule.DataStructures +{ + /// + /// + /// Ring buffer. + /// + /// When writing to a full buffer: + /// PushBack -> removes this[0] / Front() + /// PushFront -> removes this[Size-1] / Back() + /// + /// this implementation is inspired by + /// http://www.boost.org/doc/libs/1_53_0/libs/Ring_buffer/doc/Ring_buffer.html + /// because I liked their interface. + /// + public class RingBuffer : IEnumerable + { + private readonly T[] _buffer; + + /// + /// The _start. Index of the first element in buffer. + /// + private int _start; + + /// + /// The _end. Index after the last element in the buffer. + /// + private int _end; + + /// + /// The _size. Buffer size. + /// + private int _size; + + public RingBuffer(int capacity) + : this(capacity, new T[] { }) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// + /// + /// Buffer capacity. Must be positive. + /// + /// + /// Items to fill buffer with. Items length must be less than capacity. + /// Suggestion: use Skip(x).Take(y).ToArray() to build this argument from + /// any enumerable. + /// + public RingBuffer(int capacity, T[] items) + { + if (capacity < 1) + { + throw new ArgumentException( + "Ring buffer cannot have negative or zero capacity.", nameof(capacity)); + } + if (items == null) + { + throw new ArgumentNullException(nameof(items)); + } + if (items.Length > capacity) + { + throw new ArgumentException( + "Too many items to fit Ring buffer", nameof(items)); + } + + _buffer = new T[capacity]; + + Array.Copy(items, _buffer, items.Length); + _size = items.Length; + + _start = 0; + _end = _size == capacity ? 0 : _size; + } + + /// + /// Maximum capacity of the buffer. Elements pushed into the buffer after + /// maximum capacity is reached (IsFull = true), will remove an element. + /// + public int Capacity { get { return _buffer.Length; } } + + public bool IsFull + { + get + { + return Size == Capacity; + } + } + + public bool IsEmpty + { + get + { + return Size == 0; + } + } + + /// + /// Current buffer size (the number of elements that the buffer has). + /// + public int Size { get { return _size; } } + + /// + /// Element at the front of the buffer - this[0]. + /// + /// The value of the element of type T at the front of the buffer. + public T Front() + { + ThrowIfEmpty(); + return _buffer[_start]; + } + + /// + /// Element at the back of the buffer - this[Size - 1]. + /// + /// The value of the element of type T at the back of the buffer. + public T Back() + { + ThrowIfEmpty(); + return _buffer[(_end != 0 ? _end : Capacity) - 1]; + } + + public T this[int index] + { + get + { + if (IsEmpty) + { + throw new IndexOutOfRangeException(string.Format("Cannot access index {0}. Buffer is empty", index)); + } + if (index >= _size) + { + throw new IndexOutOfRangeException(string.Format("Cannot access index {0}. Buffer size is {1}", index, _size)); + } + int actualIndex = InternalIndex(index); + return _buffer[actualIndex]; + } + set + { + if (IsEmpty) + { + throw new IndexOutOfRangeException(string.Format("Cannot access index {0}. Buffer is empty", index)); + } + if (index >= _size) + { + throw new IndexOutOfRangeException(string.Format("Cannot access index {0}. Buffer size is {1}", index, _size)); + } + int actualIndex = InternalIndex(index); + _buffer[actualIndex] = value; + } + } + + /// + /// Pushes a new element to the back of the buffer. Back()/this[Size-1] + /// will now return this element. + /// + /// When the buffer is full, the element at Front()/this[0] will be + /// popped to allow for this new element to fit. + /// + /// Item to push to the back of the buffer + public void PushBack(T item) + { + if (IsFull) + { + _buffer[_end] = item; + Increment(ref _end); + _start = _end; + } + else + { + _buffer[_end] = item; + Increment(ref _end); + ++_size; + } + } + + /// + /// Pushes a new element to the front of the buffer. Front()/this[0] + /// will now return this element. + /// + /// When the buffer is full, the element at Back()/this[Size-1] will be + /// popped to allow for this new element to fit. + /// + /// Item to push to the front of the buffer + public void PushFront(T item) + { + if (IsFull) + { + Decrement(ref _start); + _end = _start; + _buffer[_start] = item; + } + else + { + Decrement(ref _start); + _buffer[_start] = item; + ++_size; + } + } + + /// + /// Removes the element at the back of the buffer. Decreasing the + /// Buffer size by 1. + /// + public void PopBack() + { + ThrowIfEmpty("Cannot take elements from an empty buffer."); + Decrement(ref _end); + _buffer[_end] = default(T); + --_size; + } + + /// + /// Removes the element at the front of the buffer. Decreasing the + /// Buffer size by 1. + /// + public void PopFront() + { + ThrowIfEmpty("Cannot take elements from an empty buffer."); + _buffer[_start] = default(T); + Increment(ref _start); + --_size; + } + + /// + /// Copies the buffer contents to an array, according to the logical + /// contents of the buffer (i.e. independent of the internal + /// order/contents) + /// + /// A new array with a copy of the buffer contents. + public T[] ToArray() + { + T[] newArray = new T[Size]; + int newArrayOffset = 0; + var segments = new ArraySegment[2] { ArrayOne(), ArrayTwo() }; + foreach (ArraySegment segment in segments) + { + Array.Copy(segment.Array, segment.Offset, newArray, newArrayOffset, segment.Count); + newArrayOffset += segment.Count; + } + return newArray; + } + + #region IEnumerable implementation + public IEnumerator GetEnumerator() + { + var segments = new ArraySegment[2] { ArrayOne(), ArrayTwo() }; + foreach (ArraySegment segment in segments) + { + for (int i = 0; i < segment.Count; i++) + { + yield return segment.Array[segment.Offset + i]; + } + } + } + #endregion + #region IEnumerable implementation + IEnumerator IEnumerable.GetEnumerator() + { + return (IEnumerator)GetEnumerator(); + } + #endregion + + private void ThrowIfEmpty(string message = "Cannot access an empty buffer.") + { + if (IsEmpty) + { + throw new InvalidOperationException(message); + } + } + + /// + /// Increments the provided index variable by one, wrapping + /// around if necessary. + /// + /// + private void Increment(ref int index) + { + if (++index == Capacity) + { + index = 0; + } + } + + /// + /// Decrements the provided index variable by one, wrapping + /// around if necessary. + /// + /// + private void Decrement(ref int index) + { + if (index == 0) + { + index = Capacity; + } + index--; + } + + /// + /// Converts the index in the argument to an index in _buffer + /// + /// + /// The transformed index. + /// + /// + /// External index. + /// + private int InternalIndex(int index) + { + return _start + (index < (Capacity - _start) ? index : index - Capacity); + } + + // doing ArrayOne and ArrayTwo methods returning ArraySegment as seen here: + // http://www.boost.org/doc/libs/1_37_0/libs/Ring_buffer/doc/Ring_buffer.html#classboost_1_1Ring__buffer_1957cccdcb0c4ef7d80a34a990065818d + // http://www.boost.org/doc/libs/1_37_0/libs/Ring_buffer/doc/Ring_buffer.html#classboost_1_1Ring__buffer_1f5081a54afbc2dfc1a7fb20329df7d5b + // should help a lot with the code. + + #region Array items easy access. + // The array is composed by at most two non-contiguous segments, + // the next two methods allow easy access to those. + + private ArraySegment ArrayOne() + { + if (IsEmpty) + { + return new ArraySegment(new T[0]); + } + else if (_start < _end) + { + return new ArraySegment(_buffer, _start, _end - _start); + } + else + { + return new ArraySegment(_buffer, _start, _buffer.Length - _start); + } + } + + private ArraySegment ArrayTwo() + { + if (IsEmpty) + { + return new ArraySegment(new T[0]); + } + else if (_start < _end) + { + return new ArraySegment(_buffer, _end, 0); + } + else + { + return new ArraySegment(_buffer, 0, _end); + } + } + #endregion + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.amd64 b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.amd64 new file mode 100644 index 00000000..494ea45d --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.amd64 @@ -0,0 +1,17 @@ +FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env +WORKDIR /app + +COPY *.csproj ./ +RUN dotnet restore + +COPY . ./ +RUN dotnet publish -c Release -o out + +FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim +WORKDIR /app +COPY --from=build-env /app/out ./ + +RUN useradd -ms /bin/bash moduleuser +USER moduleuser + +ENTRYPOINT ["dotnet", "SensorModule.dll"] \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.amd64.debug b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.amd64.debug new file mode 100644 index 00000000..19079e1d --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.amd64.debug @@ -0,0 +1,24 @@ +FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim AS base + +RUN apt-get update && \ + apt-get install -y --no-install-recommends unzip procps && \ + rm -rf /var/lib/apt/lists/* + +RUN useradd -ms /bin/bash moduleuser +USER moduleuser +RUN curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l ~/vsdbg + +FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env +WORKDIR /app + +COPY *.csproj ./ +RUN dotnet restore + +COPY . ./ +RUN dotnet publish -c Debug -o out + +FROM base +WORKDIR /app +COPY --from=build-env /app/out ./ + +ENTRYPOINT ["dotnet", "SensorModule.dll"] \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.arm32v7 b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.arm32v7 new file mode 100644 index 00000000..e258a5e4 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.arm32v7 @@ -0,0 +1,17 @@ +FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env +WORKDIR /app + +COPY *.csproj ./ +RUN dotnet restore + +COPY . ./ +RUN dotnet publish -c Release -o out + +FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim-arm32v7 +WORKDIR /app +COPY --from=build-env /app/out ./ + +RUN useradd -ms /bin/bash moduleuser +USER moduleuser + +ENTRYPOINT ["dotnet", "SensorModule.dll"] \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.arm32v7.debug b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.arm32v7.debug new file mode 100644 index 00000000..5f6562c7 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.arm32v7.debug @@ -0,0 +1,24 @@ +FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim-arm32v7 AS base + +RUN apt-get update && \ + apt-get install -y --no-install-recommends unzip procps && \ + rm -rf /var/lib/apt/lists/* + +RUN useradd -ms /bin/bash moduleuser +USER moduleuser +RUN curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l ~/vsdbg + +FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env +WORKDIR /app + +COPY *.csproj ./ +RUN dotnet restore + +COPY . ./ +RUN dotnet publish -c Debug -o out + +FROM base +WORKDIR /app +COPY --from=build-env /app/out ./ + +ENTRYPOINT ["dotnet", "SensorModule.dll"] \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.windows-amd64 b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.windows-amd64 new file mode 100644 index 00000000..f491fed3 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.windows-amd64 @@ -0,0 +1,13 @@ +FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env +WORKDIR /app + +COPY *.csproj ./ +RUN dotnet restore + +COPY . ./ +RUN dotnet publish -c Release -o out + +FROM mcr.microsoft.com/dotnet/core/runtime:3.1-nanoserver-1909 +WORKDIR /app +COPY --from=build-env /app/out ./ +ENTRYPOINT ["dotnet", "SensorModule.dll"] \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Helpers/GeneratorHelper.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Helpers/GeneratorHelper.cs new file mode 100644 index 00000000..f2d3ea05 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Helpers/GeneratorHelper.cs @@ -0,0 +1,316 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace SensorModule.Helpers +{ + public class GeneratorHelper + { + private Random _random = new Random(); + + public double GetGearBoxOilLevel() + { + int trendSign = _random.Next(-1, 1); + var offset = GetRandomNumber(0, 5); + offset = trendSign < 0 ? offset * -1 : offset; + return 40 + offset; + } + + public double GetGearBoxTemp() + { + var offset = GetRandomNumber(0, 3); + int trendSign = _random.Next(-2, 1); + var toReturn = 53.0 + offset; + + if (toReturn > 40) + { + offset = trendSign < 0 ? offset * -1 : offset; + } + else if (toReturn > 61) + { + offset *= -1; + } + + toReturn += offset; + + return toReturn > 61 ? GetRandomNumber(60, 61) : toReturn; + } + + public double GetGeneratorActivePower(double windSpeed) + { + Dictionary Values = new Dictionary() + { + { 0, -1.165047329 }, + { 1, -1.561275004 }, + { 2, -1.523817212 }, + { 3, 0.258328264 }, + { 4, 39.48032308 }, + { 5, 129.0223307 }, + { 6, 296.3115464 }, + { 7, 533.6013549 }, + { 8, 784.2038201 }, + { 9, 1033.222044 }, + { 10, 1282.494906 }, + { 11, 1522.07693 }, + { 12, 1710.51213 }, + { 13, 1847.754821 }, + { 14, 1909.292275 }, + { 15, 1929.077495 }, + }; + + var ws = Convert.ToInt32(Math.Round(windSpeed)); + ws = ws > 15 ? 15 : ws; + var apAvg = Values[ws]; + int trendSign = _random.Next(-2, 1); + + double offset; + if (ws <= 3) + { + offset = GetRandomNumber(-0.04, 0.01); + } + else if (ws <= 7) + { + offset = GetRandomNumber(0.01, 0.15); + } + else if (ws <= 12) + { + offset = GetRandomNumber(0.01, 0.63); + } + else + { + offset = GetRandomNumber(0.01, 0.94); + } + + offset = trendSign < 0 ? offset * -1 : offset; + var toReturn = (apAvg * offset) + apAvg; + return toReturn > 2100 ? 2100 : toReturn; + } + + public double GetGeneratorSpeed(double windSpeed) + { + Dictionary Values = new Dictionary() + { + { 0, 29.5339 }, + { 1, 93.4983 }, + { 2, 123.626 }, + { 3, 270.0063 }, + { 4, 850.3199 }, + { 5, 1059.4094 }, + { 6, 1317.4786 }, + { 7, 1548.3753 }, + { 8, 1635.4728 }, + { 9, 1660.1312 }, + { 10, 1685.2159 }, + { 11, 1709.3631 }, + { 12, 1722.729 }, + { 13, 1743.2982 }, + { 14, 1739.6748 }, + { 15, 1737.1417 } + }; + + var ws = Convert.ToInt32(Math.Round(windSpeed)); + ws = ws > 15 ? 15 : ws; + var gsAvg = Values[ws]; + double rate; + int trendSign = _random.Next(-3, 1); + + if (ws <= 5) + { + rate = GetRandomNumber(0, 0.7); + } + else if (ws <= 8) + { + rate = GetRandomNumber(0.001, 0.055); + } + else if (ws <= 12) + { + rate = GetRandomNumber(0.001, 0.04362); + trendSign = _random.Next(-1, 2); + } + else + { + rate = GetRandomNumber(0.001, 0.374); + trendSign = _random.Next(-1, 3); + } + rate = trendSign < 0 ? rate * -1 : rate; + var toReturn = (gsAvg * rate) + gsAvg; + return toReturn > 1800.100 + 5 ? 1800.100 : toReturn; + } + + public double GetGeneratorStatorTemp(double generatorSpeed) + { + double[] avgTempValues = { 15.0, 45.5, 55.3, 72.5 }; + var gs = Convert.ToInt32(Math.Round(generatorSpeed)); + var offset = GetRandomNumber(0, 10); + int trendSign = _random.Next(-2, 2); + offset = trendSign < 0 ? offset * -1 : offset; + double toReturn; + if (gs < 450) + { + toReturn = avgTempValues[0] + offset; + } + else if (gs < 900) + { + toReturn = avgTempValues[1] + offset; + } + else if (gs < 1350) + { + toReturn = avgTempValues[2] + offset; + } + else + { + offset = GetRandomNumber(0, 5); + toReturn = avgTempValues[3] + offset; + } + + return toReturn > 83 ? GetRandomNumber(82, 84) : toReturn; + } + + public double GetGeneratorTorque(double generatorSpeed, double activePower) + { + var toReturn = activePower == 0 || generatorSpeed == 0 ? 0 : (activePower / generatorSpeed) * (30 / 3.1416); + return toReturn > 10 ? GetRandomNumber(9, 10) : toReturn; + } + + public double GetGridFrequency(double activePower) + { + if (activePower == 0) + { + return 0; + } + else + { + var offset = GetRandomNumber(0, 0.5); + int trendSign = _random.Next(-1, 1); + offset = trendSign < 0 ? offset * -1 : offset; + + return 50 + offset; + } + } + + public double GetVoltage(double activePower) + { + var offset = GetRandomNumber(0, 20); + int trendSign = _random.Next(-1, 4); + offset = trendSign < 0 ? GetRandomNumber(0, 5) * -1 : offset; + return activePower != 0 ? 690 + offset : 0; + } + + public double GetHydraulicOilPressure() + { + var offset = GetRandomNumber(0, 10); + int trendSign = _random.Next(-2, 1); + double toReturn = 250 + offset; + + if (toReturn > 249) + { + offset = trendSign < 0 ? offset * -1 : offset; + } + else if (toReturn > 375) + { + offset *= -1; + } + + toReturn += offset; + + return toReturn > 380 ? GetRandomNumber(379, 380) : toReturn; + } + + public double GetNacelleAngle(double windDirection) + { + var offset = GetRandomNumber(0, 10); + int trendSign = _random.Next(-2, 2); + offset = trendSign < 0 ? offset * -1 : offset; + var toReturn = windDirection + offset; + return toReturn > 360 ? GetRandomNumber(358, 360) : toReturn; + } + + public double GetPitchAngle(double windSpeed) + { + Dictionary Values = new Dictionary() + { + { 0, new PitchAngleReference { Ratio = 0.98, Avg = 54.24524239 } }, + { 1, new PitchAngleReference {Ratio = 1.014, Avg = 51.67482604 } }, + { 2, new PitchAngleReference {Ratio = 1.4, Avg = 50.15667612 } }, + { 3, new PitchAngleReference {Ratio = 3.75, Avg = 44.47110192 } }, + { 4, new PitchAngleReference {Ratio = 10.9, Avg = 10.16831867 } }, + { 5, new PitchAngleReference {Ratio = 8, Avg = 3.753638458 } }, + { 6, new PitchAngleReference {Ratio = 8.6, Avg = 3.143487107 } }, + { 7, new PitchAngleReference {Ratio = 8.1, Avg = 3.851029642 } }, + { 8, new PitchAngleReference {Ratio = 7, Avg = 5.51622539 } }, + { 9, new PitchAngleReference {Ratio = 12.3, Avg = 5.607653521 } }, + { 10, new PitchAngleReference {Ratio = 11.3, Avg = 4.906807873 } }, + { 11, new PitchAngleReference {Ratio = 12.5, Avg = 4.556013361 } }, + { 12, new PitchAngleReference {Ratio = 7.6, Avg = 5.461135239 } }, + { 13, new PitchAngleReference {Ratio = 4, Avg = 6.617167409 } }, + { 14, new PitchAngleReference {Ratio = 6.5, Avg = 9.174521933 } }, + { 15, new PitchAngleReference {Ratio = 7.1, Avg = 11.5855706 } }, + }; + + var ws = Convert.ToInt32(Math.Round(windSpeed)); + ws = ws > 15 ? 15 : ws; + var paAvg = Values[ws].Avg; + var rate = GetRandomNumber(0.001, Values[ws].Ratio); + + int trendSign = _random.Next(-2, 2); + + rate = trendSign < 0 ? rate * -1 : rate; + var toReturn = (paAvg * rate) + paAvg; + + // This is needed as the avg for speeds greater than 5 are to low and the min value is to close to 0. + if (ws >= 5 && toReturn < 0) + { + toReturn = GetRandomNumber(-13, 1); + } + + return toReturn > 262.6 + 5 ? 262.6 : toReturn; + } + + public double GetVibration(double windSpeed) + { + if (windSpeed < 5) + { + return GetRandomNumber(0, 50); + } + else + { + return windSpeed * 13; + } + } + + public double GetRandomNumber(double minimum, double maximum) + { + return _random.NextDouble() * (maximum - minimum) + minimum; + } + + public bool GetRandomBool(int truePercentage = 50) + { + return _random.NextDouble() < truePercentage / 100.0; + } + + public double CalculateStandardDeviation(IEnumerable values) + { + double standardDeviation = 0; + + if (values.Any()) + { + // Compute the average. + double avg = values.Average(); + + // Perform the Sum of (value-avg)_2_2. + double sum = values.Sum(d => Math.Pow(d - avg, 2)); + + // Put it all together. + standardDeviation = Math.Sqrt((sum) / (values.Count() - 1)); + } + + return double.IsNaN(standardDeviation) ? 0 : standardDeviation; + } + } + + class PitchAngleReference + { + public double Ratio { get; set; } + public double Avg { get; set; } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/Interfaces/IWindTurbineRecord.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/Interfaces/IWindTurbineRecord.cs new file mode 100644 index 00000000..8fefe5a4 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/Interfaces/IWindTurbineRecord.cs @@ -0,0 +1,27 @@ +namespace SensorModule.Models.Interfaces +{ + public interface IWindTurbineRecord + { + int TurbineId { get; set; } + double WindSpeedStdDev { get; set; } + double TurbineSpeedStdDev { get; set; } + double OverallWindDirection { get; set; } + double TurbineWindDirection { get; set; } + double WindSpeedAverage { get; set; } + double WindTempAverage { get; set; } + bool Precipitation { get; set; } + double GearboxOilLevel { get; set; } + double GearboxOilTemp { get; set; } + double GeneratorActivePower { get; set; } + double GeneratorSpeed { get; set; } + double GeneratorTemp { get; set; } + double GeneratorTorque { get; set; } + double GridFrequency { get; set; } + double GridVoltage { get; set; } + double HydraulicOilPressure { get; set; } + double NacelleAngle { get; set; } + double PitchAngle { get; set; } + double Vibration { get; set; } + double TurbineSpeedAverage { get; set; } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/OnnxModel.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/OnnxModel.cs new file mode 100644 index 00000000..2aaf00e2 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/OnnxModel.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Text; + +namespace SensorModule.Models +{ + public class OnnxModel + { + [Key] + public int Id { get; set; } + public string Description { get; set; } + public byte[] Data { get; set; } + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/RealtimeSensorRecord.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/RealtimeSensorRecord.cs new file mode 100644 index 00000000..03c920e8 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/RealtimeSensorRecord.cs @@ -0,0 +1,16 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace SensorModule.Models +{ + public class RealtimeSensorRecord + { + [Key] + public Guid RecordId { get; set; } + public Guid TurbineId { get; set; } + public Guid SensorId { get; set; } + public string SensorType { get; set; } + public double SensorValue { get; set; } + public DateTime Timestamp { get; set; } + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/RealtimeWindTurbineRecord.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/RealtimeWindTurbineRecord.cs new file mode 100644 index 00000000..4a2c971b --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/RealtimeWindTurbineRecord.cs @@ -0,0 +1,35 @@ +using SensorModule.Models.Interfaces; +using System; +using System.ComponentModel.DataAnnotations; + +namespace SensorModule.Models +{ + public class RealtimeWindTurbineRecord : IWindTurbineRecord + { + [Key] + public Guid RecordId { get; set; } + public int TurbineId { get; set; } + public Guid TurbineGuid { get; set; } + public double WindSpeedStdDev { get; set; } + public double TurbineSpeedStdDev { get; set; } + public double OverallWindDirection { get; set; } + public double TurbineWindDirection { get; set; } + public double WindSpeedAverage { get; set; } + public double WindTempAverage { get; set; } + public bool Precipitation { get; set; } + public double GearboxOilLevel { get; set; } + public double GearboxOilTemp { get; set; } + public double GeneratorActivePower { get; set; } + public double GeneratorSpeed { get; set; } + public double GeneratorTemp { get; set; } + public double GeneratorTorque { get; set; } + public double GridFrequency { get; set; } + public double GridVoltage { get; set; } + public double HydraulicOilPressure { get; set; } + public double NacelleAngle { get; set; } + public double PitchAngle { get; set; } + public double Vibration { get; set; } + public double TurbineSpeedAverage { get; set; } + public DateTime Timestamp { get; set; } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/Sensor.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/Sensor.cs new file mode 100644 index 00000000..c396c5c1 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/Sensor.cs @@ -0,0 +1,11 @@ +using System; + +namespace SensorModule.Models +{ + public class Sensor + { + public Guid Id { get; set; } = Guid.NewGuid(); + + public string Type { get; set; } + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/TrainingWindTurbineRecord.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/TrainingWindTurbineRecord.cs new file mode 100644 index 00000000..7f67fef9 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/TrainingWindTurbineRecord.cs @@ -0,0 +1,30 @@ +using SensorModule.Models.Interfaces; + +namespace SensorModule.Models +{ + public class TrainingWindTurbineRecord : IWindTurbineRecord + { + public int TurbineId { get; set; } + public double WindSpeedStdDev { get; set; } + public double TurbineSpeedStdDev { get; set; } + public double OverallWindDirection { get; set; } + public double TurbineWindDirection { get; set; } + public double WindSpeedAverage { get; set; } + public double WindTempAverage { get; set; } + public bool Precipitation { get; set; } + public double GearboxOilLevel { get; set; } + public double GearboxOilTemp { get; set; } + public double GeneratorActivePower { get; set; } + public double GeneratorSpeed { get; set; } + public double GeneratorTemp { get; set; } + public double GeneratorTorque { get; set; } + public double GridFrequency { get; set; } + public double GridVoltage { get; set; } + public double HydraulicOilPressure { get; set; } + public double NacelleAngle { get; set; } + public double PitchAngle { get; set; } + public double Vibration { get; set; } + public double TurbineSpeedAverage { get; set; } + public bool AlterBlades { get; set; } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Program.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Program.cs new file mode 100644 index 00000000..0eb737e2 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Program.cs @@ -0,0 +1,197 @@ +namespace SensorModule +{ + using System; + using System.IO; + using System.Runtime.InteropServices; + using System.Runtime.Loader; + using System.Security.Cryptography.X509Certificates; + using System.Text; + using System.Threading; + using System.Threading.Tasks; + using Microsoft.Azure.Devices.Client; + using Microsoft.Azure.Devices.Client.Transport.Mqtt; + using Microsoft.Azure.Devices.Shared; + using Newtonsoft.Json; + using SensorModule.Services; + using SensorModule.Services.Interfaces; + + class Program + { + private static IDataGeneratorService _datageneratorservice; + private static IDataStoreService _datastoreservice; + private static ModuleClient _ioTHubModuleClient; + static int PushTimeInterval { get; set; } = 5000; + static bool StopWake { get; set; } = false; + static bool BlockedDataGeneration { get; set; } = false; + + static async Task Main(string[] args) + { + _datageneratorservice = new DataGeneratorService(); + _datastoreservice = new DataStoreService(); + + await Init(); + + try + { + Console.WriteLine("Truncating sensors table before start pushing data"); + _datastoreservice.TruncateRealtimeSensorRecordTable(); + } + catch(Exception e) + { + Console.WriteLine("Error truncating table: " + e.Message); + } + + Console.WriteLine($"Starting writing realtime records with {PushTimeInterval} millisecond interval to database..."); + + while (true) + { + if (!BlockedDataGeneration) + { + var records = _datageneratorservice.GenerateRealTimeSensorRecords(StopWake); + Console.WriteLine($"[{DateTime.Now}] Writing records to db."); + _datastoreservice.WriteSensorRecordsToDB(records); + } + await Task.Delay(PushTimeInterval); + } + } + + /// + /// Handles cleanup operations when app is cancelled or unloads + /// + public static Task WhenCancelled(CancellationToken cancellationToken) + { + var tcs = new TaskCompletionSource(); + cancellationToken.Register(s => ((TaskCompletionSource)s).SetResult(true), tcs); + return tcs.Task; + } + + /// + /// Initializes the ModuleClient and sets up the callback to receive + /// messages containing temperature information + /// + static async Task Init() + { + _ioTHubModuleClient = await ModuleClient.CreateFromEnvironmentAsync(); + _ioTHubModuleClient.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertyChanged, null).Wait(); + await SetAlertStatus("start"); + Console.WriteLine("IoT Hub module client initialized."); + + // Read from the module twin's desired properties + var moduleTwin = await _ioTHubModuleClient.GetTwinAsync(); + await OnDesiredPropertyChanged(moduleTwin.Properties.Desired, _ioTHubModuleClient); + } + + static async Task SetAlertStatus(string status) + { + Console.WriteLine($"Sending alert as reported property with value `{status}`."); + TwinCollection reportedProperties = new TwinCollection + { + ["alert"] = status + }; + + await _ioTHubModuleClient.UpdateReportedPropertiesAsync(reportedProperties); + } + + static async Task OnDesiredPropertyChanged(TwinCollection desiredProperties, object userContext) + { + try + { + Console.WriteLine("Desired property change:"); + Console.WriteLine(JsonConvert.SerializeObject(desiredProperties)); + + if (desiredProperties["SqlConnnectionString"]!=null) + { + var connectionString = desiredProperties["SqlConnnectionString"]; + Console.WriteLine($"Updating SqlConnectionString: {connectionString}"); + _datastoreservice.SetSqlConnectionString($"{connectionString}"); + } + + if (desiredProperties["PushTimeInterval"]!=null) + { + var pushTimeInterval = desiredProperties["PushTimeInterval"]; + Console.WriteLine($"Updating PushTimeInterval to: {pushTimeInterval}"); + PushTimeInterval = desiredProperties["PushTimeInterval"]; + } + + if (desiredProperties["Alert"]!=null) + { + var alertStatus = desiredProperties["Alert"]; + Console.WriteLine($"Will update alert from property to: {alertStatus}"); + await SetAlertStatus($"{alertStatus}"); + } + + if (desiredProperties["OnnxModelUrl"]!=null) + { + var onnxModelUrl = $"{desiredProperties["OnnxModelUrl"]}"; + if (!string.IsNullOrEmpty(onnxModelUrl)) + { + // Blocking data generation while we run the model + BlockedDataGeneration = true; + Console.WriteLine($"Updating OnnxModelUrl: {onnxModelUrl}"); + // Re-Create the Model Table in DB to keep only one record of the model + _datastoreservice.DropAndCreateModelTable(); + // Insert the model into the created table + _datastoreservice.InsertModelFromUrl($"{onnxModelUrl}"); + // Get model prediction of top rows + var modelResult = _datastoreservice.GetModelResult(); + Console.WriteLine($"Model prediction got a value of: {modelResult}"); + // Stabilize the data if result is > 0 + StopWake = modelResult > 0; + if (StopWake) + { + Console.WriteLine($"Stabilizing the data."); + // Clear the buffer to accelarate stabilization of the data + ClearBuffer(); + } + // If result is > 0 we need to stop the alert + var alertStatus = modelResult > 0 ? "stop":"start"; + Console.WriteLine($"Setting Alert to: {alertStatus}"); + // Update the twin module property to get new value in client + await SetAlertStatus(alertStatus); + // Unblock the data generation after running the model + BlockedDataGeneration = false; + } + else + { + BlockedDataGeneration = true; + StopWake = false; + Console.WriteLine($"Is data stabilized? {StopWake}"); + _datastoreservice.TruncateRealtimeSensorRecordTable(); + ClearBuffer(); + BlockedDataGeneration = false; + } + } + else + { + BlockedDataGeneration = true; + StopWake = false; + Console.WriteLine($"Is data stabilized? {StopWake}"); + _datastoreservice.TruncateRealtimeSensorRecordTable(); + ClearBuffer(); + BlockedDataGeneration = false; + } + } + catch (AggregateException ex) + { + foreach (Exception exception in ex.InnerExceptions) + { + Console.WriteLine(); + Console.WriteLine("Error when receiving desired property: {0}", exception); + } + } + catch (Exception ex) + { + Console.WriteLine(); + Console.WriteLine("Error when receiving desired property: {0}", ex); + } + } + + static void ClearBuffer() + { + _datageneratorservice.ClearBuffer(); + // Add new records as a reference for the next record generation + _datageneratorservice.GenerateRealTimeSensorRecords(StopWake); + _datageneratorservice.GenerateRealTimeSensorRecords(StopWake); + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/SensorModule.csproj b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/SensorModule.csproj new file mode 100644 index 00000000..9f611ee3 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/SensorModule.csproj @@ -0,0 +1,35 @@ + + + Exe + netcoreapp3.1 + latest + + + + True + + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/DataExporterService.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/DataExporterService.cs new file mode 100644 index 00000000..685b1ce4 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/DataExporterService.cs @@ -0,0 +1,144 @@ +using SensorModule.Models; +using SensorModule.Services.Interfaces; +using Parquet; +using Parquet.Data; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace SensorModule.Services +{ + public class DataExporterService : IDataExporterService + { + public void SaveParquet(IEnumerable records, string outputFile) + { + //create data columns with schema metadata and the data you need + var turbineId = new DataColumn( + new DataField("TurbineId"), + records.Select(x => x.TurbineId).ToArray()); + + var gearboxOilLevel = new DataColumn( + new DataField("GearboxOilLevel"), + records.Select(x => x.GearboxOilLevel).ToArray()); + + var gearboxOilTemp = new DataColumn( + new DataField("GearboxOilTemp"), + records.Select(x => x.GearboxOilTemp).ToArray()); + + var generatorActivePower = new DataColumn( + new DataField("GeneratorActivePower"), + records.Select(x => x.GeneratorActivePower).ToArray()); + + var generatorSpeed = new DataColumn( + new DataField("GeneratorSpeed"), + records.Select(x => x.GeneratorSpeed).ToArray()); + + var generatorTemp = new DataColumn( + new DataField("GeneratorTemp"), + records.Select(x => x.GeneratorTemp).ToArray()); + + var generatorTorque = new DataColumn( + new DataField("GeneratorTorque"), + records.Select(x => x.GeneratorTorque).ToArray()); + + var gridFrequency = new DataColumn( + new DataField("GridFrequency"), + records.Select(x => x.GridFrequency).ToArray()); + + var gridVoltage = new DataColumn( + new DataField("GridVoltage"), + records.Select(x => x.GridVoltage).ToArray()); + + var hydraulicOilPressure = new DataColumn( + new DataField("HydraulicOilPressure"), + records.Select(x => x.HydraulicOilPressure).ToArray()); + + var nacelleAngle = new DataColumn( + new DataField("NacelleAngle"), + records.Select(x => x.NacelleAngle).ToArray()); + + var overallWindDirection = new DataColumn( + new DataField("OverallWindDirection"), + records.Select(x => x.OverallWindDirection).ToArray()); + + var overalWindSpeedStdDev = new DataColumn( + new DataField("WindSpeedStdDev"), + records.Select(x => x.WindSpeedStdDev).ToArray()); + + var precipitation = new DataColumn( + new DataField("Precipitation"), + records.Select(x => x.Precipitation).ToArray()); + + var turbineWindDirection = new DataColumn( + new DataField("TurbineWindDirection"), + records.Select(x => x.TurbineWindDirection).ToArray()); + + var turbineSpeedStdDev = new DataColumn( + new DataField("TurbineSpeedStdDev"), + records.Select(x => x.TurbineSpeedStdDev).ToArray()); + + var windSpeedAverage = new DataColumn( + new DataField("WindSpeedAverage"), + records.Select(x => x.WindSpeedAverage).ToArray()); + + var windTempAverage = new DataColumn( + new DataField("WindTempAverage"), + records.Select(x => x.WindTempAverage).ToArray()); + + var alterBlades = new DataColumn( + new DataField("AlterBlades"), + records.Select(x => x.AlterBlades).ToArray()); + + var pitchAngle = new DataColumn( + new DataField("PitchAngle"), + records.Select(x => x.PitchAngle).ToArray()); + + var vibration = new DataColumn( + new DataField("Vibration"), + records.Select(x => x.Vibration).ToArray()); + + var turbineSpeedAverage = new DataColumn( + new DataField("TurbineSpeedAverage"), + records.Select(x => x.TurbineSpeedAverage).ToArray()); + + // create file schema + var schema = new Schema(turbineId.Field, gearboxOilLevel.Field, gearboxOilTemp.Field, generatorActivePower.Field, generatorSpeed.Field, generatorTemp.Field, generatorTorque.Field, gridFrequency.Field, gridVoltage.Field, hydraulicOilPressure.Field, + nacelleAngle.Field, overallWindDirection.Field, overalWindSpeedStdDev.Field, precipitation.Field, turbineWindDirection.Field, turbineSpeedStdDev.Field, windSpeedAverage.Field, windTempAverage.Field, pitchAngle.Field, vibration.Field, turbineSpeedAverage.Field, alterBlades.Field); + + var outputPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + + using (Stream fileStream = File.OpenWrite(Path.Combine(outputPath, $"{outputFile}.parquet"))) + { + using (var parquetWriter = new ParquetWriter(schema, fileStream)) + { + // create a new row group in the file + using (ParquetRowGroupWriter groupWriter = parquetWriter.CreateRowGroup()) + { + groupWriter.WriteColumn(turbineId); + groupWriter.WriteColumn(gearboxOilLevel); + groupWriter.WriteColumn(gearboxOilTemp); + groupWriter.WriteColumn(generatorActivePower); + groupWriter.WriteColumn(generatorSpeed); + groupWriter.WriteColumn(generatorTemp); + groupWriter.WriteColumn(generatorTorque); + groupWriter.WriteColumn(gridFrequency); + groupWriter.WriteColumn(gridVoltage); + groupWriter.WriteColumn(hydraulicOilPressure); + groupWriter.WriteColumn(nacelleAngle); + groupWriter.WriteColumn(overallWindDirection); + groupWriter.WriteColumn(overalWindSpeedStdDev); + groupWriter.WriteColumn(precipitation); + groupWriter.WriteColumn(turbineWindDirection); + groupWriter.WriteColumn(turbineSpeedStdDev); + groupWriter.WriteColumn(windSpeedAverage); + groupWriter.WriteColumn(windTempAverage); + groupWriter.WriteColumn(pitchAngle); + groupWriter.WriteColumn(vibration); + groupWriter.WriteColumn(turbineSpeedAverage); + groupWriter.WriteColumn(alterBlades); + } + } + } + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/DataGeneratorService.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/DataGeneratorService.cs new file mode 100644 index 00000000..dfc963ac --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/DataGeneratorService.cs @@ -0,0 +1,215 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using SensorModule.DataStructures; +using SensorModule.Helpers; +using SensorModule.Models; +using SensorModule.Services.Interfaces; + +namespace SensorModule.Services +{ + public class DataGeneratorService : IDataGeneratorService + { + private RingBuffer ringBuffer = new RingBuffer(100); + private GeneratorHelper gen = new GeneratorHelper(); + private readonly Guid TurbineGuid = Guid.NewGuid(); + + private RealtimeWindTurbineRecord GenerateFirstRealtimeRecord() + { + var windSpeed = gen.GetRandomNumber(15.0, 25.0); + var generatorSpeed = gen.GetGeneratorSpeed(windSpeed); + var activePower = gen.GetGeneratorActivePower(windSpeed); + var windDirection = gen.GetRandomNumber(41.0, 44.0); + var toReturn = new RealtimeWindTurbineRecord + { + RecordId = Guid.NewGuid(), + TurbineId = 15443, + TurbineGuid = TurbineGuid, + GearboxOilLevel = gen.GetGearBoxOilLevel(), + GearboxOilTemp = gen.GetGearBoxTemp(), + GeneratorActivePower = gen.GetGeneratorActivePower(windSpeed), + GeneratorSpeed = generatorSpeed, + GeneratorTemp = gen.GetGeneratorStatorTemp(generatorSpeed), + GeneratorTorque = gen.GetGeneratorTorque(generatorSpeed, activePower), + GridFrequency = gen.GetGridFrequency(activePower), + GridVoltage = gen.GetVoltage(activePower), + HydraulicOilPressure = gen.GetHydraulicOilPressure(), + NacelleAngle = gen.GetNacelleAngle(windDirection), + PitchAngle = gen.GetPitchAngle(windSpeed), + Vibration = gen.GetVibration(windSpeed), + WindSpeedAverage = windSpeed, + Precipitation = gen.GetRandomBool(20), + WindTempAverage = gen.GetRandomNumber(-10.0, 30), + OverallWindDirection = windDirection, + TurbineWindDirection = windDirection * gen.GetRandomNumber(0.97, 1.03), + TurbineSpeedAverage = windSpeed * gen.GetRandomNumber(0.97f, 1.03f), + WindSpeedStdDev = 4.885422, + TurbineSpeedStdDev = 4.978619, + Timestamp = DateTime.Now + }; + + ringBuffer.PushFront(toReturn); + return toReturn; + } + + public void ClearBuffer() + { + ringBuffer = new RingBuffer(100); + } + + private RealtimeWindTurbineRecord GenerateRegularRealtimeRecord(bool stopWake) + { + var currentRecords = ringBuffer.ToList(); + double windDirection = currentRecords.Select(x => x.OverallWindDirection).Average() * gen.GetRandomNumber(0.9, 1.1); + var windSpeed = currentRecords.Select(x => x.WindSpeedAverage).Average() * gen.GetRandomNumber(0.9, 1.1); + double turbineSpeed = windSpeed * gen.GetRandomNumber(0.25, 1.75); + if (stopWake) + { + turbineSpeed = windSpeed * gen.GetRandomNumber(0.97, 1.03); + windDirection = gen.GetRandomNumber(40.0, 45.0); + } + + var generatorSpeed = gen.GetGeneratorSpeed(windSpeed); + var activePower = gen.GetGeneratorActivePower(windSpeed); + var toReturn = new RealtimeWindTurbineRecord + { + RecordId = Guid.NewGuid(), + TurbineId = 15443, + TurbineGuid = TurbineGuid, + GearboxOilLevel = currentRecords.Select(x => x.GearboxOilLevel).Average() * gen.GetRandomNumber(0.95, 1.05), + GearboxOilTemp = currentRecords.Select(x => x.GearboxOilTemp).Average() * gen.GetRandomNumber(0.95, 1.05), + GeneratorActivePower = gen.GetGeneratorActivePower(windSpeed), + GeneratorSpeed = generatorSpeed, + GeneratorTemp = gen.GetGeneratorStatorTemp(generatorSpeed), + GeneratorTorque = gen.GetGeneratorTorque(generatorSpeed, activePower), + GridFrequency = gen.GetGridFrequency(activePower), + GridVoltage = gen.GetVoltage(activePower), + HydraulicOilPressure = gen.GetHydraulicOilPressure(), + NacelleAngle = gen.GetNacelleAngle(windDirection), + PitchAngle = gen.GetPitchAngle(windSpeed), + Vibration = gen.GetVibration(windSpeed), + WindSpeedAverage = windSpeed, + Precipitation = gen.GetRandomBool(20), + WindTempAverage = gen.GetRandomNumber(-10.0, 30), + OverallWindDirection = windDirection, + TurbineWindDirection = windDirection * gen.GetRandomNumber(0.97, 1.03), + TurbineSpeedAverage = turbineSpeed, + WindSpeedStdDev = gen.CalculateStandardDeviation(ringBuffer.ToList().Select(x => x.WindSpeedAverage).TakeLast(10)), + TurbineSpeedStdDev = gen.CalculateStandardDeviation(ringBuffer.ToList().Select(x => x.TurbineSpeedAverage).TakeLast(10)), + Timestamp = DateTime.Now + }; + + ringBuffer.PushFront(toReturn); + return toReturn; + } + + public RealtimeWindTurbineRecord GenerateRealTimeRecords(bool stopWake) + { + if (ringBuffer.IsEmpty) + { + return GenerateFirstRealtimeRecord(); + } + else + { + return GenerateRegularRealtimeRecord(stopWake); + } + } + + public IEnumerable GenerateTrainingRecords(int amountOfRecords) + { + var toReturn = new List(); + + for (var i = 0; i < amountOfRecords; i++) + { + var windDirection = gen.GetRandomNumber(0.0, 360.0); + var windSpeed = gen.GetRandomNumber(10.0, 25.0); + var turbineSpeed = windSpeed * gen.GetRandomNumber(0.97, 1.03); + if (((double)i / amountOfRecords) >= 0.8) + { + turbineSpeed = windSpeed * gen.GetRandomNumber(0.25, 1.75); + windDirection = gen.GetRandomNumber(40.0, 45.0); + } + + var generatorSpeed = gen.GetGeneratorSpeed(windSpeed); + var activePower = gen.GetGeneratorActivePower(windSpeed); + toReturn.Add(new TrainingWindTurbineRecord + { + TurbineId = i, + GearboxOilLevel = gen.GetGearBoxOilLevel(), + GearboxOilTemp = gen.GetGearBoxTemp(), + GeneratorActivePower = gen.GetGeneratorActivePower(windSpeed), + GeneratorSpeed = generatorSpeed, + GeneratorTemp = gen.GetGeneratorStatorTemp(generatorSpeed), + GeneratorTorque = gen.GetGeneratorTorque(generatorSpeed, activePower), + GridFrequency = gen.GetGridFrequency(activePower), + GridVoltage = gen.GetVoltage(activePower), + HydraulicOilPressure = gen.GetHydraulicOilPressure(), + NacelleAngle = gen.GetNacelleAngle(windDirection), + PitchAngle = gen.GetPitchAngle(windSpeed), + Vibration = gen.GetVibration(windSpeed), + WindSpeedAverage = windSpeed, + Precipitation = gen.GetRandomBool(20), + WindTempAverage = gen.GetRandomNumber(-10.0, 30), + OverallWindDirection = windDirection, + TurbineWindDirection = windDirection * gen.GetRandomNumber(0.97, 1.03), + TurbineSpeedAverage = turbineSpeed, + WindSpeedStdDev = gen.CalculateStandardDeviation(toReturn.Select(x => x.WindSpeedAverage).TakeLast(10)), + TurbineSpeedStdDev = gen.CalculateStandardDeviation(toReturn.Select(x => x.TurbineSpeedAverage).TakeLast(10)), + AlterBlades = (gen.CalculateStandardDeviation(toReturn.Select(x => x.TurbineSpeedAverage).TakeLast(10)) - gen.CalculateStandardDeviation(toReturn.Select(x => x.WindSpeedAverage).TakeLast(10))) > 1.0 + }); + } + + return toReturn.OrderBy(a => Guid.NewGuid()).ToList(); + } + + public List GenerateRealTimeSensorRecords(bool stopWake) + { + RealtimeWindTurbineRecord windTurbineRecord; + if (ringBuffer.IsEmpty) + { + windTurbineRecord = GenerateFirstRealtimeRecord(); + } + else + { + windTurbineRecord = GenerateRegularRealtimeRecord(stopWake); + } + var records = Constants.SensorsList.Select(sensor => + { + double sensorValue = sensor.Type switch + { + Constants.Sensors.WindSpeedStdDev => windTurbineRecord.WindSpeedStdDev, + Constants.Sensors.TurbineSpeedStdDev => windTurbineRecord.TurbineSpeedStdDev, + Constants.Sensors.OverallWindDirection => windTurbineRecord.OverallWindDirection, + Constants.Sensors.TurbineWindDirection => windTurbineRecord.TurbineWindDirection, + Constants.Sensors.WindSpeedAverage => windTurbineRecord.WindSpeedAverage, + Constants.Sensors.WindTempAverage => windTurbineRecord.WindTempAverage, + Constants.Sensors.GearboxOilLevel => windTurbineRecord.GearboxOilLevel, + Constants.Sensors.GearboxOilTemp => windTurbineRecord.GearboxOilTemp, + Constants.Sensors.GeneratorActivePower => windTurbineRecord.GeneratorActivePower, + Constants.Sensors.GeneratorSpeed => windTurbineRecord.GeneratorSpeed, + Constants.Sensors.GeneratorTemp => windTurbineRecord.GeneratorTemp, + Constants.Sensors.GeneratorTorque => windTurbineRecord.GeneratorTorque, + Constants.Sensors.GridFrequency => windTurbineRecord.GridFrequency, + Constants.Sensors.GridVoltage => windTurbineRecord.GridVoltage, + Constants.Sensors.HydraulicOilPressure => windTurbineRecord.HydraulicOilPressure, + Constants.Sensors.NacelleAngle => windTurbineRecord.NacelleAngle, + Constants.Sensors.PitchAngle => windTurbineRecord.PitchAngle, + Constants.Sensors.Vibration => windTurbineRecord.Vibration, + Constants.Sensors.TurbineSpeedAverage => windTurbineRecord.TurbineSpeedAverage, + Constants.Sensors.HatchSensor => 0, + _ => 0, + }; + return new RealtimeSensorRecord + { + RecordId = Guid.NewGuid(), + TurbineId = windTurbineRecord.TurbineGuid, + SensorId = sensor.Id, + SensorType = sensor.Type, + SensorValue = sensorValue, + Timestamp = windTurbineRecord.Timestamp + }; + }); + return records.ToList(); + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/DataStoreService.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/DataStoreService.cs new file mode 100644 index 00000000..e08176ef --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/DataStoreService.cs @@ -0,0 +1,117 @@ +using SensorModule.DataStore; +using SensorModule.Models; +using SensorModule.Services.Interfaces; +using Microsoft.Data.SqlClient; +using Microsoft.EntityFrameworkCore; +using System; +using System.Data; +using System.Net; +using System.Collections.Generic; + +namespace SensorModule.Services +{ + public class DataStoreService : IDataStoreService + { + private const string STOREDPROCNAME = "ModelResponse"; + private const string RUNMODELSTOREDPROCNAME = "RunModel"; + private const string MODELTABLENAME = "models"; + private const string TRUNCATETABLESTOREDPROCNAME = "TruncateRealtimeWindTurbineRecord"; + private const string TRUNCATEREALTIMESENSORTABLESTOREDPROCNAME = "TruncateRealtimeSensorRecords"; + private string _sqlConnectionString; + + public DataStoreService() + { + } + + public void SetSqlConnectionString(string sqlConnectionString) + { + _sqlConnectionString = sqlConnectionString; + } + + public bool ModelResponse() + { + SqlParameter[] @params = + { + new SqlParameter("@returnVal", SqlDbType.Bit) {Direction = ParameterDirection.Output} + }; + + using (var dbContext = new DatabaseContext(_sqlConnectionString)) + { + dbContext.Database.ExecuteSqlRaw($"exec @returnVal=" + STOREDPROCNAME, @params); + } + + return (bool)@params[0].Value; + } + + public void TruncateRealtimeWindTurbineRecordTable() + { + using (var dbContext = new DatabaseContext(_sqlConnectionString)) + { + dbContext.Database.ExecuteSqlRaw($"exec " + TRUNCATETABLESTOREDPROCNAME); + } + } + + public void WriteToDB(RealtimeWindTurbineRecord record) + { + using (var db = new DatabaseContext(_sqlConnectionString)) + { + record.Timestamp = DateTime.Now; + db.Add(record); + db.SaveChanges(); + } + } + + public void DropAndCreateModelTable() + { + using var dbContext = new DatabaseContext(_sqlConnectionString); + dbContext.Database.ExecuteSqlRaw($"drop table if exists {MODELTABLENAME}"); + dbContext.Database.ExecuteSqlRaw($"create table {MODELTABLENAME} ([id] [int] IDENTITY(1,1) NOT NULL, [data] [varbinary](max) NULL, [description] varchar(1000))"); + } + + public void InsertModelFromUrl(string url) + { + using var webClient = new WebClient(); + byte[] modelBytes = webClient.DownloadData(url); + using var dbContext = new DatabaseContext(_sqlConnectionString); + var query = $"insert into {MODELTABLENAME} ([description], [data]) values ('Onnx Model',?)"; + var model = new OnnxModel { Description = "Onnx Model", Data = modelBytes }; + dbContext.Add(model); + dbContext.SaveChanges(); + } + + public int GetModelResult() + { + SqlParameter[] @params = + { + new SqlParameter("@Result", SqlDbType.Int) {Direction = ParameterDirection.Output} + }; + + using (var dbContext = new DatabaseContext(_sqlConnectionString)) + { + dbContext.Database.ExecuteSqlRaw($"EXEC " + RUNMODELSTOREDPROCNAME + " @Result OUTPUT", @params); + } + + return (int)@params[0].Value; + } + + public void TruncateRealtimeSensorRecordTable() + { + using (var dbContext = new DatabaseContext(_sqlConnectionString)) + { + dbContext.Database.ExecuteSqlRaw($"exec " + TRUNCATEREALTIMESENSORTABLESTOREDPROCNAME); + } + } + + public void WriteSensorRecordsToDB(List records) + { + using (var dbContext = new DatabaseContext(_sqlConnectionString)) + { + records.ForEach(record => + { + dbContext.Add(record); + }); + dbContext.SaveChanges(); + } + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/Interfaces/IDataExporterService.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/Interfaces/IDataExporterService.cs new file mode 100644 index 00000000..acab5f36 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/Interfaces/IDataExporterService.cs @@ -0,0 +1,10 @@ +using SensorModule.Models; +using System.Collections.Generic; + +namespace SensorModule.Services.Interfaces +{ + public interface IDataExporterService + { + void SaveParquet(IEnumerable records, string outputFile); + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/Interfaces/IDataGeneratorService.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/Interfaces/IDataGeneratorService.cs new file mode 100644 index 00000000..41f7613a --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/Interfaces/IDataGeneratorService.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using SensorModule.Models; + +namespace SensorModule.Services.Interfaces +{ + public interface IDataGeneratorService + { + IEnumerable GenerateTrainingRecords(int amountOfRecords); + + RealtimeWindTurbineRecord GenerateRealTimeRecords(bool stopWake); + List GenerateRealTimeSensorRecords(bool stopWake); + + void ClearBuffer(); + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/Interfaces/IDataStoreService.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/Interfaces/IDataStoreService.cs new file mode 100644 index 00000000..4ddec645 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/Interfaces/IDataStoreService.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using SensorModule.Models; + +namespace SensorModule.Services.Interfaces +{ + public interface IDataStoreService + { + void WriteToDB(RealtimeWindTurbineRecord record); + bool ModelResponse(); + void TruncateRealtimeWindTurbineRecordTable(); + void SetSqlConnectionString(string sqlConnectionString); + void DropAndCreateModelTable(); + void InsertModelFromUrl(string url); + int GetModelResult(); + void TruncateRealtimeSensorRecordTable(); + void WriteSensorRecordsToDB(List records); + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/module.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/module.json new file mode 100644 index 00000000..5542c079 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/module.json @@ -0,0 +1,20 @@ +{ + "$schema-version": "0.0.1", + "description": "", + "image": { + "repository": "$CONTAINER_REGISTRY_NAME/sensormodule", + "tag": { + "version": "0.0.24", + "platforms": { + "amd64": "./Dockerfile.amd64", + "amd64.debug": "./Dockerfile.amd64.debug", + "arm32v7": "./Dockerfile.arm32v7", + "arm32v7.debug": "./Dockerfile.arm32v7.debug", + "windows-amd64": "./Dockerfile.windows-amd64" + } + }, + "buildOptions": [], + "contextPath": "./" + }, + "language": "csharp" +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/sensor-solution.code-workspace b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/sensor-solution.code-workspace new file mode 100644 index 00000000..876a1499 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/sensor-solution.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/Github repo.png b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/Github repo.png new file mode 100644 index 00000000..5aee7afc Binary files /dev/null and b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/Github repo.png differ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/azure-active-directory-option.png b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/azure-active-directory-option.png new file mode 100644 index 00000000..a7cda48c Binary files /dev/null and b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/azure-active-directory-option.png differ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/copy.png b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/copy.png new file mode 100644 index 00000000..5b3ef264 Binary files /dev/null and b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/copy.png differ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/iotedge-vm-dns-name.png b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/iotedge-vm-dns-name.png new file mode 100644 index 00000000..ce7799aa Binary files /dev/null and b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/iotedge-vm-dns-name.png differ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/machine-learning-resource.png b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/machine-learning-resource.png new file mode 100644 index 00000000..f5be55a8 Binary files /dev/null and b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/machine-learning-resource.png differ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/data/TrainingDataset.parquet b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/data/TrainingDataset.parquet new file mode 100644 index 00000000..6bce038e Binary files /dev/null and b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/data/TrainingDataset.parquet differ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/scripts/train.py b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/scripts/train.py new file mode 100644 index 00000000..16f5bd6b --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/scripts/train.py @@ -0,0 +1,33 @@ + +from azureml.core import Run + +from sklearn.compose import ColumnTransformer +from sklearn.pipeline import Pipeline +from sklearn.linear_model import LogisticRegression +from sklearn.preprocessing import StandardScaler + +from utils import * + +# Fetch current run +run = Run.get_context() + +# Fetch dataset from the run by name +dataset = run.input_datasets['training'] + +# Convert dataset to Pandas data frame +X_train, X_test, y_train, y_test = split_dataset(dataset) + +# Setup scikit-learn pipeline +numeric_transformer = Pipeline(steps=[('scaler', StandardScaler())]) +preprocessor = ColumnTransformer(transformers=[('num', numeric_transformer, list(X_train.columns.values))]) + +clf = Pipeline(steps=[('preprocessor', preprocessor), + ('classifier', LogisticRegression())]) + +model = clf.fit(X_train, y_train) + +# Analyze model performance +analyze_model(clf, X_test, y_test) + +# Save model +model_id = save_model(clf) diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/scripts/utils.py b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/scripts/utils.py new file mode 100644 index 00000000..b32d3c5f --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/scripts/utils.py @@ -0,0 +1,91 @@ +from azureml.core import Dataset, Model, Run +from azureml.contrib.interpret.explanation.explanation_client import ExplanationClient +from interpret.ext.blackbox import TabularExplainer + +from sklearn.preprocessing import LabelEncoder +from sklearn.metrics import accuracy_score, confusion_matrix, f1_score, precision_score, recall_score, roc_auc_score, roc_curve +from sklearn.model_selection import train_test_split + +import joblib +import matplotlib.pyplot as plt +import numpy as np +import os +import pandas as pd +import seaborn as sns +import sklearn + +OUTPUT_DIR = './outputs/' + +def split_dataset(dataset): + os.makedirs(OUTPUT_DIR, exist_ok=True) + + train_data = dataset.to_pandas_dataframe() + train_data = train_data.drop(columns=['TurbineId','Precipitation']) + + le = LabelEncoder() + train_data['AlterBlades'] = le.fit_transform(train_data['AlterBlades']) + + for x in train_data: + train_data[x] = pd.to_numeric(train_data[x]) + + y = train_data['AlterBlades'].values.flatten() + X = train_data.drop(['AlterBlades'], axis=1) + + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) + return X_train, X_test, y_train, y_test + +def analyze_model(clf, X_test, y_test): + run = Run.get_context() + + preds = clf.predict(X_test) + + accuracy = accuracy_score(y_test, preds) + run.log('Accuracy', np.float(accuracy)) + + precision = precision_score(y_test, preds, average="macro") + run.log('Precision', np.float(precision)) + + recall = recall_score(y_test, preds, average="macro") + run.log('Recall', np.float(recall)) + + f1score = f1_score(y_test, preds, average="macro") + run.log('F1 Score', np.float(f1score)) + + class_names = clf.classes_ + fig, ax = plt.subplots() + tick_marks = np.arange(len(class_names)) + plt.xticks(tick_marks, class_names) + plt.yticks(tick_marks, class_names) + sns.heatmap(pd.DataFrame(confusion_matrix(y_test, preds)), annot=True, cmap='YlGnBu', fmt='g') + ax.xaxis.set_label_position('top') + plt.tight_layout() + plt.title('Confusion Matrix', y=1.1) + plt.ylabel('Actual label') + plt.xlabel('Predicted label') + run.log_image('Confusion Matrix', plot=plt) + plt.close() + + preds_proba = clf.predict_proba(X_test)[::,1] + fpr, tpr, _ = roc_curve(y_test, preds_proba, pos_label = clf.classes_[1]) + auc = roc_auc_score(y_test, preds_proba) + plt.plot(fpr, tpr, label="data 1, auc=" + str(auc)) + plt.legend(loc=4) + run.log_image('ROC Curve', plot=plt) + plt.close() + +def save_model(clf): + run = Run.get_context() + dataset = run.input_datasets['training'] + + # Save model in the outputs folder + model_file_name = 'model.joblib' + joblib.dump(value=clf, filename=os.path.join(OUTPUT_DIR, model_file_name)) + run.upload_file(model_file_name, os.path.join(OUTPUT_DIR, model_file_name)) + + # Register the model + registered_model = run.register_model(model_name='wind_turbine_model', + model_path=model_file_name, + model_framework=Model.Framework.SCIKITLEARN, + model_framework_version=sklearn.__version__, + datasets=[(Dataset.Scenario.TRAINING, dataset)]) + return registered_model.id \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/utils.py b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/utils.py new file mode 100644 index 00000000..24a62982 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/utils.py @@ -0,0 +1,26 @@ +from skl2onnx.common.data_types import FloatTensorType, Int64TensorType, DoubleTensorType + +import joblib +import pandas as pd + +def download_model(run): + run.download_file('model.joblib') + model = joblib.load('model.joblib') + return model + +def convert_dataframe_schema(df, drop=None, batch_axis=False): + inputs = [] + nrows = None if batch_axis else 1 + for k, v in zip(df.columns, df.dtypes): + if drop is not None and k in drop: + continue + if v == 'int64': + t = Int64TensorType([nrows, 1]) + elif v == 'float32': + t = FloatTensorType([nrows, 1]) + elif v == 'float64': + t = FloatTensorType([nrows, 1]) + else: + raise Exception("Bad type") + inputs.append((k, t)) + return inputs \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/wind-turbine-scikit.ipynb b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/wind-turbine-scikit.ipynb new file mode 100644 index 00000000..457df9f6 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/wind-turbine-scikit.ipynb @@ -0,0 +1,616 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Wind Turbine: Azure ML with scikit-learn\n", + "\n", + "In this notebook, we'll build and analyze a new model to predict wind turbine wake winds.\n", + "\n", + "It is important to consider the two main conditions that influence the presence of wind wake:\n", + "1. Overall wind farm direction and turbine wind direction are both are between 40° - 45° degrees.\n", + "1. High difference that's greater than one minute between `TurbineSpeedStdDev` and `WindSpeedStdDev`.\n", + "\n", + "The above conditions are well known features to predict when `Wind Wake` is affecting the wind turbine." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Instructions\n", + "\n", + "Before you begin with this lab, please make sure to follow the steps below:\n", + "1. Locate the default datastore for the workspace, this can be done by authenticating against the workspace (cell #2) and execute the following command: `ws.get_default_datastore()`\n", + "1. Locate the dataset parquet file in the lab materials: `TrainingDataset.parquet`\n", + "1. Upload the dataset for this lab to the default datastore for the workspace. You can do this via Azure Portal or via Microsoft Azure Storage Explorer.\n", + "1. Ensure you have the correct version of `scikit-learn` and `joblib` installed. To install these dependencies, you can execute the cell below, skip this step if the dependencies are already installed.\n", + "1. Restart your kernel" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install scikit-learn==0.22.1 joblib==0.14.1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup Azure ML\n", + "\n", + "In the next cell, we will create a new Workspace config object using the ``, ``, and ``. This will fetch the matching Workspace and prompt you for authentication. Please click on the link and input the provided details.\n", + "\n", + "For more information on **Workspace**, please visit: [Microsoft Workspace Documentation](https://docs.microsoft.com/en-us/python/api/azureml-core/azureml.core.workspace.workspace?view=azure-ml-py)\n", + "\n", + "`` = You can get this ID from the landing page of your Resource Group.\n", + "\n", + "`` = This is the name of your Resource Group.\n", + "\n", + "`` = This is the name of your Workspace." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.workspace import Workspace\n", + "from azureml.core.authentication import InteractiveLoginAuthentication\n", + "project_folder = './scripts'\n", + "\n", + "try: \n", + " interactive_auth = InteractiveLoginAuthentication(tenant_id=\"\")\n", + " # Get instance of the Workspace and write it to config file\n", + " ws = Workspace(\n", + " subscription_id = '', \n", + " resource_group = '', \n", + " workspace_name = '',\n", + " auth = interactive_auth)\n", + "\n", + " # Writes workspace config file\n", + " ws.write_config()\n", + " \n", + " print('Library configuration succeeded')\n", + "except Exception as e:\n", + " print(e)\n", + " print('Workspace not found')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fetch our data\n", + "\n", + "Let's retrieve our dataset from the default workspace Datastore." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core import Dataset\n", + "from azureml.data.datapath import DataPath\n", + "from azureml.core import Datastore\n", + "\n", + "datastore = ws.get_default_datastore()\n", + "\n", + "datastore_path = [DataPath(datastore, '*.parquet')]\n", + "\n", + "tabular = Dataset.Tabular.from_parquet_files(path=datastore_path)\n", + "tabular = tabular.register(workspace=ws, \n", + " name='wind_turbine_training', \n", + " create_new_version=True)\n", + "tabular = Dataset.get_by_name(ws, name='wind_turbine_training')\n", + "print(tabular.version)\n", + "data = tabular.to_pandas_dataframe()\n", + "data.head(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we'll take a subset of our data and then proceed to visualize it to better understand any patterns and trends that might exist to drive good ML models." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "subset = tabular.take_sample(probability=0.4, seed=123).to_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Dataset Description\n", + "\n", + "Describe our current dataset. The table below shows the different statistical values for our training subset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "subset.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Turbine Wind Direction\n", + "\n", + "Let's take a look at the Turbine Wind Direction distribution against the Wind Direction Angle. As we can see, we have a considerable alteration between 40° and 50° degrees." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "from IPython.display import display\n", + "\n", + "hstyle={\"rwidth\":0.75,'edgecolor':'black'}\n", + "\n", + "# Analyze distribution of TurbineWindDirection in the dataset\n", + "fig, ax = plt.subplots()\n", + "sns.distplot(subset[['TurbineWindDirection']], ax=ax, \n", + " hist_kws=hstyle).set_title(\"Turbine Wind Direction Distribuition\")\n", + "ax.set_xlim(0,360)\n", + "ax.set(xlabel=\"Wind Direction Angle\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Turbine Wind Direction vs Alter Blades\n", + "\n", + "Let's take a look at how our training dataset conducts for `Alter Blades` against the `Wind Direction Angle`. It is very clear that between 40° and 50° degrees we have a clear spike of `True` values for `Alter Blades`. Keep in mind, that the target column for our prediction is `Alter Blades`, this column will enable us to identify a wake condition." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "g = sns.FacetGrid(subset, col='AlterBlades')\n", + "g.map(sns.distplot, 'TurbineWindDirection', hist_kws=hstyle)\n", + "g.set(xlabel=\"Wind Direction Angle\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Turbine Speed\n", + "\n", + "Let's take a look at the Turbine Speed distribution. In the chart, we can observe the distribution has values between 10 and 25 km/h." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig, ax = plt.subplots()\n", + "sns.distplot(subset[['TurbineSpeedAverage']], ax=ax, \n", + " hist_kws=hstyle).set_title(\"Average Turbine Speed Distribuition\")\n", + "ax.set(xlabel=\"Average Turbine Speed\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Turbine Speed Standard Deviation vs Alter Blades\n", + "\n", + "Let's take a look at how our training dataset behaves for `Alter Blades` against the `Turbine Speed Standard Deviation`. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Analyze how age influences whether customers have responded to insurance campaigns\n", + "g = sns.FacetGrid(subset, col='AlterBlades')\n", + "g.map(sns.distplot, 'TurbineSpeedStdDev', hist_kws=hstyle)\n", + "g.set(xlabel=\"Turbine Speed Std Dev\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Wind Speed\n", + "\n", + "Let's take a look at the Wind Speed distribution. In the chart, we can observe the distribution has values between 10 and 25 km/h." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig, ax = plt.subplots()\n", + "sns.distplot(subset[['WindSpeedAverage']], ax=ax, \n", + " hist_kws=hstyle).set_title(\"Average Wind Speed Distribuition\")\n", + "ax.set(xlabel=\"Average Wind Speed\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Wind Speed Standard Deviation vs Alter Blades\n", + "\n", + "Let's take a look at how our training dataset behaves for `Alter Blades` against the `Turbine Speed Standard Deviation`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Analyze how age influences whether customers have responded to insurance campaigns\n", + "g = sns.FacetGrid(subset, col='AlterBlades')\n", + "g.map(sns.distplot, 'WindSpeedStdDev', hist_kws=hstyle)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Isolate AlterBlades rows true values\n", + "\n", + "Let's create a Facet Grid to understand the trends that our `True` values from the `Alter Blades` column has against other features in the dataset such as:\n", + "1. Turbine Speed Standard Deviation\n", + "1. Turbine Wind Direction\n", + "1. Wind Speed Standard Deviation\n", + "\n", + "As we are able to see, when `Turbine Wind Direction` is around 40° to 45° degrees, it is a very good indication for an `Alter Blades: True` value. Also, we are able to see that high `Turbine Speed Standard Deviation` versus a low `Wind Speed Standard Deviation` are also key features to achieve a `True` value in the `Alter Blades` column" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "alterBlades = subset.loc[subset.AlterBlades]\n", + "g = sns.FacetGrid(alterBlades, col='AlterBlades')\n", + "g.map(plt.hist, 'TurbineSpeedStdDev')\n", + "g.set(xlabel=\"Turbine Speed Std Dev\")\n", + "\n", + "display(g)\n", + "\n", + "g = sns.FacetGrid(alterBlades, col='AlterBlades')\n", + "g.map(plt.hist, 'TurbineWindDirection')\n", + "g.set(xlabel=\"Turbine Wind Direction Angle\")\n", + "\n", + "display(g)\n", + "\n", + "g = sns.FacetGrid(alterBlades, col='AlterBlades')\n", + "g.map(plt.hist, 'WindSpeedStdDev')\n", + "g.set(xlabel=\"Wind Speed Std Dev\")\n", + "\n", + "display(g)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pairplot Wind Speed Std Dev, Turbine Speed Std Dev and Alter Blades\n", + "\n", + "Let's place our key features in a Pair plot to analyze their trends." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Analyze how age and category gardening spend is influenced by age and region\n", + "sns.pairplot(subset, vars=['WindSpeedStdDev', 'TurbineSpeedStdDev'], hue='AlterBlades')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create experiment\n", + "\n", + "In our script, there are three distinct sections:\n", + "1. Setting up the scikit-learn logistic regression model pipeline (including encoding our features).\n", + "1. Analyzing and logging the results of the model training.\n", + "1. Running the model explainer to understand the key model drivers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile $project_folder/train.py\n", + "\n", + "from azureml.core import Run\n", + "\n", + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.preprocessing import StandardScaler\n", + "\n", + "from utils import *\n", + "\n", + "# Fetch current run\n", + "run = Run.get_context()\n", + " \n", + "# Fetch dataset from the run by name\n", + "dataset = run.input_datasets['training']\n", + "\n", + "# Convert dataset to Pandas data frame\n", + "X_train, X_test, y_train, y_test = split_dataset(dataset)\n", + "\n", + "# Setup scikit-learn pipeline\n", + "numeric_transformer = Pipeline(steps=[('scaler', StandardScaler())])\n", + "preprocessor = ColumnTransformer(transformers=[('num', numeric_transformer, list(X_train.columns.values))])\n", + "\n", + "clf = Pipeline(steps=[('preprocessor', preprocessor),\n", + " ('classifier', LogisticRegression())])\n", + "\n", + "model = clf.fit(X_train, y_train)\n", + "\n", + "# Analyze model performance\n", + "analyze_model(clf, X_test, y_test)\n", + "\n", + "# Save model\n", + "model_id = save_model(clf)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create a Workspace Experiment\n", + "\n", + "The Experiment constructor allows to create an experiment instance. The constructor takes in the current workspace, which is fetched by calling `Workspace.from_config()` and an experiment name. \n", + "\n", + "For more information on **Experiment**, please visit: [Microsoft Experiment Documentation](https://docs.microsoft.com/en-us/python/api/azureml-core/azureml.core.experiment.experiment?view=azure-ml-py)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.experiment import Experiment\n", + "\n", + "# Get an instance of the Workspace from the config file\n", + "ws = Workspace.from_config()\n", + "\n", + "experiment_name = 'wake-detection-experiment'\n", + "\n", + "# Create Experiment\n", + "experiment = Experiment(ws, experiment_name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create Automated ML Compute cluster\n", + "\n", + "Firstly, check for the existence of the cluster. If it already exists, we are able to reuse it. Checking for the existence of the cluster can be performed by calling the constructor `ComputeTarget()` with the current workspace and name of the cluster.\n", + "\n", + "In case the cluster does not exist, the next step will be to provide a configuration for the new AML cluster by calling the function `AmlCompute.provisioning_configuration()`. It takes as parameters the VM size and the max number of nodes that the cluster can scale up to. After the configuration has executed, `ComputeTarget.create()` should be called with the previously configuration object and the workspace object.\n", + "\n", + "For more information on **ComputeTarget**, please visit: [Microsoft get_data Documentation](https://docs.microsoft.com/en-us/python/api/azureml-core/azureml.core.compute.computetarget?view=azure-ml-py)\n", + "\n", + "For more information on **AmlCompute**, please visit: [Microsoft get_data Documentation](https://docs.microsoft.com/en-us/python/api/azureml-core/azureml.core.compute.akscompute?view=azure-ml-py)\n", + "\n", + "\n", + "**Note:** Please wait for the execution of the cell to finish before moving forward." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.compute import ComputeTarget, AmlCompute\n", + "from azureml.core.compute_target import ComputeTargetException\n", + "\n", + "# Create AML CPU Compute Cluster\n", + "try:\n", + " compute_target = ComputeTarget(workspace=ws, name='cpucluster')\n", + " print('Found existing compute target.')\n", + "except ComputeTargetException:\n", + " print('Creating a new compute target...')\n", + " compute_config = AmlCompute.provisioning_configuration(vm_size='Standard_DS12_v2',\n", + " max_nodes=4)\n", + "\n", + " compute_target = ComputeTarget.create(ws, 'cpucluster', compute_config)\n", + " compute_target.wait_for_completion(show_output=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Submit Experiment\n", + "\n", + "We'll use remote compute for this job. We need to install a couple of extra libraries, including those required for model interpretability.\n", + "\n", + "The `experiment.submit()` function is called to send the experiment for execution. The only parameter received by this function is the `Estimator` object." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.train.sklearn import SKLearn\n", + "\n", + "estimator = SKLearn(source_directory=project_folder,\n", + " compute_target=compute_target,\n", + " entry_script='train.py',\n", + " inputs=[tabular.as_named_input('training')],\n", + " pip_packages=['azureml-dataprep[fuse,pandas]','joblib==0.14.1','azureml-interpret','azureml-contrib-interpret','matplotlib','scikit-learn==0.22.1','seaborn'])\n", + "\n", + "run = experiment.submit(estimator)\n", + "run" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Monitor Experiment\n", + "\n", + "The creation of an object of type `Run` will enable us to observe the experiment’s progress and results. The object is created by calling the constructor `Run()`. It takes, as arguments, the experiment and the identifier of the run to fetch. After the object has been instantiated, the `RunDetails()` function will retrieve the progress, metrics, and tasks for the specified run. They will be displayed by calling the function `show()` over the mentioned object.\n", + "\n", + "**Note:** Please wait for the execution of the cell to finish before moving forward. (Status should be **Completed**)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core import Run\n", + "from azureml.widgets import RunDetails\n", + "\n", + "run = Run(experiment, run.id)\n", + "RunDetails(run).show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Encode dataset and download trained model\n", + "\n", + "First step is to encode our training data to take the shape expected by the Onnx converter. Next, download the model obtained from the best run. In order to download the model, the function `download_model()` should be called. This will take care of downloading the model obtained from the best run." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from utils import *\n", + "from scripts.utils import *\n", + "\n", + "# Convert dataset to Pandas data frame\n", + "X_train, X_test, y_train, y_test = split_dataset(tabular)\n", + "model = download_model(run)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Convert model to Onnx format\n", + "\n", + "Export the Sklearn model to Onnx format by using `skl2onnx`. This step will output an Onnx model that we will be able to publish to the Azure SQL Edge Database Instance to use along with our `PREDICT` statement. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import skl2onnx\n", + "import onnxmltools\n", + "\n", + "# Convert the scikit model to onnx format\n", + "onnx_model = skl2onnx.convert_sklearn(model, 'Wind Turbine Dataset', convert_dataframe_schema(X_train))\n", + "# Save the onnx model locally\n", + "onnx_model_path = 'windturbinewake.model.onnx'\n", + "onnxmltools.utils.save_model(onnx_model, onnx_model_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Save model to Azure Blob Storage\n", + "\n", + "Let's save our Onnx model to the default workspace Datastore." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "datastore.upload_files(files=[onnx_model_path],\n", + " overwrite=True,\n", + " show_progress=True)" + ] + } + ], + "metadata": { + "kernel_info": { + "name": "python3" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + }, + "nteract": { + "version": "nteract-front-end@1.0.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/Rules.ruleset b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/Rules.ruleset new file mode 100644 index 00000000..f0f99190 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/Rules.ruleset @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/.gitignore b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/.gitignore new file mode 100644 index 00000000..8f8b43bb --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/.gitignore @@ -0,0 +1,232 @@ +## 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/ +build/ +bld/ +bin/ +Bin/ +obj/ +Obj/ + +# Visual Studio 2015 cache/options directory +.vs/ +/wwwroot/dist/ + +# 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 + +*_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 + +# 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 + +# 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 + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Microsoft Azure ApplicationInsights config file +ApplicationInsights.config + +# Windows Store app package directory +AppPackages/ +BundleArtifacts/ + +# 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 +orleans.codegen.cs + +/node_modules + +# 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 LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe + +# FAKE - F# Make +.fake/ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/.gitignore b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/.gitignore new file mode 100644 index 00000000..4d29575d --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/README.md b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/README.md new file mode 100644 index 00000000..859d27a6 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/README.md @@ -0,0 +1,68 @@ +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). + +## Available Scripts + +In the project directory, you can run: + +### `npm start` + +Runs the app in the development mode.
+Open [http://localhost:3000](http://localhost:3000) to view it in the browser. + +The page will reload if you make edits.
+You will also see any lint errors in the console. + +### `npm test` + +Launches the test runner in the interactive watch mode.
+See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. + +### `npm run build` + +Builds the app for production to the `build` folder.
+It correctly bundles React in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.
+Your app is ready to be deployed! + +See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. + +### `npm run eject` + +**Note: this is a one-way operation. Once you `eject`, you can’t go back!** + +If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. + +Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. + +You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. + +## Learn More + +You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). + +To learn React, check out the [React documentation](https://reactjs.org/). + +### Code Splitting + +This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting + +### Analyzing the Bundle Size + +This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size + +### Making a Progressive Web App + +This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app + +### Advanced Configuration + +This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration + +### Deployment + +This section has moved here: https://facebook.github.io/create-react-app/docs/deployment + +### `npm run build` fails to minify + +This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/package-lock.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/package-lock.json new file mode 100644 index 00000000..a04a62a0 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/package-lock.json @@ -0,0 +1,14318 @@ +{ + "name": "azure-maps-demo", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.0.tgz", + "integrity": "sha512-FuRhDRtsd6IptKpHXAa+4WPZYY2ZzgowkbLBecEDDSje1X/apG7jQM33or3NdOmjXBKWGOg4JmSiRfUfuTtHXw==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.0", + "@babel/helpers": "^7.6.0", + "@babel/parser": "^7.6.0", + "@babel/template": "^7.6.0", + "@babel/traverse": "^7.6.0", + "@babel/types": "^7.6.0", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/generator": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz", + "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==", + "requires": { + "@babel/types": "^7.7.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz", + "integrity": "sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg==", + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.0.tgz", + "integrity": "sha512-Cd8r8zs4RKDwMG/92lpZcnn5WPQ3LAMQbCw42oqUh4s7vsSN5ANUZjMel0OOnxDLq57hoDDbai+ryygYfCTOsw==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.7.0.tgz", + "integrity": "sha512-LSln3cexwInTMYYoFeVLKnYPPMfWNJ8PubTBs3hkh7wCu9iBaqq1OOyW+xGmEdLxT1nhsl+9SJ+h2oUDYz0l2A==", + "requires": { + "@babel/types": "^7.7.0", + "esutils": "^2.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.7.0.tgz", + "integrity": "sha512-Su0Mdq7uSSWGZayGMMQ+z6lnL00mMCnGAbO/R0ZO9odIdB/WNU/VfQKqMQU0fdIsxQYbRjDM4BixIa93SQIpvw==", + "requires": { + "@babel/helper-hoist-variables": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.0.tgz", + "integrity": "sha512-MZiB5qvTWoyiFOgootmRSDV1udjIqJW/8lmxgzKq6oDqxdmHUjeP2ZUOmgHdYjmUVNABqRrHjYAYRvj8Eox/UA==", + "requires": { + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-member-expression-to-functions": "^7.7.0", + "@babel/helper-optimise-call-expression": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.2.tgz", + "integrity": "sha512-pAil/ZixjTlrzNpjx+l/C/wJk002Wo7XbbZ8oujH/AoJ3Juv0iN/UTcPUHXKMFLqsfS0Hy6Aow8M31brUYBlQQ==", + "requires": { + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + } + }, + "@babel/helper-define-map": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.0.tgz", + "integrity": "sha512-kPKWPb0dMpZi+ov1hJiwse9dWweZsz3V9rP4KdytnX1E7z3cTNmFGglwklzFPuqIcHLIY3bgKSs4vkwXXdflQA==", + "requires": { + "@babel/helper-function-name": "^7.7.0", + "@babel/types": "^7.7.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.0.tgz", + "integrity": "sha512-CDs26w2shdD1urNUAji2RJXyBFCaR+iBEGnFz3l7maizMkQe3saVw9WtjG1tz8CwbjvlFnaSLVhgnu1SWaherg==", + "requires": { + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-function-name": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", + "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", + "requires": { + "@babel/helper-get-function-arity": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", + "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.0.tgz", + "integrity": "sha512-LUe/92NqsDAkJjjCEWkNe+/PcpnisvnqdlRe19FahVapa4jndeuJ+FBiTX1rcAKWKcJGE+C3Q3tuEuxkSmCEiQ==", + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz", + "integrity": "sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA==", + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz", + "integrity": "sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw==", + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.0.tgz", + "integrity": "sha512-rXEefBuheUYQyX4WjV19tuknrJFwyKw0HgzRwbkyTbB+Dshlq7eqkWbyjzToLrMZk/5wKVKdWFluiAsVkHXvuQ==", + "requires": { + "@babel/helper-module-imports": "^7.7.0", + "@babel/helper-simple-access": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz", + "integrity": "sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg==", + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" + }, + "@babel/helper-regex": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", + "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.0.tgz", + "integrity": "sha512-pHx7RN8X0UNHPB/fnuDnRXVZ316ZigkO8y8D835JlZ2SSdFKb6yH9MIYRU4fy/KPe5sPHDFOPvf8QLdbAGGiyw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.7.0", + "@babel/helper-wrap-function": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz", + "integrity": "sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.7.0", + "@babel/helper-optimise-call-expression": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz", + "integrity": "sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g==", + "requires": { + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", + "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-wrap-function": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.0.tgz", + "integrity": "sha512-sd4QjeMgQqzshSjecZjOp8uKfUtnpmCyQhKQrVJBBgeHAB/0FPi33h3AbVlVp07qQtMD4QgYSzaMI7VwncNK/w==", + "requires": { + "@babel/helper-function-name": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helpers": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.0.tgz", + "integrity": "sha512-VnNwL4YOhbejHb7x/b5F39Zdg5vIQpUUNzJwx0ww1EcVRt41bbGRZWhAURrfY32T5zTT3qwNOQFWpn+P0i0a2g==", + "requires": { + "@babel/template": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.3.tgz", + "integrity": "sha512-bqv+iCo9i+uLVbI0ILzKkvMorqxouI+GbV13ivcARXn9NNEabi2IEz912IgNpT/60BNXac5dgcfjb94NjsF33A==" + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.0.tgz", + "integrity": "sha512-ot/EZVvf3mXtZq0Pd0+tSOfGWMizqmOohXmNZg6LNFjHOV+wOPv7BvVYh8oPR8LhpIP3ye8nNooKL50YRWxpYA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.7.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz", + "integrity": "sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.5.5", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.6.0.tgz", + "integrity": "sha512-ZSyYw9trQI50sES6YxREXKu+4b7MAg6Qx2cvyDDYjP2Hpzd3FleOUwC9cqn1+za8d0A2ZU8SHujxFao956efUg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.6.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-decorators": "^7.2.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.0.tgz", + "integrity": "sha512-7poL3Xi+QFPC7sGAzEIbXUyYzGJwbc2+gSD0AkiC5k52kH2cqHdqxm5hNFfLW3cRSTcx9bN0Fl7/6zWcLLnKAQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", + "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.0.tgz", + "integrity": "sha512-mk34H+hp7kRBWJOOAR0ZMGCydgKMD4iN9TpDRp3IIcbunltxEY89XSimc6WbtSLCDrwcdy/EEw7h5CFCzxTchw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz", + "integrity": "sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.7.0.tgz", + "integrity": "sha512-vQMV07p+L+jZeUnvX3pEJ9EiXGCjB5CTTvsirFD9rpEuATnoAvLBLoYbw1v5tyn3d2XxSuvEKi8cV3KqYUa0vQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", + "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.0.tgz", + "integrity": "sha512-hi8FUNiFIY1fnUI2n1ViB1DR0R4QeK4iHcTlW6aJkrPoTdb8Rf1EMQ6GT3f67DDkYyWgew9DFoOZ6gOoEsdzTA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz", + "integrity": "sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.0.tgz", + "integrity": "sha512-vLI2EFLVvRBL3d8roAMqtVY0Bm9C1QzLkdS57hiKrjUBSqsQYrBsMCeOg/0KK7B0eK9V71J5mWcha9yyoI2tZw==", + "requires": { + "@babel/helper-module-imports": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.7.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz", + "integrity": "sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.0.tgz", + "integrity": "sha512-/b3cKIZwGeUesZheU9jNYcwrEA7f/Bo4IdPmvp7oHgvks2majB5BoT5byAql44fiNQYOPzhk2w8DbgfuafkMoA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.7.0", + "@babel/helper-define-map": "^7.7.0", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-optimise-call-expression": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz", + "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.0.tgz", + "integrity": "sha512-3QQlF7hSBnSuM1hQ0pS3pmAbWLax/uGNCbPBND9y+oJ4Y776jsyujG2k0Sn2Aj2a0QwVOiOFL5QVPA7spjvzSA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", + "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.4.tgz", + "integrity": "sha512-WyVedfeEIILYEaWGAUWzVNyqG4sfsNooMhXWsu/YzOvVGcsnPb5PguysjJqI3t3qiaYj0BR8T2f5njdjTGe44Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", + "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.0.tgz", + "integrity": "sha512-P5HKu0d9+CzZxP5jcrWdpe7ZlFDe24bmqP6a6X8BHEBl/eizAsY8K6LX8LASZL0Jxdjm5eEfzp+FIrxCm/p8bA==", + "requires": { + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", + "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz", + "integrity": "sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg==", + "requires": { + "@babel/helper-module-transforms": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.7.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.0.tgz", + "integrity": "sha512-ZAuFgYjJzDNv77AjXRqzQGlQl4HdUM6j296ee4fwKVZfhDR9LAGxfvXjBkb06gNETPnN0sLqRm9Gxg4wZH6dXg==", + "requires": { + "@babel/helper-hoist-variables": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.0.tgz", + "integrity": "sha512-u7eBA03zmUswQ9LQ7Qw0/ieC1pcAkbp5OQatbWUzY1PaBccvuJXUkYzoN1g7cqp7dbTu6Dp9bXyalBvD04AANA==", + "requires": { + "@babel/helper-module-transforms": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.0.tgz", + "integrity": "sha512-+SicSJoKouPctL+j1pqktRVCgy+xAch1hWWTMy13j0IflnyNjaoskj+DwRQFimHbLqO3sq2oN2CXMvXq3Bgapg==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.7.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", + "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", + "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", + "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "requires": { + "@babel/helper-call-delegate": "^7.4.4", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.6.3.tgz", + "integrity": "sha512-1/YogSSU7Tby9rq2VCmhuRg+6pxsHy2rI7w/oo8RKoBt6uBUFG+mk6x13kK+FY1/ggN92HAfg7ADd1v1+NCOKg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz", + "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.7.0.tgz", + "integrity": "sha512-mXhBtyVB1Ujfy+0L6934jeJcSXj/VCg6whZzEcgiiZHNS0PGC7vUCsZDQCxxztkpIdF+dY1fUMcjAgEOC3ZOMQ==", + "requires": { + "@babel/helper-builder-react-jsx": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz", + "integrity": "sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz", + "integrity": "sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.0.tgz", + "integrity": "sha512-AXmvnC+0wuj/cFkkS/HFHIojxH3ffSXE+ttulrqWjZZRaUOonfJc60e1wSNT4rV8tIunvu/R3wCp71/tLAa9xg==", + "requires": { + "regenerator-transform": "^0.14.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.6.0.tgz", + "integrity": "sha512-Da8tMf7uClzwUm/pnJ1S93m/aRXmoYNDD7TkHua8xBDdaAs54uZpTWvEt6NGwmoVMb9mZbntfTqmG2oSzN/7Vg==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz", + "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", + "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.7.2.tgz", + "integrity": "sha512-UWhDaJRqdPUtdK1s0sKYdoRuqK0NepjZto2UZltvuCgMoMZmdjhgz5hcRokie/3aYEaSz3xvusyoayVaq4PjRg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-typescript": "^7.2.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.0.tgz", + "integrity": "sha512-RrThb0gdrNwFAqEAAx9OWgtx6ICK69x7i9tCnMdVrxQwSDp/Abu9DXFU5Hh16VP33Rmxh04+NGW28NsIkFvFKA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/preset-env": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.1.tgz", + "integrity": "sha512-/93SWhi3PxcVTDpSqC+Dp4YxUu3qZ4m7I76k0w73wYfn7bGVuRIO4QUz95aJksbS+AD1/mT1Ie7rbkT0wSplaA==", + "requires": { + "@babel/helper-module-imports": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.7.0", + "@babel/plugin-proposal-dynamic-import": "^7.7.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.6.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.7.0", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-syntax-top-level-await": "^7.7.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.7.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.6.3", + "@babel/plugin-transform-classes": "^7.7.0", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.6.0", + "@babel/plugin-transform-dotall-regex": "^7.7.0", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.7.0", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.7.0", + "@babel/plugin-transform-modules-systemjs": "^7.7.0", + "@babel/plugin-transform-modules-umd": "^7.7.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.0", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.7.0", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.6.2", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.7.0", + "@babel/types": "^7.7.1", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/preset-react": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.7.0.tgz", + "integrity": "sha512-IXXgSUYBPHUGhUkH+89TR6faMcBtuMW0h5OHbMuVbL3/5wK2g6a2M2BBpkLa+Kw0sAHiZ9dNVgqJMDP/O4GRBA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.7.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0" + } + }, + "@babel/preset-typescript": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.6.0.tgz", + "integrity": "sha512-4xKw3tTcCm0qApyT6PqM9qniseCE79xGHiUnNdKGdxNsGUc2X7WwZybqIpnTmoukg3nhPceI5KPNzNqLNeIJww==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.6.0" + } + }, + "@babel/runtime": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.0.tgz", + "integrity": "sha512-89eSBLJsxNxOERC0Op4vd+0Bqm6wRMqMbFtV3i0/fbaWw/mJ8Q3eBvgX0G4SyrOOLCtbu98HspF8o09MRT+KzQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@babel/template": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", + "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/traverse": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", + "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.2", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/parser": "^7.7.2", + "@babel/types": "^7.7.2", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", + "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@cnakazawa/watch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", + "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" + }, + "@csstools/normalize.css": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-9.0.1.tgz", + "integrity": "sha512-6It2EVfGskxZCQhuykrfnALg7oVeiI6KclWSmGDqB0AiInVrTGB9Jp9i4/Ad21u9Jde/voVQz6eFX/eSg/UsPA==" + }, + "@hapi/address": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.2.tgz", + "integrity": "sha512-O4QDrx+JoGKZc6aN64L04vqa7e41tIiLU+OvKdcYaEMP97UttL0f9GIi9/0A4WAMx0uBd6SidDIhktZhgOcN8Q==" + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" + }, + "@hapi/hoek": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.0.tgz", + "integrity": "sha512-7XYT10CZfPsH7j9F1Jmg1+d0ezOux2oM2GfArAzLwWe4mE2Dr3hVjsAL6+TFY49RRJlCdJDMw3nJsLFroTc8Kw==" + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } + }, + "@jest/core": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "requires": { + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "slash": "^2.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + } + } + }, + "@jest/environment": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "requires": { + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/fake-timers": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "requires": { + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/reporters": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "requires": { + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.1", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.4.2", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/test-sequencer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "requires": { + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" + } + }, + "@jest/transform": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.9.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", + "micromatch": "^3.1.10", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", + "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==" + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", + "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==" + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", + "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==" + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", + "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", + "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==" + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", + "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==" + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", + "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==" + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", + "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" + }, + "@svgr/babel-preset": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", + "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", + "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", + "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", + "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", + "@svgr/babel-plugin-transform-svg-component": "^4.2.0" + } + }, + "@svgr/core": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", + "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", + "requires": { + "@svgr/plugin-jsx": "^4.3.3", + "camelcase": "^5.3.1", + "cosmiconfig": "^5.2.1" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", + "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@svgr/plugin-jsx": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", + "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", + "requires": { + "@babel/core": "^7.4.5", + "@svgr/babel-preset": "^4.3.3", + "@svgr/hast-util-to-babel-ast": "^4.3.2", + "svg-parser": "^2.0.0" + } + }, + "@svgr/plugin-svgo": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", + "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", + "requires": { + "cosmiconfig": "^5.2.1", + "merge-deep": "^3.0.2", + "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.2.tgz", + "integrity": "sha512-F3VE5OvyOWBEd2bF7BdtFRyI6E9it3mN7teDw0JQTlVtc4HZEYiiLSl+Uf9Uub6IYHVGc+qIrxxDyeedkQru2w==", + "requires": { + "@babel/core": "^7.4.5", + "@babel/plugin-transform-react-constant-elements": "^7.0.0", + "@babel/preset-env": "^7.4.5", + "@babel/preset-react": "^7.0.0", + "@svgr/core": "^4.3.2", + "@svgr/plugin-jsx": "^4.3.2", + "@svgr/plugin-svgo": "^4.3.1", + "loader-utils": "^1.2.3" + } + }, + "@types/babel__core": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", + "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.0.tgz", + "integrity": "sha512-c1mZUu4up5cp9KROs/QAw0gTeHrw/x7m52LcnvMxxOZ03DmLwPV0MlGmlgzV3cnSdjhJOZsj7E7FHeioai+egw==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz", + "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==" + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==" + }, + "@types/istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/json-schema": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", + "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==" + }, + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" + }, + "@types/yargs": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.3.tgz", + "integrity": "sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.1.0.tgz", + "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.7.0.tgz", + "integrity": "sha512-H5G7yi0b0FgmqaEUpzyBlVh0d9lq4cWG2ap0RKa6BkF3rpBb6IrAoubt1NWh9R2kRs/f0k6XwRDiDz3X/FqXhQ==", + "requires": { + "@typescript-eslint/experimental-utils": "2.7.0", + "eslint-utils": "^1.4.2", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^2.0.1", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.7.0.tgz", + "integrity": "sha512-9/L/OJh2a5G2ltgBWJpHRfGnt61AgDeH6rsdg59BH0naQseSwR7abwHq3D5/op0KYD/zFT4LS5gGvWcMmegTEg==", + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.7.0", + "eslint-scope": "^5.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.7.0.tgz", + "integrity": "sha512-ctC0g0ZvYclxMh/xI+tyqP0EC2fAo6KicN9Wm2EIao+8OppLfxji7KAGJosQHSGBj3TcqUrA96AjgXuKa5ob2g==", + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.7.0", + "@typescript-eslint/typescript-estree": "2.7.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.7.0.tgz", + "integrity": "sha512-vVCE/DY72N4RiJ/2f10PTyYekX2OLaltuSIBqeHYI44GQ940VCYioInIb8jKMrK9u855OEJdFC+HmWAZTnC+Ag==", + "requires": { + "debug": "^4.1.1", + "glob": "^7.1.4", + "is-glob": "^4.0.1", + "lodash.unescape": "4.0.1", + "semver": "^6.3.0", + "tsutils": "^3.17.1" + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==" + }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" + } + } + }, + "acorn-jsx": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", + "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==" + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + }, + "adjust-sourcemap-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", + "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", + "requires": { + "assert": "1.4.1", + "camelcase": "5.0.0", + "loader-utils": "1.2.3", + "object-path": "0.11.4", + "regex-parser": "2.2.10" + }, + "dependencies": { + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + } + } + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + }, + "ansi-escapes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", + "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "requires": { + "type-fest": "^0.5.2" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "requires": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + } + }, + "arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "requires": { + "util": "0.10.3" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "autoprefixer": { + "version": "9.7.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz", + "integrity": "sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==", + "requires": { + "browserslist": "^4.7.2", + "caniuse-lite": "^1.0.30001006", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.21", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==" + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "axobject-query": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "requires": { + "ast-types-flow": "0.0.7" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "babel-eslint": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", + "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + } + }, + "babel-extract-comments": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", + "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", + "requires": { + "babylon": "^6.18.0" + } + }, + "babel-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "requires": { + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.9.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" + } + }, + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" + } + }, + "babel-plugin-jest-hoist": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", + "requires": { + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-macros": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz", + "integrity": "sha512-6W2nwiXme6j1n2erPOnmRiWfObUhWH7Qw1LMi9XZy8cj+KtESu3T6asZvtk5bMQQjX8te35o7CFueiSdL/2NmQ==", + "requires": { + "@babel/runtime": "^7.4.2", + "cosmiconfig": "^5.2.0", + "resolve": "^1.10.0" + } + }, + "babel-plugin-named-asset-import": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.4.tgz", + "integrity": "sha512-S6d+tEzc5Af1tKIMbsf2QirCcPdQ+mKUCY2H1nJj1DyA1ShwpsoxEOAwbWsG5gcXNV/olpvQd9vrUWRx4bnhpw==" + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + }, + "babel-preset-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", + "requires": { + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^24.9.0" + } + }, + "babel-preset-react-app": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.0.2.tgz", + "integrity": "sha512-aXD+CTH8Chn8sNJr4tO/trWKqe5sSE4hdO76j9fhVezJSzmpWYWUSc5JoPmdSxADwef5kQFNGKXd433vvkd2VQ==", + "requires": { + "@babel/core": "7.6.0", + "@babel/plugin-proposal-class-properties": "7.5.5", + "@babel/plugin-proposal-decorators": "7.6.0", + "@babel/plugin-proposal-object-rest-spread": "7.5.5", + "@babel/plugin-syntax-dynamic-import": "7.2.0", + "@babel/plugin-transform-destructuring": "7.6.0", + "@babel/plugin-transform-flow-strip-types": "7.4.4", + "@babel/plugin-transform-react-display-name": "7.2.0", + "@babel/plugin-transform-runtime": "7.6.0", + "@babel/preset-env": "7.6.0", + "@babel/preset-react": "7.0.0", + "@babel/preset-typescript": "7.6.0", + "@babel/runtime": "7.6.0", + "babel-plugin-dynamic-import-node": "2.3.0", + "babel-plugin-macros": "2.6.1", + "babel-plugin-transform-react-remove-prop-types": "0.4.24" + }, + "dependencies": { + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", + "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/preset-env": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.0.tgz", + "integrity": "sha512-1efzxFv/TcPsNXlRhMzRnkBFMeIqBBgzwmZwlFDw5Ubj0AGLeufxugirwZmkkX/ayi3owsSqoQ4fw8LkfK9SYg==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.6.0", + "@babel/plugin-transform-classes": "^7.5.5", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.6.0", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.6.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.6.0", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.4.4", + "@babel/types": "^7.6.0", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + } + }, + "@babel/preset-react": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz", + "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", + "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", + "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==" + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + } + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", + "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", + "requires": { + "caniuse-lite": "^1.0.30001004", + "electron-to-chromium": "^1.3.295", + "node-releases": "^1.1.38" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + } + } + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001009", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001009.tgz", + "integrity": "sha512-M3rEqHN6SaVjgo4bIik7HsGcWXsi+lI9WA0p51RPMFx5gXfduyOXWJrc0R4xBkSK1pgNf4CNgy5M+6H+WiEP8g==" + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "requires": { + "rsvp": "^4.8.4" + } + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz", + "integrity": "sha512-u5ElzokS8A1pm9vM3/iDgTcI3xqHxuCao94Oz8etI3cf0Tio0p8izkDYbTIn09uP3yUUr6+veaE6IkjnTYS46g==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "optional": true + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + } + } + }, + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "clone-deep": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", + "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", + "requires": { + "for-own": "^0.1.3", + "is-plain-object": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^1.0.3", + "shallow-clone": "^0.1.2" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "requires": { + "arity-n": "^1.0.4" + } + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "requires": { + "mime-db": ">= 1.40.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==" + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-js": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz", + "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==" + }, + "core-js-compat": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.4.1.tgz", + "integrity": "sha512-YdeJI26gLc0CQJ9asLE5obEgBz2I0+CIgnoTbS2T0d5IPQw/OCgCIFR527RmpduxjrB3gSEHoGOCTq9sigOyfw==", + "requires": { + "browserslist": "^4.7.2", + "semver": "^6.3.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "requires": { + "postcss": "^7.0.5" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "css-loader": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", + "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", + "requires": { + "camelcase": "^5.2.0", + "icss-utils": "^4.1.0", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.14", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^2.0.0", + "postcss-value-parser": "^3.3.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + } + } + }, + "css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "requires": { + "postcss": "^7.0.5" + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-unit-converter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", + "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=" + }, + "css-what": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", + "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==" + }, + "cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" + }, + "csso": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", + "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", + "requires": { + "css-tree": "1.0.0-alpha.37" + } + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "requires": { + "cssom": "0.3.x" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "damerau-levenshtein": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", + "integrity": "sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA==" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" + }, + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "requires": { + "is-obj": "^1.0.0" + } + }, + "dotenv": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==" + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.3.306", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz", + "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==" + }, + "elliptic": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", + "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", + "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.52", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.52.tgz", + "integrity": "sha512-bWCbE9fbpYQY4CU6hJbJ1vSz70EClMlDgJ7BmwI+zEJhxrwjesZRPglGJlsZhu0334U3hI+gaspwksH9IGD6ag==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.2", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, + "eslint": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.6.0.tgz", + "integrity": "sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g==", + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + } + } + }, + "eslint-config-react-app": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.0.2.tgz", + "integrity": "sha512-VhlESAQM83uULJ9jsvcKxx2Ab0yrmjUt8kDz5DyhTQufqWE0ssAnejlWri5LXv25xoXfdqOyeDPdfJS9dXKagQ==", + "requires": { + "confusing-browser-globals": "^1.0.9" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "requires": { + "debug": "^2.6.9", + "resolve": "^1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "eslint-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.2.tgz", + "integrity": "sha512-S5VnD+UpVY1PyYRqeBd/4pgsmkvSokbHqTXAQMpvCyRr3XN2tvSLo9spm2nEpqQqh9dezw3os/0zWihLeOg2Rw==", + "requires": { + "fs-extra": "^8.1.0", + "loader-fs-cache": "^1.0.2", + "loader-utils": "^1.2.3", + "object-hash": "^1.3.1", + "schema-utils": "^2.2.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "schema-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz", + "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==", + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", + "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-flowtype": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.13.0.tgz", + "integrity": "sha512-bhewp36P+t7cEV0b6OdmoRWJCBYRiHFlqPZAG1oS3SF+Y0LQkeDvFSM4oxoxvczD1OdONCXMlJfQFiWLcV9urw==", + "requires": { + "lodash": "^4.17.15" + } + }, + "eslint-plugin-import": { + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", + "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", + "requires": { + "array-includes": "^3.0.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.11.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", + "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", + "requires": { + "@babel/runtime": "^7.4.5", + "aria-query": "^3.0.0", + "array-includes": "^3.0.3", + "ast-types-flow": "^0.0.7", + "axobject-query": "^2.0.2", + "damerau-levenshtein": "^1.0.4", + "emoji-regex": "^7.0.2", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.1" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + } + } + }, + "eslint-plugin-react": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz", + "integrity": "sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA==", + "requires": { + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.1.0", + "object.entries": "^1.1.0", + "object.fromentries": "^2.0.0", + "object.values": "^1.1.0", + "prop-types": "^15.7.2", + "resolve": "^1.10.1" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + } + } + }, + "eslint-plugin-react-hooks": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", + "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==" + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" + }, + "espree": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", + "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "requires": { + "acorn": "^7.1.0", + "acorn-jsx": "^5.1.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==" + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "expect": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "requires": { + "@jest/types": "^24.9.0", + "ansi-styles": "^3.2.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + } + } + }, + "ext": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.2.0.tgz", + "integrity": "sha512-0ccUQK/9e3NreLFg6K6np8aPyRgwycx+oFGtfx1dSp7Wj00Ozw9r05FgBRlzjf2XBM7LAzwgLyDscRrtSU91hA==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "dependencies": { + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "requires": { + "bser": "^2.0.0" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" + }, + "figures": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", + "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==" + }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "follow-redirects": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", + "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "fork-ts-checker-webpack-plugin": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.5.0.tgz", + "integrity": "sha512-zEhg7Hz+KhZlBhILYpXy+Beu96gwvkROWJiTXOCyOOMMrdBIRPvsBpBqgTI4jfJGrJXcqGwJR8zsBGDmzY0jsA==", + "requires": { + "babel-code-frame": "^6.22.0", + "chalk": "^2.4.1", + "chokidar": "^2.0.4", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", + "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", + "optional": true + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "requires": { + "globule": "^1.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.1.tgz", + "integrity": "sha512-09/VS4iek66Dh2bctjRkowueRJbY1JDGR1L/zRxO1Qk8Uxs6PnqaNSqalpizPT+CDjre3hnEsuzvhgomz9qYrA==" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "requires": { + "array-union": "^1.0.1", + "dir-glob": "2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + } + } + }, + "globule": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" + }, + "gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + } + } + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" + }, + "handlebars": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.2.tgz", + "integrity": "sha512-29Zxv/cynYB7mkT1rVWQnV7mGX6v7H/miQ6dbEpYTKq5eJBN7PsRB+ViYJlcT6JINTSu4dVB9kOqEun78h6Exg==", + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "harmony-reflect": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", + "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", + "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "requires": { + "react-is": "^16.7.0" + } + }, + "hosted-git-info": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + } + } + }, + "html-webpack-plugin": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.5.tgz", + "integrity": "sha512-y5l4lGxOW3pz3xBTFdfB9rnnrWRPVxlAhX6nrBYIcW+2k2zC3mSp/3DxlWVCMBfnO6UAnoF8OcFn0IMy6kaKAQ==", + "requires": { + "html-minifier": "^3.5.20", + "loader-utils": "^1.1.0", + "lodash": "^4.17.11", + "pretty-error": "^2.1.1", + "tapable": "^1.1.0", + "util.promisify": "1.0.0" + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" + }, + "http-proxy": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "requires": { + "postcss": "^7.0.14" + } + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "immer": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", + "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "^2.0.0" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inquirer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", + "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "^1.0.1" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==" + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "requires": { + "handlebars": "^4.1.2" + } + }, + "jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "requires": { + "import-local": "^2.0.0", + "jest-cli": "^24.9.0" + }, + "dependencies": { + "jest-cli": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", + "requires": { + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "import-local": "^2.0.0", + "is-ci": "^2.0.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^13.3.0" + } + } + } + }, + "jest-changed-files": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", + "requires": { + "@jest/types": "^24.9.0", + "execa": "^1.0.0", + "throat": "^4.0.0" + } + }, + "jest-config": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^24.9.0", + "@jest/types": "^24.9.0", + "babel-jest": "^24.9.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.9.0", + "realpath-native": "^1.1.0" + } + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-docblock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-each": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", + "requires": { + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-environment-jsdom": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", + "requires": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", + "jsdom": "^11.5.1" + } + }, + "jest-environment-jsdom-fourteen": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-0.1.0.tgz", + "integrity": "sha512-4vtoRMg7jAstitRzL4nbw83VmGH8Rs13wrND3Ud2o1fczDhMUF32iIrNKwYGgeOPUdfvZU4oy8Bbv+ni1fgVCA==", + "requires": { + "jest-mock": "^24.5.0", + "jest-util": "^24.5.0", + "jsdom": "^14.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" + }, + "jsdom": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz", + "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==", + "requires": { + "abab": "^2.0.0", + "acorn": "^6.0.4", + "acorn-globals": "^4.3.0", + "array-equal": "^1.0.0", + "cssom": "^0.3.4", + "cssstyle": "^1.1.1", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.0", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.1.3", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.5", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.5.0", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^6.1.2", + "xml-name-validator": "^3.0.0" + } + }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "jest-environment-node": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", + "requires": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" + }, + "jest-haste-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "requires": { + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "dependencies": { + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "optional": true + } + } + } + } + }, + "jest-jasmine2": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^24.9.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0", + "throat": "^4.0.0" + } + }, + "jest-leak-detector": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", + "requires": { + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-matcher-utils": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "requires": { + "@jest/types": "^24.9.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==" + }, + "jest-regex-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==" + }, + "jest-resolve": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } + }, + "jest-resolve-dependencies": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", + "requires": { + "@jest/types": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.9.0" + } + }, + "jest-runner": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.4.2", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-docblock": "^24.3.0", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + } + }, + "jest-runtime": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "strip-bom": "^3.0.0", + "yargs": "^13.3.0" + } + }, + "jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==" + }, + "jest-snapshot": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "expect": "^24.9.0", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^24.9.0", + "semver": "^6.2.0" + } + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "jest-validate": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "requires": { + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" + } + }, + "jest-watch-typeahead": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.0.tgz", + "integrity": "sha512-bJR/HPNgOQnkmttg1OkBIrYFAYuxFxExtgQh67N2qPvaWGVC8TCkedRNPKBfmZfVXFD3u2sCH+9OuS5ApBfCgA==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.1", + "jest-watcher": "^24.3.0", + "slash": "^3.0.0", + "string-length": "^3.1.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "string-length": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", + "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^5.2.0" + } + } + } + }, + "jest-watcher": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", + "requires": { + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "jest-util": "^24.9.0", + "string-length": "^2.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + } + } + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "js-base64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==" + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "json5": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jsx-ast-utils": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", + "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", + "requires": { + "array-includes": "^3.0.3", + "object.assign": "^4.1.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "loader-fs-cache": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz", + "integrity": "sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==", + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "requires": { + "find-up": "^1.0.0" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.unescape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", + "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "loglevel": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz", + "integrity": "sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "requires": { + "tmpl": "1.0.x" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "merge-deep": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", + "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", + "requires": { + "arr-union": "^3.1.0", + "clone-deep": "^0.2.4", + "kind-of": "^3.0.2" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "merge2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + }, + "mime-db": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", + "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==" + }, + "mime-types": { + "version": "2.1.25", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", + "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", + "requires": { + "mime-db": "1.42.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mini-create-react-context": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz", + "integrity": "sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw==", + "requires": { + "@babel/runtime": "^7.4.0", + "gud": "^1.0.0", + "tiny-warning": "^1.0.2" + } + }, + "mini-css-extract-plugin": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", + "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==" + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + } + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + } + } + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" + }, + "node-notifier": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "node-releases": { + "version": "1.1.40", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.40.tgz", + "integrity": "sha512-r4LPcC5b/bS8BdtWH1fbeK88ib/wg9aqmg6/s3ngNLn2Ewkn/8J6Iw3P9RTlfIAdSdvYvQl2thCY5Y+qTAQ2iQ==", + "requires": { + "semver": "^6.3.0" + } + }, + "node-sass": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.0.tgz", + "integrity": "sha512-W1XBrvoJ1dy7VsvTAS5q1V45lREbTlZQqFbiHb3R3OTTCma0XBtuG6xZ6Z4506nR4lmHPTqVRwxT6KgtWC97CA==", + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "normalize.css": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" + }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object-path": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", + "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.fromentries": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.1.tgz", + "integrity": "sha512-PUQv8Hbg3j2QX0IQYv3iAGCbGcu4yY4KQ92/dhA4sFSixBmSmp13UpDLs6jGK8rBtbmhNNIK99LD2k293jpiGA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.15.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "requires": { + "is-wsl": "^1.1.0" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + } + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", + "requires": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "requires": { + "p-reduce": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=" + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "requires": { + "no-case": "^2.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + } + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + } + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + }, + "pnp-webpack-plugin": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.5.0.tgz", + "integrity": "sha512-jd9olUr9D7do+RN8Wspzhpxhgp1n6Vd0NtQ4SFkmIACZoEL1nkyAdW9Ygrinjec0vgDcWjscFQQ1gDW8rsfKTg==", + "requires": { + "ts-pnp": "^1.1.2" + } + }, + "portfinder": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", + "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-attribute-case-insensitive": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.1.tgz", + "integrity": "sha512-L2YKB3vF4PetdTIthQVeT+7YiSzMoNMLLYxPXXppOOP7NoazEAy45sh2LvJ8leCQjfBcfkYQs8TtCcQjeZTp8A==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-browser-comments": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-2.0.0.tgz", + "integrity": "sha512-xGG0UvoxwBc4Yx4JX3gc0RuDl1kc4bVihCzzk6UC72YPfq5fu3c717Nu8Un3nvnq1BJ31gBnFXIG/OaUTnpHgA==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-calc": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz", + "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", + "requires": { + "css-unit-converter": "^1.1.1", + "postcss": "^7.0.5", + "postcss-selector-parser": "^5.0.0-rc.4", + "postcss-value-parser": "^3.3.1" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "requires": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "requires": { + "postcss": "^7.0.14" + } + }, + "postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "requires": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "requires": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-flexbugs-fixes": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz", + "integrity": "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-font-variant": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", + "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-initial": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", + "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", + "requires": { + "lodash.template": "^4.5.0", + "postcss": "^7.0.2" + } + }, + "postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + } + }, + "postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", + "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^3.3.1" + } + }, + "postcss-modules-scope": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz", + "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", + "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^7.0.6" + } + }, + "postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-normalize": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-7.0.1.tgz", + "integrity": "sha512-NOp1fwrG+6kVXWo7P9SizCHX6QvioxFD/hZcI2MLxPmVnFJFC0j0DDpIuNw2tUDeCFMni59gCVgeJ1/hYhj2OQ==", + "requires": { + "@csstools/normalize.css": "^9.0.1", + "browserslist": "^4.1.1", + "postcss": "^7.0.2", + "postcss-browser-comments": "^2.0.0" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "requires": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-safe-parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", + "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "postcss-selector-not": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz", + "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "pretty-bytes": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", + "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==" + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "promise": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.3.tgz", + "integrity": "sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw==", + "requires": { + "asap": "~2.0.6" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "prompts": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", + "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.3" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", + "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" + }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "requires": { + "performance-now": "^2.1.0" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + } + } + }, + "react": { + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.11.0.tgz", + "integrity": "sha512-M5Y8yITaLmU0ynd0r1Yvfq98Rmll6q8AxaEe88c8e7LxO8fZ2cNgmFt0aGAS9wzf1Ao32NKXtCl+/tVVtkxq6g==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-app-polyfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.4.tgz", + "integrity": "sha512-5Vte6ki7jpNsNCUKaboyofAhmURmCn2Y6Hu7ydJ6Iu4dct1CIGoh/1FT7gUZKAbowVX2lxVPlijvp1nKxfAl4w==", + "requires": { + "core-js": "3.2.1", + "object-assign": "4.1.1", + "promise": "8.0.3", + "raf": "3.4.1", + "regenerator-runtime": "0.13.3", + "whatwg-fetch": "3.0.0" + } + }, + "react-dev-utils": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-9.1.0.tgz", + "integrity": "sha512-X2KYF/lIGyGwP/F/oXgGDF24nxDA2KC4b7AFto+eqzc/t838gpSGiaU8trTqHXOohuLxxc5qi1eDzsl9ucPDpg==", + "requires": { + "@babel/code-frame": "7.5.5", + "address": "1.1.2", + "browserslist": "4.7.0", + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "1.0.5", + "filesize": "3.6.1", + "find-up": "3.0.0", + "fork-ts-checker-webpack-plugin": "1.5.0", + "global-modules": "2.0.0", + "globby": "8.0.2", + "gzip-size": "5.1.1", + "immer": "1.10.0", + "inquirer": "6.5.0", + "is-root": "2.1.0", + "loader-utils": "1.2.3", + "open": "^6.3.0", + "pkg-up": "2.0.0", + "react-error-overlay": "^6.0.3", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "sockjs-client": "1.4.0", + "strip-ansi": "5.2.0", + "text-table": "0.2.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "browserslist": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", + "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "requires": { + "caniuse-lite": "^1.0.30000989", + "electron-to-chromium": "^1.3.247", + "node-releases": "^1.1.29" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "inquirer": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", + "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + } + } + }, + "react-dom": { + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.11.0.tgz", + "integrity": "sha512-nrRyIUE1e7j8PaXSPtyRKtz+2y9ubW/ghNgqKFHHAHaeP0fpF5uXR+sq8IMRHC+ZUxw7W9NyCDTBtwWxvkb0iA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.17.0" + } + }, + "react-error-overlay": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.3.tgz", + "integrity": "sha512-bOUvMWFQVk5oz8Ded9Xb7WVdEi3QGLC8tH7HmYP0Fdp4Bn3qw0tRFmr5TW6mvahzvmrK4a6bqWGfCevBflP+Xw==" + }, + "react-from-dom": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/react-from-dom/-/react-from-dom-0.3.1.tgz", + "integrity": "sha512-PeNBa8iuzoD7qHA9O7YpGnXFvC+XFFwStmFh2/r2zJAvEIaRg6EwOj+EPcDIFwyYBhqPIItxIx/dGdeWiFivjQ==" + }, + "react-inlinesvg": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/react-inlinesvg/-/react-inlinesvg-1.2.0.tgz", + "integrity": "sha512-IsznU+UzpUwDGzBWbf0bfSRA5Jbqz87xeoqLM/nSIDPkoHksInF1wCGybTSn4sIui+30TqboRQP1wAelNTkdog==", + "requires": { + "exenv": "^1.2.2", + "react-from-dom": "^0.3.0" + } + }, + "react-is": { + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.11.0.tgz", + "integrity": "sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw==" + }, + "react-router": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.1.2.tgz", + "integrity": "sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.3.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "react-router-dom": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.1.2.tgz", + "integrity": "sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.1.2", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, + "react-scripts": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.2.0.tgz", + "integrity": "sha512-6LzuKbE2B4eFQG6i1FnTScn9HDcWBfXXnOwW9xKFPJ/E3rK8i1ufbOZ0ocKyRPxJAKdN7iqg3i7lt0+oxkSVOA==", + "requires": { + "@babel/core": "7.6.0", + "@svgr/webpack": "4.3.2", + "@typescript-eslint/eslint-plugin": "^2.2.0", + "@typescript-eslint/parser": "^2.2.0", + "babel-eslint": "10.0.3", + "babel-jest": "^24.9.0", + "babel-loader": "8.0.6", + "babel-plugin-named-asset-import": "^0.3.4", + "babel-preset-react-app": "^9.0.2", + "camelcase": "^5.2.0", + "case-sensitive-paths-webpack-plugin": "2.2.0", + "css-loader": "2.1.1", + "dotenv": "6.2.0", + "dotenv-expand": "5.1.0", + "eslint": "^6.1.0", + "eslint-config-react-app": "^5.0.2", + "eslint-loader": "3.0.2", + "eslint-plugin-flowtype": "3.13.0", + "eslint-plugin-import": "2.18.2", + "eslint-plugin-jsx-a11y": "6.2.3", + "eslint-plugin-react": "7.14.3", + "eslint-plugin-react-hooks": "^1.6.1", + "file-loader": "3.0.1", + "fs-extra": "7.0.1", + "fsevents": "2.0.7", + "html-webpack-plugin": "4.0.0-beta.5", + "identity-obj-proxy": "3.0.0", + "is-wsl": "^1.1.0", + "jest": "24.9.0", + "jest-environment-jsdom-fourteen": "0.1.0", + "jest-resolve": "24.9.0", + "jest-watch-typeahead": "0.4.0", + "mini-css-extract-plugin": "0.8.0", + "optimize-css-assets-webpack-plugin": "5.0.3", + "pnp-webpack-plugin": "1.5.0", + "postcss-flexbugs-fixes": "4.1.0", + "postcss-loader": "3.0.0", + "postcss-normalize": "7.0.1", + "postcss-preset-env": "6.7.0", + "postcss-safe-parser": "4.0.1", + "react-app-polyfill": "^1.0.4", + "react-dev-utils": "^9.1.0", + "resolve": "1.12.0", + "resolve-url-loader": "3.1.0", + "sass-loader": "7.2.0", + "semver": "6.3.0", + "style-loader": "1.0.0", + "terser-webpack-plugin": "1.4.1", + "ts-pnp": "1.1.4", + "url-loader": "2.1.0", + "webpack": "4.41.0", + "webpack-dev-server": "3.2.1", + "webpack-manifest-plugin": "2.1.1", + "workbox-webpack-plugin": "4.3.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "requires": { + "util.promisify": "^1.0.0" + } + }, + "recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "requires": { + "minimatch": "3.0.4" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + }, + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "requires": { + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regex-parser": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", + "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==" + }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "requires": { + "define-properties": "^1.1.2" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" + }, + "regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", + "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } + } + }, + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "requires": { + "lodash": "^4.17.15" + } + }, + "request-promise-native": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "requires": { + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "resolve-url-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.0.tgz", + "integrity": "sha512-2QcrA+2QgVqsMJ1Hn5NnJXIGCX1clQ1F6QJTqOeiaDw9ACo1G2k+8/shq3mtqne03HOFyskAClqfxKyFBriXZg==", + "requires": { + "adjust-sourcemap-loader": "2.0.0", + "camelcase": "5.0.0", + "compose-function": "3.0.3", + "convert-source-map": "1.6.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.14", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "postcss": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", + "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "requires": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" + } + } + }, + "rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + } + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "sass-loader": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.2.0.tgz", + "integrity": "sha512-h8yUWaWtsbuIiOCgR9fd9c2lRXZ2uG+h8Dzg/AGNj+Hg/3TO8+BBAW9mEP+mh8ei+qBKqSJ0F1FLlYjNBc61OA==", + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.0.1", + "neo-async": "^2.5.0", + "pify": "^4.0.1", + "semver": "^5.5.0" + }, + "dependencies": { + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "requires": { + "xmlchars": "^2.1.1" + } + }, + "scheduler": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.17.0.tgz", + "integrity": "sha512-7rro8Io3tnCPuY4la/NuI5F2yfESpnfZyT6TtkXnSWVkcu0BCDJ+8gk5ozUaFaxpIyNuWAPXrH0yFcSi28fnDA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==" + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", + "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "requires": { + "is-buffer": "^1.0.2" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + } + } + }, + "sisteransi": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", + "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==" + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + } + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "requires": { + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + } + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", + "requires": { + "babel-extract-comments": "^1.0.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" + }, + "style-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", + "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.1" + }, + "dependencies": { + "schema-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz", + "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==", + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "svg-parser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.2.tgz", + "integrity": "sha512-1gtApepKFweigFZj3sGO8KT8LvVZK8io146EzXrpVuWCDAbISz/yMucco3hWTkpZNoPabM+dnMOpy6Swue68Zg==" + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "terser": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.4.0.tgz", + "integrity": "sha512-oDG16n2WKm27JO8h4y/w3iqBGAOSCtq7k8dRmrn4Wf9NouL0b2WpMHGChFGZq4nFAQy1FsNJrVQHfurXOSTmOA==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", + "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "tiny-invariant": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.6.tgz", + "integrity": "sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==" + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "^2.1.0" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "requires": { + "glob": "^7.1.2" + } + }, + "ts-pnp": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.4.tgz", + "integrity": "sha512-1J/vefLC+BWSo+qe8OnJQfWTYRS6ingxjwqmHMqaMxXMj7kFtKLgAaYW3JeX3mktjgUL+etlU8/B4VUAUI9QGw==" + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==" + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "url-loader": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.1.0.tgz", + "integrity": "sha512-kVrp/8VfEm5fUt+fl2E0FQyrpmOYgMEkBsv8+UDP1wFhszECq5JyGF33I7cajlVY90zRZ6MyfgKXngLvHYZX8A==", + "requires": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz", + "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==", + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vendors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz", + "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "requires": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "requires": { + "makeerror": "1.0.x" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "webpack": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.0.tgz", + "integrity": "sha512-yNV98U4r7wX1VJAj5kyMsu36T8RPPQntcb5fJLOsMz/pt/WrKC0Vp1bAlqPLkA1LegSwQwf6P+kAbyhRKVQ72g==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + } + }, + "webpack-dev-server": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.2.1.tgz", + "integrity": "sha512-sjuE4mnmx6JOh9kvSbPYw3u/6uxCLHNWfhWaIPwcXWsvWOPN+nc5baq4i9jui3oOBRXGonK9+OI0jVkaz6/rCw==", + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.0.0", + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", + "debug": "^4.1.1", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "^0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.2.0", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "schema-utils": "^1.0.0", + "selfsigned": "^1.9.1", + "semver": "^5.6.0", + "serve-index": "^1.7.2", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^4.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.5.1", + "webpack-log": "^2.0.0", + "yargs": "12.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "requires": { + "xregexp": "4.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "yargs": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", + "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^2.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^10.1.0" + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-manifest-plugin": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.1.1.tgz", + "integrity": "sha512-2zqJ6mvc3yoiqfDjghAIpljhLSDh/G7vqGrzYcYqqRCd/ZZZCAuc/YPE5xG0LGpLgDJRhUNV1H+znyyhIxahzA==", + "requires": { + "fs-extra": "^7.0.0", + "lodash": ">=3.5 <5", + "object.entries": "^1.1.0", + "tapable": "^1.0.0" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, + "workbox-background-sync": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", + "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-broadcast-update": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz", + "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-build": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz", + "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==", + "requires": { + "@babel/runtime": "^7.3.4", + "@hapi/joi": "^15.0.0", + "common-tags": "^1.8.0", + "fs-extra": "^4.0.2", + "glob": "^7.1.3", + "lodash.template": "^4.4.0", + "pretty-bytes": "^5.1.0", + "stringify-object": "^3.3.0", + "strip-comments": "^1.0.2", + "workbox-background-sync": "^4.3.1", + "workbox-broadcast-update": "^4.3.1", + "workbox-cacheable-response": "^4.3.1", + "workbox-core": "^4.3.1", + "workbox-expiration": "^4.3.1", + "workbox-google-analytics": "^4.3.1", + "workbox-navigation-preload": "^4.3.1", + "workbox-precaching": "^4.3.1", + "workbox-range-requests": "^4.3.1", + "workbox-routing": "^4.3.1", + "workbox-strategies": "^4.3.1", + "workbox-streams": "^4.3.1", + "workbox-sw": "^4.3.1", + "workbox-window": "^4.3.1" + }, + "dependencies": { + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "workbox-cacheable-response": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz", + "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", + "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" + }, + "workbox-expiration": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz", + "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-google-analytics": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz", + "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==", + "requires": { + "workbox-background-sync": "^4.3.1", + "workbox-core": "^4.3.1", + "workbox-routing": "^4.3.1", + "workbox-strategies": "^4.3.1" + } + }, + "workbox-navigation-preload": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz", + "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-precaching": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz", + "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-range-requests": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz", + "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-routing": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", + "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-strategies": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz", + "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-streams": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz", + "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-sw": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz", + "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==" + }, + "workbox-webpack-plugin": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz", + "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==", + "requires": { + "@babel/runtime": "^7.0.0", + "json-stable-stringify": "^1.0.1", + "workbox-build": "^4.3.1" + } + }, + "workbox-window": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz", + "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "requires": { + "microevent.ts": "~0.1.1" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "xregexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/package.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/package.json new file mode 100644 index 00000000..383dfc13 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/package.json @@ -0,0 +1,35 @@ +{ + "name": "azure-maps-demo", + "version": "0.1.0", + "private": true, + "dependencies": { + "node-sass": "^4.13.0", + "normalize.css": "^8.0.1", + "react": "^16.11.0", + "react-dom": "^16.11.0", + "react-inlinesvg": "^1.2.0", + "react-router-dom": "^5.1.2", + "react-scripts": "3.2.0" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": "react-app" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/favicon.ico b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/favicon.ico new file mode 100644 index 00000000..bfe873eb Binary files /dev/null and b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/favicon.ico differ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/index.html b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/index.html new file mode 100644 index 00000000..460e43d6 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/index.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + Contoso Renewable Energy + + + +
+ + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/logo192.png b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/logo192.png new file mode 100644 index 00000000..fa313abf Binary files /dev/null and b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/logo192.png differ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/logo512.png b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/logo512.png new file mode 100644 index 00000000..bd5d4b5e Binary files /dev/null and b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/logo512.png differ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/manifest.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/manifest.json new file mode 100644 index 00000000..080d6c77 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/robots.txt b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/robots.txt new file mode 100644 index 00000000..01b0f9a1 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/robots.txt @@ -0,0 +1,2 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/App.js b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/App.js new file mode 100644 index 00000000..cc19290f --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/App.js @@ -0,0 +1,56 @@ +// node_modules +import React, { Component } from 'react' +import { BrowserRouter as Router, Route, Redirect } from "react-router-dom"; +import "normalize.css"; +import "./styles/global.scss"; + +// local components +import { Layout } from "./components/Layout"; +import { Home } from "./pages/Home"; +import Alerts from './pages/Alerts'; + +export default class App extends Component { + state = { + selected: 'dashboard', + showAlert: false, + showToast: false + } + + componentDidMount() { + this.pollForAlert(); + } + + componentWillUnmount() { + clearInterval(this.interval); + } + + pollForAlert = () => { + this.interval = setInterval(()=> { + fetch('/api/device').then(res => res.json()).then(json => { + const showToast = (this.state.showAlert && json.alert === false) || (this.state.showToast && json.alert === false); + this.setState({ showAlert: json.alert ? json.alert : false, showToast }); + }).catch(); + }, 1000); + } + + onSelect = (selected) => { + this.setState({ selected }); + } + + setShowToast = (showToast) => { + this.setState({ showToast }); + } + + render() { + const { selected, showAlert, showToast } = this.state; + return ( + + + }/> + } /> + } /> + + + ) + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/api/README.md b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/api/README.md new file mode 100644 index 00000000..7101aab2 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/api/README.md @@ -0,0 +1 @@ +# API Folder \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/api/sampleData.js b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/api/sampleData.js new file mode 100644 index 00000000..235ab5a8 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/api/sampleData.js @@ -0,0 +1,4 @@ +export const getForecasts = async () => { + const forecastsResponse = await fetch("api/SampleData/WeatherForecasts"); + return await forecastsResponse.json(); +}; diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/README.md b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/README.md new file mode 100644 index 00000000..f903599d --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/README.md @@ -0,0 +1,3 @@ +# Shared Assets folder + +This folder is for shared assets that are imported into components. \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-oil-temperature.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-oil-temperature.svg new file mode 100644 index 00000000..8f0f5ff6 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-oil-temperature.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + -5min + + + -4min + + + -3min + + + -2min + + + -1min + + + -0min + + + + Time + + + Temp C + + + + + + 150 + + + + + + 125 + + + + + + 100 + + + + + + 75 + + + + + + 50 + + + + + + 25 + + + + + + 0 + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-power-generated.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-power-generated.svg new file mode 100644 index 00000000..ecb79d41 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-power-generated.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + -5min + + + -4min + + + -3min + + + -2min + + + -1min + + + -0min + + + Time + + + KWH + + + + + + 50 + + + + + + 40 + + + + + + 30 + + + + + + 20 + + + + + + 10 + + + + + + 0 + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-vibration.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-vibration.svg new file mode 100644 index 00000000..38b05289 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-vibration.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + -5min + + + -4min + + + -3min + + + -2min + + + -1min + + + -0min + + + + Time + + + Hertz + + + + + + 5 + + + + + + 4 + + + + + + 3 + + + + + + 2 + + + + + + 1 + + + + + + 0 + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-direction-after.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-direction-after.svg new file mode 100644 index 00000000..922036f9 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-direction-after.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + -5min + + + -4min + + + -3min + + + -2min + + + -1min + + + -0min + + + + Time + + + Direction + + + + + + 360 + + + + + + 300 + + + + + + 240 + + + + + + 180 + + + + + + 60 + + + + + + 0 + + + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-direction-farm.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-direction-farm.svg new file mode 100644 index 00000000..a78cea30 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-direction-farm.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + -5min + + + -4min + + + -3min + + + -2min + + + -1min + + + -0min + + + + Time + + + Direction + + + + + + 360 + + + + + + 300 + + + + + + 240 + + + + + + 180 + + + + + + 60 + + + + + + 0 + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-direction-turbine.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-direction-turbine.svg new file mode 100644 index 00000000..7bdc4e47 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-direction-turbine.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + -5min + + + -4min + + + -3min + + + -2min + + + -1min + + + -0min + + + + Time + + + Direction + + + + + + 360 + + + + + + 300 + + + + + + 240 + + + + + + 180 + + + + + + 60 + + + + + + 0 + + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-speed-after.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-speed-after.svg new file mode 100644 index 00000000..8c1187e9 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-speed-after.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + -5min + + + -4min + + + -3min + + + -2min + + + -1min + + + -0min + + + + Time + + + Knots + + + + + + 80 + + + + + + 70 + + + + + + 60 + + + + + + 50 + + + + + + 40 + + + + + + 30 + + + + + + 20 + + + + + + 10 + + + + + + 0 + + + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-speed-farm.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-speed-farm.svg new file mode 100644 index 00000000..7ff70dd2 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-speed-farm.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + -5min + + + -4min + + + -3min + + + -2min + + + -1min + + + -0min + + + + Time + + + Knots + + + + + + 80 + + + + + + 70 + + + + + + 60 + + + + + + 50 + + + + + + 40 + + + + + + 30 + + + + + + 20 + + + + + + 10 + + + + + + 0 + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-speed-turbine.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-speed-turbine.svg new file mode 100644 index 00000000..289df52c --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-speed-turbine.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + -5min + + + -4min + + + -3min + + + -2min + + + -1min + + + -0min + + + + Time + + + Knots + + + + + + 80 + + + + + + 70 + + + + + + 60 + + + + + + 50 + + + + + + 40 + + + + + + 30 + + + + + + 20 + + + + + + 10 + + + + + + 0 + + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/grid.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/grid.svg new file mode 100644 index 00000000..9bf06a78 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/grid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-alerts.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-alerts.svg new file mode 100644 index 00000000..26574f86 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-alerts.svg @@ -0,0 +1,4 @@ + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-close.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-close.svg new file mode 100644 index 00000000..e3396432 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-dashboard.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-dashboard.svg new file mode 100644 index 00000000..48f99ba8 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-dashboard.svg @@ -0,0 +1,3 @@ + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-maintenance.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-maintenance.svg new file mode 100644 index 00000000..673dcbd5 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-maintenance.svg @@ -0,0 +1,3 @@ + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-models.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-models.svg new file mode 100644 index 00000000..fb9a60f9 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-models.svg @@ -0,0 +1,3 @@ + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-refresh.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-refresh.svg new file mode 100644 index 00000000..b69331ce --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-refresh.svg @@ -0,0 +1,3 @@ + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-reports.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-reports.svg new file mode 100644 index 00000000..bd20b506 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-reports.svg @@ -0,0 +1,3 @@ + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-settings.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-settings.svg new file mode 100644 index 00000000..96083408 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-settings.svg @@ -0,0 +1,3 @@ + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-tick.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-tick.svg new file mode 100644 index 00000000..fd91a2cf --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-tick.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-issue.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-issue.svg new file mode 100644 index 00000000..f103b71f --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-issue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-oil-temperature.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-oil-temperature.svg new file mode 100644 index 00000000..c76c7ba2 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-oil-temperature.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-power-generated.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-power-generated.svg new file mode 100644 index 00000000..880c6e32 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-power-generated.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-security-alerts.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-security-alerts.svg new file mode 100644 index 00000000..9a2cbcba --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-security-alerts.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-vibration.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-vibration.svg new file mode 100644 index 00000000..194ff2d8 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-vibration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-wind-direction.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-wind-direction.svg new file mode 100644 index 00000000..a34d1438 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-wind-direction.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-wind-speed.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-wind-speed.svg new file mode 100644 index 00000000..f5ed9811 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-wind-speed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/logo.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/logo.svg new file mode 100644 index 00000000..51a3baeb --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/logo.svg @@ -0,0 +1,10 @@ + + + + CONTOSO + + + RENEWABLE ENERGY + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/turbine.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/turbine.svg new file mode 100644 index 00000000..3a2fe5bf --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/turbine.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Layout/Layout.scss b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Layout/Layout.scss new file mode 100644 index 00000000..b5d78d87 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Layout/Layout.scss @@ -0,0 +1,63 @@ +.Layout { + height: 100vh; + width: 100vw; + display: flex; + header { + width: 15vw; + -webkit-box-shadow: 3px 6px 24px -10px rgba(0,0,0,0.75); + -moz-box-shadow: 3px 6px 24px -10px rgba(0,0,0,0.75); + box-shadow: 3px 6px 24px -10px rgba(0,0,0,0.75); + z-index: 1; + ul { + width: 100; + padding: 0; + margin: 0; + list-style-type: none; + li { + &.logo { + border-bottom: 1px solid #DDDFE1; + padding: 2vw; + svg { + width: 8vw; + } + } + &:nth-child(2) { + margin-top: 0.5vw; + } + padding: 1vw 2vw; + border-left: 2px solid transparent; + font-size: 0.8vw; + font-family: SegoeUISemiLight; + a { + text-decoration: none; + color: #6A707E; + display: flex; + align-items: center; + } + svg { + .icon-path { + fill:#aaa; + } + width: 1vw; + margin-right: 1vw; + } + &.selected { + background: #E5F5F5; + border-color: #00999A; + a { + color: #00999A; + } + svg { + .icon-path{ + fill: #00999a; + } + } + } + } + } + } + main { + flex: 1; + background: #B2D9EA; + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Layout/index.js b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Layout/index.js new file mode 100644 index 00000000..af5c3194 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Layout/index.js @@ -0,0 +1,51 @@ +// node_modules +import React from "react"; +import { Link } from "react-router-dom"; +import SVG from "react-inlinesvg"; + +// local imports +import "./Layout.scss"; +import Logo from '../../assets/logo.svg'; +import IconDashboard from '../../assets/icon-dashboard.svg'; +import IconAlerts from '../../assets/icon-alerts.svg'; +import IconReports from '../../assets/icon-reports.svg'; +import IconModels from '../../assets/icon-models.svg'; +import IconMaintenance from '../../assets/icon-maintenance.svg'; +import IconSettings from '../../assets/icon-settings.svg'; +import Toast from "../Toast"; + +export const Layout = ({ children, selected, showToast, setShowToast }) => { + return ( +
+
+ +
+
{children}
+ {showToast && {setShowToast(false)}} />} +
+ ); +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/README.md b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/README.md new file mode 100644 index 00000000..289b0c49 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/README.md @@ -0,0 +1 @@ +# Shared Components Folder \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Toast/Toast.scss b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Toast/Toast.scss new file mode 100644 index 00000000..6766ed37 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Toast/Toast.scss @@ -0,0 +1,24 @@ +.Toast { + position: absolute; + bottom: 1vw; + right: 1vw; + height: 2vw; + width: 10vw; + background: #00999A; + display: flex; + align-items: center; + color: white; + font-size: 0.7vw; + padding: 0 0.7vw; + .icon-tick { + width: 1vw; + margin-right: 0.3vw; + } + .icon-close { + width: 0.8vw; + cursor: pointer; + } + span { + flex: 1; + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Toast/index.js b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Toast/index.js new file mode 100644 index 00000000..e29c5239 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Toast/index.js @@ -0,0 +1,16 @@ +import React, { Component } from 'react'; +import IconClose from '../../assets/icon-close.svg'; +import IconTick from '../../assets/icon-tick.svg'; +import './Toast.scss'; + +export default class Toast extends Component { + render() { + return ( +
+ icon tick + Alert resolved + icon close +
+ ) + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/index.js b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/index.js new file mode 100644 index 00000000..a0441902 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/index.js @@ -0,0 +1,8 @@ +// node_modules +import React from 'react'; +import ReactDOM from 'react-dom'; + +// local components +import App from './App'; + +ReactDOM.render(, document.getElementById('root')); \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Alerts/Alerts.scss b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Alerts/Alerts.scss new file mode 100644 index 00000000..a35ed9bf --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Alerts/Alerts.scss @@ -0,0 +1,264 @@ +.Alerts { + position: relative; + height: 100%; + width: 100%; + .turbine { + width: 19vw; + position: absolute; + top: 7vw; + left: 34vw; + // max-height: 80vh; + } + .line { + position: absolute; + &.power-generated { + top: 14vw; + left: 28.5vw; + width: 11vw; + } + &.vibration { + top: 30vw; + left: 26.5vw; + width: 14vw; + } + &.oil-temperature { + top: 25vw; + left: 42.25vw; + width: 11vw; + } + &.security { + top: 11.2vw; + left: 42.8vw; + width: 15vw; + } + &.wind-direction { + top: 17.1vw; + left: 43vw; + width: 11.5vw; + } + &.wind-speed { + top: 11.9vw; + left: 47vw; + width: 9vw; + } + } + .loader { + position: absolute; + top: 40%; + left: calc(50% - 265px); + width: 450px; + background: white; + padding: 50px 40px; + -webkit-box-shadow: 3px 6px 24px -10px rgba(0,0,0,0.75); + -moz-box-shadow: 3px 6px 24px -10px rgba(0,0,0,0.75); + box-shadow: 3px 6px 24px -10px rgba(0,0,0,0.75); + p { + color: #00999A; + font-family: SegoeUISemiBold; + font-size: 20px; + margin: 0; + margin-bottom: 20px; + text-align: center; + } + .progress-border { + background: #E4F4F4; + border: 1px solid #BBE0E0; + width: 450px; + height: 30px; + .progress { + background: #00999A; + height: 100%; + } + } + } + .content-wrap { + height: 100%; + width: 100%; + .menu { + position: absolute; + top: 2.5vw; + left: calc(50% - 13vw); + button { + width: 7vw; + color: #707070B2; + background: #E4F4F4; + border: 1px solid #707070B2; + height: 2.2vw; + text-align: center; + font-family: SegoeUISemiBold; + font-size: 0.7vw; + outline: none; + cursor: pointer; + &.selected { + color: #00999A; + border-color: #00999A; + } + &:first-child { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + } + &:last-child { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + } + } + } + .refresh { + position: absolute; + top: 2.5vw; + cursor: pointer; + left: calc(50% + 2vw); + width: 5vw; + color: #707070B2; + background: #E4F4F4; + border: 1px solid #707070B2; + height: 2.2vw; + text-align: center; + font-family: SegoeUISemiBold; + font-size: 0.7vw; + outline: none; + justify-content: center; + display: flex; + align-items: center; + border-radius: 4px; + .icon { + width: 0.8vw; + margin-right: 0.35vw; + } + } + .stats-panels { + position: absolute; + top: 34vw; + left: 47vw; + display: flex; + } + .left-panels { + position: absolute; + top: 10vw; + left: 8vw; + display: flex; + flex-direction: column; + } + .right-panels { + position: absolute; + top: 10vw; + right: 8vw; + display: flex; + flex-direction: column; + } + .left-panels, .right-panels { + .panel { + margin-bottom: 30px; + } + .bottom-panels { + display: flex; + .panel { + margin-right: 2vw; + height: 3.5vw; + width: 7.5vw; + .stat { + font-size: 1.6vw; + font-family: SegoeUISemiLight; + color: #757B88; + } + } + } + } + .panel { + background: white; + padding: 20px; + padding: 1vw; + width: 19vw; + -webkit-box-shadow: 3px 6px 24px -10px rgba(0,0,0,0.75); + -moz-box-shadow: 3px 6px 24px -10px rgba(0,0,0,0.75); + box-shadow: 3px 6px 24px -10px rgba(0,0,0,0.75); + + &.power { + top: 10vw; + left: 10vw; + position: absolute; + } + &.vibrations { + top: 29vw; + left: 6vw; + position: absolute; + } + &.oil { + top: 21vw; + left: 52vw; + position: absolute; + } + &.security { + top: 7vw; + left: 56vw; + width: 15vw; + position: absolute; + } + .graph { + width: 100%; + height: auto; + margin-left: -0.3vw; + margin-bottom: -0.3vw; + &.power-generated, &.vibration, &.oil-temperature { + .e,.f{fill:#777;font-size:10px;font-family:SegoeUISemilight,Segoe UI;font-weight:300;letter-spacing:.02em}.f{fill:#333}.h{opacity:.039} + } + &.wind-speed-farm, &.wind-direction-farm { + .d,.e{fill:#777;font-size:10px;font-family:SegoeUISemilight,Segoe UI;font-weight:300;letter-spacing:.02em}.e{fill:#333}.g{opacity:.039} + } + &.wind-speed-turbine, &.wind-direction-turbine { + .c,.d{fill:#777;font-size:10px;font-family:SegoeUISemilight,Segoe UI;font-weight:300;letter-spacing:.02em}.d{fill:#333}.f{opacity:.039} + } + } + p { + color: #6C7280; + font-family: SegoeUISemiLight; + font-size: 0.8vw; + margin: 0; + &.padded { + padding: 1.5vw 3vw; + text-align: center; + line-height: 1.5; + } + } + &.small { + width: 6vw; + height: 2.4vw; + margin-right: 0.5vw; + h3 { + font-size: 0.8vw; + margin-bottom: 10px; + } + } + .panel-heading { + display: flex; + width: 100%; + justify-content: space-between; + } + h3 { + color: #00999A; + font-size: 1vw; + font-family: SegoeUISemiBold; + margin: 0; + margin-bottom: 5px; + } + .legend { + color: #777777; + font-size: 0.55vw; + font-family: SegoeUISemiLight; + display: flex; + align-items: center; + .ball { + height: 0.3vw; + width: 0.3vw; + border-radius: 50%; + background: #777777; + margin-left: 0.6vw; + margin-right: 0.2vw; + &.actual { + background: #00C3FF; + } + } + } + } + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Alerts/index.js b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Alerts/index.js new file mode 100644 index 00000000..1ed2bbd0 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Alerts/index.js @@ -0,0 +1,211 @@ +import React, { Component } from 'react'; +import SVG from 'react-inlinesvg'; +import './Alerts.scss'; +import TurbineImage from '../../assets/turbine.svg'; +import LinePowerGenerated from '../../assets/line-power-generated.svg'; +import LineOilTemperature from '../../assets/line-oil-temperature.svg'; +import LineVibration from '../../assets/line-vibration.svg'; +import LineWindSpeed from '../../assets/line-wind-speed.svg'; +import LineWindDirection from '../../assets/line-wind-direction.svg'; +import LineSecurityAlert from '../../assets/line-security-alerts.svg'; +import GraphPowerGenerated from '../../assets/graph-power-generated.svg'; +import GraphOilTemperature from '../../assets/graph-oil-temperature.svg'; +import GraphVibration from '../../assets/graph-vibration.svg'; +import GraphWindSpeedFarm from '../../assets/graph-wind-speed-farm.svg'; +import GraphWindDirectionFarm from '../../assets/graph-wind-direction-farm.svg'; +import GraphWindSpeedTurbine from '../../assets/graph-wind-speed-turbine.svg'; +import GraphWindDirectionTurbine from '../../assets/graph-wind-direction-turbine.svg'; +import GraphWindSpeedTurbineV2 from '../../assets/graph-wind-speed-after.svg'; +import GraphWindDirectionTurbineV2 from '../../assets/graph-wind-direction-after.svg'; +import RefreshIcon from '../../assets/icon-refresh.svg'; + +export default class Alerts extends Component { + + state = { + progress: 0, + selectedView: 'progress', + hasRefreshed: false + } + + componentDidMount() { + this.props.onSelect('alerts'); + this.startLoading() + } + + startLoading() { + this.interval = setInterval(() => { + this.setState({ progress: this.state.progress + 1 }, () => { + if (this.state.progress === 100) { + clearInterval(this.interval); + this.setState({ selectedView: 'mechanical', progress: 0 }); + } + }) + }, 30) + } + + onRefresh = () => { + this.setState({ selectedView: 'progress' }, () => { + this.interval = setInterval(() => { + this.setState({ progress: this.state.progress + 1 }, () => { + if (this.state.progress === 100) { + clearInterval(this.interval) + this.setState({ selectedView: 'environmental', progress: 0, hasRefreshed: true }); + } + }) + }, 30) + }) + } + + render() { + const { selectedView, progress, hasRefreshed } = this.state; + return ( +
+ turbine + {selectedView === 'mechanical' && <> + + + + + } + {selectedView === 'environmental' && <> + + + } + {selectedView === 'progress' &&
+

Running Query for Unit 34…

+
+
+
+
} + {selectedView !== 'progress' &&
+ <> +
+ + +
+ + + {selectedView === 'mechanical' &&
+
+
+

Power Generated

+ +
Expected +
Actual +
+
+ +
+
+
+

Vibration

+ +
Expected +
Actual +
+
+ +
+
+
+

Security Alert

+
+

No events visible to current user

+
+
+
+

Oil Temperature

+ +
Expected +
Actual +
+
+ +
+
+
+
+

Fire

+
+

None detected

+
+
+
+

Malfunction

+
+

None detected

+
+
+
+

Part Failure

+
+

None detected

+
+
+
} + {selectedView === 'environmental' &&
+
+
+
+

Wind Speed (farm)

+
+ +
+
+
+

Wind Direction (farm)

+
+ +
+
+
+
+

Temperature

+
+
32°F
+
+
+
+

Humidity

+
+
12%
+
+
+
+
+
+
+

Wind Speed (turbine)

+
+ +
+
+
+

Wind Direction (turbine)

+
+ +
+
+
+
+

Temperature

+
+
32°F
+
+
+
+

Humidity

+
+
12%
+
+
+
+
} +
} +
+ ) + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/Home.scss b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/Home.scss new file mode 100644 index 00000000..4217e3d5 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/Home.scss @@ -0,0 +1,53 @@ +.Home { + height: 100%; + width: 100%; + position: relative; + overflow: hidden; + .turbine-wrap { + position: absolute; + } + .grid { + width: 120%; + position: absolute; + top: 10vw; + left: -20%; + } + .line-issue { + position: absolute; + top: 23vw; + left: 44.2vw; + height: 3vw; + } + .alert { + top: 18vw; + left: 48vw; + width: 13vw; + border: 1px solid #00999A; + position: absolute; + background: white; + padding: 0.8vw; + h3 { + font-size: 0.9vw; + font-family: SegoeUISemiBold; + color: #00999A; + margin: 0; + } + p { + font-size: 0.8vw; + font-family: SegoeUISemiLight; + color: #777777; + } + button { + color: white; + background: #00999A; + border: none; + border-radius: 5px; + width: 60px; + height: 20px; + font-family: SegoeUISemiBold; + font-size: 10px; + outline: none; + cursor: pointer; + } + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/README.md b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/README.md new file mode 100644 index 00000000..a4cec6b3 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/README.md @@ -0,0 +1,8 @@ +# Route folder + +This folder represents a top level route or 'page' in the application. The folder should only directly contain the `index.js` and the style file directly in the folder. + +- Any components should have their own folder and should be located the the sub-folder `components`. +- Any assets should be located in a sub-folder `assets`. + +Sometimes you will find a component or assets needs to be shared between multiple pages. This is when it 'graduates' into the appropriate shared folder in the `ClientApp/src`. \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/PulseRIng/PulseRing.scss b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/PulseRIng/PulseRing.scss new file mode 100644 index 00000000..d3fc9416 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/PulseRIng/PulseRing.scss @@ -0,0 +1,10 @@ +.PulseRing { + position: absolute; + width: 9vw; + top: 26.4vw; + left: 39.7vw; + .f{fill:none}.e{stroke:none} + g { + transition: opacity 0.3s; + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/PulseRIng/index.js b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/PulseRIng/index.js new file mode 100644 index 00000000..d42935de --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/PulseRIng/index.js @@ -0,0 +1,44 @@ +import React, { useState, useEffect } from 'react'; +import './PulseRing.scss'; + +export const PulseRing = () => { + + const [status, setStatus] = useState(0); + + useEffect(() => { + const interval = setInterval(() => { + if (status === 3) { + setStatus(0); + } else { + setStatus(status + 1); + } + }, 300); + return () => { + clearInterval(interval); + } + }) + + return ( + + + + + + + 2 ? 1 : 0 }}> + + + + 1 ? 1 : 0 }}> + + + + 0 ? 1 : 0 }}> + + + + + + + ) +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/README.md b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/README.md new file mode 100644 index 00000000..23b00e88 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/README.md @@ -0,0 +1 @@ +# Page components folder \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/Turbine/Turbine.scss b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/Turbine/Turbine.scss new file mode 100644 index 00000000..f35e368e --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/Turbine/Turbine.scss @@ -0,0 +1,33 @@ +.Turbine { + position: relative; + width: 8vw; + height: fit-content; + .top { + position: absolute; + left: 0.4vw; + width: 8vw; + height: 8vw; + top: 1vw; + .a{fill:#e6e6e6;stroke:#000;stroke-miterlimit:10;stroke-width:.25px} + } + .base { + position: absolute; + left: 3.5vw; + top: 4vw; + height: 10vw; + .a{fill:#e6e6e6;stroke:#000;stroke-miterlimit:10;stroke-width:.25px} + + @media screen and (min-width: 1200px) { + left: 3.65vw; + } + @media screen and (min-width: 1500px) { + left: 3.80vw; + } + @media screen and (min-width: 1600px) { + left: 3.90vw; + } + @media screen and (min-width: 1800px) { + left: 4vw; + } + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/Turbine/index.js b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/Turbine/index.js new file mode 100644 index 00000000..8deffc12 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/Turbine/index.js @@ -0,0 +1,52 @@ +import React, { Component } from 'react' +import './Turbine.scss'; + +export default class Turbine extends Component { + + state = { + rotationDegrees: 0, + slowRotationDegrees: 0 + } + + componentDidMount() { + this.interval = setInterval(() => { + this.setState({ + rotationDegrees: this.state.rotationDegrees === 360 ? 10 : this.state.rotationDegrees + 10, + slowRotationDegrees: this.state.slowRotationDegrees === 360 ? 5 : this.state.slowRotationDegrees + 5, + }) + }, 3000/36); + } + + render() { + const { rotationDegrees, slowRotationDegrees } = this.state; + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ ) + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/index.js b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/index.js new file mode 100644 index 00000000..4f0a8e3a --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/index.js @@ -0,0 +1,202 @@ +// node_modules +import React, { Component } from 'react'; +import './Home.scss'; +import { Link } from 'react-router-dom'; +import Turbine from './components/Turbine'; +import Grid from '../../assets/grid.svg'; +import Line from '../../assets/line-issue.svg'; +import { PulseRing } from './components/PulseRIng'; + +const turbinesData = [ + { + left: '14.15', + top: '6.25', + scale: 0.45 + }, + { + left: '24.65', + top: '7', + scale: 0.45 + }, + { + left: '34.3', + top: '7.7', + scale: 0.45 + }, + { + left: '45.35', + top: '8.5', + scale: 0.45 + }, + { + left: '59.2', + top: '9.5', + scale: 0.45 + }, + { + left: '70', + top: '10.2', + scale: 0.45 + }, + { + left: '77.55', + top: '10.8', + scale: 0.45 + }, + { + left: '2.25', + top: '6.2', + scale: 0.6 + }, + { + left: '13.65', + top: '7.3', + scale: 0.6 + }, + { + left: '24', + top: '8.4', + scale: 0.6 + }, + { + left: '37.3', + top: '9.65', + scale: 0.6 + }, + { + left: '53.3', + top: '11.3', + scale: 0.6 + }, + { + left: '66.9', + top: '12.6', + scale: 0.6 + }, + { + left: '76.5', + top: '13.6', + scale: 0.6 + }, + { + left: '0.5', + top: '7.9', + scale: 0.75 + }, + { + left: '12.5', + top: '9.3', + scale: 0.75 + }, + { + left: '27.9', + top: '11.2', + scale: 0.75 + }, + { + left: '46.9', + top: '13.6', + scale: 0.75 + }, + { + left: '63.35', + top: '15.6', + scale: 0.75 + }, + { + left: '75.45', + top: '17.2', + scale: 0.75 + }, + { + left: '0.15', + top: '9.9', + scale: 0.95 + }, + { + left: '17.65', + top: '12.5', + scale: 0.95 + }, + { + left: '39.6', + top: '15.7', + scale: 0.95, + canSlowDown: true + }, + { + left: '59.3', + top: '18.5', + scale: 0.95 + }, + { + left: '74.1', + top: '20.5', + scale: 0.95 + }, + { + left: '2.85', + top: '14.9', + scale: 1.20 + }, + { + left: '28.8', + top: '19.6', + scale: 1.20 + }, + { + left: '53.1', + top: '24.1', + scale: 1.20 + }, + { + left: '72.25', + top: '27.5', + scale: 1.20 + }, + { + left: '10.7', + top: '24.5', + scale: 1.7 + }, + { + left: '42.4', + top: '32.7', + scale: 1.7 + }, + { + left: '68.4', + top: '40.7', + scale: 1.7 + } +] + +export class Home extends Component { + + componentDidMount() { + this.props.onSelect('dashboard'); + } + + render() { + return ( +
+ {this.props.showAlert && } + grid + {turbinesData.map((t, i) => +
+ +
+ )} + {this.props.showAlert && + <> + +
+

Issue Detected

+

Unit 34 is experiencing an issue…

+ +
+ } +
+ ) + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/README.md b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/README.md new file mode 100644 index 00000000..88791be2 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/README.md @@ -0,0 +1 @@ +# Pages Folder \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/styles/global.scss b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/styles/global.scss new file mode 100644 index 00000000..680fc1e0 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/styles/global.scss @@ -0,0 +1,84 @@ +/* + Global Styles + + This file should only be used for site wide styles. If the style is specific to a component then it + should be in a file next to the component +*/ +@font-face { + font-family: SegoeUI; + src: local('Segoe UI'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.woff2) + format('woff2'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.woff) + format('woff'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.ttf) + format('truetype'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.svg#web) + format('svg'); + font-weight: 400; +} + +@font-face { + font-family: SegoeUILight; + src: local('Segoe UI Light'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.woff2) + format('woff2'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.woff) + format('woff'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.ttf) + format('truetype'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.svg#web) + format('svg'); + font-weight: 100; +} + +@font-face { + font-family: SegoeUISemilight; + src: local('Segoe UI Semilight'), local('Segoe UI'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.woff2) + format('woff2'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.woff) + format('woff'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.ttf) + format('truetype'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.svg#web) + format('svg'); + font-weight: 200; +} + +@font-face { + font-family: SegoeUISemibold; + src: local('Segoe UI Semibold'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.woff2) + format('woff2'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.woff) + format('woff'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.ttf) + format('truetype'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.svg#web) + format('svg'); + font-weight: 600; +} + +@font-face { + font-family: SegoeUIBold; + src: local('Segoe UI Bold'), local('Segoe UI'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.woff2) + format('woff2'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.woff) + format('woff'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.ttf) + format('truetype'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.svg#web) + format('svg'); + font-weight: 700; +} + +@import url('https://fonts.googleapis.com/css2?family=Audiowide&display=swap'); + +@import url('https://fonts.googleapis.com/css2?family=Cousine&display=swap'); + + +body { + font-family: SegoeUI; +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Controllers/DeviceController.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Controllers/DeviceController.cs new file mode 100644 index 00000000..f2c121b0 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Controllers/DeviceController.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using SqlDbEdgeDemo.Web.Models; +using SqlDbEdgeDemo.Web.Services.Interfaces; + +namespace SqlDbEdgeDemo.Web.Controllers +{ + [Route("api/[controller]")] + public class DeviceController : Controller + { + private static IIoTHubModuleTwinService _ioTHubModuleTwinService; + + public DeviceController(IIoTHubModuleTwinService ioTHubModuleTwinService) + { + _ioTHubModuleTwinService = ioTHubModuleTwinService; + } + + [HttpGet] + public ActionResult GetStatus() + { + return Ok(_ioTHubModuleTwinService.GetTwinDeviceStatus()); + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Models/DeviceModel.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Models/DeviceModel.cs new file mode 100644 index 00000000..fda35f32 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Models/DeviceModel.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SqlDbEdgeDemo.Web.Models +{ + public class DeviceModel + { + public bool Alert { get; set; } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Models/IoTHubModuleTwinProperties.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Models/IoTHubModuleTwinProperties.cs new file mode 100644 index 00000000..4f0061f3 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Models/IoTHubModuleTwinProperties.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SqlDbEdgeDemo.Web.Models +{ + public class IoTHubModuleTwinReportedProperty + { + public string Alert { get; set; } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Options/IoTHubOptions.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Options/IoTHubOptions.cs new file mode 100644 index 00000000..ba8cd99e --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Options/IoTHubOptions.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SqlDbEdgeDemo.Web.Options +{ + public class IoTHubOptions + { + public string ModuleConnectionString { get; set; } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Pages/Error.cshtml b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Pages/Error.cshtml new file mode 100644 index 00000000..6f92b956 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Pages/Error.cshtml @@ -0,0 +1,26 @@ +@page +@model ErrorModel +@{ + ViewData["Title"] = "Error"; +} + +

Error.

+

An error occurred while processing your request.

+ +@if (Model.ShowRequestId) +{ +

+ Request ID: @Model.RequestId +

+} + +

Development Mode

+

+ Swapping to the Development environment displays detailed information about the error that occurred. +

+

+ The Development environment shouldn't be enabled for deployed applications. + It can result in displaying sensitive information from exceptions to end users. + For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development + and restarting the app. +

diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Pages/Error.cshtml.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Pages/Error.cshtml.cs new file mode 100644 index 00000000..1c0ad38a --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Pages/Error.cshtml.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace SqlDbEdgeDemo.Web.Pages +{ + [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] + public class ErrorModel : PageModel + { + public string RequestId { get; set; } + + public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + public void OnGet() + { + RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Pages/_ViewImports.cshtml b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Pages/_ViewImports.cshtml new file mode 100644 index 00000000..dd20a6d1 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Pages/_ViewImports.cshtml @@ -0,0 +1,3 @@ +@using SqlDbEdgeDemo.Web +@namespace SqlDbEdgeDemo.Web.Pages +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Program.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Program.cs new file mode 100644 index 00000000..f53152c3 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Program.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; + +namespace SqlDbEdgeDemo.Web +{ + public class Program + { + public static void Main(string[] args) + { + CreateWebHostBuilder(args).Build().Run(); + } + + public static IWebHostBuilder CreateWebHostBuilder(string[] args) => + WebHost.CreateDefaultBuilder(args) + .UseStartup(); + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Services/Interfaces/IIoTHubModuleTwinService.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Services/Interfaces/IIoTHubModuleTwinService.cs new file mode 100644 index 00000000..69126973 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Services/Interfaces/IIoTHubModuleTwinService.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using SqlDbEdgeDemo.Web.Models; + +namespace SqlDbEdgeDemo.Web.Services.Interfaces +{ + public interface IIoTHubModuleTwinService + { + DeviceModel GetTwinDeviceStatus(); + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Services/IoTHubModuleTwinService.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Services/IoTHubModuleTwinService.cs new file mode 100644 index 00000000..ca87e2e3 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Services/IoTHubModuleTwinService.cs @@ -0,0 +1,49 @@ +using System; +using Microsoft.Azure.Devices.Client; +using Newtonsoft.Json; +using SqlDbEdgeDemo.Web.Models; +using SqlDbEdgeDemo.Web.Options; +using SqlDbEdgeDemo.Web.Services.Interfaces; + +namespace SqlDbEdgeDemo.Web.Services +{ + public class IoTHubModuleTwinService : IIoTHubModuleTwinService + { + private static IoTHubOptions _options; + private static ModuleClient Client = null; + + public IoTHubModuleTwinService(IoTHubOptions options) + { + _options = options; + } + + public DeviceModel GetTwinDeviceStatus() + { + Connect(); + var twinTask = Client.GetTwinAsync(); + twinTask.Wait(); + var twin = twinTask.Result; + var properties = JsonConvert.DeserializeObject(twin.Properties.Reported.ToJson()); + return new DeviceModel + { + Alert = string.Equals(properties.Alert, "start", StringComparison.OrdinalIgnoreCase) + }; + } + + private void Connect() + { + if (Client == null) + { + try + { + Client = ModuleClient.CreateFromConnectionString(_options.ModuleConnectionString, TransportType.Amqp); + } + catch (Exception e) + { + Client = null; // Set to null for reconection + throw e; + } + } + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/SqlDbEdgeDemo.Web.csproj b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/SqlDbEdgeDemo.Web.csproj new file mode 100644 index 00000000..4ea9913b --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/SqlDbEdgeDemo.Web.csproj @@ -0,0 +1,50 @@ + + + + netcoreapp2.2 + true + Latest + false + ClientApp\ + $(DefaultItemExcludes);$(SpaRoot)node_modules\** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %(DistFiles.Identity) + PreserveNewest + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Startup.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Startup.cs new file mode 100644 index 00000000..97e9c078 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Startup.cs @@ -0,0 +1,75 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.HttpsPolicy; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.SpaServices.ReactDevelopmentServer; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using SqlDbEdgeDemo.Web.Options; +using SqlDbEdgeDemo.Web.Services; +using SqlDbEdgeDemo.Web.Services.Interfaces; + +namespace SqlDbEdgeDemo.Web +{ + public class Startup + { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + var ioTHubOptions = Configuration.GetSection("IoTHub").Get(); + services.AddSingleton(sp => ioTHubOptions); + services.AddSingleton(sp => new IoTHubModuleTwinService(ioTHubOptions)); + + services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); + + // In production, the React files will be served from this directory + services.AddSpaStaticFiles(configuration => + { + configuration.RootPath = "ClientApp/build"; + }); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IHostingEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + else + { + app.UseExceptionHandler("/Error"); + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); + } + + app.UseHttpsRedirection(); + app.UseStaticFiles(); + app.UseSpaStaticFiles(); + + app.UseMvc(routes => + { + routes.MapRoute( + name: "default", + template: "{controller}/{action=Index}/{id?}"); + }); + + app.UseSpa(spa => + { + spa.Options.SourcePath = "ClientApp"; + + if (env.IsDevelopment()) + { + spa.UseReactDevelopmentServer(npmScript: "start"); + } + }); + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/appsettings.Development.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/appsettings.Development.json new file mode 100644 index 00000000..e203e940 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/appsettings.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/appsettings.json new file mode 100644 index 00000000..1c5b6ef9 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/appsettings.json @@ -0,0 +1,11 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Warning" + } + }, + "IoTHub": { + "ModuleConnectionString": "" + }, + "AllowedHosts": "*" +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.sln b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.sln new file mode 100644 index 00000000..56161789 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.sln @@ -0,0 +1,34 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26124.0 +MinimumVisualStudioVersion = 15.0.26124.0 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDbEdgeDemo.Web", "SqlDbEdgeDemo.Web\SqlDbEdgeDemo.Web.csproj", "{CAC06327-8684-4D14-A31F-AF4D995FBB38}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Debug|x64.ActiveCfg = Debug|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Debug|x64.Build.0 = Debug|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Debug|x86.ActiveCfg = Debug|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Debug|x86.Build.0 = Debug|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Release|Any CPU.Build.0 = Release|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Release|x64.ActiveCfg = Release|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Release|x64.Build.0 = Release|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Release|x86.ActiveCfg = Release|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/samples/demos/azure-sql-edge-demos/readme.md b/samples/demos/azure-sql-edge-demos/readme.md new file mode 100644 index 00000000..c6e6cb06 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/readme.md @@ -0,0 +1,2 @@ +# Azure SQL Demos + diff --git a/samples/features/azure-arc/deployment/kubeadm/ubuntu-single-node-vm/setup-controller-new.sh b/samples/features/azure-arc/deployment/kubeadm/ubuntu-single-node-vm/setup-controller-new.sh index 5ec006a4..896e6ddb 100644 --- a/samples/features/azure-arc/deployment/kubeadm/ubuntu-single-node-vm/setup-controller-new.sh +++ b/samples/features/azure-arc/deployment/kubeadm/ubuntu-single-node-vm/setup-controller-new.sh @@ -41,7 +41,7 @@ fi if [ -z "$ARC_DC_REGION" ] then - read -p "Enter a region for the new Azure Arc Data Controller (eastus, eastus2, centralus, westus2, westeurope or southeastasia): " dc_region + read -p "Enter a region for the new Azure Arc Data Controller (eastus, eastus2, centralus, westus2, westeurope, southeastasia, japaneast, australiaeast, koreacentral, northeurope, uksouth, or francecentral): " dc_region echo export ARC_DC_REGION=$dc_region fi @@ -80,7 +80,7 @@ export DEBIAN_FRONTEND=noninteractive # Requirements file. export OSCODENAME=$(lsb_release -cs) -export AZDATA_PRIVATE_PREVIEW_DEB_PACKAGE="https://aka.ms/jul-2020-arc-azdata-$OSCODENAME" +export AZDATA_PRIVATE_PREVIEW_DEB_PACKAGE="https://aka.ms/aug-2020-arc-azdata-$OSCODENAME" # Kube version. # diff --git a/samples/features/epm-framework/sample-policies/Asymmetric Key Encryption Algorithm.xml b/samples/features/epm-framework/sample-policies/Asymmetric Key Encryption Algorithm.xml new file mode 100644 index 00000000..6d5429f9 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Asymmetric Key Encryption Algorithm.xml @@ -0,0 +1,352 @@ + + + + +<_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Asymmetric Key Encryption Algorithm + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/RSA 1024 or RSA 2048 Encrypted + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + Asymmetric Key Encryption Algorithm + Checks whether asymmetric keys were created with 1024-bit or better. + RSA 1024 or RSA 2048 Encrypted + Asymmetric Key Encryption Algorithm_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116370 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet/TargetSet/Server_/Database_/AsymmetricKey + + + + + + /PolicyStore + + + Asymmetric Key Encryption Algorithm_ObjectSet + AsymmetricKey + + + + + + + /PolicyStore/Condition/RSA 1024 or RSA 2048 Encrypted + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>KeyEncryptionAlgorithm</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.AsymmetricKeyEncryptionAlgorithm</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Rsa1024</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>KeyEncryptionAlgorithm</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.AsymmetricKeyEncryptionAlgorithm</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Rsa2048</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> +</Operator> + RSA 1024 or RSA 2048 Encrypted + Confirms that asymmetric keys were created with 1024-bit encryption or better. + AsymmetricKey + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> +</Operator> + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet/TargetSet/Server_/Database_/AsymmetricKey + + + + + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet/TargetSet/Server_/Database_/AsymmetricKey/TargetSetLevel/Server_/Database_/AsymmetricKey + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet/TargetSet/Server_/Database_/AsymmetricKey/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet + + + Server/Database/AsymmetricKey + true + + + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet/TargetSet/Server_/Database_/AsymmetricKey/TargetSetLevel/Server_/Database_/AsymmetricKey + + + + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet/TargetSet/Server_/Database_/AsymmetricKey + + + Server/Database/AsymmetricKey + AsymmetricKey + + + + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet/TargetSet/Server_/Database_/AsymmetricKey/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet/TargetSet/Server_/Database_/AsymmetricKey + + + Server/Database + Database + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Backup and Data File Location.xml b/samples/features/epm-framework/sample-policies/Backup and Data File Location.xml new file mode 100644 index 00000000..5a5257f0 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Backup and Data File Location.xml @@ -0,0 +1,251 @@ + + + + +<_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Backup and Data File Location + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Data and Backup on Separate Drive + + + + + /PolicyStore/ObjectSet/Backup and Data File Location__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + Backup and Data File Location + Checks if database and the backups are on separate backup devices. If they are on the same backup device, and the device that contains the database fails, your backups will be unavailable. Also, putting the data and backups on separate devices optimizes the I/O performance for both the production use of the database and writing the backups.<?char 13?> +<?char 13?> +Note: This policy cannot detect separate physical devices through mount points. + Data and Backup on Separate Drive + Backup and Data File Location_ObjectSet + Microsoft Best Practices: Maintenance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116373 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Backup and Data File Location__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Backup and Data File Location__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Backup and Data File Location_ObjectSet + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/Condition/Data and Backup on Separate Drive + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>DataAndBackupOnSeparateLogicalVolumes</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> +</Operator> + Data and Backup on Separate Drive + Confirms that the database and the database backups are on separate drives. + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Maintenance + + + + + + + /PolicyStore/ObjectSet/Backup and Data File Location__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Backup and Data File Location__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Backup and Data File Location__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/ObjectSet/Backup and Data File Location__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Backup and Data File Location__ObjectSet/TargetSet/Server_/Database + + + Server/Database + Database + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Data and Log File Location.xml b/samples/features/epm-framework/sample-policies/Data and Log File Location.xml new file mode 100644 index 00000000..8bcc7fba --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Data and Log File Location.xml @@ -0,0 +1,405 @@ + + + + +<_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Data and Log File Location + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Data and Log Files on Separate Drives + + + + + /PolicyStore/ObjectSet/Data and Log File Location__ObjectSet + + + + + /PolicyStore/Condition/Enterprise or Standard Edition + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + Data and Log File Location + Checks whether data and log files are placed on separate logical drives. Placing both data and log files on the same drive can cause contention for that drive and result in poor performance. Placing the files on separate drives allows the I/O activity to occur at the same time for both the data and log files. The best practice is to specify separate drives for the data and log when you create a new database. To move files after the database is created, the database must be taken offline. Move the files by using one of the following methods:<?char 13?> +<?char 13?> +* Restore the database from backup by using the RESTORE DATABASE statement with the WITH MOVE option. <?char 13?> +* Detach and then re-attach the database specifying separate locations for the data and log devices. <?char 13?> +* Specify a new location by running the ALTER DATABASE statement with the MODIFY FILE option, and then restarting the instance of SQL Server. <?char 13?> +<?char 13?> +Note: This policy cannot detect separate physical devices through mount points. + Data and Log Files on Separate Drives + Data and Log File Location_ObjectSet + Enterprise or Standard Edition + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116362 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Data and Log File Location__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Data and Log File Location__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Data and Log File Location_ObjectSet + IDatabasePerformanceFacet + + + + + + + /PolicyStore/Condition/Data and Log Files on Separate Drives + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>DataAndLogFilesOnSeparateLogicalVolumes</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>LT</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>Size</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>5120</Value><?char 13?> + </Constant><?char 13?> + </Operator><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>NE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>Status</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.DatabaseStatus</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Normal</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>IsSystemObject</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> +</Operator> + Data and Log Files on Separate Drives + Confirms that data and log files are placed on separate drives. + IDatabasePerformanceFacet + + + + + + + /PolicyStore/Condition/Enterprise or Standard Edition + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EngineEdition</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.Edition</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Standard</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EngineEdition</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.Edition</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>EnterpriseOrDeveloper</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> +</Operator> + Enterprise or Standard Edition + Confirms that the instance of SQL Server is either Enterprise or Standard Edition. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/Data and Log File Location__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Data and Log File Location__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Data and Log File Location__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/ObjectSet/Data and Log File Location__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Data and Log File Location__ObjectSet/TargetSet/Server_/Database + + + Server/Database + Database + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Database Auto Close.xml b/samples/features/epm-framework/sample-policies/Database Auto Close.xml new file mode 100644 index 00000000..a1999799 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Database Auto Close.xml @@ -0,0 +1,330 @@ + + + + +<_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Database Auto Close + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Auto Close Disabled + + + + + /PolicyStore/ObjectSet/Database Auto Close__ObjectSet + + + + + /PolicyStore/Condition/Enterprise or Standard Edition + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + Database Auto Close + Checks that the AUTO_ CLOSE option is off for SQL Server Standard and Enterprise Editions. When set to on, this option can cause performance degradation on frequently accessed databases because of the increased overhead of opening and closing the database after each connection. AUTO_CLOSE also flushes the procedure cache after each connection. + Auto Close Disabled + Database Auto Close_ObjectSet + Enterprise or Standard Edition + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116338 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Database Auto Close__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Database Auto Close__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Database Auto Close_ObjectSet + IDatabasePerformanceFacet + + + + + + + /PolicyStore/Condition/Auto Close Disabled + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>AutoClose</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> +</Operator> + Auto Close Disabled + Confirms that the AUTO_CLOSE database option is set to off. + IDatabasePerformanceFacet + + + + + + + /PolicyStore/Condition/Enterprise or Standard Edition + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EngineEdition</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.Edition</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Standard</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EngineEdition</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.Edition</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>EnterpriseOrDeveloper</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> +</Operator> + Enterprise or Standard Edition + Confirms that the instance of SQL Server is either Enterprise or Standard Edition. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/Database Auto Close__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Database Auto Close__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Database Auto Close__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/ObjectSet/Database Auto Close__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Database Auto Close__ObjectSet/TargetSet/Server_/Database + + + Server/Database + Database + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Database Auto Shrink.xml b/samples/features/epm-framework/sample-policies/Database Auto Shrink.xml new file mode 100644 index 00000000..00272a06 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Database Auto Shrink.xml @@ -0,0 +1,400 @@ + + + + +<_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Database Auto Shrink + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Auto Shrink Disabled + + + + + /PolicyStore/ObjectSet/Database Auto Shrink__ObjectSet + + + + + /PolicyStore/Condition/Enterprise or Standard Edition + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + Database Auto Shrink + Checks that the AUTO_SHRINK option is off for user databases on SQL Server Standard and Enterprise Editions. Frequently shrinking and expanding a database can lead to poor performance because of physical fragmentation. Set the AUTO_SHRINK database option to OFF. If you know that the space that you are reclaiming will not be needed in the future, you can manually shrink the database. + Auto Shrink Disabled + Database Auto Shrink_ObjectSet + Enterprise or Standard Edition + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116337 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Database Auto Shrink__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Database Auto Shrink__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Database Auto Shrink_ObjectSet + IDatabasePerformanceFacet + + + + + + + /PolicyStore/Condition/Auto Shrink Disabled + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>AutoShrink</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> +</Operator> + Auto Shrink Disabled + Confirms that the AUTO_SHRINK database option is set to off. + IDatabasePerformanceFacet + + + + + + + /PolicyStore/Condition/Enterprise or Standard Edition + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EngineEdition</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.Edition</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Standard</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EngineEdition</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.Edition</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>EnterpriseOrDeveloper</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> +</Operator> + Enterprise or Standard Edition + Confirms that the instance of SQL Server is either Enterprise or Standard Edition. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/Database Auto Shrink__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Database Auto Shrink__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Database Auto Shrink__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/Condition/Online User Database + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>AND</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Unsupported</TypeClass><?char 13?> + <Name>IsSystemObject</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Unsupported</TypeClass><?char 13?> + <Name>Status</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.DatabaseStatus</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Normal</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> +</Operator> + Online User Database + Confirms that the database is not a system database and that it is online. + Database + + + + + + + /PolicyStore/ObjectSet/Database Auto Shrink__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Database Auto Shrink__ObjectSet/TargetSet/Server_/Database + + + + + /PolicyStore/Condition/Online User Database + + + Server/Database + Database + Online User Database + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Database Collation.xml b/samples/features/epm-framework/sample-policies/Database Collation.xml new file mode 100644 index 00000000..0e75cb3d --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Database Collation.xml @@ -0,0 +1,252 @@ + + + + +<_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Database Collation + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Collation Matches master or model + + + + + /PolicyStore/ObjectSet/Database Collation__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + Database Collation + Looks for user-defined databases that have a collation different from the master or model databases. It is recommended that you not use this configuration because collation conflicts can occur that might prevent code from executing. For example, when a stored procedure joins one table to a temporary table, SQL Server might end the batch and return a collation conflict error if the collations of the user-defined database and the model database are different. This happens because temporary tables are created in tempdb, which obtains its collation based on that of the model database. If you experience collation conflict errors, consider one of the following solutions:<?char 13?> + * Export the data from the user database and import it into new tables that have the same collation as the master and model databases.<?char 13?> + * Rebuild the system databases to use a collation that matches the user database collation.<?char 13?> + * Modify any stored procedures that join user tables to tables in tempdb to create the tables in tempdb by using the collation of the user database. To do this, add the COLLATE database_default clause to the column definitions of the temporary table. For example: CREATE TABLE #temp1 ( c1 int, c2 varchar(30) COLLATE database_default ) + Collation Matches master or model + Database Collation_ObjectSet + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116336 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Database Collation__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Database Collation__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Database Collation_ObjectSet + IDatabasePerformanceFacet + + + + + + + /PolicyStore/Condition/Collation Matches master or model + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>CollationMatchesModelOrMaster</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> +</Operator> + Collation Matches master or model + Confirms that the collation of the database matches the master or model databases. + IDatabasePerformanceFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/Database Collation__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Database Collation__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Database Collation__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/ObjectSet/Database Collation__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Database Collation__ObjectSet/TargetSet/Server_/Database + + + Server/Database + Database + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Database Page Status.xml b/samples/features/epm-framework/sample-policies/Database Page Status.xml new file mode 100644 index 00000000..00668955 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Database Page Status.xml @@ -0,0 +1,306 @@ + + + + +<_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Database Page Status + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/No Suspect Database Pages + + + + + /PolicyStore/ObjectSet/Database Page Status__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + Database Page Status + Checks whether the database has suspect database pages. A database page is set suspect by error 824. This error occurs when a logical consistency error is detected during a read operation, which frequently indicates data corruption caused by a faulty I/O subsystem component. When the SQL Server Database Engine detects a suspect page, the page ID is recorded in the msdbo.dbo.suspect_pages table. This is a severe error condition that threatens database integrity and must be corrected immediately.<?char 13?> +<?char 13?> +Best Practices Recommendations:<?char 13?> +* Review the SQL Server error log for the details of the 824 error for this database.<?char 13?> +* Complete a full database consistency check (DBCC CHECKDB).<?char 13?> +* Implement the user actions defined in MSSQLSERVER_824.<?char 13?> + + No Suspect Database Pages + Database Page Status_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Maintenance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116379 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Database Page Status__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Database Page Status__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Database Page Status_ObjectSet + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/Condition/No Suspect Database Pages + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteSql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>SELECT COUNT(*) AS [Total_Suspect_Pages] FROM msdb.dbo.suspect_pages WHERE event_type IN (1,2,3) AND database_id = DB_ID(DB_NAME()) </Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> +</Operator> + No Suspect Database Pages + Confirms that the current database has no suspect database pages. A database page is set as suspect by error 824, which indicates that a logical consistency error was detected during a read operation. + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> +</Operator> + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Maintenance + + + + + + + /PolicyStore/ObjectSet/Database Page Status__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Database Page Status__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Database Page Status__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/ObjectSet/Database Page Status__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Database Page Status__ObjectSet/TargetSet/Server_/Database + + + Server/Database + Database + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Database Page Verification.xml b/samples/features/epm-framework/sample-policies/Database Page Verification.xml new file mode 100644 index 00000000..c7f0cdae --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Database Page Verification.xml @@ -0,0 +1,250 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Database Page Verification + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Page Verify Checksum + + + + + /PolicyStore/ObjectSet/Database Page Verification__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + Database Page Verification + Checks if the PAGE_VERIFY database option is not set to CHECKSUM to provide a high level of data-file integrity. When CHECKSUM is enabled for the PAGE_VERIFY database option, the SQL Server Database Engine calculates a checksum over the contents of the whole page, and stores the value in the page header when a page is written to disk. When the page is read from disk, the checksum is recomputed and compared to the checksum value that is stored in the page header. This helps provide a high level of data-file integrity. + Page Verify Checksum + Database Page Verification_ObjectSet + Microsoft Best Practices: Maintenance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116333 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Database Page Verification__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Database Page Verification__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Database Page Verification_ObjectSet + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/Condition/Page Verify Checksum + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>PageVerify</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>Microsoft.SqlServer.Management.Smo.PageVerify</ObjType><?char 13?> + <Value>Checksum</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Page Verify Checksum + Confirms that the PAGE_VERIFY database option set to CHECKSUM. + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Maintenance + + + + + + + /PolicyStore/ObjectSet/Database Page Verification__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Database Page Verification__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Database Page Verification__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/ObjectSet/Database Page Verification__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Database Page Verification__ObjectSet/TargetSet/Server_/Database + + + Server/Database + Database + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Guest Permissions.xml b/samples/features/epm-framework/sample-policies/Guest Permissions.xml new file mode 100644 index 00000000..b9785f37 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Guest Permissions.xml @@ -0,0 +1,404 @@ + + + + +<_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Guest Permissions + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Has No Database Access + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + Guest Permissions + Checks if permission to access the database is enabled for guest user. Remove access to the guest user if it is not required. The guest user cannot be dropped, but a guest user account can be disabled by revoking its CONNECT permission. You do this by executing REVOKE CONNECT FROM GUEST from within any database other than master, msdb, or tempdb. + Has No Database Access + Guest Permissions_ObjectSet + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116354 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet/TargetSet/Server_/Database_/User + + + + + + /PolicyStore + + + Guest Permissions_ObjectSet + User + + + + + + + /PolicyStore/Condition/Has No Database Access + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Unsupported</TypeClass><?char 13?> + <Name>HasDBAccess</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> +</Operator> + Has No Database Access + Confirms that the database user does not have access to the database. + User + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet/TargetSet/Server_/Database_/User + + + + + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet/TargetSet/Server_/Database_/User/TargetSetLevel/Server_/Database_/User + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet/TargetSet/Server_/Database_/User/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet + + + Server/Database/User + true + + + + + + + /PolicyStore/Condition/Guest + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Unsupported</TypeClass><?char 13?> + <Name>Name</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>guest</Value><?char 13?> + </Constant><?char 13?> +</Operator> + Guest + The user is the Guest account. + User + + + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet/TargetSet/Server_/Database_/User/TargetSetLevel/Server_/Database_/User + + + + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet/TargetSet/Server_/Database_/User + + + + + /PolicyStore/Condition/Guest + + + Server/Database/User + User + Guest + + + + + + + /PolicyStore/Condition/User or Model + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>AND</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Group><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Count>1</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>IsSystemObject</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <Name>Name</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>model</Value><?char 13?> + </Constant><?char 13?> + </Operator><?char 13?> + </Operator><?char 13?> + </Group><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Unsupported</TypeClass><?char 13?> + <Name>Status</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.DatabaseStatus</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Normal</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> +</Operator> + User or Model + Confirms that the database is a user database or the Model database and that the database is online. + Database + + + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet/TargetSet/Server_/Database_/User/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet/TargetSet/Server_/Database_/User + + + + + /PolicyStore/Condition/User or Model + + + Server/Database + Database + User or Model + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Last Successful Backup Date.xml b/samples/features/epm-framework/sample-policies/Last Successful Backup Date.xml new file mode 100644 index 00000000..6b684c7d --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Last Successful Backup Date.xml @@ -0,0 +1,273 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Last Successful Backup Date + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Safe Last Backup Date + + + + + /PolicyStore/ObjectSet/Last Successful Backup Date__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + Last Successful Backup Date + + Checks whether a database has recent backups. Scheduling regular backups is important for protecting your databases against data loss from a variety of failures.<?char 13?> + <?char 13?> + The appropriate frequency for backing up data depends on the recovery model of the database, on business requirements regarding potential data loss, and on how frequently the database is updated. In a frequently updated database, the amount of work-loss exposure increases relatively quickly between backups.<?char 13?> + <?char 13?> + The best practice is to perform backups frequently enough to protect databases against data loss. The simple recovery model and full recovery model both require data backups. The full recovery model also requires log backups, which should be taken more often than data backups. For either recovery model, you can supplement your full backups with differential backups to efficiently reduce the risk of data loss. For a database that uses the full recovery model, Microsoft recommends that you take frequent log backups. For a production database that contains critical data, log backups would typically be taken every one to fifteen minutes. Note: The recommended method for scheduling backups is a database maintenance plan. <?char 13?> + + Safe Last Backup Date + Last Successful Backup Date_ObjectSet + Microsoft Best Practices: Maintenance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116361 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Last Successful Backup Date__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Last Successful Backup Date__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Last Successful Backup Date_ObjectSet + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/Condition/Safe Last Backup Date + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>DateTime</TypeClass><?char 13?> + <Name>LastBackupDate</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>DateTime</TypeClass><?char 13?> + <FunctionType>DateAdd</FunctionType><?char 13?> + <ReturnType>DateTime</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>day</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>-1</Value><?char 13?> + </Constant><?char 13?> + <Function><?char 13?> + <TypeClass>DateTime</TypeClass><?char 13?> + <FunctionType>GetDate</FunctionType><?char 13?> + <ReturnType>DateTime</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Function><?char 13?> + </Operator> + + Safe Last Backup Date + Confirms that the database was backed up within the last day. + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Maintenance + + + + + + + /PolicyStore/ObjectSet/Last Successful Backup Date__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Last Successful Backup Date__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Last Successful Backup Date__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/ObjectSet/Last Successful Backup Date__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Last Successful Backup Date__ObjectSet/TargetSet/Server_/Database + + + Server/Database + Database + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Public Not Granted Server Permissions.xml b/samples/features/epm-framework/sample-policies/Public Not Granted Server Permissions.xml new file mode 100644 index 00000000..20de5622 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Public Not Granted Server Permissions.xml @@ -0,0 +1,217 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Public Not Granted Server Permissions + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Public Server Role Has No Granted Permissions + + + + + /PolicyStore/ObjectSet/Public Not Granted Server Permissions__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + Public Not Granted Server Permissions + Checks that the server permission is not granted to the Public role. + Public Server Role Has No Granted Permissions + Public Not Granted Server Permissions_ObjectSet + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116364 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Public Not Granted Server Permissions__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Public Not Granted Server Permissions__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Public Not Granted Server Permissions_ObjectSet + IServerSecurityFacet + + + + + + + /PolicyStore/Condition/Public Server Role Has No Granted Permissions + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>PublicServerRoleIsGrantedPermissions</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator> + + Public Server Role Has No Granted Permissions + Confirms that the Server permission is not granted to the Public role. + IServerSecurityFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/Public Not Granted Server Permissions__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Public Not Granted Server Permissions__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/README.md b/samples/features/epm-framework/sample-policies/README.md new file mode 100644 index 00000000..56ceb8c9 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/README.md @@ -0,0 +1,3 @@ +# Policy-Based Management Sample Policies + +A set of sample policies is provided, which can be imported for use as rules to be evaluated against the database engine. For more about the best practice rules behind these samples and how to import a policy-based management policy, please see [Policy-Based Management on Microsoft Docs](https://docs.microsoft.com/sql/relational-databases/policy-based-management/monitor-and-enforce-best-practices-by-using-policy-based-management). diff --git a/samples/features/epm-framework/sample-policies/Read-only Database Recovery Model.xml b/samples/features/epm-framework/sample-policies/Read-only Database Recovery Model.xml new file mode 100644 index 00000000..16162ee1 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Read-only Database Recovery Model.xml @@ -0,0 +1,436 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Read-only Database Recovery Model + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Recovery Model Simple + + + + + /PolicyStore/ObjectSet/Read-only Database Recovery Model__ObjectSet + + + + + /PolicyStore/Condition/Enterprise or Standard Edition + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + Read-only Database Recovery Model + Checks whether the recovery model is set to simple for read only databases. + Recovery Model Simple + Read-only Database Recovery Model_ObjectSet + Enterprise or Standard Edition + Microsoft Best Practices: Maintenance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116383 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Read-only Database Recovery Model__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Read-only Database Recovery Model__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Read-only Database Recovery Model_ObjectSet + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/Condition/Recovery Model Simple + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>RecoveryModel</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.RecoveryModel</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Simple</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator> + + Recovery Model Simple + Confirms that the database recovery model is set to simple. + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/Condition/Enterprise or Standard Edition + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EngineEdition</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.Edition</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Standard</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EngineEdition</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.Edition</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>EnterpriseOrDeveloper</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + </Operator> + + Enterprise or Standard Edition + Confirms that the instance of SQL Server is either Enterprise or Standard Edition. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Maintenance + + + + + + + /PolicyStore/ObjectSet/Read-only Database Recovery Model__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Read-only Database Recovery Model__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Read-only Database Recovery Model__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/Condition/Read-only + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>AND</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>AND</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>ReadOnly</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>Status</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.DatabaseStatus</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Normal</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>IsSystemObject</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + </Operator> + + Read-only + Confirms that the database ReadOnly property is equal to true. + Database + + + + + + + /PolicyStore/ObjectSet/Read-only Database Recovery Model__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Read-only Database Recovery Model__ObjectSet/TargetSet/Server_/Database + + + + + /PolicyStore/Condition/Read-only + + + Server/Database + Database + Read-only + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server 32-bit Affinity Mask Overlap.xml b/samples/features/epm-framework/sample-policies/SQL Server 32-bit Affinity Mask Overlap.xml new file mode 100644 index 00000000..8093c4f5 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server 32-bit Affinity Mask Overlap.xml @@ -0,0 +1,268 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server 32-bit Affinity Mask Overlap + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/32-bit Affinity Mask Overlapped + + + + + /PolicyStore/ObjectSet/SQL Server 32-bit Affinity Mask Overlap__ObjectSet + + + + + /PolicyStore/Condition/32-bit Configuration + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server 32-bit Affinity Mask Overlap + Checks an instance of SQL Server having processors that are assigned with both the affinity mask and the affinity I/O mask options. On a computer that has more than one processor, the affinity mask and the affinity I/O mask options are used to designate which CPUs are used by SQL Server. Enabling a CPU with both the affinity mask and the affinity I/O mask can slow performance by forcing the processor to be overused. + 32-bit Affinity Mask Overlapped + SQL Server 32-bit Affinity Mask Overlap_ObjectSet + 32-bit Configuration + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116381 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server 32-bit Affinity Mask Overlap__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server 32-bit Affinity Mask Overlap__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server 32-bit Affinity Mask Overlap_ObjectSet + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/32-bit Affinity Mask Overlapped + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>BitwiseAnd</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>AffinityMask</Name><?char 13?> + </Attribute><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>AffinityIOMask</Name><?char 13?> + </Attribute><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + 32-bit Affinity Mask Overlapped + Confirms that the same CPUs are not enabled with both the affinity mask option and the affinity I/O mask option, which can slow performance. + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/32-bit Configuration + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <Name>Platform</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>NT INTEL X86</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + 32-bit Configuration + Confirms that the version of SQL Server uses 32-bit configuration. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server 32-bit Affinity Mask Overlap__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server 32-bit Affinity Mask Overlap__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server 64-bit Affinity Mask Overlap.xml b/samples/features/epm-framework/sample-policies/SQL Server 64-bit Affinity Mask Overlap.xml new file mode 100644 index 00000000..a277f6c9 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server 64-bit Affinity Mask Overlap.xml @@ -0,0 +1,316 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server 64-bit Affinity Mask Overlap + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/64-bit Affinity Mask Overlapped + + + + + /PolicyStore/ObjectSet/SQL Server 64-bit Affinity Mask Overlap__ObjectSet + + + + + /PolicyStore/Condition/64-bit Configuration + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server 64-bit Affinity Mask Overlap + Checks an instance of SQL Server having processors that are assigned with both the affinity64 mask and the affinity64 I/O mask options. On a computer that has more than one processor, the affinity64 mask and the affinity64 I/O mask options are used to designate which CPUs are used by SQL Server. Enabling a CPU with both the affinity64 mask and the affinity64 I/O mask can slow performance by forcing the processor to be overused. + 64-bit Affinity Mask Overlapped + SQL Server 64-bit Affinity Mask Overlap_ObjectSet + 64-bit Configuration + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116381 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server 64-bit Affinity Mask Overlap__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server 64-bit Affinity Mask Overlap__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server 64-bit Affinity Mask Overlap_ObjectSet + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/64-bit Affinity Mask Overlapped + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>AND</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>BitwiseAnd</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>AffinityMask</Name><?char 13?> + </Attribute><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>AffinityIOMask</Name><?char 13?> + </Attribute><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>BitwiseAnd</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>Affinity64Mask</Name><?char 13?> + </Attribute><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>Affinity64IOMask</Name><?char 13?> + </Attribute><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator><?char 13?> + </Operator> + + 64-bit Affinity Mask Overlapped + Confirms that the same CPUs are not enabled with both the affinity mask option and the affinity I/O mask option, which can slow performance. + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/64-bit Configuration + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <Name>Platform</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>NT AMD64</Value><?char 13?> + </Constant><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <Name>Platform</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>NT INTEL IA64</Value><?char 13?> + </Constant><?char 13?> + </Operator><?char 13?> + </Operator> + + 64-bit Configuration + Confirms that the version of SQL Server uses 64-bit configuration. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server 64-bit Affinity Mask Overlap__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server 64-bit Affinity Mask Overlap__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Affinity Mask.xml b/samples/features/epm-framework/sample-policies/SQL Server Affinity Mask.xml new file mode 100644 index 00000000..7cacba4e --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Affinity Mask.xml @@ -0,0 +1,220 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Affinity Mask + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Affinity Mask Default + + + + + /PolicyStore/ObjectSet/SQL Server Affinity Mask__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server Affinity Mask + + Checks an instance of SQL Server for setting, affinity mask to its default value 0, since in most cases, the Microsoft Windows 2000 or Windows Server 2003 default affinity provides the best performance. <?char 13?> + <?char 13?> + Confirms whether the setting affinity mask of server is set to zero.<?char 13?> + + Affinity Mask Default + SQL Server Affinity Mask_ObjectSet + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116357 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Affinity Mask__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Affinity Mask__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server Affinity Mask_ObjectSet + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/Affinity Mask Default + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>AffinityMask</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Affinity Mask Default + Confirms whether the setting affinity mask of server is set to zero. + IServerPerformanceFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server Affinity Mask__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server Affinity Mask__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Blocked Process Threshold.xml b/samples/features/epm-framework/sample-policies/SQL Server Blocked Process Threshold.xml new file mode 100644 index 00000000..406b01f6 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Blocked Process Threshold.xml @@ -0,0 +1,277 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Blocked Process Threshold + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Blocked Process Threshold Optimized + + + + + /PolicyStore/ObjectSet/SQL Server Blocked Process Threshold__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server Blocked Process Threshold + Checks whether the blocked process threshold option is set lower than 5 and is not disabled (0). Setting the blocked process threshold option to a value from 1 to 4 can cause the deadlock monitor to run constantly. Values 1 to 4 should only be used for troubleshooting and never long term or in a production environment without the assistance of Microsoft Customer Service and Support. + Blocked Process Threshold Optimized + SQL Server Blocked Process Threshold_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116356 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Blocked Process Threshold__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Blocked Process Threshold__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server Blocked Process Threshold_ObjectSet + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/Blocked Process Threshold Optimized + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>BlockedProcessThreshold</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>5</Value><?char 13?> + </Constant><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>BlockedProcessThreshold</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator><?char 13?> + </Operator> + + Blocked Process Threshold Optimized + Confirms that the blocked process threshold property is set higher than 4, or is disabled (0). + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server Blocked Process Threshold__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server Blocked Process Threshold__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Default Trace.xml b/samples/features/epm-framework/sample-policies/SQL Server Default Trace.xml new file mode 100644 index 00000000..574f8b83 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Default Trace.xml @@ -0,0 +1,259 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Default Trace + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Default Trace Enabled + + + + + /PolicyStore/ObjectSet/SQL Server Default Trace__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Audit + + + SQL Server Default Trace + Checks whether default trace is turned on to collect information about configuration and DDL changes to the instance of SQL Server. This information can be helpful for customers and Microsoft Technical Support when troubleshooting issues with the Database Engine. + Default Trace Enabled + SQL Server Default Trace_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Audit + false + None + + http://go.microsoft.com/fwlink/?LinkId=116384 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Default Trace__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Default Trace__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server Default Trace_ObjectSet + IServerAuditFacet + + + + + + + /PolicyStore/Condition/Default Trace Enabled + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>DefaultTraceEnabled</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator> + + Default Trace Enabled + Confirms that the default trace enabled options is turned on. + IServerAuditFacet + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Audit + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Audit + + + + + + + /PolicyStore/ObjectSet/SQL Server Default Trace__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server Default Trace__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Dynamic Locks.xml b/samples/features/epm-framework/sample-policies/SQL Server Dynamic Locks.xml new file mode 100644 index 00000000..1f352b3a --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Dynamic Locks.xml @@ -0,0 +1,258 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Dynamic Locks + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Auto-configured Dynamic Locks + + + + + /PolicyStore/ObjectSet/SQL Server Dynamic Locks__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server Dynamic Locks + Checks whether the value of the locks option is the default setting of 0. This enables the Database Engine to allocate and deallocate lock structures dynamically, based on changing system requirements. If locks is nonzero, batch jobs will stop, and an out of locks error message will be generated when the value specified is exceeded. + Auto-configured Dynamic Locks + SQL Server Dynamic Locks_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116358 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Dynamic Locks__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Dynamic Locks__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server Dynamic Locks_ObjectSet + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/Auto-configured Dynamic Locks + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>DynamicLocks</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Auto-configured Dynamic Locks + Confirms that the locks option is set to zero. This is the recommended default value. + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server Dynamic Locks__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server Dynamic Locks__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server I_O Affinity Mask For Non-enterprise SQL Servers.xml b/samples/features/epm-framework/sample-policies/SQL Server I_O Affinity Mask For Non-enterprise SQL Servers.xml new file mode 100644 index 00000000..22b0c193 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server I_O Affinity Mask For Non-enterprise SQL Servers.xml @@ -0,0 +1,269 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server I_/O Affinity Mask For Non-enterprise SQL Servers + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/I_/O Affinity Mask Disabled + + + + + /PolicyStore/ObjectSet/SQL Server I_/O Affinity Mask For Non-enterprise SQL Servers__ObjectSet + + + + + /PolicyStore/Condition/Not Enterprise Edition + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server I/O Affinity Mask For Non-enterprise SQL Servers + Checks that the I/O Affinity Mask is disabled for non-enterprise editions. + I/O Affinity Mask Disabled + SQL Server I/O Affinity Mask For Non-enterprise SQL Servers_ObjectSet + Not Enterprise Edition + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116381 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server I_/O Affinity Mask For Non-enterprise SQL Servers__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server I_/O Affinity Mask For Non-enterprise SQL Servers__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server I/O Affinity Mask For Non-enterprise SQL Servers_ObjectSet + IServerConfigurationFacet + + + + + + + /PolicyStore/Condition/I_/O Affinity Mask Disabled + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>AffinityIOMask</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + I/O Affinity Mask Disabled + Confirms that the server I/O affinity mask property is disabled. + IServerConfigurationFacet + + + + + + + /PolicyStore/Condition/Not Enterprise Edition + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>NE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EngineEdition</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.Edition</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>EnterpriseOrDeveloper</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator> + + Not Enterprise Edition + Confirms that the instance of SQL Server is not Enterprise Edition. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server I_/O Affinity Mask For Non-enterprise SQL Servers__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server I_/O Affinity Mask For Non-enterprise SQL Servers__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Lightweight Pooling.xml b/samples/features/epm-framework/sample-policies/SQL Server Lightweight Pooling.xml new file mode 100644 index 00000000..02cc4718 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Lightweight Pooling.xml @@ -0,0 +1,217 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Lightweight Pooling + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Lightweight Pooling Disabled + + + + + /PolicyStore/ObjectSet/SQL Server Lightweight Pooling__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server Lightweight Pooling + Checks whether lightweight pooling is disabled on the server. Setting lightweightpooling to 1 causes SQL Server to switch to fiber mode scheduling. Fiber mode is intended for certain situations when the context switching of the UMS workers are the critical bottleneck in performance. Because this situation is unusual, fiber mode rarely enhances performance or scalability on the typical system. + Lightweight Pooling Disabled + SQL Server Lightweight Pooling_ObjectSet + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116350 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Lightweight Pooling__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Lightweight Pooling__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server Lightweight Pooling_ObjectSet + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/Lightweight Pooling Disabled + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>LightweightPoolingEnabled</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator> + + Lightweight Pooling Disabled + Confirms that lightweight pooling is disabled on the server. + IServerPerformanceFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server Lightweight Pooling__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server Lightweight Pooling__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Login Mode.xml b/samples/features/epm-framework/sample-policies/SQL Server Login Mode.xml new file mode 100644 index 00000000..a16c61c8 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Login Mode.xml @@ -0,0 +1,216 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Login Mode + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Windows Authentication Mode + + + + + /PolicyStore/ObjectSet/SQL Server Login Mode__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + SQL Server Login Mode + Checks for Windows Authentication. When possible, Microsoft recommends using Windows Authentication. Windows Authentication uses Kerberos security protocol, provides password policy enforcement in terms of complexity validation for strong passwords (applies only to Windows Server 2003 and later), provides support for account lockout, and supports password expiration. + Windows Authentication Mode + SQL Server Login Mode_ObjectSet + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116369 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Login Mode__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Login Mode__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server Login Mode_ObjectSet + IServerSecurityFacet + + + + + + + /PolicyStore/Condition/Windows Authentication Mode + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>LoginMode</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>Microsoft.SqlServer.Management.Smo.ServerLoginMode</ObjType><?char 13?> + <Value>Integrated</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Windows Authentication Mode + Confirms that the server LoginMode is Windows integrated authentication. + IServerSecurityFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/SQL Server Login Mode__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server Login Mode__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Max Degree of Parallelism.xml b/samples/features/epm-framework/sample-policies/SQL Server Max Degree of Parallelism.xml new file mode 100644 index 00000000..f4a58308 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Max Degree of Parallelism.xml @@ -0,0 +1,216 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Max Degree of Parallelism + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Maximum Degree of Parallelism Optimized + + + + + /PolicyStore/ObjectSet/SQL Server Max Degree of Parallelism__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server Max Degree of Parallelism + Checks the max degree of parallelism option for the optimal value to avoid unwanted resource consumption and performance degradation. The recommended value of this option is 8 or less. Setting this option to a larger value often results in unwanted resource consumption and performance degradation. + Maximum Degree of Parallelism Optimized + SQL Server Max Degree of Parallelism_ObjectSet + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116335 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Max Degree of Parallelism__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Max Degree of Parallelism__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server Max Degree of Parallelism_ObjectSet + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/Maximum Degree of Parallelism Optimized + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>LE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>MaxDegreeOfParallelism</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>8</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Maximum Degree of Parallelism Optimized + Confirms that the maximum degree of parallelism is less than 8. Eight is optimal. + IServerPerformanceFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server Max Degree of Parallelism__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server Max Degree of Parallelism__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Max Worker Threads for SQL Server 2005 and above.xml b/samples/features/epm-framework/sample-policies/SQL Server Max Worker Threads for SQL Server 2005 and above.xml new file mode 100644 index 00000000..5f699534 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Max Worker Threads for SQL Server 2005 and above.xml @@ -0,0 +1,258 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Max Worker Threads for SQL Server 2005 and above + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Auto-configured Maximum Worker Threads + + + + + /PolicyStore/ObjectSet/SQL Server Max Worker Threads for SQL Server 2005 and above__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server Max Worker Threads for SQL Server 2005 and above + Checks the max work threads server option for potentially incorrect settings of an instance of SQL Server 2005. Setting the max worker threads option to a nonzero value will prevent SQL Server from automatically determining the proper number of active worker threads based on user requests. + Auto-configured Maximum Worker Threads + SQL Server Max Worker Threads for SQL Server 2005 and above_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116324 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Max Worker Threads for SQL Server 2005 and above__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Max Worker Threads for SQL Server 2005 and above__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server Max Worker Threads for SQL Server 2005 and above_ObjectSet + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/Auto-configured Maximum Worker Threads + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>MaxWorkerThreads</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Auto-configured Maximum Worker Threads + Confirms that the maximum worker threads server option value is set to the recommended value for instances of SQL Server 2005 and later versions. + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server Max Worker Threads for SQL Server 2005 and above__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server Max Worker Threads for SQL Server 2005 and above__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Network Packet Size.xml b/samples/features/epm-framework/sample-policies/SQL Server Network Packet Size.xml new file mode 100644 index 00000000..7207aa2d --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Network Packet Size.xml @@ -0,0 +1,216 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Network Packet Size + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Network Packet Size Optimized + + + + + /PolicyStore/ObjectSet/SQL Server Network Packet Size__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server Network Packet Size + Checks whether for the value specified for network packet size server option is set to the optimal value of 8060 bytes. If the network packet size of any logged-in user is more than 8060 bytes, SQL Server performs different memory allocation operations. This can cause an increase in the process virtual address space that is not reserved for the buffer pool. + Network Packet Size Optimized + SQL Server Network Packet Size_ObjectSet + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116360 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Network Packet Size__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Network Packet Size__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server Network Packet Size_ObjectSet + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/Network Packet Size Optimized + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>LE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>NetworkPacketSize</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>8060</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Network Packet Size Optimized + Confirms that the value specified for network packet size server option does not exceed 8060 bytes. + IServerPerformanceFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server Network Packet Size__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server Network Packet Size__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Password Expiration.xml b/samples/features/epm-framework/sample-policies/SQL Server Password Expiration.xml new file mode 100644 index 00000000..805091d9 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Password Expiration.xml @@ -0,0 +1,345 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Password Expiration + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Password Expiration Enabled + + + + + /PolicyStore/ObjectSet/SQL Server Password Expiration__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + SQL Server Password Expiration + Checks whether enforce password expiration on SQL Server logins is enabled. Enforce password expiration should be enabled for all SQL Server logins. + Password Expiration Enabled + SQL Server Password Expiration_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116332 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Expiration__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Expiration__ObjectSet/TargetSet/Server_/Login + + + + + + /PolicyStore + + + SQL Server Password Expiration_ObjectSet + ILoginOptions + + + + + + + /PolicyStore/Condition/Password Expiration Enabled + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>PasswordExpirationEnabled</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator> + + Password Expiration Enabled + Confirms that password expiration is enforced for all SQL Server logins. + ILoginOptions + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Expiration__ObjectSet/TargetSet/Server_/Login + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Expiration__ObjectSet/TargetSet/Server_/Login/TargetSetLevel/Server_/Login + + + + + + /PolicyStore/ObjectSet/SQL Server Password Expiration__ObjectSet + + + Server/Login + true + + + + + + + /PolicyStore/Condition/SQL Server Authenticated Logins + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>LoginType</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.LoginType</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>SqlLogin</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator> + + SQL Server Authenticated Logins + + Login + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Expiration__ObjectSet/TargetSet/Server_/Login/TargetSetLevel/Server_/Login + + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Expiration__ObjectSet/TargetSet/Server_/Login + + + + + /PolicyStore/Condition/SQL Server Authenticated Logins + + + Server/Login + Login + SQL Server Authenticated Logins + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Password Policy.xml b/samples/features/epm-framework/sample-policies/SQL Server Password Policy.xml new file mode 100644 index 00000000..2972e2cf --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Password Policy.xml @@ -0,0 +1,345 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Password Policy + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Password Policy Enforced + + + + + /PolicyStore/ObjectSet/SQL Server Password Policy__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + SQL Server Password Policy + Checks whether password policy enforcement on SQL Server logins is enabled. Password policy should be enforced for all SQL Server logins. + Password Policy Enforced + SQL Server Password Policy_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116331 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Policy__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Policy__ObjectSet/TargetSet/Server_/Login + + + + + + /PolicyStore + + + SQL Server Password Policy_ObjectSet + ILoginOptions + + + + + + + /PolicyStore/Condition/Password Policy Enforced + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>PasswordPolicyEnforced</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator> + + Password Policy Enforced + Confirms that the enforce password option on SQL Server logins is enabled. + ILoginOptions + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Policy__ObjectSet/TargetSet/Server_/Login + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Policy__ObjectSet/TargetSet/Server_/Login/TargetSetLevel/Server_/Login + + + + + + /PolicyStore/ObjectSet/SQL Server Password Policy__ObjectSet + + + Server/Login + true + + + + + + + /PolicyStore/Condition/SQL Server Authenticated Logins + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>LoginType</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.LoginType</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>SqlLogin</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator> + + SQL Server Authenticated Logins + + Login + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Policy__ObjectSet/TargetSet/Server_/Login/TargetSetLevel/Server_/Login + + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Policy__ObjectSet/TargetSet/Server_/Login + + + + + /PolicyStore/Condition/SQL Server Authenticated Logins + + + Server/Login + Login + SQL Server Authenticated Logins + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Symmetric Key Encryption for User Databases.xml b/samples/features/epm-framework/sample-policies/Symmetric Key Encryption for User Databases.xml new file mode 100644 index 00000000..17278716 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Symmetric Key Encryption for User Databases.xml @@ -0,0 +1,397 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Symmetric Key Encryption for User Databases + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Strongly Encrypted + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + Symmetric Key Encryption for User Databases + Checks that symmetric keys with a length less than 128 bytes do not use the RC2 or RC4 encryption algorithm. The best practice recommendation is to use AES 128 bit and above to create symmetric keys for data encryption. If AES is not supported by the version of your operating system, use 3DES. + Strongly Encrypted + Symmetric Key Encryption for User Databases_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116328 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + + + + /PolicyStore + + + Symmetric Key Encryption for User Databases_ObjectSet + SymmetricKey + + + + + + + /PolicyStore/Condition/Strongly Encrypted + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>AND</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>NE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EncryptionAlgorithm</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.SymmetricKeyEncryptionAlgorithm</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>RC2</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>NE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EncryptionAlgorithm</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.SymmetricKeyEncryptionAlgorithm</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>RC4</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + </Operator> + + Strongly Encrypted + Confirms that the symmetric key encryption algorithm is neither RC2 nor RC4. + SymmetricKey + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database_/SymmetricKey + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet + + + Server/Database/SymmetricKey + true + + + + + + + /PolicyStore/Condition/Key Length Less Than 128 Bytes + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>LE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>KeyLength</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>128</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Key Length Less Than 128 Bytes + Confirms that the Symmetric Key KeyLength property is less than 128 bytes. + SymmetricKey + + + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database_/SymmetricKey + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + + + /PolicyStore/Condition/Key Length Less Than 128 Bytes + + + Server/Database/SymmetricKey + SymmetricKey + Key Length Less Than 128 Bytes + + + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + Server/Database + Database + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Symmetric Key for System Databases.xml b/samples/features/epm-framework/sample-policies/Symmetric Key for System Databases.xml new file mode 100644 index 00000000..c84c6577 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Symmetric Key for System Databases.xml @@ -0,0 +1,379 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Symmetric Key for System Databases + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Fail For Any Symmetric Key + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + Symmetric Key for System Databases + Checks for user-created symmetric keys in the msdb, model, and tempdb databases. This is not recommended. This recommendation does not apply to the master database. + Fail For Any Symmetric Key + Symmetric Key for System Databases_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116329 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + + + + /PolicyStore + + + Symmetric Key for System Databases_ObjectSet + SymmetricKey + + + + + + + /PolicyStore/Condition/Fail For Any Symmetric Key + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator> + + Fail For Any Symmetric Key + Confirms that symmetric keys in the database fail this condition. + SymmetricKey + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database_/SymmetricKey + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet + + + Server/Database/SymmetricKey + true + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database_/SymmetricKey + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + Server/Database/SymmetricKey + SymmetricKey + + + + + + + + /PolicyStore/Condition/System Databases Not Including Master + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>AND</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>NE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <Name>Name</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>master</Value><?char 13?> + </Constant><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>IsSystemObject</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + </Operator> + + System Databases Not Including Master + Confirms that the database is a system database and its name is not master. + Database + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + + + /PolicyStore/Condition/System Databases Not Including Master + + + Server/Database + Database + System Databases Not Including Master + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Symmetric Key for master Database.xml b/samples/features/epm-framework/sample-policies/Symmetric Key for master Database.xml new file mode 100644 index 00000000..311c2765 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Symmetric Key for master Database.xml @@ -0,0 +1,362 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Symmetric Key for master Database + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Microsoft Service Master Key + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + Symmetric Key for master Database + Checks for user-created symmetric keys in the master database, which is not recommended. The master database contains the Master Symmetric key. + Microsoft Service Master Key + Symmetric Key for master Database_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116329 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + + + + /PolicyStore + + + Symmetric Key for master Database_ObjectSet + SymmetricKey + + + + + + + /PolicyStore/Condition/Microsoft Service Master Key + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Unsupported</TypeClass><?char 13?> + <Name>Name</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>##MS_ServiceMasterKey##</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Microsoft Service Master Key + + Confirms that the symmetric key is the Service Master Key.<?char 13?> + <?char 13?> + The Service Master Key is the root of the SQL Server encryption hierarchy. It is generated automatically the first time it is needed to encrypt another key. By default, the Service Master Key is encrypted using the Windows data protection API and using the local machine key. The Service Master Key can only be opened by the Windows service account under which it was created or by a principal with access to both the service account name and its password.<?char 13?> + <?char 13?> + Regenerating or restoring the Service Master Key involves decrypting and re-encrypting the complete encryption hierarchy. Unless the key has been compromised, this resource-intensive operation should be scheduled during a period of low demand.<?char 13?> + + SymmetricKey + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database_/SymmetricKey + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet + + + Server/Database/SymmetricKey + true + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database_/SymmetricKey + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + Server/Database/SymmetricKey + SymmetricKey + + + + + + + + /PolicyStore/Condition/Is master + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <Name>Name</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>master</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Is master + Confirms that the database name is master. + Database + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + + + /PolicyStore/Condition/Is master + + + Server/Database + Database + Is master + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Trustworthy Database.xml b/samples/features/epm-framework/sample-policies/Trustworthy Database.xml new file mode 100644 index 00000000..cd9b82fe --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Trustworthy Database.xml @@ -0,0 +1,335 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Trustworthy Database + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Database Owner Not sysadmin + + + + + /PolicyStore/ObjectSet/Trustworthy Database__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + Trustworthy Database + Checks whether the dbo or a db_owner is assigned to a fixed server sysadmin role for databases where the trustworthy bit is set to on. Database users with the appropriate level of permissions can elevate privileges to the sysadmin role. In this role, the user can create and execute unsafe assemblies that compromise the system. The best practice is to turn off the trustworthy bit or change the dbo and db_owner to a fixed server role other than sysadmin. + Database Owner Not sysadmin + Trustworthy Database_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116327 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Trustworthy Database__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Trustworthy Database__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Trustworthy Database_ObjectSet + IDatabaseSecurityFacet + + + + + + + /PolicyStore/Condition/Database Owner Not sysadmin + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>IsOwnerSysadmin</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator> + + Database Owner Not sysadmin + Confirms that no login in the db_owner role has sysadmin privileges. + IDatabaseSecurityFacet + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/Trustworthy Database__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Trustworthy Database__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Trustworthy Database__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/Condition/Trustworthy + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>Trustworthy</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator> + + Trustworthy + Confirms that the database Trustworthy property is equal to true. + IDatabaseOptions + + + + + + + /PolicyStore/ObjectSet/Trustworthy Database__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Trustworthy Database__ObjectSet/TargetSet/Server_/Database + + + + + /PolicyStore/Condition/Trustworthy + + + Server/Database + Database + Trustworthy + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Windows Event Log Cluster Disk Resource Corruption Error.xml b/samples/features/epm-framework/sample-policies/Windows Event Log Cluster Disk Resource Corruption Error.xml new file mode 100644 index 00000000..c90d1f13 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Windows Event Log Cluster Disk Resource Corruption Error.xml @@ -0,0 +1,247 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Windows Event Log Cluster Disk Resource Corruption Error + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Cluster Disk Resource Corruption Error Check + + + + + /PolicyStore/ObjectSet/Windows Event Log Cluster Disk Resource Corruption Error__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + Windows Event Log Cluster Disk Resource Corruption Error + + Detects SCSI host adapter configuration issues or a malfunctioning device error message in the System Log.<?char 13?> + http://support.microsoft.com/kb/311081<?char 13?> + + Cluster Disk Resource Corruption Error Check + Windows Event Log Cluster Disk Resource Corruption Error_ObjectSet + Microsoft Best Practices: Windows Log File + false + None + + http://go.microsoft.com/fwlink/?LinkId=116377 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Cluster Disk Resource Corruption Error__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Cluster Disk Resource Corruption Error__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Windows Event Log Cluster Disk Resource Corruption Error_ObjectSet + Server + + + + + + + /PolicyStore/Condition/Cluster Disk Resource Corruption Error Check + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>IsNull</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteWql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>root\CIMV2</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>select EventCode from Win32_NTLogEvent where EventCode=1066 and Logfile="System"</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Cluster Disk Resource Corruption Error Check + Confirms that an ESCSI host adapter configuration issue or a malfunctioning device error (Event ID –1066) does not exist in the system log. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Windows Log File + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Cluster Disk Resource Corruption Error__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Cluster Disk Resource Corruption Error__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Windows Event Log Device Driver Control Error.xml b/samples/features/epm-framework/sample-policies/Windows Event Log Device Driver Control Error.xml new file mode 100644 index 00000000..902bd3a1 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Windows Event Log Device Driver Control Error.xml @@ -0,0 +1,248 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Windows Event Log Device Driver Control Error + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Device Driver Control Error Check + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Driver Control Error__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + Windows Event Log Device Driver Control Error + + Detects Error EventID –11 in the System Log. This error could be because of a corrupted device driver, a hardware problem, a malfunctioning device, poor cabling, or termination issues. <?char 13?> + http://support.microsoft.com/kb/259237 <?char 13?> + http://support.microsoft.com/kb/154690 + + Device Driver Control Error Check + Windows Event Log Device Driver Control Error_ObjectSet + Microsoft Best Practices: Windows Log File + false + None + + http://go.microsoft.com/fwlink/?LinkId=116371 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Driver Control Error__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Driver Control Error__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Windows Event Log Device Driver Control Error_ObjectSet + Server + + + + + + + /PolicyStore/Condition/Device Driver Control Error Check + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>IsNull</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteWql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>root\CIMV2</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>select EventCode from Win32_NTLogEvent where EventCode=11 and Logfile="System"</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Device Driver Control Error Check + Confirms that an I/O time-out event error (Event ID -11) does not exist in the system log. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Windows Log File + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Driver Control Error__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Driver Control Error__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Windows Event Log Device Not Ready Error.xml b/samples/features/epm-framework/sample-policies/Windows Event Log Device Not Ready Error.xml new file mode 100644 index 00000000..f87d94e5 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Windows Event Log Device Not Ready Error.xml @@ -0,0 +1,248 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Windows Event Log Device Not Ready Error + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Device Not Ready Error Check + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Not Ready Error__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + Windows Event Log Device Not Ready Error + + This policy detects for error messages in Detects error messages in the System Log that can be the result of SCSI host adapter configuration issues or related problems.<?char 13?> + http://support.microsoft.com/kb/259237<?char 13?> + http://support.microsoft.com/kb/154690<?char 13?> + + Device Not Ready Error Check + Windows Event Log Device Not Ready Error_ObjectSet + Microsoft Best Practices: Windows Log File + false + None + + http://go.microsoft.com/fwlink/?LinkId=116349 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Not Ready Error__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Not Ready Error__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Windows Event Log Device Not Ready Error_ObjectSet + Server + + + + + + + /PolicyStore/Condition/Device Not Ready Error Check + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>IsNull</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteWql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>root\CIMV2</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>select EventCode from Win32_NTLogEvent where EventCode=15 and Logfile="System"</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Device Not Ready Error Check + Confirms that a Device Not Ready Error (Event ID –15) does not exist in the system log. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Windows Log File + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Not Ready Error__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Not Ready Error__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Windows Event Log Failed I_O Request Error.xml b/samples/features/epm-framework/sample-policies/Windows Event Log Failed I_O Request Error.xml new file mode 100644 index 00000000..0f111e17 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Windows Event Log Failed I_O Request Error.xml @@ -0,0 +1,248 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Windows Event Log Failed I_/O Request Error + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Failed I_/O Request Check + + + + + /PolicyStore/ObjectSet/Windows Event Log Failed I_/O Request Error__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + Windows Event Log Failed I/O Request Error + + This policy detects a failed I/O request error message in the system log. This could be the result of a variety of things, including a firmware bug or faulty SCSI cables.<?char 13?> + http://support.microsoft.com/kb/311081<?char 13?> + http://support.microsoft.com/kb/885688<?char 13?> + + Failed I/O Request Check + Windows Event Log Failed I/O Request Error_ObjectSet + Microsoft Best Practices: Windows Log File + false + None + + http://go.microsoft.com/fwlink/?LinkId=116385 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Failed I_/O Request Error__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Failed I_/O Request Error__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Windows Event Log Failed I/O Request Error_ObjectSet + Server + + + + + + + /PolicyStore/Condition/Failed I_/O Request Check + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>IsNull</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteWql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>root\CIMV2</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>select EventCode from Win32_NTLogEvent where EventCode=50 and Logfile="System"</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Failed I/O Request Check + Confirms that a failed I/O request (Event ID 50) does not exist in the system log. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Windows Log File + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Failed I_/O Request Error__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Failed I_/O Request Error__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Windows Event Log I_O Delay Warning.xml b/samples/features/epm-framework/sample-policies/Windows Event Log I_O Delay Warning.xml new file mode 100644 index 00000000..542ed215 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Windows Event Log I_O Delay Warning.xml @@ -0,0 +1,244 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Windows Event Log I_/O Delay Warning + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/I_/O Delay Warning Check + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Delay Warning__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + Windows Event Log I/O Delay Warning + Detects Event ID 833 in the system log. This message indicates that SQL Server has issued a read or write request from disk, and that the request has taken longer than 15 seconds to return. This error is reported by SQL Server and indicates a problem with the disk I/O subsystem. Delays this long can severely limit the performance of your instance of SQL Server. + I/O Delay Warning Check + Windows Event Log I/O Delay Warning_ObjectSet + Microsoft Best Practices: Windows Log File + false + None + + http://go.microsoft.com/fwlink/?LinkId=116375 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Delay Warning__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Delay Warning__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Windows Event Log I/O Delay Warning_ObjectSet + Server + + + + + + + /PolicyStore/Condition/I_/O Delay Warning Check + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>IsNull</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteWql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>root\CIMV2</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>select EventCode from Win32_NTLogEvent where EventCode=833 and Logfile="System"</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + I/O Delay Warning Check + Confirms that an I/O delay warning (Event ID 833) does not exist in the system log. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Windows Log File + + + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Delay Warning__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Delay Warning__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Windows Event Log I_O Error During Hard Page Fault Error.xml b/samples/features/epm-framework/sample-policies/Windows Event Log I_O Error During Hard Page Fault Error.xml new file mode 100644 index 00000000..91c80ed1 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Windows Event Log I_O Error During Hard Page Fault Error.xml @@ -0,0 +1,248 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Windows Event Log I_/O Error During Hard Page Fault Error + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/I_/O Error During Hard Page Fault Error Check + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Error During Hard Page Fault Error__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + Windows Event Log I/O Error During Hard Page Fault Error + + DetectsI/O Error during hard page fault in System Log.<?char 13?> + http://support.microsoft.com/kb/304415 <?char 13?> + http://support.microsoft.com/kb/305547<?char 13?> + + I/O Error During Hard Page Fault Error Check + Windows Event Log I/O Error During Hard Page Fault Error_ObjectSet + Microsoft Best Practices: Windows Log File + false + None + + http://go.microsoft.com/fwlink/?LinkId=116355 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Error During Hard Page Fault Error__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Error During Hard Page Fault Error__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Windows Event Log I/O Error During Hard Page Fault Error_ObjectSet + Server + + + + + + + /PolicyStore/Condition/I_/O Error During Hard Page Fault Error Check + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>IsNull</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteWql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>root\CIMV2</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>select EventCode from Win32_NTLogEvent where EventCode=51 and Logfile="System"</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + I/O Error During Hard Page Fault Error Check + Confirms that an I/O Error during hard page fault (Event ID – 51) does not exist in the system log. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Windows Log File + + + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Error During Hard Page Fault Error__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Error During Hard Page Fault Error__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Windows Event Log Read Retry Error.xml b/samples/features/epm-framework/sample-policies/Windows Event Log Read Retry Error.xml new file mode 100644 index 00000000..6ecf9259 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Windows Event Log Read Retry Error.xml @@ -0,0 +1,244 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Windows Event Log Read Retry Error + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Read Retry Error Check + + + + + /PolicyStore/ObjectSet/Windows Event Log Read Retry Error__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + Windows Event Log Read Retry Error + Detects Error Event ID 825 in the system log. This error message indicates that SQL Server could not read data from the disk on the first try. This message indicates a major problem with the disk I/O subsystem, not with SQL Server itself. However, the disk problem can cause data loss or database corruption if it is not resolved. + Read Retry Error Check + Windows Event Log Read Retry Error_ObjectSet + Microsoft Best Practices: Windows Log File + false + None + + http://go.microsoft.com/fwlink/?LinkId=116339 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Read Retry Error__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Read Retry Error__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Windows Event Log Read Retry Error_ObjectSet + Server + + + + + + + /PolicyStore/Condition/Read Retry Error Check + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>IsNull</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteWql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>root\CIMV2</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>select EventCode from Win32_NTLogEvent where EventCode=825 and Logfile="System"</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Read Retry Error Check + Confirms that read retry issues (Event ID 825) do not exist in the system log. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Windows Log File + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Read Retry Error__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Read Retry Error__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Windows Event Log Storage System I_O Timeout Error.xml b/samples/features/epm-framework/sample-policies/Windows Event Log Storage System I_O Timeout Error.xml new file mode 100644 index 00000000..77b46f32 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Windows Event Log Storage System I_O Timeout Error.xml @@ -0,0 +1,248 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Windows Event Log Storage System I_/O Timeout Error + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Storage System I_/O Timeout Error Check + + + + + /PolicyStore/ObjectSet/Windows Event Log Storage System I_/O Timeout Error__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + Windows Event Log Storage System I/O Timeout Error + + Detects Error EventID –9 in the System Log. This error indicates that I/O time-out has occurred within the storage system, as detected from the driver for the controller. <?char 13?> + http://support.microsoft.com/kb/259237 <?char 13?> + http://support.microsoft.com/kb/154690 + + Storage System I/O Timeout Error Check + Windows Event Log Storage System I/O Timeout Error_ObjectSet + Microsoft Best Practices: Windows Log File + false + None + + http://go.microsoft.com/fwlink/?LinkId=116330 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Storage System I_/O Timeout Error__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Storage System I_/O Timeout Error__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Windows Event Log Storage System I/O Timeout Error_ObjectSet + Server + + + + + + + /PolicyStore/Condition/Storage System I_/O Timeout Error Check + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>IsNull</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteWql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>root\CIMV2</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>select EventCode from Win32_NTLogEvent where EventCode=9 and Logfile="System"</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Storage System I/O Timeout Error Check + Confirms that an I/O time-out event error (Event ID -9) does not exist in the system log. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Windows Log File + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Storage System I_/O Timeout Error__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Storage System I_/O Timeout Error__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Windows Event Log System Failure Error.xml b/samples/features/epm-framework/sample-policies/Windows Event Log System Failure Error.xml new file mode 100644 index 00000000..81b7162d --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Windows Event Log System Failure Error.xml @@ -0,0 +1,244 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Windows Event Log System Failure Error + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/System Failure Error Check + + + + + /PolicyStore/ObjectSet/Windows Event Log System Failure Error__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + Windows Event Log System Failure Error + Detects Error Event ID 6008 in the System Log. This error indicates an unexpected system shutdown. The system might be unstable and might not provide the stability and integrity that is required to host an instance of SQL Server. If it is known, you should address the root cause of the unexpected server restarts. Otherwise, move the instance of SQL Server to another computer. + System Failure Error Check + Windows Event Log System Failure Error_ObjectSet + Microsoft Best Practices: Windows Log File + false + None + + http://go.microsoft.com/fwlink/?LinkId=116326 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Windows Event Log System Failure Error__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log System Failure Error__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Windows Event Log System Failure Error_ObjectSet + Server + + + + + + + /PolicyStore/Condition/System Failure Error Check + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>IsNull</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteWql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>root\CIMV2</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>select EventCode from Win32_NTLogEvent where EventCode=6008 and Logfile="System"</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + System Failure Error Check + Confirms that an unexpected system shutdown error message (Event ID – 6008) does not exist in the system log. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Windows Log File + + + + + + + /PolicyStore/ObjectSet/Windows Event Log System Failure Error__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log System Failure Error__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/sql-big-data-cluster/deployment/README.md b/samples/features/sql-big-data-cluster/deployment/README.md index b8d629e3..6793158b 100644 --- a/samples/features/sql-big-data-cluster/deployment/README.md +++ b/samples/features/sql-big-data-cluster/deployment/README.md @@ -19,3 +19,6 @@ Using the sample Python script in **offline** folder, you will push the necessar Using the sample Python script in **private-aks** folder, you will Deploy SQL Server big data cluster in in your private network with Azure Kubernetes service (AKS) private cluster. +## __[OpenShift manifests and scripts](openshift/)__ + +Use manifests and scripts in **openshift** folder, to support SQL Server Big Data Clusters on OpenShift. \ No newline at end of file diff --git a/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm-ad/setup-bdc-ad.sh b/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm-ad/setup-bdc-ad.sh index fe3a3513..f4d8a124 100644 --- a/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm-ad/setup-bdc-ad.sh +++ b/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm-ad/setup-bdc-ad.sh @@ -92,10 +92,8 @@ IMAGES=( mssql-monitor-influxdb mssql-monitor-kibana mssql-monitor-telegraf - mssql-security-domainctl mssql-security-knox mssql-security-support - mssql-server mssql-server-controller mssql-server-data mssql-ha-operator diff --git a/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm/setup-bdc.sh b/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm/setup-bdc.sh index 26cda1a4..f5b8076e 100644 --- a/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm/setup-bdc.sh +++ b/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm/setup-bdc.sh @@ -73,10 +73,8 @@ IMAGES=( mssql-monitor-influxdb mssql-monitor-kibana mssql-monitor-telegraf - mssql-security-domainctl mssql-security-knox mssql-security-support - mssql-server mssql-server-controller mssql-server-data mssql-ha-operator diff --git a/samples/features/sql-big-data-cluster/deployment/offline/push-bdc-images-to-custom-private-repo.py b/samples/features/sql-big-data-cluster/deployment/offline/push-bdc-images-to-custom-private-repo.py index 9174b102..96e37c04 100644 --- a/samples/features/sql-big-data-cluster/deployment/offline/push-bdc-images-to-custom-private-repo.py +++ b/samples/features/sql-big-data-cluster/deployment/offline/push-bdc-images-to-custom-private-repo.py @@ -41,10 +41,8 @@ images = ['mssql-app-service-proxy', 'mssql-monitor-influxdb' 'mssql-monitor-kibana' 'mssql-monitor-telegraf' - 'mssql-security-domainctl' 'mssql-security-knox' 'mssql-security-support' - 'mssql-server' 'mssql-server-controller' 'mssql-server-data' 'mssql-ha-operator' diff --git a/samples/features/sql-big-data-cluster/deployment/openshift/bdc-scc.yaml b/samples/features/sql-big-data-cluster/deployment/openshift/bdc-scc.yaml new file mode 100644 index 00000000..01615a1f --- /dev/null +++ b/samples/features/sql-big-data-cluster/deployment/openshift/bdc-scc.yaml @@ -0,0 +1,39 @@ +apiVersion: security.openshift.io/v1 +kind: SecurityContextConstraints +metadata: +  annotations: +    kubernetes.io/description: SQL Server BDC custom scc is based on 'nonroot' scc plus additional capabilities. +  generation: 2 +  name: bdc-scc +allowHostDirVolumePlugin: false +allowHostIPC: false +allowHostNetwork: false +allowHostPID: false +allowHostPorts: false +allowPrivilegeEscalation: true +allowPrivilegedContainer: false +allowedCapabilities: + - SETUID + - SETGID + - CHOWN + - SYS_PTRACE +defaultAddCapabilities: null +fsGroup: +  type: RunAsAny +readOnlyRootFilesystem: false +requiredDropCapabilities: + - KILL + - MKNOD +runAsUser: +  type: MustRunAsNonRoot +seLinuxContext: +  type: MustRunAs +supplementalGroups: +  type: RunAsAny +volumes: + - configMap + - downwardAPI + - emptyDir + - persistentVolumeClaim + - projected + - secret \ No newline at end of file diff --git a/samples/features/sql-big-data-cluster/deployment/private-aks/README.md b/samples/features/sql-big-data-cluster/deployment/private-aks/README.md index 5dc27b56..d5289dd4 100644 --- a/samples/features/sql-big-data-cluster/deployment/private-aks/README.md +++ b/samples/features/sql-big-data-cluster/deployment/private-aks/README.md @@ -67,7 +67,7 @@ sudo ./deploy-private-aks-udr.sh 1. Download the script on the location that you are planning to use for the deployment ``` bash -curl --output deploy-bdc https://raw.githubusercontent.com/microsoft/sql-server-samples/master/samples/features/sql-big-data-cluster/deployment/private-aks/scripts/deploy-bdc.sh +curl --output deploy-bdc.sh https://raw.githubusercontent.com/microsoft/sql-server-samples/master/samples/features/sql-big-data-cluster/deployment/private-aks/scripts/deploy-bdc.sh ``` 2. Make the script executable diff --git a/samples/features/sql-big-data-cluster/deployment/private-aks/scripts/deploy-bdc.sh b/samples/features/sql-big-data-cluster/deployment/private-aks/scripts/deploy-bdc.sh index 21c5160c..90337531 100644 --- a/samples/features/sql-big-data-cluster/deployment/private-aks/scripts/deploy-bdc.sh +++ b/samples/features/sql-big-data-cluster/deployment/private-aks/scripts/deploy-bdc.sh @@ -25,9 +25,9 @@ azdata bdc config replace -c private-bdc-aks/control.json -j "$.spec.storage.log azdata bdc config replace -c private-bdc-aks/control.json -j "$.spec.endpoints[0].serviceType=NodePort" azdata bdc config replace -c private-bdc-aks/control.json -j "$.spec.endpoints[1].serviceType=NodePort" -azdata bdc config replace -c private-bdc-aks /bdc.json -j "$.spec.resources.master.spec.endpoints[0].serviceType=NodePort" -azdata bdc config replace -c private-bdc-aks /bdc.json -j "$.spec.resources.gateway.spec.endpoints[0].serviceType=NodePort" -azdata bdc config replace -c private-bdc-aks /bdc.json -j "$.spec.resources.appproxy.spec.endpoints[0].serviceType=NodePort" +azdata bdc config replace -c private-bdc-aks/bdc.json -j "$.spec.resources.master.spec.endpoints[0].serviceType=NodePort" +azdata bdc config replace -c private-bdc-aks/bdc.json -j "$.spec.resources.gateway.spec.endpoints[0].serviceType=NodePort" +azdata bdc config replace -c private-bdc-aks/bdc.json -j "$.spec.resources.appproxy.spec.endpoints[0].serviceType=NodePort" #In case you're deploying BDC in HA mode ( aks-dev-test-ha profile ) please also use the following command #azdata bdc config replace -c private-bdc-aks /bdc.json -j "$.spec.resources.master.spec.endpoints[1].serviceType=NodePort" diff --git a/samples/features/sql-big-data-cluster/spark/config-install/installpackage_Spark.ipynb b/samples/features/sql-big-data-cluster/spark/config-install/installpackage_Spark.ipynb index 833b2f8e..afed0633 100644 --- a/samples/features/sql-big-data-cluster/spark/config-install/installpackage_Spark.ipynb +++ b/samples/features/sql-big-data-cluster/spark/config-install/installpackage_Spark.ipynb @@ -57,7 +57,7 @@ "Maven packages can be installed onto your Spark cluster using notebook cell configuration at the start of your spark session. Before starting a spark session in Azure Data Studio, run the following code:\r\n", "\r\n", "```\r\n", - "%%configure -f` \\\r\n", + "%%configure -f \\\r\n", "{\"conf\": {\"spark.jars.packages\": \"com.microsoft.azure:azure-eventhubs-spark_2.11:2.3.1\"}}\r\n", "```\r\n", "" diff --git a/samples/features/ssms-templates/Sql/External Data Source/Create External Data Source.sql b/samples/features/ssms-templates/Sql/External Data Source/Create External Data Source.sql index 55c58e8f..040244a7 100644 --- a/samples/features/ssms-templates/Sql/External Data Source/Create External Data Source.sql +++ b/samples/features/ssms-templates/Sql/External Data Source/Create External Data Source.sql @@ -7,7 +7,7 @@ GO IF EXISTS ( SELECT * FROM sys.external_data_sources - WHERE name = N'' + WHERE name = N'' ) DROP EXTERNAL DATA SOURCE GO diff --git a/samples/features/ssms-templates/Sql/External Data Source/Drop External Data Source.sql b/samples/features/ssms-templates/Sql/External Data Source/Drop External Data Source.sql index 0b767cae..2e83e39c 100644 --- a/samples/features/ssms-templates/Sql/External Data Source/Drop External Data Source.sql +++ b/samples/features/ssms-templates/Sql/External Data Source/Drop External Data Source.sql @@ -6,8 +6,8 @@ GO IF EXISTS ( SELECT * - FROM sys.external_data_sources - WHERE name = N'' + FROM sys.external_data_sources + WHERE name = N'' ) DROP EXTERNAL DATA SOURCE GO \ No newline at end of file diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Database/Create Database.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Database/Create Database.sql index 08c11275..eeb19c1e 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Database/Create Database.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Database/Create Database.sql @@ -1,5 +1,5 @@ -- =================================================================================================================================== --- Create database template for Azure SQL Database and Azure SQL Data Warehouse Database +-- Create database template for Azure SQL Database and Azure Synapse Analytics Database -- -- This script will only run in the context of the master database. To manage this database in -- SQL Server Management Studio, either connect to the created database, or connect to master. @@ -9,27 +9,30 @@ -- continuity, data protection and security, and near-zero administration all backed by the power -- and reach of Microsoft Azure. -- --- SQL Database is available in the following service tiers: Basic, Standard, Premium , DataWarehouse, Web (Retired) +-- SQL Database is available in the following service tiers: GeneralPurpose, Basic, Standard, Premium , DataWarehouse, Web (Retired) -- and Business (Retired). +-- General Purpose service tier is a default service tier in Azure SQL Database that is designed for most of the generic workloads. +-- If you need a fully managed database engine with 99.99% SLA with storage latency between 5 and 10 ms that match Azure SQL +-- IaaS in most of the cases, General Purpose tier is the option for you. -- Standard is the go-to option for getting started with cloud-designed business applications and -- offers mid-level performance and business continuity features. Performance objectives for Standard -- deliver predictable per minute transaction rates. -- --- See http://go.microsoft.com/fwlink/p/?LinkId=306622 for more information about Azure SQL Database. +-- See https://go.microsoft.com/fwlink/p/?LinkId=306622 for more information about Azure SQL Database. -- --- See http://go.microsoft.com/fwlink/?LinkId=787140 for more information about Azure SQL Data Warehouse. +-- See https://go.microsoft.com/fwlink/?LinkId=787140 for more information about Azure Synapse Analytics. -- --- See http://go.microsoft.com/fwlink/p/?LinkId=402063 for more information about CREATE DATABASE for Azure SQL Database. +-- See https://go.microsoft.com/fwlink/p/?LinkId=402063 for more information about CREATE DATABASE for Azure SQL Database. -- --- See http://go.microsoft.com/fwlink/?LinkId=787139 for more information about CREATE DATABASE for Azure SQL Data Warehouse Database. +-- See https://go.microsoft.com/fwlink/?LinkId=787139 for more information about CREATE DATABASE for Azure Synapse Analytics Database. -- =================================================================================================================================== CREATE DATABASE COLLATE ( - EDITION = '', - SERVICE_OBJECTIVE='', - MAXSIZE = + EDITION = '', + SERVICE_OBJECTIVE='', + MAXSIZE = ) GO diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Database/Drop Database.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Database/Drop Database.sql index 6b1c6790..e782dae8 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Database/Drop Database.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Database/Drop Database.sql @@ -1,5 +1,5 @@ --- =================================================================================== --- Drop database template for Azure SQL Database and Azure SQL Data Warehouse Database --- =================================================================================== +-- =================================================================================================================================== +-- Drop database template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand Database +-- =================================================================================================================================== DROP DATABASE GO diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Alter External Data Source DW.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Alter External Data Source DW.sql index 77a40355..c8923004 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Alter External Data Source DW.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Alter External Data Source DW.sql @@ -1,6 +1,6 @@ --- ========================================================================= --- Alter external data source template for Azure SQL Data Warehouse Database --- ========================================================================= +-- ======================================================================== +-- Alter external data source template for Azure Synapse Analytics Database +-- ======================================================================== ALTER EXTERNAL DATA SOURCE SET LOCATION = N'', diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Create External Data Source DW.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Create External Data Source DW.sql index 886d87b6..1f7b36b3 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Create External Data Source DW.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Create External Data Source DW.sql @@ -1,20 +1,20 @@ --- ========================================================================== --- Create external data source template for Azure SQL Data Warehouse Database --- ========================================================================== +-- ========================================================================= +-- Create external data source template for Azure Synapse Analytics Database +-- ========================================================================= IF EXISTS ( SELECT * - FROM sys.external_data_sources - WHERE name = N'' + FROM sys.external_data_sources + WHERE name = N'' ) DROP EXTERNAL DATA SOURCE GO CREATE EXTERNAL DATA SOURCE WITH ( - TYPE = , - LOCATION = N'', - RESOURCE_MANAGER_LOCATION = N'', - CREDENTIAL = + TYPE = , + LOCATION = N'', + RESOURCE_MANAGER_LOCATION = N'', + CREDENTIAL = ) GO \ No newline at end of file diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Create External Data Source.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Create External Data Source.sql index 13b90e80..200cbce9 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Create External Data Source.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Create External Data Source.sql @@ -4,7 +4,7 @@ IF EXISTS ( SELECT * FROM sys.external_data_sources - WHERE name = N'' + WHERE name = N'' ) DROP EXTERNAL DATA SOURCE GO diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Drop External Data Source.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Drop External Data Source.sql index 69e66fd3..1072e9f9 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Drop External Data Source.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Drop External Data Source.sql @@ -1,11 +1,11 @@ --- =============================================================================================== --- Drop external data source template for Azure SQL Database and Azure SQL Data Warehouse Database --- =============================================================================================== +-- ====================================================================================================================================== +-- Drop external data source template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +-- ====================================================================================================================================== IF EXISTS ( SELECT * - FROM sys.external_data_sources - WHERE name = N'' + FROM sys.external_data_sources + WHERE name = N'' ) DROP EXTERNAL DATA SOURCE GO \ No newline at end of file diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/External File Format/Create External File Format.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/External File Format/Create External File Format.sql index 6f0a5fdf..1772c506 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/External File Format/Create External File Format.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/External File Format/Create External File Format.sql @@ -1,6 +1,6 @@ --- ========================================================================== --- Create external file format template for Azure SQL Data Warehouse Database --- ========================================================================== +-- ========================================================================= +-- Create external file format template for Azure Synapse Analytics Database +-- ========================================================================= IF EXISTS ( SELECT * diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/External File Format/Drop External File Format.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/External File Format/Drop External File Format.sql index e39fec07..352a5617 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/External File Format/Drop External File Format.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/External File Format/Drop External File Format.sql @@ -1,6 +1,6 @@ --- ======================================================================== --- Drop external file format template for Azure SQL Data Warehouse Database --- ======================================================================== +-- ================================================================================================================== +-- Drop external file format template for Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +-- ================================================================================================================== IF EXISTS ( SELECT * diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Scalar Function DW (New Menu).sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Scalar Function DW (New Menu).sql index bc24016a..1827a584 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Scalar Function DW (New Menu).sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Scalar Function DW (New Menu).sql @@ -1,6 +1,6 @@ --- ===================================================================== --- Create Scalar Function Template for Azure SQL Data Warehouse Database --- ===================================================================== +-- ==================================================================== +-- Create Scalar Function Template for Azure Synapse Analytics Database +-- ==================================================================== SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Drop Function.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Drop Function.sql index acce825a..f7b2d7cd 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Drop Function.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Drop Function.sql @@ -1,6 +1,6 @@ - --=================================================================================== --- Drop function template for Azure SQL Database and Azure SQL Data Warehouse Database ---==================================================================================== + --================================================================================== +-- Drop function template for Azure SQL Database and Azure Synapse Analytics Database +--=================================================================================== IF OBJECT_ID (N'.') IS NOT NULL DROP FUNCTION . GO diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Create Index.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Create Index.sql index 861fea58..b37b8b6f 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Create Index.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Create Index.sql @@ -1,6 +1,6 @@ --- ================================================================================== --- Create index template for Azure SQL Database and Azure SQL Data Warehouse Database --- ================================================================================== +-- ================================================================================= +-- Create index template for Azure SQL Database and Azure Synapse Analytics Database +-- ================================================================================= CREATE INDEX ON . diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Drop Index.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Drop Index.sql index 7da05954..4f8f0881 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Drop Index.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Drop Index.sql @@ -1,6 +1,6 @@ ---======================================================================== --- Drop index template for Azure SQL Database and Azure SQL Data Warehouse ---======================================================================== +--======================================================================= +-- Drop index template for Azure SQL Database and Azure Synapse Analytics +--======================================================================= IF EXISTS ( SELECT * FROM sys.indexes diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Login/Create Login.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Login/Create Login.sql index a060f492..519f58f2 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Login/Create Login.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Login/Create Login.sql @@ -1,6 +1,6 @@ --- ====================================================================================== --- Create SQL Login template for Azure SQL Database and Azure SQL Data Warehouse Database --- ====================================================================================== +-- ============================================================================================================================= +-- Create SQL Login template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +-- ============================================================================================================================= CREATE LOGIN WITH PASSWORD = '' diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Login/Drop Login.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Login/Drop Login.sql index ce390455..ed021dd8 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Login/Drop Login.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Login/Drop Login.sql @@ -1,6 +1,6 @@ --- ==================================================================================== --- Drop SQL Login template for Azure SQL Database and Azure SQL Data Warehouse Database --- ==================================================================================== +-- =========================================================================================================================== +-- Drop SQL Login template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +-- =========================================================================================================================== DROP LOGIN Go diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Role/Create Role.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Role/Create Role.sql index 216bc3de..174dd2bb 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Role/Create Role.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Role/Create Role.sql @@ -1,6 +1,6 @@ --- ========================================================================================== --- Create Database Role template for Azure SQL Database and Azure SQL Data Warehouse Database --- ========================================================================================== +-- ========================================================================================= +-- Create Database Role template for Azure SQL Database and Azure Synapse Analytics Database +-- ========================================================================================= -- Create the database role CREATE ROLE AUTHORIZATION [dbo] GO diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Role/Drop Role.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Role/Drop Role.sql index 2f00d1ec..ae45b76b 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Role/Drop Role.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Role/Drop Role.sql @@ -1,6 +1,6 @@ --- ======================================================================================== --- Drop Database Role template for Azure SQL Database and Azure SQL Data Warehouse Database --- ======================================================================================== +-- =============================================================================================================================== +-- Drop Database Role template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +-- =============================================================================================================================== -- Drop the role DROP ROLE ; diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Schema/Create Schema.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Schema/Create Schema.sql index 5db793fa..a1f5fa84 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Schema/Create Schema.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Schema/Create Schema.sql @@ -1,6 +1,6 @@ --- =================================================================================== --- Create Schema Template for Azure SQL Database and Azure SQL Data Warehouse Database --- =================================================================================== +-- ========================================================================================================================== +-- Create Schema Template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +-- ========================================================================================================================== CREATE SCHEMA AUTHORIZATION diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Schema/Drop Schema.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Schema/Drop Schema.sql index ca204aba..60862187 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Schema/Drop Schema.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Schema/Drop Schema.sql @@ -1,6 +1,6 @@ ---================================================================================== --- Drop Schema template for Azure SQL Database and Azure SQL Data Warehouse Database ---================================================================================== +--========================================================================================================================= +-- Drop Schema template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +--========================================================================================================================= IF EXISTS( SELECT * FROM sys.schemas diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Statistics/Create Statistics.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Statistics/Create Statistics.sql index 8010ace8..61e49403 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Statistics/Create Statistics.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Statistics/Create Statistics.sql @@ -1,6 +1,6 @@ --- =============================================================================================== --- Create Sampled Statistics Template for Azure SQL Database and Azure SQL Data Warehouse Database --- =============================================================================================== +-- ====================================================================================================================================== +-- Create Sampled Statistics Template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +-- ====================================================================================================================================== CREATE STATISTICS ON . ( diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Statistics/Drop Statistics.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Statistics/Drop Statistics.sql index be0d700a..bbc6cf1c 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Statistics/Drop Statistics.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Statistics/Drop Statistics.sql @@ -1,6 +1,6 @@ ---====================================================================================== --- Drop Statistics template for Azure SQL Database and Azure SQL Data Warehouse Database ---====================================================================================== +--============================================================================================================================= +-- Drop Statistics template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +--============================================================================================================================= IF EXISTS ( SELECT * FROM sys.stats as st diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Create Stored Procedure DW (New Menu).sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Create Stored Procedure DW (New Menu).sql index a723c18f..cb919301 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Create Stored Procedure DW (New Menu).sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Create Stored Procedure DW (New Menu).sql @@ -1,6 +1,6 @@ --- ====================================================================== --- Create Stored Procedure Template for Azure SQL Data Warehouse Database --- ====================================================================== +-- ===================================================================== +-- Create Stored Procedure Template for Azure Synapse Analytics Database +-- ===================================================================== SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Drop Stored Procedure.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Drop Stored Procedure.sql index 8914ee50..7af30c9e 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Drop Stored Procedure.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Drop Stored Procedure.sql @@ -1,6 +1,6 @@ --- =========================================================================================== --- Drop Stored Procedure Template for Azure SQL Database and Azure SQL Data Warehouse Database --- =========================================================================================== +-- ========================================================================================== +-- Drop Stored Procedure Template for Azure SQL Database and Azure Synapse Analytics Database +-- ========================================================================================== -- Drop stored procedure if it already exists IF EXISTS ( diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create External Table DW.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create External Table DW.sql index ff56e788..753e1079 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create External Table DW.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create External Table DW.sql @@ -1,6 +1,6 @@ --- ==================================================================== --- Create External Table Template for Azure SQL Data Warehouse Database --- ==================================================================== +-- =================================================================== +-- Create External Table Template for Azure Synapse Analytics Database +-- =================================================================== IF OBJECT_ID('.', 'U') IS NOT NULL DROP EXTERNAL TABLE . diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Graph Edge Table.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Graph Edge Table.sql index 9c520ee5..d3967030 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Graph Edge Table.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Graph Edge Table.sql @@ -1,24 +1,32 @@ -- ========================================= --- Create Graph Edge Template +-- Create Graph Edge Table Template -- ========================================= +USE +GO -IF OBJECT_ID('.', 'U') IS NOT NULL - DROP TABLE . +DROP TABLE IF EXISTS . GO CREATE TABLE . ( - -- Columns are optional for Edge Tables. + -- Columns are optional for Graph Edge Tables. -- , , , + -- System generated edge constraint. + -- + CONNECTION (), + + CONSTRAINT EC_ CONNECTION (, TO ), -- Unique index on $edge_id is required. - -- If no user-defined index is specified, a default index is created instead. + -- If no user-defined index is specified, a default index is created. + -- INDEX ix_graphid UNIQUE ($edge_id), -- indexes on $from_id and $to_id are optional, but support faster lookups. + -- INDEX ix_fromid ($from_id, $to_id), INDEX ix_toid ($to_id, $from_id) ) diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create SQL DW Partitioned Table.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create SQL DW Partitioned Table.sql index 6762010e..ad6873dd 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create SQL DW Partitioned Table.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create SQL DW Partitioned Table.sql @@ -1,6 +1,6 @@ --- ======================================================================= --- Create Partitioned Table Template for Azure SQL Data Warehouse Database --- ======================================================================= +-- ====================================================================== +-- Create Partitioned Table Template for Azure Synapse Analytics Database +-- ====================================================================== IF OBJECT_ID('.', 'U') IS NOT NULL DROP TABLE . diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create SQL DW Table.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create SQL DW Table.sql index ee646172..ad8859e6 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create SQL DW Table.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create SQL DW Table.sql @@ -1,6 +1,6 @@ --- =========================================================== --- Create Table Template for Azure SQL Data Warehouse Database --- =========================================================== +-- ========================================================== +-- Create Table Template for Azure Synapse Analytics Database +-- ========================================================== IF OBJECT_ID('.', 'U') IS NOT NULL DROP TABLE . diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create System-Versioned Table.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create System-Versioned Table.sql index fff691c8..2496fbf9 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create System-Versioned Table.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create System-Versioned Table.sql @@ -13,7 +13,7 @@ BEGIN --If table is system-versioned, SYSTEM_VERSIONING must be set to OFF first - IF ((SELECT temporal_type FROM SYS.TABLES WHERE object_id = OBJECT_ID('.', 'U')) = 2) + IF ((SELECT temporal_type FROM sys.tables WHERE object_id = OBJECT_ID('.', 'U')) = 2) BEGIN ALTER TABLE [].[] SET (SYSTEM_VERSIONING = OFF) END diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Drop External Table.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Drop External Table.sql index 1bb161fa..fad276b0 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Drop External Table.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Drop External Table.sql @@ -1,6 +1,6 @@ ---========================================================================================== --- Drop External Table template for Azure SQL Database and Azure SQL Data Warehouse Database ---========================================================================================== +--================================================================================================================================= +-- Drop External Table template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +--================================================================================================================================= IF EXISTS ( SELECT * FROM sys.tables diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Drop Table.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Drop Table.sql index 7758c8b9..8bca0fcf 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Drop Table.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Drop Table.sql @@ -1,6 +1,6 @@ ---================================================================================= --- Drop Table template for Azure SQL Database and Azure SQL Data Warehouse Database ---================================================================================= +--================================================================================ +-- Drop Table template for Azure SQL Database and Azure Synapse Analytics Database +--================================================================================ IF EXISTS ( SELECT * FROM sys.tables diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/User/Create User.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/User/Create User.sql index 61de5bf7..cb838af2 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/User/Create User.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/User/Create User.sql @@ -1,6 +1,6 @@ --- ======================================================================================== --- Create User as DBO template for Azure SQL Database and Azure SQL Data Warehouse Database --- ======================================================================================== +-- ======================================================================================= +-- Create User as DBO template for Azure SQL Database and Azure Synapse Analytics Database +-- ======================================================================================= -- For login , create a user in the database CREATE USER FOR LOGIN diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/User/Drop User.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/User/Drop User.sql index f1a830b4..f21cca8a 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/User/Drop User.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/User/Drop User.sql @@ -1,5 +1,5 @@ --- ======================================================================================== --- Create User as DBO template for Azure SQL Database and Azure SQL Data Warehouse Database --- ======================================================================================== +-- =============================================================================================================================== +-- Create User as DBO template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +-- =============================================================================================================================== DROP USER GO diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/View/Create View.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/View/Create View.sql index 93570399..151b4106 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/View/Create View.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/View/Create View.sql @@ -1,6 +1,6 @@ --- ================================================================================= --- Create View template for Azure SQL Database and Azure SQL Data Warehouse Database --- ================================================================================= +-- ================================================================================ +-- Create View template for Azure SQL Database and Azure Synapse Analytics Database +-- ================================================================================ IF object_id(N'.', 'V') IS NOT NULL DROP VIEW . diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/View/Drop View.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/View/Drop View.sql index a5aeb66f..b65c8345 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/View/Drop View.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/View/Drop View.sql @@ -1,6 +1,6 @@ ---================================================================================ --- Drop View template for Azure SQL Database and Azure SQL Data Warehouse Database ---================================================================================ +--======================================================================================================================= +-- Drop View template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +--======================================================================================================================= IF EXISTS ( SELECT * FROM sys.views diff --git a/samples/features/ssms-templates/Sql/Table/Create Graph Edge Table.sql b/samples/features/ssms-templates/Sql/Table/Create Graph Edge Table.sql index c56b10e4..d3967030 100644 --- a/samples/features/ssms-templates/Sql/Table/Create Graph Edge Table.sql +++ b/samples/features/ssms-templates/Sql/Table/Create Graph Edge Table.sql @@ -1,26 +1,32 @@ -- ========================================= --- Create Graph Edge Template +-- Create Graph Edge Table Template -- ========================================= USE GO -IF OBJECT_ID('.', 'U') IS NOT NULL - DROP TABLE . +DROP TABLE IF EXISTS . GO CREATE TABLE . ( - -- Columns are optional for Edge Tables. + -- Columns are optional for Graph Edge Tables. -- , , , + -- System generated edge constraint. + -- + CONNECTION (), + + CONSTRAINT EC_ CONNECTION (, TO ), -- Unique index on $edge_id is required. -- If no user-defined index is specified, a default index is created. + -- INDEX ix_graphid UNIQUE ($edge_id), -- indexes on $from_id and $to_id are optional, but support faster lookups. + -- INDEX ix_fromid ($from_id, $to_id), INDEX ix_toid ($to_id, $from_id) ) diff --git a/samples/features/ssms-templates/Sql/Table/Create Memory Optimized System-Versioned Table.sql b/samples/features/ssms-templates/Sql/Table/Create Memory Optimized System-Versioned Table.sql index 2061a1cd..371dfa33 100644 --- a/samples/features/ssms-templates/Sql/Table/Create Memory Optimized System-Versioned Table.sql +++ b/samples/features/ssms-templates/Sql/Table/Create Memory Optimized System-Versioned Table.sql @@ -19,7 +19,7 @@ USE GO BEGIN - IF ((SELECT temporal_type FROM SYS.TABLES WHERE object_id = OBJECT_ID('.', 'U')) = 2) + IF ((SELECT temporal_type FROM sys.tables WHERE object_id = OBJECT_ID('.', 'U')) = 2) BEGIN ALTER TABLE [].[] SET (SYSTEM_VERSIONING = OFF) END diff --git a/samples/features/ssms-templates/Sql/Table/Create System-Versioned Table.sql b/samples/features/ssms-templates/Sql/Table/Create System-Versioned Table.sql index 420f0300..58231ac6 100644 --- a/samples/features/ssms-templates/Sql/Table/Create System-Versioned Table.sql +++ b/samples/features/ssms-templates/Sql/Table/Create System-Versioned Table.sql @@ -16,7 +16,7 @@ GO BEGIN --If table is system-versioned, SYSTEM_VERSIONING must be set to OFF first - IF ((SELECT temporal_type FROM SYS.TABLES WHERE object_id = OBJECT_ID('.', 'U')) = 2) + IF ((SELECT temporal_type FROM sys.tables WHERE object_id = OBJECT_ID('.', 'U')) = 2) BEGIN ALTER TABLE [].[] SET (SYSTEM_VERSIONING = OFF) END diff --git a/samples/features/ssms-templates/Sql/Table/drop constraint.sql b/samples/features/ssms-templates/Sql/Table/drop constraint.sql index 893d85fa..15c30a7b 100644 --- a/samples/features/ssms-templates/Sql/Table/drop constraint.sql +++ b/samples/features/ssms-templates/Sql/Table/drop constraint.sql @@ -3,6 +3,11 @@ -- -- This template creates a table with a CHECK CONSTRAINT, -- then it removes the CHECK CONSTRAINT from the table + +-- Note: The DROP syntax can also be used to drop +-- Edge Constraint object types. To achieve this replace +-- the constraint_name attribute with the name of the +-- respective Edge Constraint object -- ======================================================== USE GO diff --git a/samples/features/unicode/DataType_WesternMyth.sql b/samples/features/unicode/DataType_WesternMyth.sql index 2ef4b9d9..cfd1a3cb 100644 --- a/samples/features/unicode/DataType_WesternMyth.sql +++ b/samples/features/unicode/DataType_WesternMyth.sql @@ -7,7 +7,13 @@ -- Test Latin character strings with Latin collation -- Set size limit of data types to be the same under Basic Multilingual Plane (BMP) -- Characters between 1-byte (ASCII) and 3-bytes (East Asian) +USE master; +DROP DATABASE IF EXISTS UnicodeDatabase; +CREATE DATABASE UnicodeDatabase COLLATE LATIN1_GENERAL_100_CI_AS_SC_UTF8 +GO +USE UnicodeDatabase +GO DROP TABLE IF EXISTS t1; CREATE TABLE t1 (c1 varchar(24) COLLATE Latin1_General_100_CI_AI, c2 nvarchar(8) COLLATE Latin1_General_100_CI_AI); @@ -46,7 +52,8 @@ GO -- uh-oh data loss on the varchar example. Why? --- varchar is bound to code page enconding, and these code points cannot be found in the Latin code page. +-- varchar is bound to code page enconding, +-- and these code points cannot be found in the Latin code page. SELECT ASCII('敏' COLLATE Latin1_General_100_CI_AI), CHAR(63) SELECT ASCII('捷' COLLATE Latin1_General_100_CI_AI), CHAR(63) @@ -152,10 +159,10 @@ GO -- But the majority of my data is set to Latin (ASCII) DROP TABLE IF EXISTS t4; -CREATE TABLE t4 (c1 varchar(110) COLLATE Latin1_General_100_CI_AI_SC); +CREATE TABLE t4 (c1 varchar(110) COLLATE Latin1_General_100_CI_AI_SC_UTF8); INSERT INTO t4 VALUES (N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii敏捷的棕色狐狸跳👶👦') -SELECT LEN(c1) AS [varchar UTF16 LEN], - DATALENGTH(c1) AS [varchar UTF16 DATALENGTH], c1 +SELECT LEN(c1) AS [varchar UTF8 LEN], + DATALENGTH(c1) AS [varchar UTF8 DATALENGTH], c1 FROM t4; GO @@ -164,8 +171,8 @@ GO -- Where are the savings? SELECT DATALENGTH(N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii') AS [Latin_UTF16_2bytes], DATALENGTH(N'敏捷的棕色狐狸跳') AS [Chinese_UTF16_2bytes], - DATALENGTH(N'👶👦') AS [SC_UTF16_4bytes] + DATALENGTH(N'👶') AS [SC_UTF16_4bytes] SELECT DATALENGTH('MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [Latin_UTF8_1byte], DATALENGTH('敏捷的棕色狐狸跳' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [Chinese_UTF8_3bytes], - DATALENGTH('👶👦' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [SC_UTF8_4bytes] + DATALENGTH('👶' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [SC_UTF8_4bytes] GO \ No newline at end of file diff --git a/samples/features/unicode/notebooks/DataType_WesternMyth.ipynb b/samples/features/unicode/notebooks/DataType_WesternMyth.ipynb index 92a4160f..bcd928bc 100644 --- a/samples/features/unicode/notebooks/DataType_WesternMyth.ipynb +++ b/samples/features/unicode/notebooks/DataType_WesternMyth.ipynb @@ -15,45 +15,18 @@ "cells": [ { "cell_type": "markdown", - "source": [ - "# Data type sizes - a western myth" - ], - "metadata": { - "azdata_cell_guid": "9e602698-2ef8-4fed-872f-5bad8c440600" - } + "source": "# Data type sizes - a western myth", + "metadata": {} }, { "cell_type": "markdown", - "source": [ - "## Test Latin character strings with Latin collation\r\n", - "\r\n", - "**Note:** My server default is SQL_Latin1_General_CP1_CI_AS\r\n", - "\r\n", - "Set size limit of data types to be the same under Basic Multilingual Plane (BMP)\r\n", - "Characters between 1-byte (ASCII) and 3-bytes (East Asian)" - ], - "metadata": { - "azdata_cell_guid": "78fc4a30-52e8-407d-8807-04097ad12348" - } + "source": "## Test Latin character strings with Latin collation\r\n\r\n**Note:** My server default is SQL_Latin1_General_CP1_CI_AS\r\n\r\nSet size limit of data types to be the same under Basic Multilingual Plane (BMP)\r\nCharacters: ranging from 1-byte (ASCII) to 3-bytes (East Asian) per character. So a max of 24-bytes for an East Asian 8 character string.", + "metadata": {} }, { "cell_type": "code", - "source": [ - "DROP TABLE IF EXISTS t1;\r\n", - "CREATE TABLE t1 (c1 varchar(24) COLLATE Latin1_General_100_CI_AI, \r\n", - "\tc2 nvarchar(8) COLLATE Latin1_General_100_CI_AI); \r\n", - "INSERT INTO t1 VALUES (N'MyString', N'MyString') \r\n", - "SELECT LEN(c1) AS [varchar LEN], \r\n", - "\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\n", - "FROM t1; \r\n", - "SELECT LEN(c2) AS [nvarchar LEN], \r\n", - "\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\n", - "FROM t1;\r\n", - "GO" - ], - "metadata": { - "azdata_cell_guid": "4a7b199e-3117-4fcb-b149-776f4da6cf71" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nDROP TABLE IF EXISTS t1;\r\nCREATE TABLE t1 (c1 varchar(24) COLLATE Latin1_General_100_CI_AI, \r\n\tc2 nvarchar(8) COLLATE Latin1_General_100_CI_AI); \r\nINSERT INTO t1 VALUES (N'MyString', N'MyString') \r\nSELECT LEN(c1) AS [varchar LEN], \r\n\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\nFROM t1; \r\nSELECT LEN(c2) AS [nvarchar LEN], \r\n\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\nFROM t1;\r\nGO", + "metadata": {}, "outputs": [ { "output_type": "display_data", @@ -79,14 +52,13 @@ { "output_type": "display_data", "data": { - "text/html": "Total execution time: 00:00:00.068" + "text/html": "Total execution time: 00:00:00.1996267" }, "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 15, + "execution_count": 1, "data": { "application/vnd.dataresource+json": { "schema": { @@ -111,12 +83,12 @@ ] }, "text/html": "
varchar LENvarchar DATALENGTHc1
88MyString
" - } + }, + "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 15, + "execution_count": 1, "data": { "application/vnd.dataresource+json": { "schema": { @@ -141,47 +113,26 @@ ] }, "text/html": "
nvarchar LENnvarchar DATALENGTHc2
816MyString
" - } + }, + "metadata": {} } ], "execution_count": 15 }, { "cell_type": "markdown", - "source": [ - "That's as expected. So what was I talking about?" - ], - "metadata": { - "azdata_cell_guid": "8615ddba-64e7-4abc-9df6-ec5648f39788" - } + "source": "That's as expected on bothe cases. So what was I talking about?\r\n\r\nRun next example with Chinese characters.", + "metadata": {} }, { "cell_type": "markdown", - "source": [ - "# Test Chinese character strings with Latin collation" - ], - "metadata": { - "azdata_cell_guid": "4a85f77d-fd22-46a6-b7aa-5d6fca65dd99" - } + "source": "# Test Chinese character strings with Latin collation", + "metadata": {} }, { "cell_type": "code", - "source": [ - "DROP TABLE IF EXISTS t1;\r\n", - "CREATE TABLE t1 (c1 varchar(24) COLLATE Latin1_General_100_CI_AI, \r\n", - "\tc2 nvarchar(8) COLLATE Latin1_General_100_CI_AI); \r\n", - "INSERT INTO t1 VALUES (N'敏捷的棕色狐狸跳', N'敏捷的棕色狐狸跳') \r\n", - "SELECT LEN(c1) AS [varchar LEN], \r\n", - "\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\n", - "FROM t1; \r\n", - "SELECT LEN(c2) AS [nvarchar LEN], \r\n", - "\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\n", - "FROM t1;\r\n", - "GO" - ], - "metadata": { - "azdata_cell_guid": "f5d3d422-588c-4cc9-9bbd-2664b392b0fb" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nDROP TABLE IF EXISTS t1;\r\nCREATE TABLE t1 (c1 varchar(24) COLLATE Latin1_General_100_CI_AI, \r\n\tc2 nvarchar(8) COLLATE Latin1_General_100_CI_AI); \r\nINSERT INTO t1 VALUES (N'敏捷的棕色狐狸跳', N'敏捷的棕色狐狸跳') \r\nSELECT LEN(c1) AS [varchar LEN], \r\n\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\nFROM t1; \r\nSELECT LEN(c2) AS [nvarchar LEN], \r\n\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\nFROM t1;\r\nGO", + "metadata": {}, "outputs": [ { "output_type": "display_data", @@ -213,7 +164,6 @@ }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 16, "data": { "application/vnd.dataresource+json": { @@ -239,11 +189,11 @@ ] }, "text/html": "
varchar LENvarchar DATALENGTHc1
88????????
" - } + }, + "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 16, "data": { "application/vnd.dataresource+json": { @@ -269,32 +219,29 @@ ] }, "text/html": "
nvarchar LENnvarchar DATALENGTHc2
816敏捷的棕色狐狸跳
" - } + }, + "metadata": {} } ], "execution_count": 16 }, { "cell_type": "markdown", - "source": [ - "uh-oh data loss on the varchar example. Why?\r\n", - "\r\n", - "varchar is bound to code page enconding, and these code points cannot be found in the Latin code page." - ], - "metadata": { - "azdata_cell_guid": "d77295e2-75eb-487e-861e-ca1634b90740" - } + "source": "uh-oh data loss on the varchar example. Why?\r\n\r\nVarchar is bound to code page encoding by default, and these code points cannot be found in the Latin code page.\r\n\r\nBut why didn't it happen in the nvarchar example? \r\n\r\nThese Chinese characters are double-byte and within the *Basic Multilingual Plane* (BMP), and nvarchar with this non-SC collation encodes in UCS-2 (BMP), not the code page.\r\n\r\nRun the next example:", + "metadata": {} }, { "cell_type": "code", - "source": [ - "SELECT ASCII('敏' COLLATE Latin1_General_100_CI_AI), CHAR(63)\r\n", - "SELECT ASCII('捷' COLLATE Latin1_General_100_CI_AI), CHAR(63)" - ], - "metadata": { - "azdata_cell_guid": "9dd9bce0-c073-42ec-9faa-8ebc142fd025" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nSELECT ASCII('敏' COLLATE Latin1_General_100_CI_AI), CHAR(63);\r\nSELECT ASCII('捷' COLLATE Latin1_General_100_CI_AI), CHAR(63);", + "metadata": {}, "outputs": [ + { + "output_type": "display_data", + "data": { + "text/html": "Commands completed successfully." + }, + "metadata": {} + }, { "output_type": "display_data", "data": { @@ -312,14 +259,13 @@ { "output_type": "display_data", "data": { - "text/html": "Total execution time: 00:00:00.046" + "text/html": "Total execution time: 00:00:00.017" }, "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 3, + "execution_count": 4, "data": { "application/vnd.dataresource+json": { "schema": { @@ -340,12 +286,12 @@ ] }, "text/html": "
(No column name)(No column name)
63?
" - } + }, + "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 3, + "execution_count": 4, "data": { "application/vnd.dataresource+json": { "schema": { @@ -366,34 +312,29 @@ ] }, "text/html": "
(No column name)(No column name)
63?
" - } + }, + "metadata": {} } ], - "execution_count": 3 + "execution_count": 4 }, { "cell_type": "markdown", - "source": [ - "But why didn't it happen in the nvarchar example?\r\n", - "\r\n", - "These Chinese characters are double-byte and within the *Basic Multilingual Plane* (BMP)\r\n", - "\r\n", - "nvarchar with this non-SC collation encodes in UCS-2 (BMP), not the code page" - ], - "metadata": { - "azdata_cell_guid": "75416bff-a350-4f27-9de5-7b407b59ac81" - } + "source": "The ASCII function returns the ASCII code value of the leftmost character of a character expression. We know the Latin code page that's chosen can't represent a double-byte character, so it can only read the first byte, which is incorrectly translated to code point 63. Using the CHAR function, we see that the 63 code point is a question mark character. \r\n\r\nRun the next example:", + "metadata": {} }, { "cell_type": "code", - "source": [ - "SELECT UNICODE(N'敏' COLLATE Latin1_General_100_CI_AI), NCHAR(25935)\r\n", - "SELECT UNICODE(N'捷' COLLATE Latin1_General_100_CI_AI), NCHAR(25463)" - ], - "metadata": { - "azdata_cell_guid": "ffed888f-da51-4cad-a88e-b0ccf2a38f10" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nSELECT UNICODE(N'敏' COLLATE Latin1_General_100_CI_AI), NCHAR(25935);\r\nSELECT UNICODE(N'捷' COLLATE Latin1_General_100_CI_AI), NCHAR(25463);", + "metadata": {}, "outputs": [ + { + "output_type": "display_data", + "data": { + "text/html": "Commands completed successfully." + }, + "metadata": {} + }, { "output_type": "display_data", "data": { @@ -411,13 +352,12 @@ { "output_type": "display_data", "data": { - "text/html": "Total execution time: 00:00:00.021" + "text/html": "Total execution time: 00:00:00.024" }, "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 5, "data": { "application/vnd.dataresource+json": { @@ -439,11 +379,11 @@ ] }, "text/html": "
(No column name)(No column name)
25935
" - } + }, + "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 5, "data": { "application/vnd.dataresource+json": { @@ -465,133 +405,26 @@ ] }, "text/html": "
(No column name)(No column name)
25463
" - } + }, + "metadata": {} } ], "execution_count": 5 }, { "cell_type": "markdown", - "source": [ - "Irrespective of collation now. With a Unicode capable data type, collation only sets linguistic algorithms (Compare = sort; Case sensitivity = Upper/Lowercase)" - ], - "metadata": { - "azdata_cell_guid": "d6db32d2-033f-4800-a492-3494b65dbc36" - } - }, - { - "cell_type": "code", - "source": [ - "SELECT UNICODE(N'敏' COLLATE Chinese_PRC_90_CI_AI), NCHAR(25935)\r\n", - "SELECT UNICODE(N'捷' COLLATE Chinese_PRC_90_CI_AI), NCHAR(25463)" - ], - "metadata": { - "azdata_cell_guid": "ba6107ed-50d8-4e3f-8e59-3eb1cb56e983" - }, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": "(1 row affected)" - }, - "metadata": {} - }, - { - "output_type": "display_data", - "data": { - "text/html": "(1 row affected)" - }, - "metadata": {} - }, - { - "output_type": "display_data", - "data": { - "text/html": "Total execution time: 00:00:00.039" - }, - "metadata": {} - }, - { - "output_type": "execute_result", - "metadata": {}, - "execution_count": 9, - "data": { - "application/vnd.dataresource+json": { - "schema": { - "fields": [ - { - "name": "(No column name)" - }, - { - "name": "(No column name)" - } - ] - }, - "data": [ - { - "0": "25935", - "1": "敏" - } - ] - }, - "text/html": "
(No column name)(No column name)
25935
" - } - }, - { - "output_type": "execute_result", - "metadata": {}, - "execution_count": 9, - "data": { - "application/vnd.dataresource+json": { - "schema": { - "fields": [ - { - "name": "(No column name)" - }, - { - "name": "(No column name)" - } - ] - }, - "data": [ - { - "0": "25463", - "1": "捷" - } - ] - }, - "text/html": "
(No column name)(No column name)
25463
" - } - } - ], - "execution_count": 9 + "source": "Works irrespective of collation now. By adding the N prefix we force the use of a [Unicode constant](https://docs.microsoft.com/sql/t-sql/data-types/constants-transact-sql#unicode-strings), and collation only sets linguistic algorithms (Compare = sort; Case sensitivity = Upper/Lowercase), not the encoding. Using the UNICODE function, we can correctly identify the code points for the string characters, which the NCHAR function can represent accurately.", + "metadata": {} }, { "cell_type": "markdown", - "source": [ - "## Now test Chinese character strings with Chinese collation" - ], - "metadata": { - "azdata_cell_guid": "041d9858-808d-4a6b-9bc7-302feddf4036" - } + "source": "## Now test Chinese character strings with Chinese collation", + "metadata": {} }, { "cell_type": "code", - "source": [ - "DROP TABLE IF EXISTS t2;\r\n", - "CREATE TABLE t2 (c1 varchar(24) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI, \r\n", - "\tc2 nvarchar(8) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI); \r\n", - "INSERT INTO t2 VALUES (N'敏捷的棕色狐狸跳', N'敏捷的棕色狐狸跳') \r\n", - "SELECT LEN(c1) AS [varchar LEN], \r\n", - "\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\n", - "FROM t2; \r\n", - "SELECT LEN(c2) AS [nvarchar LEN], \r\n", - "\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\n", - "FROM t2;\r\n", - "GO" - ], - "metadata": { - "azdata_cell_guid": "d8fecb5c-9120-46b5-b34c-d75fc8664a80" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nDROP TABLE IF EXISTS t2;\r\nCREATE TABLE t2 (c1 varchar(24) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI, \r\n\tc2 nvarchar(8) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI); \r\nINSERT INTO t2 VALUES (N'敏捷的棕色狐狸跳', N'敏捷的棕色狐狸跳') \r\nSELECT LEN(c1) AS [varchar LEN], \r\n\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\nFROM t2; \r\nSELECT LEN(c2) AS [nvarchar LEN], \r\n\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\nFROM t2;\r\nGO", + "metadata": {}, "outputs": [ { "output_type": "display_data", @@ -623,7 +456,6 @@ }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 17, "data": { "application/vnd.dataresource+json": { @@ -649,11 +481,11 @@ ] }, "text/html": "
varchar LENvarchar DATALENGTHc1
816敏捷的棕色狐狸跳
" - } + }, + "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 17, "data": { "application/vnd.dataresource+json": { @@ -679,57 +511,31 @@ ] }, "text/html": "
nvarchar LENnvarchar DATALENGTHc2
816敏捷的棕色狐狸跳
" - } + }, + "metadata": {} } ], "execution_count": 17 }, { "cell_type": "markdown", - "source": [ - "Now the varchar example is correct. But there's 2 bytes per character?...\r\n", - "\r\n", - "**Myth buster:** code page defines string length for varchar. It's not always 1 byte per character. \r\n", - "\r\n", - "Wasn't East-Asian 3 bytes? Yes, on UTF-8, but under Chinese collation code page, they are encoded using 2 bytes just like UCS-2/UTF-16\r\n", - "" - ], - "metadata": { - "azdata_cell_guid": "0bb36f33-1fb1-499e-97a9-a071f5332eba" - } + "source": "Now the varchar example is correct because the code page can recognize Chinese characters. But there's 2 bytes per character, not 3?...\r\n\r\n**Myth buster:** code page defines string length for varchar. Varchar is **not** always 1 byte per character. \r\n\r\nOk, but wasn't East-Asian 3 bytes? Yes, with UTF-8, but under Chinese collation code page, they are encoded using 2 bytes just like UCS-2/UTF-16\r\n", + "metadata": {} }, { "cell_type": "markdown", - "source": [ - "## Test with Supplementary Characters (4 bytes)" - ], - "metadata": { - "azdata_cell_guid": "cdc78270-6de2-4bb9-9c49-8ac7aae92b8b" - } + "source": "## Test with Supplementary Characters (4 bytes)", + "metadata": {} }, { "cell_type": "code", - "source": [ - "DROP TABLE IF EXISTS t2;\r\n", - "CREATE TABLE t2 (c1 varchar(24) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC, \r\n", - "\tc2 nvarchar(8) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC); \r\n", - "INSERT INTO t2 VALUES (N'👶👦👧👨👩👴👵👨', N'👶👦👧👨👩👴👵👨') \r\n", - "SELECT LEN(c1) AS [varchar LEN], \r\n", - "\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\n", - "FROM t2; \r\n", - "SELECT LEN(c2) AS [nvarchar LEN], \r\n", - "\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\n", - "FROM t2;\r\n", - "GO" - ], - "metadata": { - "azdata_cell_guid": "c8fa69ca-590b-414c-88eb-d4892816d324" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nDROP TABLE IF EXISTS t2;\r\nCREATE TABLE t2 (c1 varchar(24) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC, \r\n\tc2 nvarchar(8) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC); \r\nINSERT INTO t2 VALUES (N'👶👦👧👨👩👴👵👨', N'👶👦👧👨👩👴👵👨') \r\nSELECT LEN(c1) AS [varchar LEN], \r\n\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\nFROM t2; \r\nSELECT LEN(c2) AS [nvarchar LEN], \r\n\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\nFROM t2;\r\nGO", + "metadata": {}, "outputs": [ { "output_type": "error", - "evalue": "Msg 2628, Level 16, State 1, Line 4\r\nString or binary data would be truncated in table 'master.dbo.t2', column 'c2'. Truncated value: '👶👦👧👨'.", "ename": "", + "evalue": "Msg 2628, Level 16, State 1, Line 4\r\nString or binary data would be truncated in table 'master.dbo.t2', column 'c2'. Truncated value: '👶👦👧👨'.", "traceback": [] }, { @@ -762,7 +568,6 @@ }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 20, "data": { "application/vnd.dataresource+json": { @@ -782,11 +587,11 @@ "data": [] }, "text/html": "
varchar LENvarchar DATALENGTHc1
" - } + }, + "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 20, "data": { "application/vnd.dataresource+json": { @@ -806,38 +611,21 @@ "data": [] }, "text/html": "
nvarchar LENnvarchar DATALENGTHc2
" - } + }, + "metadata": {} } ], "execution_count": 20 }, { "cell_type": "markdown", - "source": [ - "uh-oh, let's set the proper data type length" - ], - "metadata": { - "azdata_cell_guid": "0c643441-2b73-4880-82d7-0b019c14416c" - } + "source": "uh-oh, let's set the proper data type length from 8 to 16 byte-pairs (so a 32-byte encoding limit)", + "metadata": {} }, { "cell_type": "code", - "source": [ - "DROP TABLE IF EXISTS t2;\r\n", - "CREATE TABLE t2 (c1 varchar(24) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC, \r\n", - "\tc2 nvarchar(16) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC); \r\n", - "INSERT INTO t2 VALUES (N'👶👦👧👨👩👴👵👨', N'👶👦👧👨👩👴👵👨') \r\n", - "SELECT LEN(c1) AS [varchar LEN], \r\n", - "\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\n", - "FROM t2; \r\n", - "SELECT LEN(c2) AS [nvarchar LEN], \r\n", - "\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\n", - "FROM t2;\r\n", - "GO" - ], - "metadata": { - "azdata_cell_guid": "ba341c74-d2ca-4477-82f2-0c39bcc38af7" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nDROP TABLE IF EXISTS t2;\r\nCREATE TABLE t2 (c1 varchar(24) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC, \r\n\tc2 nvarchar(16) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC); \r\nINSERT INTO t2 VALUES (N'👶👦👧👨👩👴👵👨', N'👶👦👧👨👩👴👵👨') \r\nSELECT LEN(c1) AS [varchar LEN], \r\n\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\nFROM t2; \r\nSELECT LEN(c2) AS [nvarchar LEN], \r\n\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\nFROM t2;\r\nGO", + "metadata": {}, "outputs": [ { "output_type": "display_data", @@ -869,7 +657,6 @@ }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 21, "data": { "application/vnd.dataresource+json": { @@ -895,11 +682,11 @@ ] }, "text/html": "
varchar LENvarchar DATALENGTHc1
1616????????????????
" - } + }, + "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 21, "data": { "application/vnd.dataresource+json": { @@ -925,40 +712,29 @@ ] }, "text/html": "
nvarchar LENnvarchar DATALENGTHc2
832👶👦👧👨👩👴👵👨
" - } + }, + "metadata": {} } ], "execution_count": 21 }, { "cell_type": "markdown", - "source": [ - "\r\n", - "Varchar still doesn't encode? " - ], - "metadata": { - "azdata_cell_guid": "d062a6e7-2a91-48d4-b81b-0bfb530df450" - } + "source": "Nvarchar looks good. But varchar still doesn't encode? \r\n\r\nSet a larger data type length. For example double from 24 to 48 bytes. Now try again:", + "metadata": {} }, { "cell_type": "code", - "source": [ - "DROP TABLE IF EXISTS t2;\r\n", - "CREATE TABLE t2 (c1 varchar(48) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC_UTF8, \r\n", - "\tc2 nvarchar(16) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC); \r\n", - "INSERT INTO t2 VALUES (N'👶👦👧👨👩👴👵👨', N'👶👦👧👨👩👴👵👨') \r\n", - "SELECT LEN(c1) AS [varchar LEN], \r\n", - "\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\n", - "FROM t2; \r\n", - "SELECT LEN(c2) AS [nvarchar LEN], \r\n", - "\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\n", - "FROM t2;\r\n", - "GO" - ], - "metadata": { - "azdata_cell_guid": "d8082437-485c-4c9d-84ca-16acd6e63849" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nDROP TABLE IF EXISTS t2;\r\nCREATE TABLE t2 (c1 varchar(48) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC_UTF8, \r\n\tc2 nvarchar(16) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC); \r\nINSERT INTO t2 VALUES (N'👶👦👧👨👩👴👵👨', N'👶👦👧👨👩👴👵👨') \r\nSELECT LEN(c1) AS [varchar LEN], \r\n\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\nFROM t2; \r\nSELECT LEN(c2) AS [nvarchar LEN], \r\n\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\nFROM t2;\r\nGO", + "metadata": {}, "outputs": [ + { + "output_type": "display_data", + "data": { + "text/html": "Commands completed successfully." + }, + "metadata": {} + }, { "output_type": "display_data", "data": { @@ -983,14 +759,13 @@ { "output_type": "display_data", "data": { - "text/html": "Total execution time: 00:00:00.071" + "text/html": "Total execution time: 00:00:00.033" }, "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 22, + "execution_count": 3, "data": { "application/vnd.dataresource+json": { "schema": { @@ -1015,12 +790,12 @@ ] }, "text/html": "
varchar LENvarchar DATALENGTHc1
832👶👦👧👨👩👴👵👨
" - } + }, + "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 22, + "execution_count": 3, "data": { "application/vnd.dataresource+json": { "schema": { @@ -1045,36 +820,21 @@ ] }, "text/html": "
nvarchar LENnvarchar DATALENGTHc2
832👶👦👧👨👩👴👵👨
" - } + }, + "metadata": {} } ], - "execution_count": 22 + "execution_count": 3 }, { "cell_type": "markdown", - "source": [ - "Finally!\r\n", - "\r\n", - "What if I needed all these in one database? Easy, I could just use nvarchar." - ], - "metadata": { - "azdata_cell_guid": "544ee63a-67fa-4b24-b974-4fa4e809949c" - } + "source": "Finally!\r\n\r\nWhat if I needed all these characters in one database? Easy, I could just use nvarchar which encodes in UTF-16.", + "metadata": {} }, { "cell_type": "code", - "source": [ - "DROP TABLE IF EXISTS t3;\r\n", - "CREATE TABLE t3 (c1 nvarchar(110) COLLATE Latin1_General_100_CI_AI_SC); \r\n", - "INSERT INTO t3 VALUES (N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii敏捷的棕色狐狸跳👶👦') \r\n", - "SELECT LEN(c1) AS [nvarchar UTF16 LEN], \r\n", - "\tDATALENGTH(c1) AS [nvarchar UTF16 DATALENGTH], c1\r\n", - "FROM t3; \r\n", - "GO" - ], - "metadata": { - "azdata_cell_guid": "87e6c383-d9ab-48da-a4d7-f1cc0cf3aee3" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nDROP TABLE IF EXISTS t3;\r\nCREATE TABLE t3 (c1 nvarchar(110) COLLATE Latin1_General_100_CI_AI_SC); \r\nINSERT INTO t3 VALUES (N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii敏捷的棕色狐狸跳👶👦') \r\nSELECT LEN(c1) AS [nvarchar UTF16 LEN], \r\n\tDATALENGTH(c1) AS [nvarchar UTF16 DATALENGTH], c1\r\nFROM t3; \r\nGO", + "metadata": {}, "outputs": [ { "output_type": "display_data", @@ -1099,7 +859,6 @@ }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 23, "data": { "application/vnd.dataresource+json": { @@ -1125,35 +884,29 @@ ] }, "text/html": "
nvarchar UTF16 LENnvarchar UTF16 DATALENGTHc1
65134MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii敏捷的棕色狐狸跳👶👦
" - } + }, + "metadata": {} } ], "execution_count": 23 }, { "cell_type": "markdown", - "source": [ - "But the majority of my data is set to Latin (ASCII)" - ], - "metadata": { - "azdata_cell_guid": "808dc693-ca7b-4ee5-b71f-9cf9cbcef31f" - } + "source": "But wait. The majority of my data is set to Latin (ASCII), can we do better?", + "metadata": {} }, { "cell_type": "code", - "source": [ - "DROP TABLE IF EXISTS t4;\r\n", - "CREATE TABLE t4 (c1 varchar(110) COLLATE Latin1_General_100_CI_AI_SC); \r\n", - "INSERT INTO t4 VALUES (N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii敏捷的棕色狐狸跳👶👦') \r\n", - "SELECT LEN(c1) AS [varchar UTF16 LEN], \r\n", - "\tDATALENGTH(c1) AS [varchar UTF16 DATALENGTH], c1\r\n", - "FROM t4; \r\n", - "GO" - ], - "metadata": { - "azdata_cell_guid": "8597dfb2-ec28-4c82-865a-ec7a8d01c663" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nDROP TABLE IF EXISTS t4;\r\nCREATE TABLE t4 (c1 varchar(110) COLLATE Latin1_General_100_CI_AI_SC_UTF8); \r\nINSERT INTO t4 VALUES (N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii敏捷的棕色狐狸跳👶👦') \r\nSELECT LEN(c1) AS [varchar UTF8 LEN], \r\n\tDATALENGTH(c1) AS [varchar UTF8 DATALENGTH], c1\r\nFROM t4; \r\nGO", + "metadata": {}, "outputs": [ + { + "output_type": "display_data", + "data": { + "text/html": "Commands completed successfully." + }, + "metadata": {} + }, { "output_type": "display_data", "data": { @@ -1171,23 +924,22 @@ { "output_type": "display_data", "data": { - "text/html": "Total execution time: 00:00:00.013" + "text/html": "Total execution time: 00:00:00.253" }, "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 24, + "execution_count": 1, "data": { "application/vnd.dataresource+json": { "schema": { "fields": [ { - "name": "varchar UTF16 LEN" + "name": "varchar UTF8 LEN" }, { - "name": "varchar UTF16 DATALENGTH" + "name": "varchar UTF8 DATALENGTH" }, { "name": "c1" @@ -1196,42 +948,36 @@ }, "data": [ { - "0": "67", - "1": "67", - "2": "MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii????????????" + "0": "65", + "1": "87", + "2": "MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii敏捷的棕色狐狸跳👶👦" } ] }, - "text/html": "
varchar UTF16 LENvarchar UTF16 DATALENGTHc1
6767MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii????????????
" - } + "text/html": "
varchar UTF8 LENvarchar UTF8 DATALENGTHc1
6587MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii敏捷的棕色狐狸跳👶👦
" + }, + "metadata": {} } ], - "execution_count": 24 + "execution_count": 1 }, { "cell_type": "markdown", - "source": [ - "Where are the savings?" - ], - "metadata": { - "azdata_cell_guid": "e8d09b41-c69d-43de-8b67-43ad7e25bb03" - } + "source": "With this data pattern the savings are obvious. Where are the savings? Let's compare breaking down to individual Latin, Chinese, and Emoji strings.", + "metadata": {} }, { "cell_type": "code", - "source": [ - "SELECT DATALENGTH(N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii') AS [Latin_UTF16_2bytes], \r\n", - "\tDATALENGTH(N'敏捷的棕色狐狸跳') AS [Chinese_UTF16_2bytes], \r\n", - "\tDATALENGTH(N'👶👦') AS [SC_UTF16_4bytes]\r\n", - "SELECT DATALENGTH('MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [Latin_UTF8_1byte], \r\n", - "\tDATALENGTH('敏捷的棕色狐狸跳' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [Chinese_UTF8_3bytes], \r\n", - "\tDATALENGTH('👶👦' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [SC_UTF8_4bytes]\r\n", - "GO" - ], - "metadata": { - "azdata_cell_guid": "79351524-1cba-412a-8111-2cc93871612d" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nSELECT DATALENGTH(N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii') AS [Latin_UTF16_2bytes], \r\n\tDATALENGTH(N'敏捷的棕色狐狸跳') AS [Chinese_UTF16_2bytes], \r\n\tDATALENGTH(N'👶👦') AS [SC_UTF16_4bytes]\r\nSELECT DATALENGTH('MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [Latin_UTF8_1byte], \r\n\tDATALENGTH('敏捷的棕色狐狸跳' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [Chinese_UTF8_3bytes], \r\n\tDATALENGTH('👶👦' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [SC_UTF8_4bytes]\r\nGO", + "metadata": {}, "outputs": [ + { + "output_type": "display_data", + "data": { + "text/html": "Commands completed successfully." + }, + "metadata": {} + }, { "output_type": "display_data", "data": { @@ -1249,14 +995,13 @@ { "output_type": "display_data", "data": { - "text/html": "Total execution time: 00:00:00.043" + "text/html": "Total execution time: 00:00:00.024" }, "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 25, + "execution_count": 2, "data": { "application/vnd.dataresource+json": { "schema": { @@ -1281,12 +1026,12 @@ ] }, "text/html": "
Latin_UTF16_2bytesChinese_UTF16_2bytesSC_UTF16_4bytes
110168
" - } + }, + "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 25, + "execution_count": 2, "data": { "application/vnd.dataresource+json": { "schema": { @@ -1305,16 +1050,17 @@ "data": [ { "0": "55", - "1": "8", - "2": "4" + "1": "24", + "2": "8" } ] }, - "text/html": "
Latin_UTF8_1byteChinese_UTF8_3bytesSC_UTF8_4bytes
5584
" - } + "text/html": "
Latin_UTF8_1byteChinese_UTF8_3bytesSC_UTF8_4bytes
55248
" + }, + "metadata": {} } ], - "execution_count": 25 + "execution_count": 2 } ] } \ No newline at end of file diff --git a/samples/manage/azure-arc-enabled-sql-server/README.md b/samples/manage/azure-arc-enabled-sql-server/README.md new file mode 100644 index 00000000..b0aa6a5f --- /dev/null +++ b/samples/manage/azure-arc-enabled-sql-server/README.md @@ -0,0 +1,30 @@ +--- +services: Azure Arc enabled SQL Server +platforms: Azure +author: anosov1960 +ms.author: sashan +ms.date: 12/08/2020 +--- + +# Running the script using Cloud Shell + +Use the following steps to migrate your existing SQL Server - Azure Arc resources from Microsoft.AzureData namespace to Microsoft.AzureArcData namespace. + +1. Launch the [Cloud Shell](https://shell.azure.com/). For details, [read more about PowerShell in Cloud Shell](https://aka.ms/pscloudshell/docs). + +2. Upload the script to the shell using the following command: + + ```console + curl https://raw.githubusercontent.com/microsoft/sql-server-samples/master/samples/manage/azure-arc-enabled-sql-server/migrate-to-azure-arc-data.ps1 -o migrate-to-azure-arc-data.ps1 + ``` + +3. Run the script. + + ```console + ./migrate-to-azure-arc-data.ps1 + ``` + +> [!NOTE] +> - To paste the commands into the shell, use `Ctrl-Shift-V` on Windows or `Cmd-v` on MacOS. +> - The script will be uploaded directly to the home folder associated with your Cloud Shell session. +> - The script will prompt for the resource group name and print a message when migration is completed. diff --git a/samples/manage/azure-arc-enabled-sql-server/migrate-to-azure-arc-data.ps1 b/samples/manage/azure-arc-enabled-sql-server/migrate-to-azure-arc-data.ps1 new file mode 100644 index 00000000..a4521a1d --- /dev/null +++ b/samples/manage/azure-arc-enabled-sql-server/migrate-to-azure-arc-data.ps1 @@ -0,0 +1,50 @@ +# ---------------------------------------------------------------------------------- +# +# Copyright Microsoft Corporation +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# --------------------------------------------------------------------------------- +# +# Sample script for migrating the existing SQL Server - Azure Arc resources from Microsoft.AzureData namespace to Microsoft.AzureArcData namespace +# within a single Resource Group +# + +$ResourceGroup=read-host -Prompt "Enter Resource Group Name" + +$SqlArcResources = Get-AzResource -ExpandProperties -ResourceType Microsoft.AzureData/sqlServerInstances -ResourceGroupName $ResourceGroup +foreach ($r in $SqlArcResources) { + Write-Host ("Migrating resource: {0}" -f $r.Name) + + if ( ! ($r.Properties.containerResourceId -match "Microsoft.HybridCompute/machines") ) { + $arcResource = Get-AzResource -ResourceType Microsoft.HybridCompute/machines -Name $r.Properties.containerResourceId + if($null -eq $arcResource) { + Write-Warning ("Could not locate the Machine - Azure Arc resource associated with this SQL Server Instance. You should manually un-register and re-register this instance.") + continue + } else { + $r.Properties.containerResourceId = $arcResource.ResourceId + } + } + + if( $null -ne $r.Properties.tcpPorts ){ + Write-Warning "The property `"tcpPorts`" has been renamed to `"tcpStaticPorts`". The property name will be updated during resource migration." + $r.Properties | Add-Member -MemberType NoteProperty -Name "tcpStaticPorts" -Value $r.Properties.tcpPorts + $r.Properties.psobject.properties.remove("tcpPorts") + } + + if( $null -ne $r.Properties.createTime ){ + Write-Warning "There is a known bug in the createTime property. This property will be removed during resource migration." + $r.Properties.psobject.properties.remove("createTime") + } + + New-AzResource -ResourceName $r.Name -Location $r.Location -Properties $r.Properties -ResourceGroupName $r.ResourceGroupName ` + -ResourceType Microsoft.AzureArcData/sqlServerInstances -Force +} + +Write-Host "Namespace migration completed for SQL Server - Azure Arc resources." diff --git a/samples/manage/azure-hybrid-benefit/README.md b/samples/manage/azure-hybrid-benefit/README.md new file mode 100644 index 00000000..b48286bf --- /dev/null +++ b/samples/manage/azure-hybrid-benefit/README.md @@ -0,0 +1,61 @@ +--- +services: Azure SQL +platforms: Azure +author: anosov1960 +ms.author: sashan +ms.date: 12/17/2020 +--- + +# Overview + +This script is provided to help you manage the SQL Server licenses that are consumed by the SQL Servers deployed to Azure. The script writes the results to a `sql-license-usage.csv` file. If the file with this name already exists, the new results will be appended to it. The report includes the following information for each scanned subscription as well as the totals for each category. +| **Category** | **Description** | +|:--|:--| +|Date|Date of the scan| +|Time|Time of the scan| +|Subscription name|The name of the subscription| +|Subscription ID|The unique subscription ID| +|AHB Std vCores|Total vCores used by General Purpose service tier or SQL Server Standard edition billed with AHB discount| +|AHB Ent vCores|Total vCores used by Business Critical service tier or SQL Server Enterprise edition billed with AHB discount| +|PAYG Std vCores|Total vCores used by General Purpose service tier or SQL Server Standard edition billed at full price| +|PAYG Ent vCores|Total vCores used by Business Critical service tier or SQL Server Enterprise edition billed at full price| +|HADR Std vCores|Total vCores used by HADR replicas running SQL Server Standard edition| +|HADR Ent vCores|Total vCores used by HADR replicas running SQL Server Enterprise edition| +|Developer vCores|Total vCores used by SQL Server Developer edition| +|Express vCores|Total vCores used by SQL Server Express edition| + +>[!NOTE] +> - The usage data is a snapshot at the time of the script execution based on the size of the deployed SQL resources in vCores. +> - For IaaS workloads, such as SQL Server in Virtual Machines or SSIS integration runtimes, each vCPU is counted as one vCore. +> - For PaaS workloads, each vCore of Business Critical service tier is counted as one Enterprise vCore and each vCore of General Purpose service tier is counted as one Standard vCore. + +# Running the script using Cloud Shell + +Use the following steps to calculate the SQL Server license usage: + +1. Launch the [Cloud Shell](https://shell.azure.com/). For details, read [PowerShell in Cloud Shell](https://aka.ms/pscloudshell/docs). + +2. Upload the script to the shell using the following command: + + ```console + curl https://raw.githubusercontent.com/microsoft/sql-server-samples/master/samples/manage/azure-hybrid-benefit/sql-license-usage.ps1 -o sql-license-usage.ps1 + ``` + +3. Run the script with a specific subscriptions ID or the file name as the parameter. The file should be used if you need to scan a subset of the subscriptions. If the parameter is not specified, the script will scan all the subscriptions in your account. + + ```console + ./sql-license-usage.ps1 or .csv + ``` + +If the a file is specified, it must be a `.csv` file with the list of subscriptions. To create a file containing all subscriptions in your account, use the following command. You can then edit the file to remove the subscriptions you don't want to scan. + + ```console + Get-AzSubscription | Export-Csv .\mysubscriptions.csv -NoTypeInformation + ``` +> [!NOTE] +> - To paste the commands into the shell, use `Ctrl-Shift-V` on Windows or `Cmd-v` on MacOS. +> - The `curl` command will copy the script directly to the home folder associated with your Cloud Shell session. + +# Tracking SQL license usage over time + +You can track your license utilization over time by periodically running this script. Each new scan will add the results to `sql-license-usage.csv`, which you can use for reporting the license usage over time in Excel or other tools. To run this script on schedule using Azure automation, read [Create a PowerShell runbook tutorial](https://docs.microsoft.com/azure/automation/learn/automation-tutorial-runbook-textual-powershell). diff --git a/samples/manage/azure-hybrid-benefit/ahb-usage-in-subscription.ps1 b/samples/manage/azure-hybrid-benefit/ahb-usage-in-subscription.ps1 new file mode 100644 index 00000000..1ddf8865 --- /dev/null +++ b/samples/manage/azure-hybrid-benefit/ahb-usage-in-subscription.ps1 @@ -0,0 +1,112 @@ +# ---------------------------------------------------------------------------------- +# +# Copyright Microsoft Corporation +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# --------------------------------------------------------------------------------- +# +# This script calculates the usage of different types of SQL Server licenses by the SQL resources +# in the specific subscriptions. +# +# NOTE: +# 1. The script requires a .csv file with the list of subscriptions. Use Export-Csv comlet to create the file. +# 2. SQL Database resources that use the DTU based business model are excluded. +# + +# Set the subscription Id +$SubcriptionId = read-host -Prompt "Enter Subscription ID" +Set-AzContext -SubscriptionId $SubcriptionId + +# Variables to keep track of SQL VMs and VCPUs count +$total_std_vcores = 0 +$total_ent_vcores = 0 + +#Get all SQL databases in the subscription +$databases = Get-AzSqlServer | Get-AzSqlDatabase + +# Get the databases with License Included and add to VCore count +foreach ($db in $databases){ + if (($db.SkuName -ne "ElasticPool") -and ($db.LicenseType -eq "LicenseIncluded")) { + if ($db.Edition -eq "BusinessCritical") { + $total_ent_vcores += $db.Capacity + } elseif ($db.Edition -eq "GeneralPurpose") { + $total_std_vcores += $db.Capacity + } + } +} + +#Get all SQL elastic pools in the subscription +$pools = Get-AzSqlServer | Get-AzSqlElasticPool + +# Get the elastic pools with License Included and and add to VCore count +foreach ($pool in $pools){ + if ($pool.LicenseType -eq "LicenseIncluded") { + if ($pool.Edition -eq "BusinessCritical") { + $total_ent_vcores += $pool.Capacity + } elseif ($pool.Edition -eq "GeneralPurpose") { + $total_std_vcores += $pool.Capacity + } + } +} + +#Get all SQL managed instances in the subscription +$instances = Get-AzSqlInstance + +# Get the SQL managed instances with License Included and add to VCore count +foreach ($ins in $instances){ + if (($ins.InstancePoolName -eq $null) -and ($ins.LicenseType -eq "LicenseIncluded")) { + if ($ins.Sku.Tier -eq "BusinessCritical") { + $total_ent_vcores += $ins.VCores + } elseif ($ins.Sku.Tier -eq "GeneralPurpose") { + $total_std_vcores += $ins.VCores + } + } +} + +#Get all instance pools in the subscription +$ipools = Get-AzSqlInstancePool + +# Get the instance pools with License Included and add to VCore count +foreach ($ip in $ipools){ + if ($ip.LicenseType -eq "LicenseIncluded") { + if ($ip.Edition -eq "BusinessCritical") { + $total_ent_vcores += $ip.VCores + } elseif ($ip.Edition -eq "GeneralPurpose") { + $total_std_vcores += $ip.VCores + } + } +} + +#Get All Sql VMs with AHB license configured +$sql_vms= Get-AzSqlVM | where {$_.LicenseType.Contains("AHUB")} + +# Get the VM size, match it with the corresponding VCPU count and add to VCore count +foreach ($sql_vm in $sql_vms){ + $vm = Get-AzVm -Name $sql_vm.Name -ResourceGroupName $sql_vm.ResourceGroupName + $vm_size = $vm.HardwareProfile.VmSize + # Select first size and get the VCPus available + $size_info = Get-AzComputeResourceSku | where {$_.ResourceType.Contains('virtualMachines') -and $_.Name -like $vm_size} | Select-Object -First 1 + # Save the VCPU count + $vcpu= $size_info.Capabilities | Where-Object {$_.name -eq "vCPUsAvailable"} + + if ($vcpu){ + $data = [pscustomobject]@{vm_resource_uri=$vm.Id;sku=$sql_vm.Sku;size=$vm_size;vcpus=$vcpu.value} + $array += $data + + if ($data.sku -like "Enterprise"){ + $total_ent_vcores += $data.vcpus + }elseif ($data.sku -like "Standard"){ + $total_std_vcores += $data.vcpus + } + } +} + +Write-Host "Total number of VCores for SQL Enterprise: " $total_ent_vcores +Write-Host "Total number of VCores for SQL Standard: " $total_std_vcores \ No newline at end of file diff --git a/samples/manage/azure-hybrid-benefit/sql-license-usage.ps1 b/samples/manage/azure-hybrid-benefit/sql-license-usage.ps1 new file mode 100644 index 00000000..24452f64 --- /dev/null +++ b/samples/manage/azure-hybrid-benefit/sql-license-usage.ps1 @@ -0,0 +1,263 @@ +# ---------------------------------------------------------------------------------- +# +# Copyright Microsoft Corporation +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# --------------------------------------------------------------------------------- +# +# Sample script to calculate the consolidated SQL Server license usage by all of the SQL resources in a specific subscription or the entire the account. +# +# This script accepts a .csv file or a subscription ID as a parameter. The file must include a list of subscriptions to be scanned for the license usage. You can create +# such a file by the following command and then edit to remove the subscriptions you don't want to scan: +# > Get-AzSubscription | Export-Csv .\mysubscriptions.csv -NoTypeInformation +# +# If no parameter is provided, the script will prompt for a file or subscriptiobn ID. If no value is provided, the scipt will scan all the subscriptions you account +# has access to. +# +# +# NOTE: The script does not calculate usage for Azure SQL resources that use the DTU-based purchasing model +# + +# Subscriptions to scan + +if ($args[0] -like "*.csv") { + $subscriptions = Import-Csv $args[0] +}elseif($args[0] -ne $null){ + $subscriptions = [PSCustomObject]@{SubscriptionId = $args[0]} | Get-AzSubscription +}else{ + $subscriptions = Get-AzSubscription +} + + +#Initialize tables and arrays + +[System.Collections.ArrayList]$usage = @() +if ($includeEC -eq $null){ + $usage += ,(@("Date", "Time", "Subscription Name", "Subscription ID", "AHB Std vCores", "AHB Ent vCores", "PAYG Std vCores", "PAYG Ent vCores", "HADR Std vCores", "HADR Ent vCores", "Developer vCores", "Express vCores")) +}else{ + $usage += ,(@("Date", "Time", "Subscription Name", "Subscription ID", "AHB ECs", "PAYG ECs", "AHB Std vCores", "AHB Ent vCores", "PAYG Std vCores", "PAYG Ent vCores", "HADR Std vCores", "HADR Ent vCores", "Developer vCores", "Express vCores")) +} + +$subtotal = [pscustomobject]@{ahb_std=0; ahb_ent=0; payg_std=0; payg_ent=0; hadr_std=0; hadr_ent=0; developer=0; express=0} +$total = [pscustomobject]@{} +$subtotal.psobject.properties.name | %{$total | Add-Member -MemberType NoteProperty -Name $_ -Value 0} + +#Save the VM SKU table for future use + +$VM_SKUs = Get-AzComputeResourceSku + +Write-Host ([Environment]::NewLine + "-- Scanning subscriptions --") + +# Calculate usage for each subscription + +foreach ($sub in $subscriptions){ + + if ($sub.State -ne "Enabled") {continue} + + try { + Set-AzContext -SubscriptionId $sub.Id + }catch { + write-host "Invalid subscription: " $sub.Id + {continue} + } + + # Reset the subtotals + $subtotal.psobject.properties.name | %{$subtotal.$_ = 0} + + #Get all logical servers + $servers = Get-AzSqlServer + + #Get all SQL database resources in the subscription + $databases = $servers | Get-AzSqlDatabase + + # Process the vCore-based databases + foreach ($db in $databases ){ + if ($db.SkuName -eq "ElasticPool") {continue} + + if ($db.LicenseType -eq "LicenseIncluded") { + if ($db.Edition -eq "BusinessCritical") { + $subtotal.ahb_ent += $db.Capacity + } elseif ($db.Edition -eq "GeneralPurpose") { + $subtotal.ahb_std += $db.Capacity + } + }else{ + if ($db.Edition -eq "BusinessCritical") { + $subtotal.payg_ent += $db.Capacity + } elseif ($db.Edition -eq "GeneralPurpose") { + $subtotal.payg_std += $db.Capacity + } + } + } + + #Get all SQL elastic pool resources in the subscription + $pools = $servers | Get-AzSqlElasticPool + + # Process the vCore-based elastic pools + foreach ($pool in $pools){ + if ($pool.LicenseType -eq "LicenseIncluded") { + if ($pool.Edition -eq "BusinessCritical") { + $subtotal.ahb_ent += $pool.Capacity + } elseif ($pool.Edition -eq "GeneralPurpose") { + $subtotal.ahb_std += $pool.Capacity + } + }else{ + if ($pool.Edition -eq "BusinessCritical") { + $subtotal.payg_ent += $pool.Capacity + } elseif ($pool.Edition -eq "GeneralPurpose") { + $subtotal.payg_std += $pool.Capacity + } + } + } + + #Get all SQL managed instance resources in the subscription + $instances = Get-AzSqlInstance + + # Process the SQL managed instances with License Included and add to VCore count + foreach ($ins in $instances){ + if ($ins.InstancePoolName -eq $null){ + if ($ins.LicenseType -eq "LicenseIncluded") { + if ($ins.Sku.Tier -eq "BusinessCritical") { + $subtotal.ahb_ent += $ins.VCores + } elseif ($ins.Sku.Tier -eq "GeneralPurpose") { + $subtotal.ahb_std += $ins.VCores + } + }else{ + if ($ins.Edition -eq "BusinessCritical") { + $subtotal.payg_ent += $pool.Capacity + } elseif ($ins.Edition -eq "GeneralPurpose") { + $subtotal.payg_std += $ins.Capacity + } + } + } + } + + #Get all instance pool resources in the subscription + $ipools = Get-AzSqlInstancePool + + # Process the instance pools + foreach ($ip in $ipools){ + if ($ip.LicenseType -eq "LicenseIncluded") { + if ($ip.Edition -eq "BusinessCritical") { + $subtotal.ahb_ent += $ip.VCores + } elseif ($ip.Edition -eq "GeneralPurpose") { + $subtotal.ahb_std += $ip.VCores + } + }else{ + if ($ip.Edition -eq "BusinessCritical") { + $subtotal.payg_ent += $ip.Capacity + } elseif ($ip.Edition -eq "GeneralPurpose") { + $subtotal.payg_std += $ip.Capacity + } + } + } + + + #Get all SSIS imtegration runtime resources in the subscription + $ssis_irs = Get-AzResourceGroup | Get-AzDataFactoryV2 | Get-AzDataFactoryV2IntegrationRuntime + + # Get the VM size, match it with the corresponding VCPU count and add to VCore count + foreach ($ssis_ir in $ssis_irs){ + # Select first size and get the VCPus available + $size_info = $VM_SKUs | where { $_.Name -like $ssis_ir.NodeSize} | Select-Object -First 1 + + # Save the VCPU count + $vcpu= $size_info.Capabilities | Where-Object {$_.name -eq "vCPUsAvailable"} + + if ($ssis_ir.State -eq "Started"){ + if ($ssis_ir.LicenseType -like "LicenseIncluded"){ + if ($ssis_ir.Edition -like "Enterprise"){ + $subtotal.ahb_ent += $vcpu.value + }elseif ($ssis_ir.Edition -like "Standard"){ + $subtotal.ahb_std += $vcpu.value + } + }elseif ($data.license -like "BasePrice"){ + if ($ssis_ir.Edition -like "Enterprise"){ + $subtotal.payg_ent += $vcpu.value + }elseif ($ssis_ir.Edition -like "Standard"){ + $subtotal.payg_std += $vcpu.value + }elseif ($ssis_ir.Edition -like "Developer"){ + $subtotal.developer += $vcpu.value + }elseif ($ssis_ir.Edition -like "Express"){ + $subtotal.express += $vcpu.value + } + } + } + } + + + #Get All SQL VMs resources in the subscription + $sql_vms = Get-AzSqlVM + + # Get the VM size, match it with the corresponding VCPU count and add to VCore count + foreach ($sql_vm in $sql_vms){ + $vm = Get-AzVm -Name $sql_vm.Name -ResourceGroupName $sql_vm.ResourceGroupName + $vm_size = $vm.HardwareProfile.VmSize + # Select first size and get the VCPus available + $size_info = $VM_SKUs | where {$_.ResourceType.Contains('virtualMachines') -and $_.Name -like $vm_size} | Select-Object -First 1 + # Save the VCPU count + $vcpu= $size_info.Capabilities | Where-Object {$_.name -eq "vCPUsAvailable"} + + if ($vcpu){ + $data = [pscustomobject]@{vm_resource_uri=$vm.Id;sku=$sql_vm.Sku;license=$sql_vm.LicenseType;size=$vm_size;vcpus=$vcpu.value} + + if ($data.license -like "DR"){ + if ($data.sku -like "Enterprise"){ + $subtotal.hadr_ent += $data.vcpus + }elseif ($data.sku -like "Standard"){ + $subtotal.hadr_std += $data.vcpus + } + }elseif ($data.license -like "AHUB"){ + if ($data.sku -like "Enterprise"){ + $subtotal.ahb_ent += $data.vcpus + }elseif ($data.sku -like "Standard"){ + $subtotal.ahb_std += $data.vcpus + } + }elseif ($data.license -like "PAYG"){ + if ($data.sku -like "Enterprise"){ + $subtotal.payg_ent += $data.vcpus + }elseif ($data.sku -like "Standard"){ + $subtotal.payg_std += $data.vcpus + }elseif ($data.sku -like "Developer"){ + $subtotal.developer += $data.vcpus + }elseif ($data.sku -like "Express"){ + $subtotal.express += $data.vcpus + } + } + } + } + + # Increment the totals and add subtotals to the usage array + + $subtotal.psobject.properties.name | %{$total.$_ += $subtotal.$_} + + if ($includeEC -eq $null){ + $usage += ,(@((Get-Date -Format d), (Get-Date -Format t), $sub.Name, $sub.Id, $subtotal.ahb_std, $subtotal.ahb_ent, $subtotal.payg_std, $subtotal.payg_ent, $subtotal.hadr_std, $subtotal.hadr_ent, $subtotal.developer, $subtotal.express)) + }else{ + $usage += ,(@((Get-Date -Format d), (Get-Date -Format t), $sub.Name, $sub.Id, ($subtotal.ahb_std + $subtotal.ahb_ent*4), ($subtotal.payg_std + $subtotal.payg_ent*4), $subtotal.ahb_std, $subtotal.ahb_ent, $subtotal.payg_std, $subtotal.payg_ent, $subtotal.hadr_std, $subtotal.hadr_ent, $subtotal.developer, $subtotal.express)) + } +} + +# Add the total numbers to the usage array + +if ($includeEC -eq $null){ + $usage += ,(@((Get-Date -Format d), (Get-Date -Format t), "Total", $null, $total.ahb_std, $total.ahb_ent, $total.payg_std, $total.payg_ent, $total.hadr_std, $total.hadr_ent, $total.developer, $total.express)) +}else{ + $usage += ,(@((Get-Date -Format d), (Get-Date -Format t), "Total", $null, ($total.ahb_std + $total.ahb_ent*4), ($total.payg_std + $total.payg_ent*4), $total.ahb_std, $total.ahb_ent, $total.payg_std, $total.payg_ent, $total.hadr_std, $total.hadr_ent, $total.developer, $total.express)) +} + +# Append to '.\sql-license-usage.csv' + +$table = ConvertFrom-Csv ($usage | %{ $_ -join ','} ) +$table | Format-table +#$fileName = '.\sql-license-usage_' + (Get-Date -f yyyy-MM-dd_HH-mm-ss) + '.csv' +$fileName = '.\sql-license-usage.csv' +$table | Export-Csv $fileName -NoTypeInformation -Append + +Write-Host ([Environment]::NewLine + "-- The usage data is saved to " + $fileName + "--") diff --git a/samples/manage/sql-assessment-api/SqlAssessmentClient/.gitignore b/samples/manage/sql-assessment-api/SqlAssessmentClient/.gitignore new file mode 100644 index 00000000..dfcfd56f --- /dev/null +++ b/samples/manage/sql-assessment-api/SqlAssessmentClient/.gitignore @@ -0,0 +1,350 @@ +## 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 +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.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 + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# 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 + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: 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 +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/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 +*.appx +*.appxbundle +*.appxupload + +# 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 + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# 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 +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# 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/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ diff --git a/samples/manage/sql-assessment-api/SqlAssessmentClient/.vscode/launch.json b/samples/manage/sql-assessment-api/SqlAssessmentClient/.vscode/launch.json new file mode 100644 index 00000000..c15aa054 --- /dev/null +++ b/samples/manage/sql-assessment-api/SqlAssessmentClient/.vscode/launch.json @@ -0,0 +1,27 @@ +{ + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md + "version": "0.2.0", + "configurations": [ + { + "name": ".NET Core Launch (console)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/AssessmentClient.SMO/bin/Debug/netcoreapp3.1/AssessmentClient.SMO.dll", + "args": [], + "cwd": "${workspaceFolder}/AssessmentClient.SMO", + // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console + "console": "externalTerminal", + "stopAtEntry": false + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach", + "processId": "${command:pickProcess}" + } + ] +} \ No newline at end of file diff --git a/samples/manage/sql-assessment-api/SqlAssessmentClient/.vscode/tasks.json b/samples/manage/sql-assessment-api/SqlAssessmentClient/.vscode/tasks.json new file mode 100644 index 00000000..f4db04fa --- /dev/null +++ b/samples/manage/sql-assessment-api/SqlAssessmentClient/.vscode/tasks.json @@ -0,0 +1,42 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/AssessmentClient.SMO/AssessmentClient.SMO.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/AssessmentClient.SMO/AssessmentClient.SMO.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "${workspaceFolder}/AssessmentClient.SMO/AssessmentClient.SMO.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/samples/manage/sql-assessment-api/SqlAssessmentClient/AssessmentClient.SMO/AssessmentClient.SMO.csproj b/samples/manage/sql-assessment-api/SqlAssessmentClient/AssessmentClient.SMO/AssessmentClient.SMO.csproj new file mode 100644 index 00000000..54302bd7 --- /dev/null +++ b/samples/manage/sql-assessment-api/SqlAssessmentClient/AssessmentClient.SMO/AssessmentClient.SMO.csproj @@ -0,0 +1,14 @@ + + + + Exe + netcoreapp3.1 + enable + + + + + + + + diff --git a/samples/manage/sql-assessment-api/SqlAssessmentClient/AssessmentClient.SMO/Program.cs b/samples/manage/sql-assessment-api/SqlAssessmentClient/AssessmentClient.SMO/Program.cs new file mode 100644 index 00000000..5f7c5e96 --- /dev/null +++ b/samples/manage/sql-assessment-api/SqlAssessmentClient/AssessmentClient.SMO/Program.cs @@ -0,0 +1,75 @@ +namespace AssessmentClient.SMO +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Threading.Tasks; + + using Microsoft.SqlServer.Management.Assessment; + using Microsoft.SqlServer.Management.Assessment.Checks; + using Microsoft.SqlServer.Management.Smo; + + public static class Program + { + private static async Task Main(string[] args) + { + // Connect to a server or a database with SMO + // https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/create-program/connecting-to-an-instance-of-sql-server + var target = new Server(); + + + // Use GetAssessmentItem method to obtain + // a list of available SQL Assessment checks + IEnumerable checklist = target.GetAssessmentItems(); + + + // Checks are tagged with strings corresponding to + // categories like "Performance", "Storage", or "Security" + var allTags = new SortedSet(checklist.SelectMany(c => c.Tags)); + + DisplayCategories(target.Name, allTags); + + while (Prompt(out string? line)) + { + // Use GetAssessmentResultsList to run assessment + List assessmentResults = string.IsNullOrWhiteSpace(line) + ? await target.GetAssessmentResultsList().ConfigureAwait(false) // all checks + : await target.GetAssessmentResultsList(line.Split()).ConfigureAwait(false); // selected checks + + DisplayAssessmentResults(assessmentResults); + } + } + + private static void DisplayAssessmentResults(List assessmentResults) + { + // Properties of IAssessmentResult provide + // recommendation text, help link, etc + foreach (var result in assessmentResults) + { + Console.WriteLine("-------"); + Console.Write(" "); + Console.WriteLine(result.Message); + Console.Write(" "); + Console.WriteLine(result.Check.HelpLink); + } + } + + private static bool Prompt(out string? line) + { + Console.Write("Enter category (ENTER for all categories, 'exit' to leave) > "); + line = Console.ReadLine(); + + return string.Compare(line, "exit", StringComparison.OrdinalIgnoreCase) != 0; + } + + private static void DisplayCategories(string targetName, IEnumerable allTags) + { + Console.WriteLine($"All categories available for {targetName}:\n"); + + foreach (var tag in allTags) + { + Console.WriteLine($" {tag}"); + } + } + } +} diff --git a/samples/manage/sql-assessment-api/SqlAssessmentClient/AssessmentClient.sln b/samples/manage/sql-assessment-api/SqlAssessmentClient/AssessmentClient.sln new file mode 100644 index 00000000..bf523892 --- /dev/null +++ b/samples/manage/sql-assessment-api/SqlAssessmentClient/AssessmentClient.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30621.155 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AssessmentClient.SMO", "AssessmentClient.SMO\AssessmentClient.SMO.csproj", "{C9745F7C-40B1-43FA-AA5D-C2BF0588038D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C9745F7C-40B1-43FA-AA5D-C2BF0588038D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C9745F7C-40B1-43FA-AA5D-C2BF0588038D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C9745F7C-40B1-43FA-AA5D-C2BF0588038D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C9745F7C-40B1-43FA-AA5D-C2BF0588038D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {113F74E6-A46A-4090-A4F5-7280F2623F23} + EndGlobalSection +EndGlobal diff --git a/samples/manage/sql-assessment-api/SqlAssessmentClient/README.md b/samples/manage/sql-assessment-api/SqlAssessmentClient/README.md new file mode 100644 index 00000000..000e236b --- /dev/null +++ b/samples/manage/sql-assessment-api/SqlAssessmentClient/README.md @@ -0,0 +1,224 @@ +# SQL Assessment API client sample + +## Overview + +This repository contains an example C# application using SQL Assessment API. The application uses popular [SQL Management Objects (SMO)](https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/overview-smo?view=sql-server-ver15) library. WHile it was not required to invoke assessment, SMO gives a convenient object-oriented API for managing SQL Server objects. See [Service based SQL Assessment](#Using-SQL-Tools-Service) for an example of non-SMO application. + +To use SQL Assessment API this sample project references [Microsoft.SqlServer.SqlManagementObjects](https://www.nuget.org/packages/Microsoft.SqlServer.SqlManagementObjects) and [Microsoft.SqlServer.Assessment](https://www.nuget.org/packages/Microsoft.SqlServer.Assessment/) Nuget packages. + +## SQL Assessment workflow + +A typical SQL Assessment workflow consists of three stages: + +1. Establish a connection to a SQL Server and select target instance or database (Microsoft.Data.SqlClient, SQL Management Objects, SQL Tools Service, PowerShell). + +2. (Optional) Create SQL Assessment check list. A default check list is used if this step was skipped. + +3. Invoke assessment on the target object selected at step 1. + +## Using SQL Assessment with SQL Management Objects + +### Establish a connection and select a SQL Server object with SMO + +SQL Management Objects is a handy tool for accessing and managing SQL SErver objects. This sample application connects to a local SQL Server instance with a short statement: + +```CSharp +var target = new Server(); +``` + +To assess a database replace this line with the following snippet: + +```CSharp +var target = new Server().Databases["MyDatabase"]; +``` + +See [SMO documentation](https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/overview-smo) for more details on connecting to a server or a database. + +### Invoke assessment with default check list + +SQL Assessment asynchronous code returns a list of SQL Assessment results. Each result can be an assessment note, warning, or error. Every assessment result contains a message to the user with a recommendation. Each assessment note is associated to the corresponding check from the list. + +```CSharp +List results = await target.GetAssessmentResultsList(); +``` + +### Invoke assessment with selected checks + +SQL Assessment API gives a collection of checks currently available for given target. Selected checks may be passed to `GetAssessmentResultsList`. + +```CSharp +IEnumerable availableChecks = target.GetAssessmentItems(); +``` + +Select checks to be run. + +```CSharp +var checklist = availableChecks.First(5); +var results = await target.GetAssessmentResultsList(checklist); +``` + +### Select checks by category + +SQL Assessment check may be tagged with one or more category names. Checks from default check list always have "DefaultRuleset" tag and at least one area tag. "DefaultRuleset" denotes a check produced by default ruleset supplied with SQL Assessment API. Area tags may be "Performance", "Security", "Memory", "Deprecated", "Storage", etc. + +```CSharp +var checklist = target.GetAssessmentItems("Performance", "Security"); +var results = await target.GetAssessmentResultsList(checklist); +``` + +This is equivalent to the following code: + +```CSharp +var results = await target.GetAssessmentResultsList("Performance", "Security"); +``` + +### Custom rule sets + +Checks are generated by a SQL Assessment engine for every target. The engine uses rules from one or more rule sets. Rule sets are collected on a stack. A rule set may override rules from an underlying rule set. A ruleset may be constructed with a C# code, but we recommend using declarative JSON format. For more details on rule set files see [SQL Assessment API GitHub page](https://github.com/microsoft/sql-server-samples/tree/master/samples/manage/sql-assessment-api). + +```CSharp +using (var reader = File.OpenText("my ruleset.json")) +{ + SqlAssessmentExtensions.Engine.PushRuleFactoryJson(reader); +} +``` + +## Using SQL Tools Service + +[SQL Tools Service](https://github.com/microsoft/sqltoolsservice) is a JSON-RPC service over stdio. SQL assessment takes the same three steps: connect, select checks, run. + +_In the following examples adjust `Content-Length` value according to actual JSON length including CR or CRLF line endings._ + +### Connect with SQL Tools Service + +```json +Content-Length:267 + +{ + "jsonrpc": "2.0", + "id": "12", + "method": "connection/connect", + "params": { + "ownerUri": "my connection", + "connection": { + "serverName": "(local)", + "authenticationType": "Integrated" + } + } +} +``` + +See [SQL Tools Service documentation](https://microsoft.github.io/sqltoolssdk/) for more details on connecting to a server or a database. + +### Get available checks + +Use `targetType` to select target type: + +1. SQL Server instance. + +2. SQL Server database. In this case provide database name while connecting to the target. + +```json +Content-Length:181 + +{ + "jsonrpc": "2.0", + "id": "12", + "method": "assessment/getAssessmentItems", + "params": { + "targetType": 1, + "ownerUri": "my connection" + } +} +``` + +Sample output: + +```json +{ + "jsonrpc": "2.0", + "id": "12", + "result": { + "success": true, + "errorMessage": null, + "items": [ + { + "rulesetVersion": "1.0.280", + "rulesetName": "Microsoft ruleset", + "targetType": 1, + "targetName": "MYSERVER", + "checkId": "TF174", + "tags": [ + "DefaultRuleset", + "TraceFlag", + "Memory", + "Performance" + ], + "displayName": "TF 174 increases the plan cache bucket count", + "description": "Trace Flag 174 increases the SQL Server ...", + "helpLink": "https://docs.microsoft.com/sql/t-sql/ ...", + "level": "Information" + }, + + ... + + ] + } +} +``` + +### Invoke SQL Assessment with SQL Tools Service + +Use the same `targetType`. + +```json +Content-Length:169 + +{ + "jsonrpc": "2.0", + "id": "12", + "method": "assessment/invoke", + "params": { + "targetType": 1, + "ownerUri": "my connection" + } +} +``` + +Sample output: + +```json +{ + "jsonrpc": "2.0", + "id": "12", + "result": { + "success": true, + "errorMessage": null, + "items": [ + { + "message": "Enable trace flag 834 to use large-page allocations to improve analytical and data warehousing workloads", + "kind": 0, + "timestamp": "2020-11-09T22:46:36.5529014+03:00", + "rulesetVersion": "1.0.280", + "rulesetName": "Microsoft ruleset", + "targetType": 1, + "targetName": "MYSERVER", + "checkId": "TF834", + "tags": [ + "DefaultRuleset", + "TraceFlag", + "Performance", + "Memory", + "ColumnStore" + ], + "displayName": "TF 834 enables large-page allocations", + "description": "Trace Flag 834 causes the server ...", + "helpLink": "https://support.microsoft.com/kb/3210239", + "level": "Information" + }, + + ... + ] + } +} +``` \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Readme.md b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Readme.md new file mode 100644 index 00000000..fdfdebbc --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Readme.md @@ -0,0 +1,15 @@ +--- +page_type: sample +languages: +- csharp +products: +- azure-sql-database +--- + +# Developing applications with C# and Azure SQL + +Pick a platform below to get started: +* [unix-based (Includes macOS, RHEL, Ubuntu, SLES](https://github.com/Microsoft/sql-server-samples/tree/master/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based) +* [Windows](https://github.com/Microsoft/sql-server-samples/tree/master/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows) + +Please visit our [getting started tutorials](https://www.microsoft.com/en-us/sql-server/developer-get-started/) diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlColumnstoreSample/Program.cs b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlColumnstoreSample/Program.cs new file mode 100644 index 00000000..fc44147c --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlColumnstoreSample/Program.cs @@ -0,0 +1,136 @@ +using Microsoft.Azure.KeyVault; +using Microsoft.Azure.KeyVault.Models; +using Microsoft.Azure.Services.AppAuthentication; +using System; +using System.Data.SqlClient; +using System.Text; +using System.Threading.Tasks; + +namespace AzureSqlColumnstoreSample +{ + class Program + { + static void Main(string[] args) + { + System.Threading.Tasks.Task task = Program.DoWork(args); + // Becuase this program takes user input, have a long wait. + var result = task.Wait(TimeSpan.FromMinutes(30)); + } + + static async System.Threading.Tasks.Task DoWork(string[] args) + { + + Console.WriteLine("*** Azure SQL Columnstore demo ***"); + + // Build connection string + SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); + builder.DataSource = "your_server.database.windows.net"; // update me + builder.UserID = "your_user"; // update me + builder.Password = await GetPasswordFromKeyVault(); + builder.InitialCatalog = "your_database"; + + // Connect to Azure SQL + Console.Write("Connecting to Azure SQL ... "); + using (SqlConnection connection = new SqlConnection(builder.ConnectionString)) + { + string sql; + try + { + connection.Open(); + string dropTable = "Drop table if exists Table_with_3M_rows"; + using (SqlCommand command = new SqlCommand(dropTable, connection)) + { + command.ExecuteNonQuery(); + Console.WriteLine("Table cleaned up."); + } + + // Insert 5 million rows into the table 'Table_with_3M_rows' + Console.Write("Inserting 3 million rows into table 'Table_with_3M_rows'. This takes ~1 minute, please wait ... "); + StringBuilder sb = new StringBuilder(); + sb.Append("WITH a AS (SELECT * FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) AS a(a))"); + sb.Append("SELECT TOP(3000000)"); + sb.Append("ROW_NUMBER() OVER (ORDER BY a.a) AS OrderItemId "); + sb.Append(",a.a + b.a + c.a + d.a + e.a + f.a + g.a + h.a AS OrderId "); + sb.Append(",a.a * 10 AS Price "); + sb.Append(",CONCAT(a.a, N' ', b.a, N' ', c.a, N' ', d.a, N' ', e.a, N' ', f.a, N' ', g.a, N' ', h.a) AS ProductName "); + sb.Append("INTO Table_with_3M_rows "); + sb.Append("FROM a, a AS b, a AS c, a AS d, a AS e, a AS f, a AS g, a AS h;"); + sql = sb.ToString(); + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.ExecuteNonQuery(); + Console.WriteLine("Done."); + } + + // Execute SQL query without columnstore index + double elapsedTimeWithoutIndex = SumPrice(connection); + Console.WriteLine("Query time WITHOUT columnstore index: " + elapsedTimeWithoutIndex + "ms"); + + // Add a Columnstore Index + Console.Write("Adding a columnstore to table 'Table_with_3M_rows' ... "); + sql = "CREATE CLUSTERED COLUMNSTORE INDEX columnstoreindex ON Table_with_3M_rows;"; + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.ExecuteNonQuery(); + Console.WriteLine("Done."); + } + + // Execute the same SQL query again after columnstore index was added + double elapsedTimeWithIndex = SumPrice(connection); + Console.WriteLine("Query time WITH columnstore index: " + elapsedTimeWithIndex + "ms"); + + // Calculate performance gain from adding columnstore index + Console.WriteLine("Performance improvement with columnstore index: " + + Math.Round(elapsedTimeWithoutIndex / elapsedTimeWithIndex) + "x!"); + } + + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + finally + { + string dropTable = "Drop table if exists Table_with_3M_rows"; + using (SqlCommand command = new SqlCommand(dropTable, connection)) + { + command.ExecuteNonQuery(); + Console.WriteLine("Table cleaned up."); + } + } + } + Console.WriteLine("All done. Press any key to finish..."); + Console.ReadKey(true); + } + + private static async Task GetPasswordFromKeyVault() + { + Console.WriteLine("Trying to get Password from Key Vault. Press a key to continue..."); + Console.ReadKey(true); + /* The next four lines of code show you how to use AppAuthentication library to fetch secrets from your key vault */ + AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider(); + KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback)); + SecretBundle secret = await keyVaultClient.GetSecretAsync("https://your_keyvault_name.vault.azure.net/secrets/AppSecret"); // update me + return secret.Value; + } + + public static double SumPrice(SqlConnection connection) + { + String sql = "SELECT SUM(Price) FROM Table_with_3M_rows"; + long startTicks = DateTime.Now.Ticks; + using (SqlCommand command = new SqlCommand(sql, connection)) + { + try + { + var sum = command.ExecuteScalar(); + TimeSpan elapsed = TimeSpan.FromTicks(DateTime.Now.Ticks) - TimeSpan.FromTicks(startTicks); + return elapsed.TotalMilliseconds; + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + } + return 0; + } + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlEFSample/EFSampleContext.cs b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlEFSample/EFSampleContext.cs new file mode 100644 index 00000000..750feaf7 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlEFSample/EFSampleContext.cs @@ -0,0 +1,22 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.SqlServer; + +namespace AzureSqlEFSample +{ + public class EFSampleContext : DbContext + { + string _connectionString; + public EFSampleContext(string connectionString) + { + this._connectionString = connectionString; + + } + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder.UseSqlServer(this._connectionString); + } + + public DbSet Users { get; set; } + public DbSet Tasks { get; set; } + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlEFSample/Program.cs b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlEFSample/Program.cs new file mode 100644 index 00000000..e2da50da --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlEFSample/Program.cs @@ -0,0 +1,113 @@ +using System; +using System.Data.SqlClient; +using Microsoft.Azure.KeyVault; +using Microsoft.Azure.KeyVault.Models; +using Microsoft.Azure.Services.AppAuthentication; +using System.Threading.Tasks; +using System.Collections.Generic; +using System.Linq; + +namespace AzureSqlEFSample +{ + class Program + { + static void Main(string[] args) + { + System.Threading.Tasks.Task task = Program.DoWork(args); + // Becuase this program takes user input, have a long wait. + var result = task.Wait(TimeSpan.FromMinutes(30)); + } + + static async System.Threading.Tasks.Task DoWork(string[] args) + { + Console.WriteLine("** C# CRUD sample with Entity Framework and Azure SQL DB**\n"); + + // Build connection string + SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); + builder.DataSource = "your_server_name.database.windows.net"; // update me + builder.UserID = "your_user"; // update me + builder.Password = await GetPasswordFromKeyVault(); // taken from Key Vault + builder.InitialCatalog = "your_db_name"; // Update me + + using (EFSampleContext context = new EFSampleContext(builder.ConnectionString)) + { + try + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + Console.WriteLine("Created database schema from C# classes."); + + // Create demo: Create a Task instance and save it to the database + Task newTask = new Task() { Title = "Ship Helsinki", IsComplete = false, DueDate = DateTime.Parse("04-01-2017") }; + context.Tasks.Add(newTask); + context.SaveChanges(); + Console.WriteLine("\nCreated Task: " + newTask.ToString()); + + // Association demo: Assign task to user + + // Read demo: find incomplete tasks assigned to user 'Anna' + Console.WriteLine("\nIncomplete tasks assigned to 'Anna':"); + var query = from t in context.Tasks + where t.IsComplete == false && + t.AssignedTo.FirstName.Equals("Anna") + select t; + foreach (var t in query) + { + Console.WriteLine(t.ToString()); + } + + // Update demo: change the 'dueDate' of a task + Task taskToUpdate = context.Tasks.First(); // get the first task + Console.WriteLine("\nUpdating task: " + taskToUpdate.ToString()); + taskToUpdate.DueDate = DateTime.Parse("06-30-2016"); + context.SaveChanges(); + Console.WriteLine("dueDate changed: " + taskToUpdate.ToString()); + + // Delete demo: delete all tasks with a dueDate in 2016 + Console.WriteLine("\nDeleting all tasks with a dueDate in 2016"); + DateTime dueDate2016 = DateTime.Parse("12-31-2016"); + List queryResults = context.Tasks.Where(t => t.DueDate < dueDate2016).ToList(); + foreach (Task t in queryResults) + { + Console.WriteLine("Deleting task: " + t.ToString()); + context.Tasks.Remove(t); + } + context.SaveChanges(); + + // Show tasks after the 'Delete' operation - there should be 0 tasks + Console.WriteLine("\nTasks after delete:"); + List tasksAfterDelete = (from t in context.Tasks select t).ToList(); + if (tasksAfterDelete.Count == 0) + { + Console.WriteLine("[None]"); + } + else + { + foreach (Task t in query) + { + Console.WriteLine(t.ToString()); + } + } + } + catch (SqlException e) + { + Console.WriteLine(e.ToString()); + } + } + + Console.WriteLine("All done. Press any key to finish..."); + Console.ReadKey(true); + } + + private static async Task GetPasswordFromKeyVault() + { + Console.WriteLine("Trying to get Password from Key Vault. Press a key to continue..."); + Console.ReadKey(true); + /* The next four lines of code show you how to use AppAuthentication library to fetch secrets from your key vault */ + AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider(); + KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback)); + SecretBundle secret = await keyVaultClient.GetSecretAsync("https://your_keyvault_name.vault.azure.net/secrets/AppSecret"); // update me + return secret.Value; + } + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlEFSample/Task.cs b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlEFSample/Task.cs new file mode 100644 index 00000000..c9067532 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlEFSample/Task.cs @@ -0,0 +1,18 @@ +using System; + +namespace AzureSqlEFSample +{ + public class Task + { + public int TaskId { get; set; } + public string Title { get; set; } + public DateTime DueDate { get; set; } + public bool IsComplete { get; set; } + public virtual User AssignedTo { get; set; } + + public override string ToString() + { + return "Task [id=" + this.TaskId + ", title=" + this.Title + ", dueDate=" + this.DueDate.ToString() + ", IsComplete=" + this.IsComplete + "]"; + } + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlEFSample/User.cs b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlEFSample/User.cs new file mode 100644 index 00000000..5dfd2930 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlEFSample/User.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace AzureSqlEFSample +{ + public class User + { + public int UserId { get; set; } + public String FirstName { get; set; } + public String LastName { get; set; } + public virtual IList Tasks { get; set; } + + public String GetFullName() + { + return this.FirstName + " " + this.LastName; + } + public override string ToString() + { + return "User [id=" + this.UserId + ", name=" + this.GetFullName() + "]"; + } + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlSample/Program.cs b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlSample/Program.cs new file mode 100644 index 00000000..2da9966d --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlSample/Program.cs @@ -0,0 +1,135 @@ +using System; +using System.Text; +using System.Data.SqlClient; + +namespace AzureSqlSample +{ + class Program + { + static void Main(string[] args) + { + string sql; + + // Build connection string + SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); + builder.DataSource = "your_server_name.database.windows.net"; // update me + builder.UserID = "your_user"; // update me + builder.Password = "your_password"; // update me + builder.InitialCatalog = "your_database_name"; // update me + + // Connect to Azure SQL + using (SqlConnection connection = new SqlConnection(builder.ConnectionString)) + { + try + { + Console.WriteLine("Connect to Azure SQL and demo Create, Read, Update and Delete operations."); + + // Connect to Azure SQL + Console.Write("Connecting to Azure SQL ... "); + connection.Open(); + Console.WriteLine("Done."); + + using (SqlCommand command = new SqlCommand("DROP TABLE IF EXISTS Employees", connection)) + { + command.ExecuteNonQuery(); + } + + + // Create a Table and insert some sample data + Console.Write("Creating sample table with data, press any key to continue..."); + Console.ReadKey(true); + StringBuilder sb = new StringBuilder(); + sb.Append("CREATE TABLE Employees ( "); + sb.Append(" Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, "); + sb.Append(" Name NVARCHAR(50), "); + sb.Append(" Location NVARCHAR(50) "); + sb.Append("); "); + sb.Append("INSERT INTO Employees (Name, Location) VALUES "); + sb.Append("(N'Jared', N'Australia'), "); + sb.Append("(N'Nikita', N'India'), "); + sb.Append("(N'Tom', N'Germany'); "); + sql = sb.ToString(); + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.ExecuteNonQuery(); + Console.WriteLine("Done."); + } + + // INSERT demo + Console.Write("Inserting a new row into table, press any key to continue..."); + Console.ReadKey(true); + sb.Clear(); + sb.Append("INSERT Employees (Name, Location) "); + sb.Append("VALUES (@name, @location);"); + sql = sb.ToString(); + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.Parameters.AddWithValue("@name", "Jake"); + command.Parameters.AddWithValue("@location", "United States"); + int rowsAffected = command.ExecuteNonQuery(); + Console.WriteLine(rowsAffected + " row(s) inserted"); + } + + // UPDATE demo + String userToUpdate = "Nikita"; + Console.Write("Updating 'Location' for user '" + userToUpdate + "', press any key to continue..."); + Console.ReadKey(true); + sb.Clear(); + sb.Append("UPDATE Employees SET Location = N'United States' WHERE Name = @name"); + sql = sb.ToString(); + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.Parameters.AddWithValue("@name", userToUpdate); + int rowsAffected = command.ExecuteNonQuery(); + Console.WriteLine(rowsAffected + " row(s) updated"); + } + + // DELETE demo + String userToDelete = "Jared"; + Console.Write("Deleting user '" + userToDelete + "', press any key to continue..."); + Console.ReadKey(true); + sb.Clear(); + sb.Append("DELETE FROM Employees WHERE Name = @name;"); + sql = sb.ToString(); + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.Parameters.AddWithValue("@name", userToDelete); + int rowsAffected = command.ExecuteNonQuery(); + Console.WriteLine(rowsAffected + " row(s) deleted"); + } + + // READ demo + Console.WriteLine("Reading data from table, press any key to continue..."); + Console.ReadKey(true); + sql = "SELECT Id, Name, Location FROM Employees;"; + using (SqlCommand command = new SqlCommand(sql, connection)) + { + + using (SqlDataReader reader = command.ExecuteReader()) + { + while (reader.Read()) + { + Console.WriteLine("{0} {1} {2}", reader.GetInt32(0), reader.GetString(1), reader.GetString(2)); + } + } + } + } + catch (SqlException e) + { + Console.WriteLine(e.ToString()); + } + finally + { + Console.WriteLine("Cleaning up table."); + using (SqlCommand command = new SqlCommand("DROP TABLE IF EXISTS Employees", connection)) + { + command.ExecuteNonQuery(); + } + } + } + + Console.WriteLine("All done. Press any key to finish..."); + Console.ReadKey(true); + } + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlSample/Program_KeyVault.cs b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlSample/Program_KeyVault.cs new file mode 100644 index 00000000..f8d40282 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/AzureSqlSample/Program_KeyVault.cs @@ -0,0 +1,160 @@ +using System; +using System.Text; +using System.Data.SqlClient; +using Microsoft.Azure.KeyVault; +using Microsoft.Azure.KeyVault.Models; +using Microsoft.Azure.Services.AppAuthentication; +using System.Threading.Tasks; + +namespace AzureSQLSample +{ + class Program + { + static void Main(string[] args) + { + Task task = Program.DoWork(args); + // Becuase this program takes user input, have a long wait. + var result = task.Wait(TimeSpan.FromMinutes(30)); + } + + static async Task DoWork(string[] args) + { + string sql; + + // Build connection string + SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); + builder.DataSource = "your_server_name.database.windows.net"; // update me + builder.UserID = "your_user_id"; // update me + builder.Password = await GetPasswordFromKeyVault(); // taken from Key Vault + builder.InitialCatalog = "your_database"; // Update me + + using (SqlConnection connection = new SqlConnection(builder.ConnectionString)) + { + try + { + Console.WriteLine("Connect to Azure SQL and demo Create, Read, Update and Delete operations."); + + // Connect to Azure SQL + Console.Write("Connecting to Azure SQL ... "); + connection.Open(); + Console.WriteLine("Done."); + + string dropTableIfExists = @"DROP TABLE IF EXISTS Employees"; + using (SqlCommand command = new SqlCommand(dropTableIfExists, connection)) + { + command.ExecuteNonQuery(); + Console.WriteLine("Done."); + } + + + // Create a Table and insert some sample data + Console.Write("Creating sample table with data, press any key to continue..."); + Console.ReadKey(true); + StringBuilder sb = new StringBuilder(); + sb.Append("CREATE TABLE Employees ( "); + sb.Append(" Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, "); + sb.Append(" Name NVARCHAR(50), "); + sb.Append(" Location NVARCHAR(50) "); + sb.Append("); "); + sb.Append("INSERT INTO Employees (Name, Location) VALUES "); + sb.Append("(N'Jared', N'Australia'), "); + sb.Append("(N'Nikita', N'India'), "); + sb.Append("(N'Tom', N'Germany'); "); + sql = sb.ToString(); + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.ExecuteNonQuery(); + Console.WriteLine("Done."); + } + + // INSERT demo + Console.Write("Inserting a new row into table, press any key to continue..."); + Console.ReadKey(true); + sb.Clear(); + sb.Append("INSERT Employees (Name, Location) "); + sb.Append("VALUES (@name, @location);"); + sql = sb.ToString(); + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.Parameters.AddWithValue("@name", "Jake"); + command.Parameters.AddWithValue("@location", "United States"); + int rowsAffected = command.ExecuteNonQuery(); + Console.WriteLine(rowsAffected + " row(s) inserted"); + } + + // UPDATE demo + String userToUpdate = "Nikita"; + Console.Write("Updating 'Location' for user '" + userToUpdate + "', press any key to continue..."); + Console.ReadKey(true); + sb.Clear(); + sb.Append("UPDATE Employees SET Location = N'United States' WHERE Name = @name"); + sql = sb.ToString(); + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.Parameters.AddWithValue("@name", userToUpdate); + int rowsAffected = command.ExecuteNonQuery(); + Console.WriteLine(rowsAffected + " row(s) updated"); + } + + // DELETE demo + String userToDelete = "Jared"; + Console.Write("Deleting user '" + userToDelete + "', press any key to continue..."); + Console.ReadKey(true); + sb.Clear(); + sb.Append("DELETE FROM Employees WHERE Name = @name;"); + sql = sb.ToString(); + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.Parameters.AddWithValue("@name", userToDelete); + int rowsAffected = command.ExecuteNonQuery(); + Console.WriteLine(rowsAffected + " row(s) deleted"); + } + + // READ demo + Console.WriteLine("Reading data from table, press any key to continue..."); + Console.ReadKey(true); + sql = "SELECT Id, Name, Location FROM Employees;"; + using (SqlCommand command = new SqlCommand(sql, connection)) + { + + using (SqlDataReader reader = command.ExecuteReader()) + { + while (reader.Read()) + { + Console.WriteLine("{0} {1} {2}", reader.GetInt32(0), reader.GetString(1), reader.GetString(2)); + } + } + } + } + catch (SqlException e) + { + Console.WriteLine(e.ToString()); + } + finally + { + Console.WriteLine("Cleaning up table."); + string dropTableIfExists = @"DROP TABLE IF EXISTS Employees"; + using (SqlCommand command = new SqlCommand(dropTableIfExists, connection)) + { + command.ExecuteNonQuery(); + Console.WriteLine("Done."); + } + } + } + + Console.WriteLine("All done. Press any key to finish..."); + Console.ReadKey(true); + } + + private static async Task GetPasswordFromKeyVault() + { + Console.WriteLine("Trying to get Password from Key Vault. Press a key to continue..."); + Console.ReadKey(true); + /* The next four lines of code show you how to use AppAuthentication library to fetch secrets from your key vault */ + AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider(); + KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback)); + SecretBundle secret = await keyVaultClient.GetSecretAsync("https://your_key_vault_name.vault.azure.net/secrets/AppSecret"); // update me + return secret.Value; + } + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/Readme.md b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/Readme.md new file mode 100644 index 00000000..1a374b9b --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Unix-based/Readme.md @@ -0,0 +1,11 @@ +## Sample details + +Please visit the [C# tutorials](https://www.microsoft.com/en-us/sql-server/developer-get-started/csharp) and select RHEL, Ubuntu, SLES, or macOs to run through the sample in full with more detail. + + + +The scripts and this guide are provided as samples. They are not part of any Azure service and are not covered by any SLA or other Azure-related agreements. They are provided as-is with no warranties express or implied. Microsoft takes no responsibility for the use of the scripts or the accuracy of this document. Familiarize yourself with the scripts before using them. +## Related Links + +For more information, see these articles: +* To see more getting started tutorials, visit our [tutorials page](https://www.microsoft.com/en-us/sql-server/developer-get-started/) diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlColumnstoreSample/Program.cs b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlColumnstoreSample/Program.cs new file mode 100644 index 00000000..0a6a4997 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlColumnstoreSample/Program.cs @@ -0,0 +1,139 @@ +using System; +using System.Text; +using System.Data.SqlClient; +using Microsoft.Azure.KeyVault; +using Microsoft.Azure.KeyVault.Models; +using Microsoft.Azure.Services.AppAuthentication; +using System.Threading.Tasks; + +namespace AzureSQLSample +{ + class Program + { + static void Main(string[] args) + { + Task task = Program.DoWork(args); + + // Because this program waits for user input, use a long wait. + var result = task.Wait(TimeSpan.FromMinutes(30)); + } + + static async Task DoWork(string[] args) + { + string sql; + + // Build connection string + SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); + builder.DataSource = "your_server.database.windows.net"; // update me + builder.UserID = "your_user"; // update me + builder.Password = await GetPasswordFromKeyVault(); // taken from Key Vault + builder.InitialCatalog = "your_db"; // Update me + + // Connect to SQL + Console.Write("Connecting to Azure SQL ... "); + using (SqlConnection connection = new SqlConnection(builder.ConnectionString)) + { + try + { + // Connect to SQL + Console.Write("Connecting to Azure SQL ... "); + connection.Open(); + Console.WriteLine("Done."); + + string dropTableIfExists = @"DROP TABLE IF EXISTS Table_with_3M_rows"; + using (SqlCommand command = new SqlCommand(dropTableIfExists, connection)) + { + command.ExecuteNonQuery(); + Console.WriteLine("Done."); + } + + // Insert 3 million rows into the table 'Table_with_3M_rows' + Console.Write("Inserting 3 million rows into table 'Table_with_3M_rows'. This takes ~1 minute, please wait ... "); + StringBuilder sb = new StringBuilder(); + sb.Append("WITH a AS (SELECT * FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) AS a(a))"); + sb.Append("SELECT TOP(3000000)"); + sb.Append("ROW_NUMBER() OVER (ORDER BY a.a) AS OrderItemId "); + sb.Append(",a.a + b.a + c.a + d.a + e.a + f.a + g.a + h.a AS OrderId "); + sb.Append(",a.a * 10 AS Price "); + sb.Append(",CONCAT(a.a, N' ', b.a, N' ', c.a, N' ', d.a, N' ', e.a, N' ', f.a, N' ', g.a, N' ', h.a) AS ProductName "); + sb.Append("INTO Table_with_3M_rows "); + sb.Append("FROM a, a AS b, a AS c, a AS d, a AS e, a AS f, a AS g, a AS h;"); + sql = sb.ToString(); + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.ExecuteNonQuery(); + Console.WriteLine("Done."); + } + + // Execute SQL query without columnstore index + double elapsedTimeWithoutIndex = SumPrice(connection); + Console.WriteLine("Query time WITHOUT columnstore index: " + elapsedTimeWithoutIndex + "ms"); + + // Add a Columnstore Index + Console.Write("Adding a columnstore to table 'Table_with_3M_rows' ... "); + sql = "CREATE CLUSTERED COLUMNSTORE INDEX columnstoreindex ON Table_with_3M_rows;"; + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.ExecuteNonQuery(); + Console.WriteLine("Done."); + } + + // Execute the same SQL query again after columnstore index was added + double elapsedTimeWithIndex = SumPrice(connection); + Console.WriteLine("Query time WITH columnstore index: " + elapsedTimeWithIndex + "ms"); + + // Calculate performance gain from adding columnstore index + Console.WriteLine("Performance improvement with columnstore index: " + + Math.Round(elapsedTimeWithoutIndex / elapsedTimeWithIndex) + "x!"); + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + finally + { + string dropTableIfExists = @"DROP TABLE IF EXISTS Table_with_3M_rows"; + using (SqlCommand command = new SqlCommand(dropTableIfExists, connection)) + { + command.ExecuteNonQuery(); + Console.WriteLine("Done."); + } + + Console.WriteLine("All done. Press any key to finish..."); + Console.ReadKey(true); + } + } + } + + public static double SumPrice(SqlConnection connection) + { + String sql = "SELECT SUM(Price) FROM Table_with_3M_rows"; + long startTicks = DateTime.Now.Ticks; + using (SqlCommand command = new SqlCommand(sql, connection)) + { + try + { + var sum = command.ExecuteScalar(); + TimeSpan elapsed = TimeSpan.FromTicks(DateTime.Now.Ticks) - TimeSpan.FromTicks(startTicks); + return elapsed.TotalMilliseconds; + } + catch (Exception e) + { + Console.WriteLine(e.ToString()); + } + } + return 0; + } + + private static async Task GetPasswordFromKeyVault() + { + Console.WriteLine("Trying to get Password from Key Vault. Press a key to continue..."); + Console.ReadKey(true); + /* The next four lines of code show you how to use AppAuthentication library to fetch secrets from your key vault */ + AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider(); + KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback)); + SecretBundle secret = await keyVaultClient.GetSecretAsync("https://you_keyvault_name.vault.azure.net/secrets/AppSecret"); // update me + return secret.Value; + } + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlEFSample/EFSampleContext.cs b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlEFSample/EFSampleContext.cs new file mode 100644 index 00000000..1472efbb --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlEFSample/EFSampleContext.cs @@ -0,0 +1,16 @@ +using System; +using System.Data.Entity; + +namespace AzureSqlEFSample +{ + public class EFSampleContext : DbContext + { + public EFSampleContext(string connectionString) + { + Database.SetInitializer(new CreateDatabaseIfNotExists()); + this.Database.Connection.ConnectionString = connectionString; + } + public DbSet Users { get; set; } + public DbSet Tasks { get; set; } + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlEFSample/Program.cs b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlEFSample/Program.cs new file mode 100644 index 00000000..100021aa --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlEFSample/Program.cs @@ -0,0 +1,110 @@ +using System; +using System.Data.SqlClient; +using Microsoft.Azure.KeyVault; +using Microsoft.Azure.KeyVault.Models; +using Microsoft.Azure.Services.AppAuthentication; +using System.Threading.Tasks; +using System.Collections.Generic; +using System.Linq; + +namespace AzureSqlEFSample +{ + class Program + { + static void Main(string[] args) + { + System.Threading.Tasks.Task task = Program.DoWork(args); + // Becuase this program takes user input, have a long wait. + var result = task.Wait(TimeSpan.FromMinutes(30)); + } + + static async System.Threading.Tasks.Task DoWork(string[] args) + { + string sql; + Console.WriteLine("** C# CRUD sample with Entity Framework and Azure SQL **\n"); + + // Build connection string + SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); + builder.DataSource = "your_server.database.windows.net"; // update me + builder.UserID = "your_user"; // update me + builder.Password = await GetPasswordFromKeyVault(); // taken from Key Vault + builder.InitialCatalog = "your_db"; // Update me + + using (EFSampleContext context = new EFSampleContext(builder.ConnectionString)) + { + try + { + // Create demo: Create a Task instance and save it to the database + Task newTask = new Task() { Title = "Ship Helsinki", IsComplete = false, DueDate = DateTime.Parse("04-01-2017") }; + context.Tasks.Add(newTask); + context.SaveChanges(); + Console.WriteLine("\nCreated Task: " + newTask.ToString()); + + // Association demo: Assign task to user + + // Read demo: find incomplete tasks assigned to user 'Anna' + Console.WriteLine("\nIncomplete tasks assigned to 'Anna':"); + var query = from t in context.Tasks + where t.IsComplete == false && + t.AssignedTo.FirstName.Equals("Anna") + select t; + foreach (var t in query) + { + Console.WriteLine(t.ToString()); + } + + // Update demo: change the 'dueDate' of a task + Task taskToUpdate = context.Tasks.First(); // get the first task + Console.WriteLine("\nUpdating task: " + taskToUpdate.ToString()); + taskToUpdate.DueDate = DateTime.Parse("06-30-2016"); + context.SaveChanges(); + Console.WriteLine("dueDate changed: " + taskToUpdate.ToString()); + + // Delete demo: delete all tasks with a dueDate in 2016 + Console.WriteLine("\nDeleting all tasks with a dueDate in 2016"); + DateTime dueDate2016 = DateTime.Parse("12-31-2016"); + List queryResults = context.Tasks.Where(t => t.DueDate < dueDate2016).ToList(); + foreach (Task t in queryResults) + { + Console.WriteLine("Deleting task: " + t.ToString()); + context.Tasks.Remove(t); + } + context.SaveChanges(); + + // Show tasks after the 'Delete' operation - there should be 0 tasks + Console.WriteLine("\nTasks after delete:"); + List tasksAfterDelete = (from t in context.Tasks select t).ToList(); + if (tasksAfterDelete.Count == 0) + { + Console.WriteLine("[None]"); + } + else + { + foreach (Task t in query) + { + Console.WriteLine(t.ToString()); + } + } + } + catch (SqlException e) + { + Console.WriteLine(e.ToString()); + } + } + + Console.WriteLine("All done. Press any key to finish..."); + Console.ReadKey(true); + } + + private static async Task GetPasswordFromKeyVault() + { + Console.WriteLine("Trying to get Password from Key Vault. Press a key to continue..."); + Console.ReadKey(true); + /* The next four lines of code show you how to use AppAuthentication library to fetch secrets from your key vault */ + AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider(); + KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback)); + SecretBundle secret = await keyVaultClient.GetSecretAsync("https://your_keyvault_name.vault.azure.net/secrets/AppSecret"); // update me + return secret.Value; + } + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlEFSample/Task.cs b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlEFSample/Task.cs new file mode 100644 index 00000000..c9067532 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlEFSample/Task.cs @@ -0,0 +1,18 @@ +using System; + +namespace AzureSqlEFSample +{ + public class Task + { + public int TaskId { get; set; } + public string Title { get; set; } + public DateTime DueDate { get; set; } + public bool IsComplete { get; set; } + public virtual User AssignedTo { get; set; } + + public override string ToString() + { + return "Task [id=" + this.TaskId + ", title=" + this.Title + ", dueDate=" + this.DueDate.ToString() + ", IsComplete=" + this.IsComplete + "]"; + } + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlEFSample/User.cs b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlEFSample/User.cs new file mode 100644 index 00000000..7849ee9c --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlEFSample/User.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; + +namespace AzureSqlEFSample +{ + public class User + { + public int UserId { get; set; } + public String FirstName { get; set; } + public String LastName { get; set; } + public virtual IList Tasks { get; set; } + + public String GetFullName() + { + return this.FirstName + " " + this.LastName; + } + public override string ToString() + { + return "User [id=" + this.UserId + ", name=" + this.GetFullName() + "]"; + } + } +} +``` \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlSample/Program.cs b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlSample/Program.cs new file mode 100644 index 00000000..2da9966d --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlSample/Program.cs @@ -0,0 +1,135 @@ +using System; +using System.Text; +using System.Data.SqlClient; + +namespace AzureSqlSample +{ + class Program + { + static void Main(string[] args) + { + string sql; + + // Build connection string + SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); + builder.DataSource = "your_server_name.database.windows.net"; // update me + builder.UserID = "your_user"; // update me + builder.Password = "your_password"; // update me + builder.InitialCatalog = "your_database_name"; // update me + + // Connect to Azure SQL + using (SqlConnection connection = new SqlConnection(builder.ConnectionString)) + { + try + { + Console.WriteLine("Connect to Azure SQL and demo Create, Read, Update and Delete operations."); + + // Connect to Azure SQL + Console.Write("Connecting to Azure SQL ... "); + connection.Open(); + Console.WriteLine("Done."); + + using (SqlCommand command = new SqlCommand("DROP TABLE IF EXISTS Employees", connection)) + { + command.ExecuteNonQuery(); + } + + + // Create a Table and insert some sample data + Console.Write("Creating sample table with data, press any key to continue..."); + Console.ReadKey(true); + StringBuilder sb = new StringBuilder(); + sb.Append("CREATE TABLE Employees ( "); + sb.Append(" Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, "); + sb.Append(" Name NVARCHAR(50), "); + sb.Append(" Location NVARCHAR(50) "); + sb.Append("); "); + sb.Append("INSERT INTO Employees (Name, Location) VALUES "); + sb.Append("(N'Jared', N'Australia'), "); + sb.Append("(N'Nikita', N'India'), "); + sb.Append("(N'Tom', N'Germany'); "); + sql = sb.ToString(); + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.ExecuteNonQuery(); + Console.WriteLine("Done."); + } + + // INSERT demo + Console.Write("Inserting a new row into table, press any key to continue..."); + Console.ReadKey(true); + sb.Clear(); + sb.Append("INSERT Employees (Name, Location) "); + sb.Append("VALUES (@name, @location);"); + sql = sb.ToString(); + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.Parameters.AddWithValue("@name", "Jake"); + command.Parameters.AddWithValue("@location", "United States"); + int rowsAffected = command.ExecuteNonQuery(); + Console.WriteLine(rowsAffected + " row(s) inserted"); + } + + // UPDATE demo + String userToUpdate = "Nikita"; + Console.Write("Updating 'Location' for user '" + userToUpdate + "', press any key to continue..."); + Console.ReadKey(true); + sb.Clear(); + sb.Append("UPDATE Employees SET Location = N'United States' WHERE Name = @name"); + sql = sb.ToString(); + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.Parameters.AddWithValue("@name", userToUpdate); + int rowsAffected = command.ExecuteNonQuery(); + Console.WriteLine(rowsAffected + " row(s) updated"); + } + + // DELETE demo + String userToDelete = "Jared"; + Console.Write("Deleting user '" + userToDelete + "', press any key to continue..."); + Console.ReadKey(true); + sb.Clear(); + sb.Append("DELETE FROM Employees WHERE Name = @name;"); + sql = sb.ToString(); + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.Parameters.AddWithValue("@name", userToDelete); + int rowsAffected = command.ExecuteNonQuery(); + Console.WriteLine(rowsAffected + " row(s) deleted"); + } + + // READ demo + Console.WriteLine("Reading data from table, press any key to continue..."); + Console.ReadKey(true); + sql = "SELECT Id, Name, Location FROM Employees;"; + using (SqlCommand command = new SqlCommand(sql, connection)) + { + + using (SqlDataReader reader = command.ExecuteReader()) + { + while (reader.Read()) + { + Console.WriteLine("{0} {1} {2}", reader.GetInt32(0), reader.GetString(1), reader.GetString(2)); + } + } + } + } + catch (SqlException e) + { + Console.WriteLine(e.ToString()); + } + finally + { + Console.WriteLine("Cleaning up table."); + using (SqlCommand command = new SqlCommand("DROP TABLE IF EXISTS Employees", connection)) + { + command.ExecuteNonQuery(); + } + } + } + + Console.WriteLine("All done. Press any key to finish..."); + Console.ReadKey(true); + } + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlSample/Program_KeyVault.cs b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlSample/Program_KeyVault.cs new file mode 100644 index 00000000..f8d40282 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/AzureSqlSample/Program_KeyVault.cs @@ -0,0 +1,160 @@ +using System; +using System.Text; +using System.Data.SqlClient; +using Microsoft.Azure.KeyVault; +using Microsoft.Azure.KeyVault.Models; +using Microsoft.Azure.Services.AppAuthentication; +using System.Threading.Tasks; + +namespace AzureSQLSample +{ + class Program + { + static void Main(string[] args) + { + Task task = Program.DoWork(args); + // Becuase this program takes user input, have a long wait. + var result = task.Wait(TimeSpan.FromMinutes(30)); + } + + static async Task DoWork(string[] args) + { + string sql; + + // Build connection string + SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); + builder.DataSource = "your_server_name.database.windows.net"; // update me + builder.UserID = "your_user_id"; // update me + builder.Password = await GetPasswordFromKeyVault(); // taken from Key Vault + builder.InitialCatalog = "your_database"; // Update me + + using (SqlConnection connection = new SqlConnection(builder.ConnectionString)) + { + try + { + Console.WriteLine("Connect to Azure SQL and demo Create, Read, Update and Delete operations."); + + // Connect to Azure SQL + Console.Write("Connecting to Azure SQL ... "); + connection.Open(); + Console.WriteLine("Done."); + + string dropTableIfExists = @"DROP TABLE IF EXISTS Employees"; + using (SqlCommand command = new SqlCommand(dropTableIfExists, connection)) + { + command.ExecuteNonQuery(); + Console.WriteLine("Done."); + } + + + // Create a Table and insert some sample data + Console.Write("Creating sample table with data, press any key to continue..."); + Console.ReadKey(true); + StringBuilder sb = new StringBuilder(); + sb.Append("CREATE TABLE Employees ( "); + sb.Append(" Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, "); + sb.Append(" Name NVARCHAR(50), "); + sb.Append(" Location NVARCHAR(50) "); + sb.Append("); "); + sb.Append("INSERT INTO Employees (Name, Location) VALUES "); + sb.Append("(N'Jared', N'Australia'), "); + sb.Append("(N'Nikita', N'India'), "); + sb.Append("(N'Tom', N'Germany'); "); + sql = sb.ToString(); + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.ExecuteNonQuery(); + Console.WriteLine("Done."); + } + + // INSERT demo + Console.Write("Inserting a new row into table, press any key to continue..."); + Console.ReadKey(true); + sb.Clear(); + sb.Append("INSERT Employees (Name, Location) "); + sb.Append("VALUES (@name, @location);"); + sql = sb.ToString(); + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.Parameters.AddWithValue("@name", "Jake"); + command.Parameters.AddWithValue("@location", "United States"); + int rowsAffected = command.ExecuteNonQuery(); + Console.WriteLine(rowsAffected + " row(s) inserted"); + } + + // UPDATE demo + String userToUpdate = "Nikita"; + Console.Write("Updating 'Location' for user '" + userToUpdate + "', press any key to continue..."); + Console.ReadKey(true); + sb.Clear(); + sb.Append("UPDATE Employees SET Location = N'United States' WHERE Name = @name"); + sql = sb.ToString(); + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.Parameters.AddWithValue("@name", userToUpdate); + int rowsAffected = command.ExecuteNonQuery(); + Console.WriteLine(rowsAffected + " row(s) updated"); + } + + // DELETE demo + String userToDelete = "Jared"; + Console.Write("Deleting user '" + userToDelete + "', press any key to continue..."); + Console.ReadKey(true); + sb.Clear(); + sb.Append("DELETE FROM Employees WHERE Name = @name;"); + sql = sb.ToString(); + using (SqlCommand command = new SqlCommand(sql, connection)) + { + command.Parameters.AddWithValue("@name", userToDelete); + int rowsAffected = command.ExecuteNonQuery(); + Console.WriteLine(rowsAffected + " row(s) deleted"); + } + + // READ demo + Console.WriteLine("Reading data from table, press any key to continue..."); + Console.ReadKey(true); + sql = "SELECT Id, Name, Location FROM Employees;"; + using (SqlCommand command = new SqlCommand(sql, connection)) + { + + using (SqlDataReader reader = command.ExecuteReader()) + { + while (reader.Read()) + { + Console.WriteLine("{0} {1} {2}", reader.GetInt32(0), reader.GetString(1), reader.GetString(2)); + } + } + } + } + catch (SqlException e) + { + Console.WriteLine(e.ToString()); + } + finally + { + Console.WriteLine("Cleaning up table."); + string dropTableIfExists = @"DROP TABLE IF EXISTS Employees"; + using (SqlCommand command = new SqlCommand(dropTableIfExists, connection)) + { + command.ExecuteNonQuery(); + Console.WriteLine("Done."); + } + } + } + + Console.WriteLine("All done. Press any key to finish..."); + Console.ReadKey(true); + } + + private static async Task GetPasswordFromKeyVault() + { + Console.WriteLine("Trying to get Password from Key Vault. Press a key to continue..."); + Console.ReadKey(true); + /* The next four lines of code show you how to use AppAuthentication library to fetch secrets from your key vault */ + AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider(); + KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback)); + SecretBundle secret = await keyVaultClient.GetSecretAsync("https://your_key_vault_name.vault.azure.net/secrets/AppSecret"); // update me + return secret.Value; + } + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/Readme.md b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/Readme.md new file mode 100644 index 00000000..dc1611f0 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/csharp/Windows/Readme.md @@ -0,0 +1,11 @@ +## Sample details + +Please visit the [C# on Windows tutorial](https://www.microsoft.com/en-us/sql-server/developer-get-started/csharp/windows/az) to run through the sample in full with more detail. + + + +The scripts and this guide are provided as samples. They are not part of any Azure service and are not covered by any SLA or other Azure-related agreements. They are provided as-is with no warranties express or implied. Microsoft takes no responsibility for the use of the scripts or the accuracy of this document. Familiarize yourself with the scripts before using them. +## Related Links + +For more information, see these articles: +* To see more getting started tutorials, visit our [tutorials page](https://www.microsoft.com/en-us/sql-server/developer-get-started/) diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/go/Readme.md b/samples/tutorials/AzureSqlGettingStartedSamples/go/Readme.md new file mode 100644 index 00000000..490ce637 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/go/Readme.md @@ -0,0 +1,13 @@ +--- +page_type: sample +languages: +- go +products: +- azure-sql-database +--- + +# Developing applications with Go and Azure SQL + +This information is meant to pair with the steps from [getting started tutorials](https://www.microsoft.com/en-us/sql-server/developer-get-started/), so please follow along there. + +Please visit our [getting started tutorials](https://www.microsoft.com/en-us/sql-server/developer-get-started/) diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/go/columnstore.go b/samples/tutorials/AzureSqlGettingStartedSamples/go/columnstore.go new file mode 100644 index 00000000..74ea849a --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/go/columnstore.go @@ -0,0 +1,63 @@ +package main + +import ( + _ "github.com/denisenkom/go-mssqldb" + "database/sql" + "context" + "log" + "fmt" + "time" +) + +var server = "your_server.database.windows.net" +var user = "your_user" +var password = "your_password" +var database = "your_database" + +var db *sql.DB + +// Delete an employee from database +func ExecuteAggregateStatement(db *sql.DB) { + ctx := context.Background() + + // Ping database to see if it's still alive. + // Important for handling network issues and long queries. + err := db.PingContext(ctx) + if err != nil { + log.Fatal("Error pinging database: " + err.Error()) + } + + var result string + + // Execute long non-query to aggregate rows + err = db.QueryRowContext(ctx, "SELECT SUM(Price) as sum FROM Table_with_3M_rows").Scan(&result) + if err != nil { + log.Fatal("Error executing query: " + err.Error()) + } + + fmt.Printf("Sum: %s\n", result) +} + +func main() { + // Connect to database + connString := fmt.Sprintf("server=%s;user id=%s;password=%s;database=%s;", + server, user, password, database) + var err error + + // Create connection pool + db, err = sql.Open("sqlserver", connString) + if err != nil { + log.Fatal("Open connection failed:", err.Error()) + } + fmt.Printf("Connected!\n") + + defer db.Close() + + t1 := time.Now() + fmt.Printf("Start time: %s\n", t1) + + ExecuteAggregateStatement(db) + + t2 := time.Since(t1) + fmt.Printf("The query took: %s\n", t2) +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/go/connect.go b/samples/tutorials/AzureSqlGettingStartedSamples/go/connect.go new file mode 100644 index 00000000..309c64e3 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/go/connect.go @@ -0,0 +1,59 @@ +package main + +import ( + _ "github.com/denisenkom/go-mssqldb" + "database/sql" + "context" + "log" + "fmt" +) + +// Replace with your own connection parameters +var server = "your_server.database.windows.net" +var user = "your_user" +var password = "your_password" +var database = "your_database" + +var db *sql.DB + +func main() { + var err error + + // Create connection string + connString := fmt.Sprintf("server=%s;user id=%s;password=%s;database=%s", + server, user, password, database) + + // Create connection pool + db, err = sql.Open("sqlserver", connString) + if err != nil { + log.Fatal("Error creating connection pool: " + err.Error()) + } + log.Printf("Connected!\n") + + // Close the database connection pool after program executes + defer db.Close() + + SelectVersion() +} + +// Gets and prints SQL Server version +func SelectVersion(){ + // Use background context + ctx := context.Background() + + // Ping database to see if it's still alive. + // Important for handling network issues and long queries. + err := db.PingContext(ctx) + if err != nil { + log.Fatal("Error pinging database: " + err.Error()) + } + + var result string + + // Run query and scan for result + err = db.QueryRowContext(ctx, "SELECT @@version").coScan(&result) + if err != nil { + log.Fatal("Scan failed:", err.Error()) + } + fmt.Printf("%s\n", result) +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/go/crud.go b/samples/tutorials/AzureSqlGettingStartedSamples/go/crud.go new file mode 100644 index 00000000..549878b3 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/go/crud.go @@ -0,0 +1,190 @@ +package main + +import ( + _ "github.com/denisenkom/go-mssqldb" + "database/sql" + "context" + "log" + "fmt" + "errors" +) + +var db *sql.DB + +// Replace with your own connection parameters +var server = "your_server.database.windows.net" +var user = "your_user" +var password = "your_password" +var database = "your_database" + + +func main() { + // Build connection string + connString := fmt.Sprintf("server=%s;user id=%s;password=%s;database=%s;", + server, user, password, database) + + var err error + + // Create connection pool + db, err = sql.Open("sqlserver", connString) + if err != nil { + log.Fatal("Error creating connection pool: ", err.Error()) + } + ctx := context.Background() + err = db.PingContext(ctx) + if err != nil { + log.Fatal(err.Error()) + } + fmt.Printf("Connected!\n") + + // Create employee + createID, err := CreateEmployee("Jake", "United States") + if err != nil { + log.Fatal("Error creating Employee: ", err.Error()) + } + fmt.Printf("Inserted ID: %d successfully.\n", createID) + + // Read employees + count, err := ReadEmployees() + if err != nil { + log.Fatal("Error reading Employees: ", err.Error()) + } + fmt.Printf("Read %d row(s) successfully.\n", count) + + // Update from database + updatedRows, err := UpdateEmployee("Jake", "Poland") + if err != nil { + log.Fatal("Error updating Employee: ", err.Error()) + } + fmt.Printf("Updated %d row(s) successfully.\n", updatedRows) + + // Delete from database + deletedRows, err := DeleteEmployee("Jake") + if err != nil { + log.Fatal("Error deleting Employee: ", err.Error()) + } + fmt.Printf("Deleted %d row(s) successfully.\n", deletedRows) +} + +// CreateEmployee inserts an employee record +func CreateEmployee(name string, location string) (int64, error) { + ctx := context.Background() + var err error + + if db == nil { + err = errors.New("CreateEmployee: db is null") + return -1, err + } + + // Check if database is alive. + err = db.PingContext(ctx) + if err != nil { + return -1, err + } + + tsql := "INSERT INTO TestSchema.Employees (Name, Location) VALUES (@Name, @Location); select convert(bigint, SCOPE_IDENTITY());" + + stmt, err := db.Prepare(tsql) + if err != nil { + return -1, err + } + defer stmt.Close() + + row := stmt.QueryRowContext( + ctx, + sql.Named("Name", name), + sql.Named("Location", location)) + var newID int64 + err = row.Scan(&newID) + if err != nil { + return -1, err + } + + return newID, nil +} + +// ReadEmployees reads all employee records +func ReadEmployees() (int, error) { + ctx := context.Background() + + // Check if database is alive. + err := db.PingContext(ctx) + if err != nil { + return -1, err + } + + tsql := fmt.Sprintf("SELECT Id, Name, Location FROM TestSchema.Employees;") + + // Execute query + rows, err := db.QueryContext(ctx, tsql) + if err != nil { + return -1, err + } + + defer rows.Close() + + var count int + + // Iterate through the result set. + for rows.Next() { + var name, location string + var id int + + // Get values from row. + err := rows.Scan(&id, &name, &location) + if err != nil { + return -1, err + } + + fmt.Printf("ID: %d, Name: %s, Location: %s\n", id, name, location) + count++ + } + + return count, nil +} + +// UpdateEmployee updates an employee's information +func UpdateEmployee(name string, location string) (int64, error) { + ctx := context.Background() + + // Check if database is alive. + err := db.PingContext(ctx) + if err != nil { + return -1, err + } + + tsql := fmt.Sprintf("UPDATE TestSchema.Employees SET Location = @Location WHERE Name = @Name") + + // Execute non-query with named parameters + result, err := db.ExecContext( + ctx, + tsql, + sql.Named("Location", location), + sql.Named("Name", name)) + if err != nil { + return -1, err + } + + return result.RowsAffected() +} + +// DeleteEmployee deletes an employee from the database +func DeleteEmployee(name string) (int64, error) { + ctx := context.Background() + + // Check if database is alive. + err := db.PingContext(ctx) + if err != nil { + return -1, err + } + + tsql := fmt.Sprintf("DELETE FROM TestSchema.Employees WHERE Name = @Name;") + + // Execute non-query with named parameters + result, err := db.ExecContext(ctx, tsql, sql.Named("Name", name)) + if err != nil { + return -1, err + } + + return result.RowsAffected() +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/go/orm.go b/samples/tutorials/AzureSqlGettingStartedSamples/go/orm.go new file mode 100644 index 00000000..0e397c9a --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/go/orm.go @@ -0,0 +1,103 @@ + package main + + import ( + "fmt" + "github.com/jinzhu/gorm" + _ "github.com/jinzhu/gorm/dialects/mssql" + "log" + ) + + var server = "your_server.database.windows.net" + var user = "your_user" + var password = "your_password" + var database = "your_database" + + // Define a User model struct + type User struct { + gorm.Model + FirstName string + LastName string + } + + // Define a Task model struct + type Task struct { + gorm.Model + Title string + DueDate string + IsComplete bool + UserID uint + } + + // Read and print all the tasks + func ReadAllTasks(db *gorm.DB){ + var users []User + var tasks []Task + db.Find(&users) + + for _, user := range users{ + db.Model(&user).Related(&tasks) + fmt.Printf("%s %s's tasks:\n", user.FirstName, user.LastName) + for _, task := range tasks { + fmt.Printf("Title: %s\nDueDate: %s\nIsComplete:%t\n\n", + task.Title, task.DueDate, task.IsComplete) + } + } + } + + // Update a task based on a user + func UpdateSomeonesTask(db *gorm.DB, userId int){ + var task Task + db.Where("user_id = ?", userId).First(&task).Update("Title", "Buy donuts for Luis") + fmt.Printf("Title: %s\nDueDate: %s\nIsComplete:%t\n\n", + task.Title, task.DueDate, task.IsComplete) + } + + // Delete all the tasks for a user + func DeleteSomeonesTasks(db *gorm.DB, userId int){ + db.Where("user_id = ?", userId).Delete(&Task{}) + fmt.Printf("Deleted all tasks for user %d", userId) + } + + func main() { + connectionString := fmt.Sprintf("server=%s;user id=%s;password=%s;database=%s", + server, user, password, database) + db, err := gorm.Open("mssql", connectionString) + + if err != nil { + log.Fatal("Failed to create connection pool. Error: " + err.Error()) + } + gorm.DefaultCallback.Create().Remove("mssql:set_identity_insert") + defer db.Close() + + fmt.Println("Migrating models...") + db.AutoMigrate(&User{}) + db.AutoMigrate(&Task{}) + + // Create awesome Users + fmt.Println("Creating awesome users...") + db.Create(&User{FirstName: "Andrea", LastName: "Lam"}) //UserID: 1 + db.Create(&User{FirstName: "Meet", LastName: "Bhagdev"}) //UserID: 2 + db.Create(&User{FirstName: "Luis", LastName: "Bosquez"}) //UserID: 3 + + // Create appropriate Tasks for each user + fmt.Println("Creating new appropriate tasks...") + db.Create(&Task{ + Title: "Do laundry", DueDate: "2021-03-30", IsComplete: false, UserID: 1}) + db.Create(&Task{ + Title: "Mow the lawn", DueDate: "2021-03-30", IsComplete: false, UserID: 2}) + db.Create(&Task{ + Title: "Do more laundry", DueDate: "2021-03-30", IsComplete: false, UserID: 3}) + db.Create(&Task{ + Title: "Watch TV", DueDate: "2021-03-30", IsComplete: false, UserID: 3}) + + // Read + fmt.Println("\nReading all the tasks...") + ReadAllTasks(db) + + // Update - update Task title to something more appropriate + fmt.Println("Updating Andrea's task...") + UpdateSomeonesTask(db, 1) + + // Delete - delete Luis's task + DeleteSomeonesTasks(db, 3) + } \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Readme.md b/samples/tutorials/AzureSqlGettingStartedSamples/java/Readme.md new file mode 100644 index 00000000..95776560 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Readme.md @@ -0,0 +1,15 @@ +--- +page_type: sample +languages: +- java +products: +- azure-sql-database +--- + +# Developing applications with Java and Azure SQL + +Pick a platform below to get started: +* [unix-based (Includes macOS, RHEL, Ubuntu, SLES](https://github.com/Microsoft/sql-server-samples/tree/master/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based) +* [Windows](https://github.com/Microsoft/sql-server-samples/tree/master/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows) + +Please visit our [getting started tutorials](https://www.microsoft.com/en-us/sql-server/developer-get-started/) diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlColumnstoreSample/App.java b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlColumnstoreSample/App.java new file mode 100644 index 00000000..19d1b718 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlColumnstoreSample/App.java @@ -0,0 +1,117 @@ +package com.sqlsamples; + +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; + +import com.azure.identity.DefaultAzureCredentialBuilder; +import com.azure.security.keyvault.secrets.SecretClient; +import com.azure.security.keyvault.secrets.models.KeyVaultSecret; +import com.azure.security.keyvault.secrets.SecretClientBuilder; + +public class App { + + public static void main(String[] args) { + + System.out.println("*** Azure SQL Columnstore demo ***"); + + // Get the key vault secret + // + System.out.println("Fetching Secret from Key Vault."); + SecretClient secretClient = new SecretClientBuilder() + .vaultUrl("https://your_keyvault_name.vault.azure.net/") // Update me + .credential(new DefaultAzureCredentialBuilder().build()) + .buildClient(); + KeyVaultSecret secret = secretClient.getSecret("AppSecret"); + System.out.println("Secret Fetched."); + + // Update the connection information below + String connectionUrl = "jdbc:sqlserver://your_server.database.windows.net;databaseName=your_db;user=your_user;password=" + secret.getValue(); + + // Load SQL Server JDBC driver and establish connection. + try { + // Load SQL Server JDBC driver and establish connection. + System.out.print("Connecting to Azure SQL ... "); + try (Connection connection = DriverManager.getConnection(connectionUrl)) { + System.out.println("Done."); + + // Create an example database + System.out.print("Dropping Table if already created ... "); + String sql = "DROP TABLE IF EXISTS [Table_with_3M_rows];"; + try (Statement statement = connection.createStatement()) { + statement.executeUpdate(sql); + System.out.println("Done."); + } + // Insert 3 million rows into the table 'Table_with_3M_rows' + System.out.print( + "Inserting 3 million rows into table 'Table_with_3M_rows'. This takes ~1 minute, please wait ... "); + sql = new StringBuilder() + .append("WITH a AS (SELECT * FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) AS a(a))") + .append("SELECT TOP(5000000)").append("ROW_NUMBER() OVER (ORDER BY a.a) AS OrderItemId ") + .append(",a.a + b.a + c.a + d.a + e.a + f.a + g.a + h.a AS OrderId ") + .append(",a.a * 10 AS Price ") + .append(",CONCAT(a.a, N' ', b.a, N' ', c.a, N' ', d.a, N' ', e.a, N' ', f.a, N' ', g.a, N' ', h.a) AS ProductName ") + .append("INTO Table_with_3M_rows ") + .append("FROM a, a AS b, a AS c, a AS d, a AS e, a AS f, a AS g, a AS h;").toString(); + try (Statement statement = connection.createStatement()) { + statement.executeUpdate(sql); + System.out.println("Done."); + } + + // Execute SQL query without a columnstore index + long elapsedTimeWithoutIndex = SumPrice(connection); + System.out.println("Query time WITHOUT columnstore index: " + elapsedTimeWithoutIndex + "ms"); + + System.out.print("Adding a columnstore to table 'Table_with_3M_rows' ... "); + sql = "CREATE CLUSTERED COLUMNSTORE INDEX columnstoreindex ON Table_with_3M_rows;"; + try (Statement statement = connection.createStatement()) { + statement.executeUpdate(sql); + System.out.println("Done."); + } + + // Execute the same SQL query again after the columnstore index + // is added + long elapsedTimeWithIndex = SumPrice(connection); + System.out.println("Query time WITH columnstore index: " + elapsedTimeWithIndex + "ms"); + + // Calculate performance gain from adding columnstore index + System.out.println("Performance improvement with columnstore index: " + + elapsedTimeWithoutIndex / elapsedTimeWithIndex + "x!"); + + connection.close(); + } + } catch (Exception e) { + System.out.println(""); + e.printStackTrace(); + } + finally { + + try (Connection connection = DriverManager.getConnection(connectionUrl)){ + // Delete the Employees table if it exists + Statement statement = connection.createStatement(); + statement.executeUpdate("Drop table if exists Table_with_3M_rows"); + System.out.println("Table cleaned up."); + } catch (Exception e) { + System.out.println(); + e.printStackTrace(); + } + } + } + + public static long SumPrice(Connection connection) { + String sql = "SELECT SUM(Price) FROM Table_with_3M_rows;"; + long startTime = System.currentTimeMillis(); + try (Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(sql)) { + while (resultSet.next()) { + long elapsedTime = System.currentTimeMillis() - startTime; + return elapsedTime; + } + } catch (Exception e) { + System.out.println(""); + e.printStackTrace(); + } + return 0; + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlColumnstoreSample/pom.xml b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlColumnstoreSample/pom.xml new file mode 100644 index 00000000..7fcf0874 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlColumnstoreSample/pom.xml @@ -0,0 +1,50 @@ + + 4.0.0 + com.sqlsamples + AzureSqlColumnstoreSample + jar + 1.0.0 + AzureSqlColumnstoreSample + http://maven.apache.org + + + junit + junit + 3.8.1 + test + + + + com.microsoft.sqlserver + mssql-jdbc + 7.0.0.jre8 + + + + com.azure + azure-security-keyvault-secrets + 4.0.1 + + + com.azure + azure-security-keyvault-keys + 4.0.0 + + + com.azure + azure-identity + 1.0.4 + + + org.slf4j + slf4j-jdk14 + 1.7.25 + + + + + 1.8 + 1.8 + + \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlHibernateSample/App.java b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlHibernateSample/App.java new file mode 100644 index 00000000..298f51be --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlHibernateSample/App.java @@ -0,0 +1,169 @@ +package com.sqlsamples; + +import java.sql.Connection; +import java.sql.Statement; +import java.sql.DriverManager; +import java.text.SimpleDateFormat; +import java.util.List; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.cfg.Configuration; + +import com.azure.identity.DefaultAzureCredentialBuilder; +import com.azure.security.keyvault.secrets.SecretClient; +import com.azure.security.keyvault.secrets.models.KeyVaultSecret; +import com.azure.security.keyvault.secrets.SecretClientBuilder; + +/** + * Java CRUD sample with Hibernate and Azure SQL + * + */ +public class App { + String connectionUrl = "jdbc:sqlserver://your_server.database.windows.net"; // update me + String userName = "your_user"; // update me + String password = "Will_Be_Updated_From_Key_Vault"; + String sampleDatabaseName = "your_db"; // update me + + // Main entry point + public static void main(String[] args) { + App app = new App(); + app.runDemo(); + } + + // Helper to run the demp app + public void runDemo() + { + // Get the key vault secret + // + System.out.println("Fetching Secret from Key Vault."); + SecretClient secretClient = new SecretClientBuilder() + .vaultUrl("https://your_key_vault.vault.azure.net/") // Update me + .credential(new DefaultAzureCredentialBuilder().build()) + .buildClient(); + KeyVaultSecret secret = secretClient.getSecret("AppSecret"); + password = secret.getValue(); + System.out.println("Secret Fetched."); + + // Configure Hibernate logging to only log SEVERE errors + @SuppressWarnings("unused") + org.jboss.logging.Logger logger = org.jboss.logging.Logger.getLogger("org.hibernate"); + java.util.logging.Logger.getLogger("org.hibernate").setLevel(java.util.logging.Level.SEVERE); + + System.out.println("**Java CRUD sample with Hibernate and Azure SQL **\n"); + try { + // We're creating the Hibernate configuration via code. An alternative is to use a 'hibernate.cfg.xml' file. + Configuration cfg = createHibernateConfiguration(); + + // We're mapping POJO classes to Tables via Hibernate Annotations. An alternative is to use Hibernate mapping xml files. + cfg.addAnnotatedClass(User.class); + cfg.addAnnotatedClass(Task.class); + + System.out.println("added classes to config"); + + + // Hibernate needs an existing database. We already have one created. + + // Create the Hibernate SessionFactory and Session. + // This causes Hibernate to create Tables and Relationships in the database from our Annotated classes. + try (SessionFactory sessionFactory = cfg.buildSessionFactory(); + Session session = sessionFactory.openSession()) { + + System.out.println("Created database schema from Java classes.\n"); + session.beginTransaction(); + + // Create demo: Create a User instance and save it to the database + User newUser = new User("Anna", "Shrestinian"); + session.save(newUser); + System.out.println("Created User: " + newUser.toString()); + + // Create demo: Create a Task instance and save it to the database + SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy"); + Task newTask = new Task("Ship Helsinki", sdf.parse("04-01-2017")); + session.save(newTask); + System.out.println("Created Task: " + newTask.toString()); + + // Association demo: Assign task to user + newTask.setUser(newUser); + session.save(newTask); + System.out.println("Assigned Task: '" + newTask.getTitle() + "' to user '" + newUser.getFullName() + "'\n"); + + // Read demo: find incomplete tasks assigned to user 'Anna' + System.out.println("Incomplete tasks assigned to 'Anna':"); + String hqlQuery = "from Task where isComplete = false and user.firstName = :paramFirstName"; + List incompleteTasks = session.createQuery(hqlQuery, Task.class) + .setParameter("paramFirstName", "Anna") + .getResultList(); + for(Task theTask : incompleteTasks) { + System.out.println(theTask.toString()); + } + + // Update demo: change the 'dueDate' of a task + hqlQuery = "from Task"; + Task taskToUpdate = session.createQuery(hqlQuery, Task.class) + .getResultList() + .get(0); // get the first task + System.out.println("\nUpdating task: " + taskToUpdate.toString()); + taskToUpdate.setDueDate(sdf.parse("06-30-2016")); + session.save(taskToUpdate); + System.out.println("dueDate changed: " + taskToUpdate.toString()); + + // Delete demo: delete all tasks with a dueDate in 2016 + System.out.println("\nDeleting all tasks with a dueDate in 2016"); + hqlQuery = "from Task where dueDate < :paramDate"; + List tasksToDelete = session.createQuery(hqlQuery, Task.class) + .setParameter("paramDate", sdf.parse("12-31-2016")) + .getResultList(); + for(Task theTask : tasksToDelete) { + System.out.println("Deleting task:" + theTask.toString()); + session.delete(theTask); + } + + // Show tasks after the 'Delete' operation - there should be 0 tasks + System.out.println("\nTasks after delete:"); + hqlQuery = "from Task"; + List tasksAfterDelete = session.createQuery(hqlQuery, Task.class) + .getResultList(); + if(tasksAfterDelete.isEmpty()) { + System.out.println("[None]"); + } + else { + for(Task theTask : tasksAfterDelete) { + System.out.println(theTask.toString()); + } + } + + session.getTransaction().commit(); + } + System.out.println("All done."); + + } catch (Exception e) { + System.out.println(); + e.printStackTrace(); + } + } + + // Create Hibernate configuration via code instead of using a + // 'hibernate.cfg.xml' file. + private Configuration createHibernateConfiguration() { + String url = this.connectionUrl + ";databaseName=" + this.sampleDatabaseName; + Configuration cfg = new Configuration() + .setProperty("hibernate.connection.driver_class", "com.microsoft.sqlserver.jdbc.SQLServerDriver") + .setProperty("hibernate.connection.url", url) + .setProperty("hibernate.connection.username", this.userName) + .setProperty("hibernate.connection.password", this.password) + .setProperty("hibernate.connection.autocommit", "true") + .setProperty("hibernate.show_sql", "false"); + + // Tell Hibernate to use the 'SQL Server' dialect when dynamically + // generating SQL queries + cfg.setProperty("hibernate.dialect", "org.hibernate.dialect.SQLServerDialect"); + + // Tell Hibernate to show the generated T-SQL + cfg.setProperty("hibernate.show_sql", "false"); + + // This is ok during development, but not recommended in production + // See: http://stackoverflow.com/questions/221379/hibernate-hbm2ddl-auto-update-in-production + cfg.setProperty("hibernate.hbm2ddl.auto", "update"); + return cfg; + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlHibernateSample/Task.java b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlHibernateSample/Task.java new file mode 100644 index 00000000..4e2d9e04 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlHibernateSample/Task.java @@ -0,0 +1,77 @@ +package com.sqlsamples; + +import java.util.Date; +import javax.persistence.*; +import java.text.SimpleDateFormat; + +@Entity +@Table(name = "Tasks") +public class Task { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id", updatable = false, nullable = false) + private Long id; + private String title; + private Boolean isComplete; + @Temporal(TemporalType.TIMESTAMP) + private Date dueDate; + + // Specify a Many:1 mapping between Task and User + @ManyToOne + private User user; + + public Task() { + } + + public Task(String title, Date dueDate) { + this.title = title; + this.dueDate = dueDate; + this.isComplete = false; + } + + public Task(String title, Date dueDate, User user) { + this.title = title; + this.dueDate = dueDate; + this.isComplete = false; + this.user = user; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return this.title; + } + + public void setTitle(String title) { + this.title = title; + } + + public User getUser() { + return this.user; + } + + public void setUser(User user) { + this.user = user; + } + + public Date getDueDate() { + return this.dueDate; + } + + public void setDueDate(Date dueDate) { + this.dueDate = dueDate; + } + + @Override + public String toString() { + SimpleDateFormat ft = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz"); + return "Task [id=" + this.id + ", title=" + this.title + ", dueDate=" + ft.format(this.dueDate) + + ", isComplete=" + this.isComplete.toString() + "]"; + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlHibernateSample/User.java b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlHibernateSample/User.java new file mode 100644 index 00000000..c57132b5 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlHibernateSample/User.java @@ -0,0 +1,70 @@ +package com.sqlsamples; + +import java.util.List; +import java.util.ArrayList; +import javax.persistence.*; + +@Entity +@Table(name = "Users") +public class User { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id", updatable = false, nullable = false) + private Long id; + private String firstName; + private String lastName; + + // Specify a 1:Many mapping between User and Task via the "user" field in + // the "Tasks" class. + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) + private List tasks = new ArrayList(); + + public User() { + } + + public User(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getFullName() { + return this.firstName + " " + this.lastName; + } + + public List getTasks() { + return tasks; + } + + public void setTasks(List tasks) { + this.tasks = tasks; + } + + @Override + public String toString() { + return "User [id=" + this.id + ", name=" + this.getFullName() + "]"; + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlHibernateSample/pom.xml b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlHibernateSample/pom.xml new file mode 100644 index 00000000..7183584e --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlHibernateSample/pom.xml @@ -0,0 +1,66 @@ + + 4.0.0 + com.sqlsamples + AzureSqlHibernateSample + jar + 1.0.0 + AzureSqlHibernateSample + http://maven.apache.org + + + junit + junit + 3.8.1 + test + + + + com.microsoft.sqlserver + mssql-jdbc + 7.0.0.jre8 + + + + org.hibernate + hibernate-core + 5.2.3.Final + + + org.javassist + javassist + 3.23.1-GA + + + javax.xml.bind + jaxb-api + 2.3.0 + + + + com.azure + azure-security-keyvault-secrets + 4.0.1 + + + com.azure + azure-security-keyvault-keys + 4.0.0 + + + com.azure + azure-identity + 1.0.4 + + + org.slf4j + slf4j-jdk14 + 1.7.25 + + + + UTF-8 + 1.8 + 1.8 + + \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlSample/App.java b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlSample/App.java new file mode 100644 index 00000000..c97e2ed0 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlSample/App.java @@ -0,0 +1,111 @@ +package com.sqlsamples; + +import java.sql.Connection; +import java.sql.Statement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.DriverManager; + +public class App { + + public static void main(String[] args) { + + System.out.println("Connect to Azure SQL and demo Create, Read, Update and Delete operations."); + + // Update the connection information below + String connectionUrl = "jdbc:sqlserver://your_server_name.database.windows.net;databaseName=your_database_name;user=your_user;password=your_password"; + + try { + // Load SQL Server JDBC driver and establish connection. + System.out.print("Connecting to Azure SQL ... "); + try (Connection connection = DriverManager.getConnection(connectionUrl)) { + System.out.println("Done."); + + // Create a sample database + System.out.print("Dropping Employees table if exists ... "); + String sql = "DROP Table IF EXISTS Employees"; + try (Statement statement = connection.createStatement()) { + statement.executeUpdate(sql); + System.out.println("Done."); + } + + // Create a Table and insert some sample data + System.out.println("Creating sample table with data, press ENTER to continue..."); + System.in.read(); + sql = new StringBuilder().append("CREATE TABLE Employees ( ") + .append(" Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, ").append(" Name NVARCHAR(50), ") + .append(" Location NVARCHAR(50) ").append("); ") + .append("INSERT INTO Employees (Name, Location) VALUES ").append("(N'Jared', N'Australia'), ") + .append("(N'Nikita', N'India'), ").append("(N'Tom', N'Germany'); ").toString(); + try (Statement statement = connection.createStatement()) { + statement.executeUpdate(sql); + System.out.println("Done."); + } + + // INSERT demo + System.out.println("Inserting a new row into table, press ENTER to continue..."); + System.in.read(); + sql = new StringBuilder().append("INSERT Employees (Name, Location) ").append("VALUES (?, ?);") + .toString(); + try (PreparedStatement statement = connection.prepareStatement(sql)) { + statement.setString(1, "Jake"); + statement.setString(2, "United States"); + int rowsAffected = statement.executeUpdate(); + System.out.println(rowsAffected + " row(s) inserted"); + } + + // UPDATE demo + String userToUpdate = "Nikita"; + System.out.print("Updating 'Location' for user '" + userToUpdate + "', press ENTER to continue..."); + System.in.read(); + sql = "UPDATE Employees SET Location = N'United States' WHERE Name = ?"; + try (PreparedStatement statement = connection.prepareStatement(sql)) { + statement.setString(1, userToUpdate); + int rowsAffected = statement.executeUpdate(); + System.out.println(rowsAffected + " row(s) updated"); + } + + // DELETE demo + String userToDelete = "Jared"; + System.out.println("Deleting user '" + userToDelete + "', press ENTER to continue..."); + System.in.read(); + sql = "DELETE FROM Employees WHERE Name = ?;"; + try (PreparedStatement statement = connection.prepareStatement(sql)) { + statement.setString(1, userToDelete); + int rowsAffected = statement.executeUpdate(); + System.out.println(rowsAffected + " row(s) deleted"); + } + + // READ demo + System.out.println("Reading data from table, press ENTER to continue..."); + System.in.read(); + sql = "SELECT Id, Name, Location FROM Employees;"; + try (Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery(sql)) { + while (resultSet.next()) { + System.out.println( + resultSet.getInt(1) + " " + resultSet.getString(2) + " " + resultSet.getString(3)); + } + } + connection.close(); + System.out.println("All done."); + } + } catch (Exception e) { + System.out.println(); + e.printStackTrace(); + } finally { + String sql = "DROP Table IF EXISTS Employees"; + try (Connection connection = DriverManager.getConnection(connectionUrl)) { + System.out.println("Done."); + try (Statement statement = connection.createStatement()) { + statement.executeUpdate(sql); + System.out.println("Table dropped."); + } + } catch (Exception e) { + System.out.println(); + e.printStackTrace(); + } + } + + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlSample/App_KeyVault.java b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlSample/App_KeyVault.java new file mode 100644 index 00000000..6970f0a7 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlSample/App_KeyVault.java @@ -0,0 +1,126 @@ +package com.sqlsamples; + +import java.sql.Connection; +import java.sql.Statement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.DriverManager; + +import com.azure.identity.DefaultAzureCredentialBuilder; +import com.azure.security.keyvault.secrets.SecretClient; +import com.azure.security.keyvault.secrets.models.KeyVaultSecret; +import com.azure.security.keyvault.secrets.SecretClientBuilder; + +public class App { + + public static void main(String[] args) { + + System.out.println("Connect to Azure SQL and demo Create, Read, Update and Delete operations."); + + // Get the key vault secret + // + System.out.println("Fetching Secret from Key Vault."); + SecretClient secretClient = new SecretClientBuilder() + .vaultUrl("https://your_keyvault_name.vault.azure.net/") // Update me + .credential(new DefaultAzureCredentialBuilder().build()) + .buildClient(); + KeyVaultSecret secret = secretClient.getSecret("AppSecret"); + System.out.println("Secret Fetched."); + + // Update the connection information below + String connectionUrl = "jdbc:sqlserver://your_server.database.windows.net;databaseName=your_db;user=your_user;password=" + secret.getValue(); + + try { + // Load Azure SQL JDBC driver and establish connection. + System.out.print("Connecting to Azure SQL ... "); + try (Connection connection = DriverManager.getConnection(connectionUrl)) { + System.out.println("Done."); + + // Delete the Employees table if it exists + try (Statement statement = connection.createStatement()) { + statement.executeUpdate("Drop table if exists Employees"); + System.out.println("Done."); + } catch (Exception e) { + System.out.println(); + e.printStackTrace(); + } + + // Create a Table and insert some sample data + System.out.print("Creating sample table with data, press ENTER to continue..."); + System.in.read(); + String sql = new StringBuilder().append("CREATE TABLE Employees ( ") + .append(" Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, ").append(" Name NVARCHAR(50), ") + .append(" Location NVARCHAR(50) ").append("); ") + .append("INSERT INTO Employees (Name, Location) VALUES ").append("(N'Jared', N'Australia'), ") + .append("(N'Nikita', N'India'), ").append("(N'Tom', N'Germany'); ").toString(); + try (Statement statement = connection.createStatement()) { + statement.executeUpdate(sql); + System.out.println("Done."); + } + + // INSERT demo + System.out.print("Inserting a new row into table, press ENTER to continue..."); + System.in.read(); + sql = new StringBuilder().append("INSERT Employees (Name, Location) ").append("VALUES (?, ?);") + .toString(); + try (PreparedStatement statement = connection.prepareStatement(sql)) { + statement.setString(1, "Jake"); + statement.setString(2, "United States"); + int rowsAffected = statement.executeUpdate(); + System.out.println(rowsAffected + " row(s) inserted"); + } + + // UPDATE demo + String userToUpdate = "Nikita"; + System.out.print("Updating 'Location' for user '" + userToUpdate + "', press ENTER to continue..."); + System.in.read(); + sql = "UPDATE Employees SET Location = N'United States' WHERE Name = ?"; + try (PreparedStatement statement = connection.prepareStatement(sql)) { + statement.setString(1, userToUpdate); + int rowsAffected = statement.executeUpdate(); + System.out.println(rowsAffected + " row(s) updated"); + } + + // DELETE demo + String userToDelete = "Jared"; + System.out.print("Deleting user '" + userToDelete + "', press ENTER to continue..."); + System.in.read(); + sql = "DELETE FROM Employees WHERE Name = ?;"; + try (PreparedStatement statement = connection.prepareStatement(sql)) { + statement.setString(1, userToDelete); + int rowsAffected = statement.executeUpdate(); + System.out.println(rowsAffected + " row(s) deleted"); + } + + // READ demo + System.out.print("Reading data from table, press ENTER to continue..."); + System.in.read(); + sql = "SELECT Id, Name, Location FROM Employees;"; + try (Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery(sql)) { + while (resultSet.next()) { + System.out.println( + resultSet.getInt(1) + " " + resultSet.getString(2) + " " + resultSet.getString(3)); + } + } + connection.close(); + System.out.println("All done."); + } + } catch (Exception e) { + System.out.println(); + e.printStackTrace(); + } + finally { + + try (Connection connection = DriverManager.getConnection(connectionUrl)){ + // Delete the Employees table if it exists + Statement statement = connection.createStatement(); + statement.executeUpdate("Drop table if exists Employees"); + System.out.println("Table cleaned up."); + } catch (Exception e) { + System.out.println(); + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlSample/pom.xml b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlSample/pom.xml new file mode 100644 index 00000000..eaae13db --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/AzureSqlSample/pom.xml @@ -0,0 +1,99 @@ + + + + 4.0.0 + + com.sqlsamples + AzureSqlSample + 1.0.0 + + AzureSqlSample + + + UTF-8 + 1.8 + 1.8 + + + + + junit + junit + 4.11 + test + + + com.microsoft.sqlserver + mssql-jdbc + 7.0.0.jre8 + + + com.azure + azure-security-keyvault-secrets + 4.0.1 + + + + com.azure + azure-security-keyvault-keys + 4.0.0 + + + com.azure + azure-identity + 1.0.4 + + + org.slf4j + slf4j-jdk14 + 1.7.25 + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/Readme.md b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/Readme.md new file mode 100644 index 00000000..833e7e95 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Unix-based/Readme.md @@ -0,0 +1,11 @@ +## Sample details + +Please visit the [Java tutorials](https://www.microsoft.com/en-us/sql-server/developer-get-started) and select RHEL, Ubuntu, SLES, or macOs to run through the sample in full with more detail. + + + +The scripts and this guide are provided as samples. They are not part of any Azure service and are not covered by any SLA or other Azure-related agreements. They are provided as-is with no warranties express or implied. Microsoft takes no responsibility for the use of the scripts or the accuracy of this document. Familiarize yourself with the scripts before using them. +## Related Links + +For more information, see these articles: +* To see more getting started tutorials, visit our [tutorials page](https://www.microsoft.com/en-us/sql-server/developer-get-started/) diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlColumnstoreSample/App.java b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlColumnstoreSample/App.java new file mode 100644 index 00000000..19d1b718 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlColumnstoreSample/App.java @@ -0,0 +1,117 @@ +package com.sqlsamples; + +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; + +import com.azure.identity.DefaultAzureCredentialBuilder; +import com.azure.security.keyvault.secrets.SecretClient; +import com.azure.security.keyvault.secrets.models.KeyVaultSecret; +import com.azure.security.keyvault.secrets.SecretClientBuilder; + +public class App { + + public static void main(String[] args) { + + System.out.println("*** Azure SQL Columnstore demo ***"); + + // Get the key vault secret + // + System.out.println("Fetching Secret from Key Vault."); + SecretClient secretClient = new SecretClientBuilder() + .vaultUrl("https://your_keyvault_name.vault.azure.net/") // Update me + .credential(new DefaultAzureCredentialBuilder().build()) + .buildClient(); + KeyVaultSecret secret = secretClient.getSecret("AppSecret"); + System.out.println("Secret Fetched."); + + // Update the connection information below + String connectionUrl = "jdbc:sqlserver://your_server.database.windows.net;databaseName=your_db;user=your_user;password=" + secret.getValue(); + + // Load SQL Server JDBC driver and establish connection. + try { + // Load SQL Server JDBC driver and establish connection. + System.out.print("Connecting to Azure SQL ... "); + try (Connection connection = DriverManager.getConnection(connectionUrl)) { + System.out.println("Done."); + + // Create an example database + System.out.print("Dropping Table if already created ... "); + String sql = "DROP TABLE IF EXISTS [Table_with_3M_rows];"; + try (Statement statement = connection.createStatement()) { + statement.executeUpdate(sql); + System.out.println("Done."); + } + // Insert 3 million rows into the table 'Table_with_3M_rows' + System.out.print( + "Inserting 3 million rows into table 'Table_with_3M_rows'. This takes ~1 minute, please wait ... "); + sql = new StringBuilder() + .append("WITH a AS (SELECT * FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) AS a(a))") + .append("SELECT TOP(5000000)").append("ROW_NUMBER() OVER (ORDER BY a.a) AS OrderItemId ") + .append(",a.a + b.a + c.a + d.a + e.a + f.a + g.a + h.a AS OrderId ") + .append(",a.a * 10 AS Price ") + .append(",CONCAT(a.a, N' ', b.a, N' ', c.a, N' ', d.a, N' ', e.a, N' ', f.a, N' ', g.a, N' ', h.a) AS ProductName ") + .append("INTO Table_with_3M_rows ") + .append("FROM a, a AS b, a AS c, a AS d, a AS e, a AS f, a AS g, a AS h;").toString(); + try (Statement statement = connection.createStatement()) { + statement.executeUpdate(sql); + System.out.println("Done."); + } + + // Execute SQL query without a columnstore index + long elapsedTimeWithoutIndex = SumPrice(connection); + System.out.println("Query time WITHOUT columnstore index: " + elapsedTimeWithoutIndex + "ms"); + + System.out.print("Adding a columnstore to table 'Table_with_3M_rows' ... "); + sql = "CREATE CLUSTERED COLUMNSTORE INDEX columnstoreindex ON Table_with_3M_rows;"; + try (Statement statement = connection.createStatement()) { + statement.executeUpdate(sql); + System.out.println("Done."); + } + + // Execute the same SQL query again after the columnstore index + // is added + long elapsedTimeWithIndex = SumPrice(connection); + System.out.println("Query time WITH columnstore index: " + elapsedTimeWithIndex + "ms"); + + // Calculate performance gain from adding columnstore index + System.out.println("Performance improvement with columnstore index: " + + elapsedTimeWithoutIndex / elapsedTimeWithIndex + "x!"); + + connection.close(); + } + } catch (Exception e) { + System.out.println(""); + e.printStackTrace(); + } + finally { + + try (Connection connection = DriverManager.getConnection(connectionUrl)){ + // Delete the Employees table if it exists + Statement statement = connection.createStatement(); + statement.executeUpdate("Drop table if exists Table_with_3M_rows"); + System.out.println("Table cleaned up."); + } catch (Exception e) { + System.out.println(); + e.printStackTrace(); + } + } + } + + public static long SumPrice(Connection connection) { + String sql = "SELECT SUM(Price) FROM Table_with_3M_rows;"; + long startTime = System.currentTimeMillis(); + try (Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(sql)) { + while (resultSet.next()) { + long elapsedTime = System.currentTimeMillis() - startTime; + return elapsedTime; + } + } catch (Exception e) { + System.out.println(""); + e.printStackTrace(); + } + return 0; + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlColumnstoreSample/pom.xml b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlColumnstoreSample/pom.xml new file mode 100644 index 00000000..7fcf0874 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlColumnstoreSample/pom.xml @@ -0,0 +1,50 @@ + + 4.0.0 + com.sqlsamples + AzureSqlColumnstoreSample + jar + 1.0.0 + AzureSqlColumnstoreSample + http://maven.apache.org + + + junit + junit + 3.8.1 + test + + + + com.microsoft.sqlserver + mssql-jdbc + 7.0.0.jre8 + + + + com.azure + azure-security-keyvault-secrets + 4.0.1 + + + com.azure + azure-security-keyvault-keys + 4.0.0 + + + com.azure + azure-identity + 1.0.4 + + + org.slf4j + slf4j-jdk14 + 1.7.25 + + + + + 1.8 + 1.8 + + \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlHibernateSample/App.java b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlHibernateSample/App.java new file mode 100644 index 00000000..298f51be --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlHibernateSample/App.java @@ -0,0 +1,169 @@ +package com.sqlsamples; + +import java.sql.Connection; +import java.sql.Statement; +import java.sql.DriverManager; +import java.text.SimpleDateFormat; +import java.util.List; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.cfg.Configuration; + +import com.azure.identity.DefaultAzureCredentialBuilder; +import com.azure.security.keyvault.secrets.SecretClient; +import com.azure.security.keyvault.secrets.models.KeyVaultSecret; +import com.azure.security.keyvault.secrets.SecretClientBuilder; + +/** + * Java CRUD sample with Hibernate and Azure SQL + * + */ +public class App { + String connectionUrl = "jdbc:sqlserver://your_server.database.windows.net"; // update me + String userName = "your_user"; // update me + String password = "Will_Be_Updated_From_Key_Vault"; + String sampleDatabaseName = "your_db"; // update me + + // Main entry point + public static void main(String[] args) { + App app = new App(); + app.runDemo(); + } + + // Helper to run the demp app + public void runDemo() + { + // Get the key vault secret + // + System.out.println("Fetching Secret from Key Vault."); + SecretClient secretClient = new SecretClientBuilder() + .vaultUrl("https://your_key_vault.vault.azure.net/") // Update me + .credential(new DefaultAzureCredentialBuilder().build()) + .buildClient(); + KeyVaultSecret secret = secretClient.getSecret("AppSecret"); + password = secret.getValue(); + System.out.println("Secret Fetched."); + + // Configure Hibernate logging to only log SEVERE errors + @SuppressWarnings("unused") + org.jboss.logging.Logger logger = org.jboss.logging.Logger.getLogger("org.hibernate"); + java.util.logging.Logger.getLogger("org.hibernate").setLevel(java.util.logging.Level.SEVERE); + + System.out.println("**Java CRUD sample with Hibernate and Azure SQL **\n"); + try { + // We're creating the Hibernate configuration via code. An alternative is to use a 'hibernate.cfg.xml' file. + Configuration cfg = createHibernateConfiguration(); + + // We're mapping POJO classes to Tables via Hibernate Annotations. An alternative is to use Hibernate mapping xml files. + cfg.addAnnotatedClass(User.class); + cfg.addAnnotatedClass(Task.class); + + System.out.println("added classes to config"); + + + // Hibernate needs an existing database. We already have one created. + + // Create the Hibernate SessionFactory and Session. + // This causes Hibernate to create Tables and Relationships in the database from our Annotated classes. + try (SessionFactory sessionFactory = cfg.buildSessionFactory(); + Session session = sessionFactory.openSession()) { + + System.out.println("Created database schema from Java classes.\n"); + session.beginTransaction(); + + // Create demo: Create a User instance and save it to the database + User newUser = new User("Anna", "Shrestinian"); + session.save(newUser); + System.out.println("Created User: " + newUser.toString()); + + // Create demo: Create a Task instance and save it to the database + SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy"); + Task newTask = new Task("Ship Helsinki", sdf.parse("04-01-2017")); + session.save(newTask); + System.out.println("Created Task: " + newTask.toString()); + + // Association demo: Assign task to user + newTask.setUser(newUser); + session.save(newTask); + System.out.println("Assigned Task: '" + newTask.getTitle() + "' to user '" + newUser.getFullName() + "'\n"); + + // Read demo: find incomplete tasks assigned to user 'Anna' + System.out.println("Incomplete tasks assigned to 'Anna':"); + String hqlQuery = "from Task where isComplete = false and user.firstName = :paramFirstName"; + List incompleteTasks = session.createQuery(hqlQuery, Task.class) + .setParameter("paramFirstName", "Anna") + .getResultList(); + for(Task theTask : incompleteTasks) { + System.out.println(theTask.toString()); + } + + // Update demo: change the 'dueDate' of a task + hqlQuery = "from Task"; + Task taskToUpdate = session.createQuery(hqlQuery, Task.class) + .getResultList() + .get(0); // get the first task + System.out.println("\nUpdating task: " + taskToUpdate.toString()); + taskToUpdate.setDueDate(sdf.parse("06-30-2016")); + session.save(taskToUpdate); + System.out.println("dueDate changed: " + taskToUpdate.toString()); + + // Delete demo: delete all tasks with a dueDate in 2016 + System.out.println("\nDeleting all tasks with a dueDate in 2016"); + hqlQuery = "from Task where dueDate < :paramDate"; + List tasksToDelete = session.createQuery(hqlQuery, Task.class) + .setParameter("paramDate", sdf.parse("12-31-2016")) + .getResultList(); + for(Task theTask : tasksToDelete) { + System.out.println("Deleting task:" + theTask.toString()); + session.delete(theTask); + } + + // Show tasks after the 'Delete' operation - there should be 0 tasks + System.out.println("\nTasks after delete:"); + hqlQuery = "from Task"; + List tasksAfterDelete = session.createQuery(hqlQuery, Task.class) + .getResultList(); + if(tasksAfterDelete.isEmpty()) { + System.out.println("[None]"); + } + else { + for(Task theTask : tasksAfterDelete) { + System.out.println(theTask.toString()); + } + } + + session.getTransaction().commit(); + } + System.out.println("All done."); + + } catch (Exception e) { + System.out.println(); + e.printStackTrace(); + } + } + + // Create Hibernate configuration via code instead of using a + // 'hibernate.cfg.xml' file. + private Configuration createHibernateConfiguration() { + String url = this.connectionUrl + ";databaseName=" + this.sampleDatabaseName; + Configuration cfg = new Configuration() + .setProperty("hibernate.connection.driver_class", "com.microsoft.sqlserver.jdbc.SQLServerDriver") + .setProperty("hibernate.connection.url", url) + .setProperty("hibernate.connection.username", this.userName) + .setProperty("hibernate.connection.password", this.password) + .setProperty("hibernate.connection.autocommit", "true") + .setProperty("hibernate.show_sql", "false"); + + // Tell Hibernate to use the 'SQL Server' dialect when dynamically + // generating SQL queries + cfg.setProperty("hibernate.dialect", "org.hibernate.dialect.SQLServerDialect"); + + // Tell Hibernate to show the generated T-SQL + cfg.setProperty("hibernate.show_sql", "false"); + + // This is ok during development, but not recommended in production + // See: http://stackoverflow.com/questions/221379/hibernate-hbm2ddl-auto-update-in-production + cfg.setProperty("hibernate.hbm2ddl.auto", "update"); + return cfg; + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlHibernateSample/Task.java b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlHibernateSample/Task.java new file mode 100644 index 00000000..4e2d9e04 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlHibernateSample/Task.java @@ -0,0 +1,77 @@ +package com.sqlsamples; + +import java.util.Date; +import javax.persistence.*; +import java.text.SimpleDateFormat; + +@Entity +@Table(name = "Tasks") +public class Task { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id", updatable = false, nullable = false) + private Long id; + private String title; + private Boolean isComplete; + @Temporal(TemporalType.TIMESTAMP) + private Date dueDate; + + // Specify a Many:1 mapping between Task and User + @ManyToOne + private User user; + + public Task() { + } + + public Task(String title, Date dueDate) { + this.title = title; + this.dueDate = dueDate; + this.isComplete = false; + } + + public Task(String title, Date dueDate, User user) { + this.title = title; + this.dueDate = dueDate; + this.isComplete = false; + this.user = user; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return this.title; + } + + public void setTitle(String title) { + this.title = title; + } + + public User getUser() { + return this.user; + } + + public void setUser(User user) { + this.user = user; + } + + public Date getDueDate() { + return this.dueDate; + } + + public void setDueDate(Date dueDate) { + this.dueDate = dueDate; + } + + @Override + public String toString() { + SimpleDateFormat ft = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz"); + return "Task [id=" + this.id + ", title=" + this.title + ", dueDate=" + ft.format(this.dueDate) + + ", isComplete=" + this.isComplete.toString() + "]"; + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlHibernateSample/User.java b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlHibernateSample/User.java new file mode 100644 index 00000000..43fa5355 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlHibernateSample/User.java @@ -0,0 +1,69 @@ +package com.sqlsamples; + +import java.util.List; +import java.util.ArrayList; +import javax.persistence.*; + +@Entity +@Table(name = "Users") +public class User { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id", updatable = false, nullable = false) + private Long id; + private String firstName; + private String lastName; + + // Specify a 1:Many mapping between User and Task via the "user" field in + // the "Tasks" class. + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) + private List tasks = new ArrayList(); + + public User() { + } + + public User(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getFullName() { + return this.firstName + " " + this.lastName; + } + + public List getTasks() { + return tasks; + } + + public void setTasks(List tasks) { + this.tasks = tasks; + } + + @Override + public String toString() { + return "User [id=" + this.id + ", name=" + this.getFullName() + "]"; + } \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlHibernateSample/pom.xml b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlHibernateSample/pom.xml new file mode 100644 index 00000000..7183584e --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlHibernateSample/pom.xml @@ -0,0 +1,66 @@ + + 4.0.0 + com.sqlsamples + AzureSqlHibernateSample + jar + 1.0.0 + AzureSqlHibernateSample + http://maven.apache.org + + + junit + junit + 3.8.1 + test + + + + com.microsoft.sqlserver + mssql-jdbc + 7.0.0.jre8 + + + + org.hibernate + hibernate-core + 5.2.3.Final + + + org.javassist + javassist + 3.23.1-GA + + + javax.xml.bind + jaxb-api + 2.3.0 + + + + com.azure + azure-security-keyvault-secrets + 4.0.1 + + + com.azure + azure-security-keyvault-keys + 4.0.0 + + + com.azure + azure-identity + 1.0.4 + + + org.slf4j + slf4j-jdk14 + 1.7.25 + + + + UTF-8 + 1.8 + 1.8 + + \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlSample/App.java b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlSample/App.java new file mode 100644 index 00000000..11603560 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlSample/App.java @@ -0,0 +1,111 @@ +package com.sqlsamples; + +import java.sql.Connection; +import java.sql.Statement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.DriverManager; + +public class App { + + public static void main(String[] args) { + + System.out.println("Connect to Azure SQL and demo Create, Read, Update and Delete operations."); + + // Update the connection information below + String connectionUrl = "jdbc:sqlserver://your_server_name.database.windows.net;databaseName=your_database_name;user=your_user;password=your_password"; + + try { + // Load Azure SQL JDBC driver and establish connection. + System.out.print("Connecting to Azure SQL ... "); + try (Connection connection = DriverManager.getConnection(connectionUrl)) { + System.out.println("Done."); + + // Delete the Employees table if it exists + try (Statement statement = connection.createStatement()) { + statement.executeUpdate("Drop table if exists Employees"); + System.out.println("Done."); + } catch (Exception e) { + System.out.println(); + e.printStackTrace(); + } + + // Create a Table and insert some sample data + System.out.print("Creating sample table with data, press ENTER to continue..."); + System.in.read(); + String sql = new StringBuilder().append("CREATE TABLE Employees ( ") + .append(" Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, ").append(" Name NVARCHAR(50), ") + .append(" Location NVARCHAR(50) ").append("); ") + .append("INSERT INTO Employees (Name, Location) VALUES ").append("(N'Jared', N'Australia'), ") + .append("(N'Nikita', N'India'), ").append("(N'Tom', N'Germany'); ").toString(); + try (Statement statement = connection.createStatement()) { + statement.executeUpdate(sql); + System.out.println("Done."); + } + + // INSERT demo + System.out.print("Inserting a new row into table, press ENTER to continue..."); + System.in.read(); + sql = new StringBuilder().append("INSERT Employees (Name, Location) ").append("VALUES (?, ?);") + .toString(); + try (PreparedStatement statement = connection.prepareStatement(sql)) { + statement.setString(1, "Jake"); + statement.setString(2, "United States"); + int rowsAffected = statement.executeUpdate(); + System.out.println(rowsAffected + " row(s) inserted"); + } + + // UPDATE demo + String userToUpdate = "Nikita"; + System.out.print("Updating 'Location' for user '" + userToUpdate + "', press ENTER to continue..."); + System.in.read(); + sql = "UPDATE Employees SET Location = N'United States' WHERE Name = ?"; + try (PreparedStatement statement = connection.prepareStatement(sql)) { + statement.setString(1, userToUpdate); + int rowsAffected = statement.executeUpdate(); + System.out.println(rowsAffected + " row(s) updated"); + } + + // DELETE demo + String userToDelete = "Jared"; + System.out.print("Deleting user '" + userToDelete + "', press ENTER to continue..."); + System.in.read(); + sql = "DELETE FROM Employees WHERE Name = ?;"; + try (PreparedStatement statement = connection.prepareStatement(sql)) { + statement.setString(1, userToDelete); + int rowsAffected = statement.executeUpdate(); + System.out.println(rowsAffected + " row(s) deleted"); + } + + // READ demo + System.out.print("Reading data from table, press ENTER to continue..."); + System.in.read(); + sql = "SELECT Id, Name, Location FROM Employees;"; + try (Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery(sql)) { + while (resultSet.next()) { + System.out.println( + resultSet.getInt(1) + " " + resultSet.getString(2) + " " + resultSet.getString(3)); + } + } + connection.close(); + System.out.println("All done."); + } + } catch (Exception e) { + System.out.println(); + e.printStackTrace(); + } + finally { + + try (Connection connection = DriverManager.getConnection(connectionUrl)){ + // Delete the Employees table if it exists + Statement statement = connection.createStatement(); + statement.executeUpdate("Drop table if exists Employees"); + System.out.println("Table cleaned up."); + } catch (Exception e) { + System.out.println(); + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlSample/App_KeyVault.java b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlSample/App_KeyVault.java new file mode 100644 index 00000000..9959a7fc --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlSample/App_KeyVault.java @@ -0,0 +1,126 @@ +package com.sqlsamples; + +import java.sql.Connection; +import java.sql.Statement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.DriverManager; + +import com.azure.identity.DefaultAzureCredentialBuilder; +import com.azure.security.keyvault.secrets.SecretClient; +import com.azure.security.keyvault.secrets.models.KeyVaultSecret; +import com.azure.security.keyvault.secrets.SecretClientBuilder; + +public class App { + + public static void main(String[] args) { + + System.out.println("Connect to Azure SQL and demo Create, Read, Update and Delete operations."); + + // Get the key vault secret + // + System.out.println("Fetching Secret from Key Vault."); + SecretClient secretClient = new SecretClientBuilder() + .vaultUrl("https://your_keyvault_name.vault.azure.net/") + .credential(new DefaultAzureCredentialBuilder().build()) + .buildClient(); + KeyVaultSecret secret = secretClient.getSecret("AppSecret"); + System.out.println("Secret Fetched."); + + // Update the connection information below + String connectionUrl = "jdbc:sqlserver://your_server.database.windows.net;databaseName=your_db;user=your_user;password=" + secret.getValue(); + + try { + // Load Azure SQL JDBC driver and establish connection. + System.out.print("Connecting to Azure SQL ... "); + try (Connection connection = DriverManager.getConnection(connectionUrl)) { + System.out.println("Done."); + + // Delete the Employees table if it exists + try (Statement statement = connection.createStatement()) { + statement.executeUpdate("Drop table if exists Employees"); + System.out.println("Done."); + } catch (Exception e) { + System.out.println(); + e.printStackTrace(); + } + + // Create a Table and insert some sample data + System.out.print("Creating sample table with data, press ENTER to continue..."); + System.in.read(); + String sql = new StringBuilder().append("CREATE TABLE Employees ( ") + .append(" Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, ").append(" Name NVARCHAR(50), ") + .append(" Location NVARCHAR(50) ").append("); ") + .append("INSERT INTO Employees (Name, Location) VALUES ").append("(N'Jared', N'Australia'), ") + .append("(N'Nikita', N'India'), ").append("(N'Tom', N'Germany'); ").toString(); + try (Statement statement = connection.createStatement()) { + statement.executeUpdate(sql); + System.out.println("Done."); + } + + // INSERT demo + System.out.print("Inserting a new row into table, press ENTER to continue..."); + System.in.read(); + sql = new StringBuilder().append("INSERT Employees (Name, Location) ").append("VALUES (?, ?);") + .toString(); + try (PreparedStatement statement = connection.prepareStatement(sql)) { + statement.setString(1, "Jake"); + statement.setString(2, "United States"); + int rowsAffected = statement.executeUpdate(); + System.out.println(rowsAffected + " row(s) inserted"); + } + + // UPDATE demo + String userToUpdate = "Nikita"; + System.out.print("Updating 'Location' for user '" + userToUpdate + "', press ENTER to continue..."); + System.in.read(); + sql = "UPDATE Employees SET Location = N'United States' WHERE Name = ?"; + try (PreparedStatement statement = connection.prepareStatement(sql)) { + statement.setString(1, userToUpdate); + int rowsAffected = statement.executeUpdate(); + System.out.println(rowsAffected + " row(s) updated"); + } + + // DELETE demo + String userToDelete = "Jared"; + System.out.print("Deleting user '" + userToDelete + "', press ENTER to continue..."); + System.in.read(); + sql = "DELETE FROM Employees WHERE Name = ?;"; + try (PreparedStatement statement = connection.prepareStatement(sql)) { + statement.setString(1, userToDelete); + int rowsAffected = statement.executeUpdate(); + System.out.println(rowsAffected + " row(s) deleted"); + } + + // READ demo + System.out.print("Reading data from table, press ENTER to continue..."); + System.in.read(); + sql = "SELECT Id, Name, Location FROM Employees;"; + try (Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery(sql)) { + while (resultSet.next()) { + System.out.println( + resultSet.getInt(1) + " " + resultSet.getString(2) + " " + resultSet.getString(3)); + } + } + connection.close(); + System.out.println("All done."); + } + } catch (Exception e) { + System.out.println(); + e.printStackTrace(); + } + finally { + + try (Connection connection = DriverManager.getConnection(connectionUrl)){ + // Delete the Employees table if it exists + Statement statement = connection.createStatement(); + statement.executeUpdate("Drop table if exists Employees"); + System.out.println("Table cleaned up."); + } catch (Exception e) { + System.out.println(); + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlSample/pom.xml b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlSample/pom.xml new file mode 100644 index 00000000..eaae13db --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/AzureSqlSample/pom.xml @@ -0,0 +1,99 @@ + + + + 4.0.0 + + com.sqlsamples + AzureSqlSample + 1.0.0 + + AzureSqlSample + + + UTF-8 + 1.8 + 1.8 + + + + + junit + junit + 4.11 + test + + + com.microsoft.sqlserver + mssql-jdbc + 7.0.0.jre8 + + + com.azure + azure-security-keyvault-secrets + 4.0.1 + + + + com.azure + azure-security-keyvault-keys + 4.0.0 + + + com.azure + azure-identity + 1.0.4 + + + org.slf4j + slf4j-jdk14 + 1.7.25 + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/Readme.md b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/Readme.md new file mode 100644 index 00000000..602463c7 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/java/Windows/Readme.md @@ -0,0 +1,11 @@ +## Sample details + +Please visit the [Java on Windows tutorial](https://www.microsoft.com/en-us/sql-server/developer-get-started/java/windows/az) to run through the sample in full with more detail. + + + +The scripts and this guide are provided as samples. They are not part of any Azure service and are not covered by any SLA or other Azure-related agreements. They are provided as-is with no warranties express or implied. Microsoft takes no responsibility for the use of the scripts or the accuracy of this document. Familiarize yourself with the scripts before using them. +## Related Links + +For more information, see these articles: +* To see more getting started tutorials, visit our [tutorials page](https://www.microsoft.com/en-us/sql-server/developer-get-started/) diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Readme.md b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Readme.md new file mode 100644 index 00000000..c151703a --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Readme.md @@ -0,0 +1,15 @@ +--- +page_type: sample +languages: +- nodejs +products: +- azure-sql-database +--- + +# Developing applications with NodeJs and Azure SQL + +Pick a platform below to get started: +* [unix-based (Includes macOS, RHEL, Ubuntu, SLES](https://github.com/Microsoft/sql-server-samples/tree/master/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Unix-based) +* [Windows](https://github.com/Microsoft/sql-server-samples/tree/master/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Windows) + +Please visit our [getting started tutorials](https://www.microsoft.com/en-us/sql-server/developer-get-started/) diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Unix-based/AzureSqlColumnstoreSample/columnstore.js b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Unix-based/AzureSqlColumnstoreSample/columnstore.js new file mode 100644 index 00000000..41443a07 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Unix-based/AzureSqlColumnstoreSample/columnstore.js @@ -0,0 +1,99 @@ +var Connection = require('tedious').Connection; +var Request = require('tedious').Request; +var uuid = require('node-uuid'); +var async = require('async'); +const KeyVaultSecrets = require("@azure/keyvault-secrets"); +const Identity = require("@azure/identity"); + +var password; +var conn; + +async function GetSecret(){ + console.log("Getting secret..."); + // DefaultAzureCredential expects the following three environment variables: + // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory + // - AZURE_CLIENT_ID: The application (client) ID registered in the AAD tenant + // - AZURE_CLIENT_SECRET: The client secret for the registered application + const credential = new Identity.DefaultAzureCredential(); + + const vaultName = process.env["KEY_VAULT_NAME"] || "your_keyvault_name"; + const url = `https://${vaultName}.vault.azure.net`; + + const client = new KeyVaultSecrets.SecretClient(url, credential); + + try { + secret = await client.getSecret('AppSecret').then((secret) => { + password = secret.value; + }); + } + catch (error) { + console.log("Error connecting to key vault: " + error); + } +} + +async function GetConnection(){ + var config = { + server: 'your_server.database.windows.net', // update me + authentication: { + type: 'default', + options: { + userName: 'your_user', // update me + password: password // will be retrieved + } + }, + options: { + encrypt: true, + trustServerCertificate: true, + database: 'your_database' // update me + } + }; + + conn = new Connection(config); + conn.connect(); +} + +function exec(sql) { + var timerName = "QueryTime"; + + var request = new Request(sql, function(err) { + if (err) { + console.log(err); + } + }); + request.on('doneProc', function(rowCount, more, rows) { + if(!more){ + console.timeEnd(timerName); + } + }); + request.on('row', function(columns) { + columns.forEach(function(column) { + console.log("Sum: " + column.value); + }); + }); + console.time(timerName); + conn.execSql(request); +} + +async function Main() { + + await GetSecret(); + await GetConnection(); + + console.log("Got connection"); + + conn.on('connect', function(err) { + if (err) { + console.log(err); + } else { + console.log('Connected'); + + // Execute all functions in the array serially + async.waterfall([ + function(){ + exec('SELECT SUM(Price) FROM Table_with_3M_rows');}, + ]); + }}); + +} + +Main(); \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Unix-based/AzureSqlSample/connect.js b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Unix-based/AzureSqlSample/connect.js new file mode 100644 index 00000000..4d3673c1 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Unix-based/AzureSqlSample/connect.js @@ -0,0 +1,32 @@ +var Connection = require('tedious').Connection; + var Request = require('tedious').Request; + var TYPES = require('tedious').TYPES; + + // Create connection to database + var config = { + server: 'your_server.database.windows.net', // update me + authentication: { + type: 'default', + options: { + userName: 'your_user', // update me + password: 'your_password' // update me + } + }, + options: { + trustServerCertificate: true, + encrypt: true, + database: 'your_database' // update me + + } + } + var connection = new Connection(config); + connection.connect(); + + // Attempt to connect and execute queries if connection goes through + connection.on('connect', function(err) { + if (err) { + console.log(err); + } else { + console.log('Connected'); + } + }); \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Unix-based/AzureSqlSample/crud.js b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Unix-based/AzureSqlSample/crud.js new file mode 100644 index 00000000..963be1e7 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Unix-based/AzureSqlSample/crud.js @@ -0,0 +1,150 @@ +var Connection = require('tedious').Connection; +var Request = require('tedious').Request; +var TYPES = require('tedious').TYPES; +var async = require('async'); + +// Create connection to database +var config = { + server: 'your_server.database.windows.net', // update me + authentication: { + type: 'default', + options: { + userName: 'your_user', // update me + password: 'your_password' // update me + } + }, + options: { + encrypt: true, + database: 'your_database', // update me + trustServerCertificate: true, + encrypt: true + } +} + +var connection = new Connection(config); +connection.connect(); + +function Start(callback) { + console.log('Starting...'); + callback(null, 'Jake', 'United States'); +} + +function Insert(name, location, callback) { + console.log("Inserting '" + name + "' into Table..."); + + request = new Request( + 'INSERT INTO TestSchema.Employees (Name, Location) OUTPUT INSERTED.Id VALUES (@Name, @Location);', + function(err, rowCount, rows) { + if (err) { + callback(err); + } else { + console.log(rowCount + ' row(s) inserted'); + callback(null, 'Nikita', 'United States'); + } + }); + request.addParameter('Name', TYPES.NVarChar, name); + request.addParameter('Location', TYPES.NVarChar, location); + + // Execute SQL statement + connection.execSql(request); +} + +function Update(name, location, callback) { + console.log("Updating Location to '" + location + "' for '" + name + "'..."); + + // Update the employee record requested + request = new Request( + 'UPDATE TestSchema.Employees SET Location=@Location WHERE Name = @Name;', + function(err, rowCount, rows) { + if (err) { + callback(err); + } else { + console.log(rowCount + ' row(s) updated'); + callback(null, 'Jared'); + } + }); + request.addParameter('Name', TYPES.NVarChar, name); + request.addParameter('Location', TYPES.NVarChar, location); + + // Execute SQL statement + connection.execSql(request); +} + +function Delete(name, callback) { + console.log("Deleting '" + name + "' from Table..."); + + // Delete the employee record requested + request = new Request( + 'DELETE FROM TestSchema.Employees WHERE Name = @Name;', + function(err, rowCount, rows) { + if (err) { + callback(err); + } else { + console.log(rowCount + ' row(s) deleted'); + callback(null); + } + }); + request.addParameter('Name', TYPES.NVarChar, name); + + // Execute SQL statement + connection.execSql(request); +} + +function Read(callback) { + console.log('Reading rows from the Table...'); + + // Read all rows from table + request = new Request( + 'SELECT Id, Name, Location FROM TestSchema.Employees;', + function(err, rowCount, rows) { + if (err) { + callback(err); + } else { + console.log(rowCount + ' row(s) returned'); + callback(null); + } + }); + + // Print the rows read + var result = ""; + request.on('row', function(columns) { + columns.forEach(function(column) { + if (column.value === null) { + console.log('NULL'); + } else { + result += column.value + " "; + } + }); + console.log(result); + result = ""; + }); + + // Execute SQL statement + connection.execSql(request); +} + +function Complete(err, result) { + if (err) { + callback(err); + } else { + console.log("Done!"); + } +} + +// Attempt to connect and execute queries if connection goes through +connection.on('connect', function(err) { + if (err) { + console.log(err); + } else { + console.log('Connected'); + + // Execute all functions in the array serially + async.waterfall([ + Start, + Insert, + Update, + Delete, + Read + ], Complete) + } +}); \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Unix-based/AzureSqlSample/crud_KeyVault.js b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Unix-based/AzureSqlSample/crud_KeyVault.js new file mode 100644 index 00000000..e293b6a2 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Unix-based/AzureSqlSample/crud_KeyVault.js @@ -0,0 +1,193 @@ +var Connection = require('tedious').Connection; +var Request = require('tedious').Request; +var TYPES = require('tedious').TYPES; +var async = require('async'); +const KeyVaultSecrets = require("@azure/keyvault-secrets"); +const Identity = require("@azure/identity"); + +var pwd; +var connection; + +async function GetSecret(){ + console.log("Getting secret..."); + // DefaultAzureCredential expects the following three environment variables: + // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory + // - AZURE_CLIENT_ID: The application (client) ID registered in the AAD tenant + // - AZURE_CLIENT_SECRET: The client secret for the registered application + const credential = new Identity.DefaultAzureCredential(); + + console.log("got default cred"); + + const vaultName = process.env["KEY_VAULT_NAME"] || "your_keyvault_name"; + const url = `https://${vaultName}.vault.azure.net`; + + const client = new KeyVaultSecrets.SecretClient(url, credential); + + try { + secret = await client.getSecret('AppSecret').then((secret) => { + pwd = secret.value + }); + } + catch (error) { + console.log("Error connecting to key vault: " + error); + } +} + +async function GetConnection(){ + + // Create connection to database + var config = { + server: 'your_server.database.windows.net', // update me + authentication: { + type: 'default', + options: { + userName: 'your_user', // update me + password: pwd // fetched from key vault + } + }, + options: { + database: 'your_database', // update me + trustServerCertificate: true, + encrypt: true + } + } + connection = new Connection(config); + await connection.connect(); + console.log("Connected"); + +} + +function Start(callback) { + console.log('Starting...'); + callback(null, 'Jake', 'United States'); +} + +function Insert(name, location, callback) { + console.log("Inserting '" + name + "' into Table..."); + + request = new Request( + 'INSERT INTO TestSchema.Employees (Name, Location) OUTPUT INSERTED.Id VALUES (@Name, @Location);', + function(err, rowCount, rows) { + if (err) { + callback(err); + } else { + console.log(rowCount + ' row(s) inserted'); + callback(null, 'Nikita', 'United States'); + } + }); + request.addParameter('Name', TYPES.NVarChar, name); + request.addParameter('Location', TYPES.NVarChar, location); + + // Execute SQL statement + connection.execSql(request); +} + +function Update(name, location, callback) { + console.log("Updating Location to '" + location + "' for '" + name + "'..."); + + // Update the employee record requested + request = new Request( + 'UPDATE TestSchema.Employees SET Location=@Location WHERE Name = @Name;', + function(err, rowCount, rows) { + if (err) { + callback(err); + } else { + console.log(rowCount + ' row(s) updated'); + callback(null, 'Jared'); + } + }); + request.addParameter('Name', TYPES.NVarChar, name); + request.addParameter('Location', TYPES.NVarChar, location); + + // Execute SQL statement + connection.execSql(request); +} + +function Delete(name, callback) { + console.log("Deleting '" + name + "' from Table..."); + + // Delete the employee record requested + request = new Request( + 'DELETE FROM TestSchema.Employees WHERE Name = @Name;', + function(err, rowCount, rows) { + if (err) { + callback(err); + } else { + console.log(rowCount + ' row(s) deleted'); + callback(null); + } + }); + request.addParameter('Name', TYPES.NVarChar, name); + + // Execute SQL statement + connection.execSql(request); +} + +function Read(callback) { + console.log('Reading rows from the Table...'); + + // Read all rows from table + request = new Request( + 'SELECT Id, Name, Location FROM TestSchema.Employees;', + function(err, rowCount, rows) { + if (err) { + callback(err); + } else { + console.log(rowCount + ' row(s) returned'); + callback(null); + } + }); + + // Print the rows read + var result = ""; + request.on('row', function(columns) { + columns.forEach(function(column) { + if (column.value === null) { + console.log('NULL'); + } else { + result += column.value + " "; + } + }); + console.log(result); + result = ""; + }); + + // Execute SQL statement + connection.execSql(request); +} + +function Complete(err, result) { + if (err) { + throw err; + } else { + console.log("Done!"); + } +} + + +async function Main() { + +// Attempt to connect and execute queries if connection goes through + console.log('Starting'); + + await GetSecret(); + await GetConnection(); + + connection.on('connect', function(err) { + if (err) { + console.log(err); + } else { + console.log('Connected'); + + // Execute all functions in the array serially + async.waterfall([ + Start, + Insert, + Update, + Delete, + Read + ], Complete); + }}); +} + +Main(); \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Unix-based/AzureSqlSequelizeSample/orm.js b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Unix-based/AzureSqlSequelizeSample/orm.js new file mode 100644 index 00000000..81c9f5d7 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Unix-based/AzureSqlSequelizeSample/orm.js @@ -0,0 +1,147 @@ + var Sequelize = require('sequelize'); + const KeyVaultSecrets = require("@azure/keyvault-secrets"); + const Identity = require("@azure/identity"); + + + var userName = 'your_user'; // update me + var password = 'fetch_from_key_vault'; // fetched from key vault + var hostName = 'your_server.database.windows.net'; // update me + var sampleDbName = 'your_database'; //update me + + +async function GetSecret(){ + console.log("Getting secret..."); + // DefaultAzureCredential expects the following three environment variables: + // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory + // - AZURE_CLIENT_ID: The application (client) ID registered in the AAD tenant + // - AZURE_CLIENT_SECRET: The client secret for the registered application + const credential = new Identity.DefaultAzureCredential(); + + console.log("got default cred"); + + const vaultName = process.env["KEY_VAULT_NAME"] || "your_key_vault_name"; + const url = `https://${vaultName}.vault.azure.net`; + + console.log("connecting to vault: " + vaultName + " at: " + url); + + const client = new KeyVaultSecrets.SecretClient(url, credential); + + try { + secret = await client.getSecret('AppSecret').then((secret) => { + password = secret.value + }); + } + catch (error) { + console.log("Error connecting to key vault: "+ error); + } +} + +async function Main() { + +// Attempt to connect and execute queries if connection goes through + console.log('Starting'); + + await GetSecret(); + + // Initialize Sequelize to connect to sample DB + var sampleDb = new Sequelize(sampleDbName, userName, password, { + dialect: 'mssql', + host: hostName, + port: 1433, // Default port + logging: false, // disable logging; default: console.log, + encrypt: true, + + dialectOptions: { + requestTimeout: 30000 // timeout = 30 seconds + } + }); + + // Define the 'User' model + var User = sampleDb.define('user', { + firstName: Sequelize.STRING, + lastName: Sequelize.STRING + }); + + // Define the 'Task' model + var Task = sampleDb.define('task', { + title: Sequelize.STRING, + dueDate: Sequelize.DATE, + isComplete: Sequelize.BOOLEAN + }); + + // Model a 1:Many relationship between User and Task + User.hasMany(Task); + + console.log('**Node CRUD sample with Sequelize and MSSQL **'); + + // Tell Sequelize to DROP and CREATE tables and relationships in the database + sampleDb.sync({force: true}) + .then(function() { + console.log('\nCreated database schema from model.'); + + // Create demo: Create a User instance and save it to the database + User.create({firstName: 'Anna', lastName: 'Shrestinian'}) + .then(function(user) { + console.log('\nCreated User:', user.get({ plain: true})); + + // Create demo: Create a Task instance and save it to the database + Task.create({ + title: 'Ship Helsinki', dueDate: new Date(2017,04,01), isComplete: false + }) + .then(function(task) { + console.log('\nCreated Task:', task.get({ plain: true})); + + // Association demo: Assign task to user + user.setTasks([task]) + .then(function() { + console.log('\nAssigned task \'' + + task.title + + '\' to user ' + user.firstName + + ' ' + user.lastName); + + // Read demo: find incomplete tasks assigned to user 'Anna'' + User.findAll({ + where: { firstName: 'Anna'}, + include: [{ + model: Task, + where: { isComplete: false } + }] + }) + .then(function(users) { + console.log('\nIncomplete tasks assigned to Anna:\n', + JSON.stringify(users)); + + // Update demo: change the 'dueDate' of a task + Task.findByPk(1).then(function(task) { + console.log('\nUpdating task:', + task.title + ' ' + task.dueDate); + task.update({ + dueDate: new Date(2016,06,30) + }) + .then(function() { + console.log('dueDate changed:', + task.title + ' ' + task.dueDate); + + // Delete demo: delete all tasks with a dueDate in 2016 + console.log('\nDeleting all tasks with with a dueDate in 2016'); + Task.destroy({ + where: { dueDate: {[Sequelize.Op.lte]: new Date(2016,12,31)}}, + }).then(function() { // delete this line and the below, and corresponding closing braces and see what happens. + Task.findAll() + .then(function(tasks) { + console.log('Tasks in database after delete:', + JSON.stringify(tasks)); + console.log('\nAll done!'); + }) + + }) + }) + }) + }) + }) + }) + }) + }) +} + +Main(); \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Unix-based/Readme.md b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Unix-based/Readme.md new file mode 100644 index 00000000..4a64a9fc --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Unix-based/Readme.md @@ -0,0 +1,11 @@ +## Sample details + +Please visit the [NodeJs tutorials](https://www.microsoft.com/en-us/sql-server/developer-get-started) and select RHEL, Ubuntu, SLES, or macOs to run through the sample in full with more detail. + + + +The scripts and this guide are provided as samples. They are not part of any Azure service and are not covered by any SLA or other Azure-related agreements. They are provided as-is with no warranties express or implied. Microsoft takes no responsibility for the use of the scripts or the accuracy of this document. Familiarize yourself with the scripts before using them. +## Related Links + +For more information, see these articles: +* To see more getting started tutorials, visit our [tutorials page](https://www.microsoft.com/en-us/sql-server/developer-get-started/) diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Windows/AzureSqlColumnstoreSample/columnstore.js b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Windows/AzureSqlColumnstoreSample/columnstore.js new file mode 100644 index 00000000..8bf28bf9 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Windows/AzureSqlColumnstoreSample/columnstore.js @@ -0,0 +1,101 @@ +var Connection = require('tedious').Connection; +var Request = require('tedious').Request; +var uuid = require('node-uuid'); +var async = require('async'); +const KeyVaultSecrets = require("@azure/keyvault-secrets"); +const Identity = require("@azure/identity"); + +var password; +var conn; + +async function GetSecret(){ + console.log("Getting secret..."); + // DefaultAzureCredential expects the following three environment variables: + // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory + // - AZURE_CLIENT_ID: The application (client) ID registered in the AAD tenant + // - AZURE_CLIENT_SECRET: The client secret for the registered application + const credential = new Identity.DefaultAzureCredential(); + + const vaultName = process.env["KEY_VAULT_NAME"] || "your_keyvault_name"; + const url = `https://${vaultName}.vault.azure.net`; + + console.log("connecting to vault: " + vaultName + " at: " + url); + + const client = new KeyVaultSecrets.SecretClient(url, credential); + + try { + secret = await client.getSecret('AppSecret').then((secret) => { + password = secret.value; + }); + } + catch (error) { + console.log("Error connecting to key vault: " + error); + } +} + +async function GetConnection(){ + var config = { + server: 'your_server.database.windows.net', // update me + authentication: { + type: 'default', + options: { + userName: 'your_user', // update me + password: password // will be retrieved + } + }, + options: { + encrypt: true, + trustServerCertificate: true, + database: 'your_database' // update me + } + }; + + conn = new Connection(config); + conn.connect(); +} + +function exec(sql) { + var timerName = "QueryTime"; + + var request = new Request(sql, function(err) { + if (err) { + console.log(err); + } + }); + request.on('doneProc', function(rowCount, more, rows) { + if(!more){ + console.timeEnd(timerName); + } + }); + request.on('row', function(columns) { + columns.forEach(function(column) { + console.log("Sum: " + column.value); + }); + }); + console.time(timerName); + conn.execSql(request); +} + +async function Main() { + + await GetSecret(); + await GetConnection(); + + console.log("Got connection"); + + conn.on('connect', function(err) { + if (err) { + console.log(err); + } else { + console.log('Connected'); + + // Execute all functions in the array serially + async.waterfall([ + function(){ + exec('SELECT SUM(Price) FROM Table_with_3M_rows');}, + ]); + }}); + +} + +Main(); \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Windows/AzureSqlSample/connect.js b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Windows/AzureSqlSample/connect.js new file mode 100644 index 00000000..04190829 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Windows/AzureSqlSample/connect.js @@ -0,0 +1,31 @@ + var Connection = require('tedious').Connection; + var Request = require('tedious').Request; + var TYPES = require('tedious').TYPES; + + // Create connection to database + var config = { + server: 'your_server.database.windows.net', // update me + authentication: { + type: 'default', + options: { + userName: 'your_user', // update me + password: 'your_password' // update me + } + }, + options: { + database: 'your_database', // update me + trustServerCertificate: true, + encrypt: true + } + } + var connection = new Connection(config); + connection.connect(); + + // Attempt to connect and execute queries if connection goes through + connection.on('connect', function(err) { + if (err) { + console.log(err); + } else { + console.log('Connected'); + } + }); \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Windows/AzureSqlSample/crud.js b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Windows/AzureSqlSample/crud.js new file mode 100644 index 00000000..e4b08e2c --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Windows/AzureSqlSample/crud.js @@ -0,0 +1,147 @@ +var Connection = require('tedious').Connection; +var Request = require('tedious').Request; +var TYPES = require('tedious').TYPES; +var async = require('async'); + +// Create connection to database +var config = { + server: 'your_server.database.windows.net', + authentication: { + type: 'default', + options: { + userName: 'your_user', + password: 'your_password' + } + }, + options: { + database: 'your_database', + trustServerCertificate: true + } +} +var connection = new Connection(config); +connection.connect(); + +function Start(callback) { + console.log('Starting...'); + callback(null, 'Jake', 'United States'); +} + +function Insert(name, location, callback) { + console.log("Inserting '" + name + "' into Table..."); + + request = new Request( + 'INSERT INTO TestSchema.Employees (Name, Location) OUTPUT INSERTED.Id VALUES (@Name, @Location);', + function(err, rowCount, rows) { + if (err) { + callback(err); + } else { + console.log(rowCount + ' row(s) inserted'); + callback(null, 'Nikita', 'United States'); + } + }); + request.addParameter('Name', TYPES.NVarChar, name); + request.addParameter('Location', TYPES.NVarChar, location); + + // Execute SQL statement + connection.execSql(request); +} + +function Update(name, location, callback) { + console.log("Updating Location to '" + location + "' for '" + name + "'..."); + + // Update the employee record requested + request = new Request( + 'UPDATE TestSchema.Employees SET Location=@Location WHERE Name = @Name;', + function(err, rowCount, rows) { + if (err) { + callback(err); + } else { + console.log(rowCount + ' row(s) updated'); + callback(null, 'Jared'); + } + }); + request.addParameter('Name', TYPES.NVarChar, name); + request.addParameter('Location', TYPES.NVarChar, location); + + // Execute SQL statement + connection.execSql(request); +} + +function Delete(name, callback) { + console.log("Deleting '" + name + "' from Table..."); + + // Delete the employee record requested + request = new Request( + 'DELETE FROM TestSchema.Employees WHERE Name = @Name;', + function(err, rowCount, rows) { + if (err) { + callback(err); + } else { + console.log(rowCount + ' row(s) deleted'); + callback(null); + } + }); + request.addParameter('Name', TYPES.NVarChar, name); + + // Execute SQL statement + connection.execSql(request); +} + +function Read(callback) { + console.log('Reading rows from the Table...'); + + // Read all rows from table + request = new Request( + 'SELECT Id, Name, Location FROM TestSchema.Employees;', + function(err, rowCount, rows) { + if (err) { + callback(err); + } else { + console.log(rowCount + ' row(s) returned'); + callback(null); + } + }); + + // Print the rows read + var result = ""; + request.on('row', function(columns) { + columns.forEach(function(column) { + if (column.value === null) { + console.log('NULL'); + } else { + result += column.value + " "; + } + }); + console.log(result); + result = ""; + }); + + // Execute SQL statement + connection.execSql(request); +} + +function Complete(err, result) { + if (err) { + callback(err); + } else { + console.log("Done!"); + } +} + +// Attempt to connect and execute queries if connection goes through +connection.on('connect', function(err) { + if (err) { + console.log(err); + } else { + console.log('Connected'); + + // Execute all functions in the array serially + async.waterfall([ + Start, + Insert, + Update, + Delete, + Read + ], Complete) + } +}); \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Windows/AzureSqlSample/crud_KeyVault.js b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Windows/AzureSqlSample/crud_KeyVault.js new file mode 100644 index 00000000..af51b086 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Windows/AzureSqlSample/crud_KeyVault.js @@ -0,0 +1,192 @@ +var Connection = require('tedious').Connection; +var Request = require('tedious').Request; +var TYPES = require('tedious').TYPES; +var async = require('async'); +const KeyVaultSecrets = require("@azure/keyvault-secrets"); +const Identity = require("@azure/identity"); + +var pwd; +var connection; + +async function GetSecret(){ + console.log("Getting secret..."); + // DefaultAzureCredential expects the following three environment variables: + // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory + // - AZURE_CLIENT_ID: The application (client) ID registered in the AAD tenant + // - AZURE_CLIENT_SECRET: The client secret for the registered application + const credential = new Identity.DefaultAzureCredential(); + + console.log("got default cred"); + + const vaultName = process.env["KEY_VAULT_NAME"] || "your_keyvault_name"; + const url = `https://${vaultName}.vault.azure.net`; + + const client = new KeyVaultSecrets.SecretClient(url, credential); + + try { + secret = await client.getSecret('AppSecret').then((secret) => { + pwd = secret.value + }); + } + catch (error) { + console.log("Error connecting to key vault: " + error); + } +} + +async function GetConnection(){ + + // Create connection to database + var config = { + server: 'your_server.database.windows.net', // update me + authentication: { + type: 'default', + options: { + userName: 'your_user', // update me + password: pwd // fetched from key vault + } + }, + options: { + database: 'your_database', // update me + trustServerCertificate: true, + encrypt: true + } + } + connection = new Connection(config); + await connection.connect(); + console.log("Connected"); +} + +function Start(callback) { + console.log('Starting...'); + callback(null, 'Jake', 'United States'); +} + +function Insert(name, location, callback) { + console.log("Inserting '" + name + "' into Table..."); + + request = new Request( + 'INSERT INTO TestSchema.Employees (Name, Location) OUTPUT INSERTED.Id VALUES (@Name, @Location);', + function(err, rowCount, rows) { + if (err) { + callback(err); + } else { + console.log(rowCount + ' row(s) inserted'); + callback(null, 'Nikita', 'United States'); + } + }); + request.addParameter('Name', TYPES.NVarChar, name); + request.addParameter('Location', TYPES.NVarChar, location); + + // Execute SQL statement + connection.execSql(request); +} + +function Update(name, location, callback) { + console.log("Updating Location to '" + location + "' for '" + name + "'..."); + + // Update the employee record requested + request = new Request( + 'UPDATE TestSchema.Employees SET Location=@Location WHERE Name = @Name;', + function(err, rowCount, rows) { + if (err) { + callback(err); + } else { + console.log(rowCount + ' row(s) updated'); + callback(null, 'Jared'); + } + }); + request.addParameter('Name', TYPES.NVarChar, name); + request.addParameter('Location', TYPES.NVarChar, location); + + // Execute SQL statement + connection.execSql(request); +} + +function Delete(name, callback) { + console.log("Deleting '" + name + "' from Table..."); + + // Delete the employee record requested + request = new Request( + 'DELETE FROM TestSchema.Employees WHERE Name = @Name;', + function(err, rowCount, rows) { + if (err) { + callback(err); + } else { + console.log(rowCount + ' row(s) deleted'); + callback(null); + } + }); + request.addParameter('Name', TYPES.NVarChar, name); + + // Execute SQL statement + connection.execSql(request); +} + +function Read(callback) { + console.log('Reading rows from the Table...'); + + // Read all rows from table + request = new Request( + 'SELECT Id, Name, Location FROM TestSchema.Employees;', + function(err, rowCount, rows) { + if (err) { + callback(err); + } else { + console.log(rowCount + ' row(s) returned'); + callback(null); + } + }); + + // Print the rows read + var result = ""; + request.on('row', function(columns) { + columns.forEach(function(column) { + if (column.value === null) { + console.log('NULL'); + } else { + result += column.value + " "; + } + }); + console.log(result); + result = ""; + }); + + // Execute SQL statement + connection.execSql(request); +} + +function Complete(err, result) { + if (err) { + throw err; + } else { + console.log("Done!"); + } +} + + +async function Main() { + +// Attempt to connect and execute queries if connection goes through + console.log('Starting'); + + await GetSecret(); + await GetConnection(); + + connection.on('connect', function(err) { + if (err) { + console.log(err); + } else { + console.log('Connected'); + + // Execute all functions in the array serially + async.waterfall([ + Start, + Insert, + Update, + Delete, + Read + ], Complete); + }}); +} + +Main(); \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Windows/AzureSqlSequelizeSample/orm.js b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Windows/AzureSqlSequelizeSample/orm.js new file mode 100644 index 00000000..314b74ca --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Windows/AzureSqlSequelizeSample/orm.js @@ -0,0 +1,147 @@ +var Sequelize = require('sequelize'); + const KeyVaultSecrets = require("@azure/keyvault-secrets"); + const Identity = require("@azure/identity"); + + + var userName = 'your_user'; // update me + var password = 'fetch_from_key_vault'; // fetched from key vault + var hostName = 'your_server.database.windows.net'; // update me + var sampleDbName = 'your_database'; //update me + + +async function GetSecret(){ + console.log("Getting secret..."); + // DefaultAzureCredential expects the following three environment variables: + // - AZURE_TENANT_ID: The tenant ID in Azure Active Directory + // - AZURE_CLIENT_ID: The application (client) ID registered in the AAD tenant + // - AZURE_CLIENT_SECRET: The client secret for the registered application + const credential = new Identity.DefaultAzureCredential(); + + console.log("got default cred"); + + const vaultName = process.env["KEYVAULT_NAME"] || "your_key_vault_name"; + const url = `https://${vaultName}.vault.azure.net`; + + console.log("connecting to vault: " + vaultName + " at: " + url); + + const client = new KeyVaultSecrets.SecretClient(url, credential); + + try { + secret = await client.getSecret('AppSecret').then((secret) => { + password = secret.value + }); + } + catch (error) { + console.log("Error connecting to key vault: "+ err); + } +} + +async function Main() { + +// Attempt to connect and execute queries if connection goes through + console.log('Starting'); + + await GetSecret(); + + // Initialize Sequelize to connect to sample DB + var sampleDb = new Sequelize(sampleDbName, userName, password, { + dialect: 'mssql', + host: hostName, + port: 1433, // Default port + logging: false, // disable logging; default: console.log, + encrypt: true, + + dialectOptions: { + requestTimeout: 30000 // timeout = 30 seconds + } + }); + + // Define the 'User' model + var User = sampleDb.define('user', { + firstName: Sequelize.STRING, + lastName: Sequelize.STRING + }); + + // Define the 'Task' model + var Task = sampleDb.define('task', { + title: Sequelize.STRING, + dueDate: Sequelize.DATE, + isComplete: Sequelize.BOOLEAN + }); + + // Model a 1:Many relationship between User and Task + User.hasMany(Task); + + console.log('**Node CRUD sample with Sequelize and MSSQL **'); + + // Tell Sequelize to DROP and CREATE tables and relationships in the database + sampleDb.sync({force: true}) + .then(function() { + console.log('\nCreated database schema from model.'); + + // Create demo: Create a User instance and save it to the database + User.create({firstName: 'Anna', lastName: 'Shrestinian'}) + .then(function(user) { + console.log('\nCreated User:', user.get({ plain: true})); + + // Create demo: Create a Task instance and save it to the database + Task.create({ + title: 'Ship Helsinki', dueDate: new Date(2017,04,01), isComplete: false + }) + .then(function(task) { + console.log('\nCreated Task:', task.get({ plain: true})); + + // Association demo: Assign task to user + user.setTasks([task]) + .then(function() { + console.log('\nAssigned task \'' + + task.title + + '\' to user ' + user.firstName + + ' ' + user.lastName); + + // Read demo: find incomplete tasks assigned to user 'Anna'' + User.findAll({ + where: { firstName: 'Anna'}, + include: [{ + model: Task, + where: { isComplete: false } + }] + }) + .then(function(users) { + console.log('\nIncomplete tasks assigned to Anna:\n', + JSON.stringify(users)); + + // Update demo: change the 'dueDate' of a task + Task.findByPk(1).then(function(task) { + console.log('\nUpdating task:', + task.title + ' ' + task.dueDate); + task.update({ + dueDate: new Date(2016,06,30) + }) + .then(function() { + console.log('dueDate changed:', + task.title + ' ' + task.dueDate); + + // Delete demo: delete all tasks with a dueDate in 2016 + console.log('\nDeleting all tasks with with a dueDate in 2016'); + Task.destroy({ + where: { dueDate: {[Sequelize.Op.lte]: new Date(2016,12,31)}}, + }).then(function() { // delete this line and the below, and corresponding closing braces and see what happens. + Task.findAll() + .then(function(tasks) { + console.log('Tasks in database after delete:', + JSON.stringify(tasks)); + console.log('\nAll done!'); + }) + + }) + }) + }) + }) + }) + }) + }) + }) +} + +Main(); \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Windows/Readme.md b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Windows/Readme.md new file mode 100644 index 00000000..b0ef2663 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/nodejs/Windows/Readme.md @@ -0,0 +1,11 @@ +## Sample details + +Please visit the [NodeJs on Windows tutorial](https://www.microsoft.com/en-us/sql-server/developer-get-started/node/windows/az) to run through the sample in full with more detail. + + + +The scripts and this guide are provided as samples. They are not part of any Azure service and are not covered by any SLA or other Azure-related agreements. They are provided as-is with no warranties express or implied. Microsoft takes no responsibility for the use of the scripts or the accuracy of this document. Familiarize yourself with the scripts before using them. +## Related Links + +For more information, see these articles: +* To see more getting started tutorials, visit our [tutorials page](https://www.microsoft.com/en-us/sql-server/developer-get-started/) diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/php/Readme.md b/samples/tutorials/AzureSqlGettingStartedSamples/php/Readme.md new file mode 100644 index 00000000..0104aa82 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/php/Readme.md @@ -0,0 +1,15 @@ +--- +page_type: sample +languages: +- php +products: +- azure-sql-database +--- + +# Developing applications with PHP and Azure SQL + +Pick a platform below to get started: +* [unix-based (Includes macOS, RHEL, Ubuntu, SLES](https://github.com/Microsoft/sql-server-samples/tree/master/samples/tutorials/AzureSqlGettingStartedSamples/php/Unix-based) +* [Windows](https://github.com/Microsoft/sql-server-samples/tree/master/samples/tutorials/AzureSqlGettingStartedSamples/php/Windows) + +Please visit our [getting started tutorials](https://www.microsoft.com/en-us/sql-server/developer-get-started/) diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/php/Unix-based/AzureSqlColumnstoreSample/columnstore.php b/samples/tutorials/AzureSqlGettingStartedSamples/php/Unix-based/AzureSqlColumnstoreSample/columnstore.php new file mode 100644 index 00000000..1114502f --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/php/Unix-based/AzureSqlColumnstoreSample/columnstore.php @@ -0,0 +1,41 @@ + "your_database", + "Uid" => "your_user", + "PWD" => "your_password" +); +//Establishes the connection +$conn = sqlsrv_connect($serverName, $connectionOptions); + +//Read Query +$tsql= "SELECT SUM(Price) as sum FROM Table_with_3M_rows"; +$getResults= sqlsrv_query($conn, $tsql); +echo ("Sum: "); +if ($getResults == FALSE) + die(FormatErrors(sqlsrv_errors())); +while ($row = sqlsrv_fetch_array($getResults, SQLSRV_FETCH_ASSOC)) { + echo ($row['sum'] . PHP_EOL); + +} +sqlsrv_free_stmt($getResults); + +function FormatErrors( $errors ) +{ + /* Display errors. */ + echo "Error information: "; + + foreach ( $errors as $error ) + { + echo "SQLSTATE: ".$error['SQLSTATE'].""; + echo "Code: ".$error['code'].""; + echo "Message: ".$error['message'].""; + } +} +$time_end = microtime(true); +$execution_time = round((($time_end - $time_start)*1000),2); +echo 'QueryTime: '.$execution_time.' ms'; + +?> \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/php/Unix-based/AzureSqlSample/connect.php b/samples/tutorials/AzureSqlGettingStartedSamples/php/Unix-based/AzureSqlSample/connect.php new file mode 100644 index 00000000..020a011c --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/php/Unix-based/AzureSqlSample/connect.php @@ -0,0 +1,12 @@ + "your_database", + "Uid" => "your_user", + "PWD" => "your_password" + ); + //Establishes the connection + $conn = sqlsrv_connect($serverName, $connectionOptions); + if($conn) + echo "Connected!" +?> \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/php/Unix-based/AzureSqlSample/crud.php b/samples/tutorials/AzureSqlGettingStartedSamples/php/Unix-based/AzureSqlSample/crud.php new file mode 100644 index 00000000..c53e9c66 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/php/Unix-based/AzureSqlSample/crud.php @@ -0,0 +1,74 @@ + "your_database", + "Uid" => "your_user", + "PWD" => "your_password" +); +//Establishes the connection +$conn = sqlsrv_connect($serverName, $connectionOptions); + +//Insert Query +echo ("Inserting a new row into table" . PHP_EOL); +$tsql= "INSERT INTO TestSchema.Employees (Name, Location) VALUES (?,?);"; +$params = array('Jake','United States'); +$getResults= sqlsrv_query($conn, $tsql, $params); +$rowsAffected = sqlsrv_rows_affected($getResults); +if ($getResults == FALSE or $rowsAffected == FALSE) + die(FormatErrors(sqlsrv_errors())); +echo ($rowsAffected. " row(s) inserted: " . PHP_EOL); + +sqlsrv_free_stmt($getResults); + +//Update Query + +$userToUpdate = 'Nikita'; +$tsql= "UPDATE TestSchema.Employees SET Location = ? WHERE Name = ?"; +$params = array('Sweden', $userToUpdate); +echo("Updating Location for user " . $userToUpdate . PHP_EOL); + +$getResults= sqlsrv_query($conn, $tsql, $params); +$rowsAffected = sqlsrv_rows_affected($getResults); +if ($getResults == FALSE or $rowsAffected == FALSE) + die(FormatErrors(sqlsrv_errors())); +echo ($rowsAffected. " row(s) updated: " . PHP_EOL); +sqlsrv_free_stmt($getResults); + +//Delete Query +$userToDelete = 'Jared'; +$tsql= "DELETE FROM TestSchema.Employees WHERE Name = ?"; +$params = array($userToDelete); +$getResults= sqlsrv_query($conn, $tsql, $params); +echo("Deleting user " . $userToDelete . PHP_EOL); +$rowsAffected = sqlsrv_rows_affected($getResults); +if ($getResults == FALSE or $rowsAffected == FALSE) + die(FormatErrors(sqlsrv_errors())); +echo ($rowsAffected. " row(s) deleted: " . PHP_EOL); +sqlsrv_free_stmt($getResults); + + +//Read Query +$tsql= "SELECT Id, Name, Location FROM TestSchema.Employees;"; +$getResults= sqlsrv_query($conn, $tsql); +echo ("Reading data from table" . PHP_EOL); +if ($getResults == FALSE) + die(FormatErrors(sqlsrv_errors())); +while ($row = sqlsrv_fetch_array($getResults, SQLSRV_FETCH_ASSOC)) { + echo ($row['Id'] . " " . $row['Name'] . " " . $row['Location'] . PHP_EOL); + +} +sqlsrv_free_stmt($getResults); + +function FormatErrors( $errors ) +{ + /* Display errors. */ + echo "Error information: "; + + foreach ( $errors as $error ) + { + echo "SQLSTATE: ".$error['SQLSTATE'].""; + echo "Code: ".$error['code'].""; + echo "Message: ".$error['message'].""; + } +} +?> \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/php/Unix-based/Readme.md b/samples/tutorials/AzureSqlGettingStartedSamples/php/Unix-based/Readme.md new file mode 100644 index 00000000..c29f0ff8 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/php/Unix-based/Readme.md @@ -0,0 +1,11 @@ +## Sample details + +Please visit the [PHP tutorials](https://www.microsoft.com/en-us/sql-server/developer-get-started) and select RHEL, Ubuntu, SLES, or macOs to run through the sample in full with more detail. + + + +The scripts and this guide are provided as samples. They are not part of any Azure service and are not covered by any SLA or other Azure-related agreements. They are provided as-is with no warranties express or implied. Microsoft takes no responsibility for the use of the scripts or the accuracy of this document. Familiarize yourself with the scripts before using them. +## Related Links + +For more information, see these articles: +* To see more getting started tutorials, visit our [tutorials page](https://www.microsoft.com/en-us/sql-server/developer-get-started/) diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/php/Windows/AzureSqlColumnstoreSample/columnstore.php b/samples/tutorials/AzureSqlGettingStartedSamples/php/Windows/AzureSqlColumnstoreSample/columnstore.php new file mode 100644 index 00000000..eb194e06 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/php/Windows/AzureSqlColumnstoreSample/columnstore.php @@ -0,0 +1,42 @@ + "your_database", + "Uid" => "your_user", + "PWD" => "your_password" +); +//Establishes the connection +$conn = sqlsrv_connect($serverName, $connectionOptions); + +//Read Query +$tsql= "SELECT SUM(Price) as sum FROM Table_with_3M_rows"; +$getResults= sqlsrv_query($conn, $tsql); +echo ("Sum: "); +if ($getResults == FALSE) + die(FormatErrors(sqlsrv_errors())); +while ($row = sqlsrv_fetch_array($getResults, SQLSRV_FETCH_ASSOC)) { + echo ($row['sum'] . PHP_EOL); + +} +sqlsrv_free_stmt($getResults); + +function FormatErrors( $errors ) +{ + /* Display errors. */ + echo "Error information: "; + + foreach ( $errors as $error ) + { + echo "SQLSTATE: ".$error['SQLSTATE'].""; + echo "Code: ".$error['code'].""; + echo "Message: ".$error['message'].""; + } +} +$time_end = microtime(true); +$execution_time = round((($time_end - $time_start)*1000),2); +echo 'QueryTime: '.$execution_time.' ms'; + + +?> \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/php/Windows/AzureSqlSample/connect.php b/samples/tutorials/AzureSqlGettingStartedSamples/php/Windows/AzureSqlSample/connect.php new file mode 100644 index 00000000..020a011c --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/php/Windows/AzureSqlSample/connect.php @@ -0,0 +1,12 @@ + "your_database", + "Uid" => "your_user", + "PWD" => "your_password" + ); + //Establishes the connection + $conn = sqlsrv_connect($serverName, $connectionOptions); + if($conn) + echo "Connected!" +?> \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/php/Windows/AzureSqlSample/crud.php b/samples/tutorials/AzureSqlGettingStartedSamples/php/Windows/AzureSqlSample/crud.php new file mode 100644 index 00000000..2f28f000 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/php/Windows/AzureSqlSample/crud.php @@ -0,0 +1,74 @@ + "your_database", + "Uid" => "your_user", + "PWD" => "your_password" +); + +//Establishes the connection +$conn = sqlsrv_connect($serverName, $connectionOptions); + +//Insert Query +echo ("Inserting a new row into table" . PHP_EOL); +$tsql= "INSERT INTO TestSchema.Employees (Name, Location) VALUES (?,?);"; +$params = array('Jake','United States'); +$getResults= sqlsrv_query($conn, $tsql, $params); +$rowsAffected = sqlsrv_rows_affected($getResults); +if ($getResults == FALSE or $rowsAffected == FALSE) + die(FormatErrors(sqlsrv_errors())); +echo ($rowsAffected. " row(s) inserted: " . PHP_EOL); + +sqlsrv_free_stmt($getResults); + +//Update Query + +$userToUpdate = 'Nikita'; +$tsql= "UPDATE TestSchema.Employees SET Location = ? WHERE Name = ?"; +$params = array('Sweden', $userToUpdate); +echo("Updating Location for user " . $userToUpdate . PHP_EOL); + +$getResults= sqlsrv_query($conn, $tsql, $params); +$rowsAffected = sqlsrv_rows_affected($getResults); +if ($getResults == FALSE or $rowsAffected == FALSE) + die(FormatErrors(sqlsrv_errors())); +echo ($rowsAffected. " row(s) updated: " . PHP_EOL); +sqlsrv_free_stmt($getResults); + +//Delete Query +$userToDelete = 'Jared'; +$tsql= "DELETE FROM TestSchema.Employees WHERE Name = ?"; +$params = array($userToDelete); +$getResults= sqlsrv_query($conn, $tsql, $params); +echo("Deleting user " . $userToDelete . PHP_EOL); +$rowsAffected = sqlsrv_rows_affected($getResults); +if ($getResults == FALSE or $rowsAffected == FALSE) + die(FormatErrors(sqlsrv_errors())); +echo ($rowsAffected. " row(s) deleted: " . PHP_EOL); +sqlsrv_free_stmt($getResults); + + +//Read Query +$tsql= "SELECT Id, Name, Location FROM TestSchema.Employees;"; +$getResults= sqlsrv_query($conn, $tsql); +echo ("Reading data from table" . PHP_EOL); +if ($getResults == FALSE) + die(FormatErrors(sqlsrv_errors())); +while ($row = sqlsrv_fetch_array($getResults, SQLSRV_FETCH_ASSOC)) { + echo ($row['Id'] . " " . $row['Name'] . " " . $row['Location'] . PHP_EOL); +} +sqlsrv_free_stmt($getResults); + +function FormatErrors( $errors ) +{ + /* Display errors. */ + echo "Error information: "; + + foreach ( $errors as $error ) + { + echo "SQLSTATE: ".$error['SQLSTATE'].""; + echo "Code: ".$error['code'].""; + echo "Message: ".$error['message'].""; + } +} +?> \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/php/Windows/Readme.md b/samples/tutorials/AzureSqlGettingStartedSamples/php/Windows/Readme.md new file mode 100644 index 00000000..c1e82330 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/php/Windows/Readme.md @@ -0,0 +1,11 @@ +## Sample details + +Please visit the [PHP on Windows tutorial](https://www.microsoft.com/en-us/sql-server/developer-get-started/php/windows/az) to run through the sample in full with more detail. + + + +The scripts and this guide are provided as samples. They are not part of any Azure service and are not covered by any SLA or other Azure-related agreements. They are provided as-is with no warranties express or implied. Microsoft takes no responsibility for the use of the scripts or the accuracy of this document. Familiarize yourself with the scripts before using them. +## Related Links + +For more information, see these articles: +* To see more getting started tutorials, visit our [tutorials page](https://www.microsoft.com/en-us/sql-server/developer-get-started/) diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/python/Readme.md b/samples/tutorials/AzureSqlGettingStartedSamples/python/Readme.md new file mode 100644 index 00000000..fcadb21e --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/python/Readme.md @@ -0,0 +1,15 @@ +--- +page_type: sample +languages: +- ruby +products: +- azure-sql-database +--- + +# Developing applications with Python and Azure SQL + +Pick a platform below to get started: +* [unix-based (Includes macOS, RHEL, Ubuntu, SLES](https://github.com/Microsoft/sql-server-samples/tree/master/samples/tutorials/AzureSqlGettingStartedSamples/python/Unix-based) +* [Windows](https://github.com/Microsoft/sql-server-samples/tree/master/samples/tutorials/AzureSqlGettingStartedSamples/python/Windows) + +Please visit our [getting started tutorials](https://www.microsoft.com/en-us/sql-server/developer-get-started/) diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/python/Unix-based/AzureSqlColumnstoreSample/columnstore.py b/samples/tutorials/AzureSqlGettingStartedSamples/python/Unix-based/AzureSqlColumnstoreSample/columnstore.py new file mode 100644 index 00000000..216b5eb8 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/python/Unix-based/AzureSqlColumnstoreSample/columnstore.py @@ -0,0 +1,29 @@ +import pyodbc +import datetime +server = 'your_server.database.windows.net' +database = 'your_database' +username = 'your_user' + + +from azure.identity import DefaultAzureCredential +from azure.keyvault.secrets import SecretClient + +credential = DefaultAzureCredential() + +secret_client = SecretClient(vault_url="https://.vault.azure.net", credential=credential) + +# NOTE: please replace the ("") with the name of the secret in your vault +secret = secret_client.get_secret("AppSecret") + +password = secret.value + +cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password) +cursor = cnxn.cursor() +tsql = "SELECT SUM(Price) as sum FROM Table_with_3M_rows" +a = datetime.datetime.now() +with cursor.execute(tsql): + b = datetime.datetime.now() + c = b - a + for row in cursor: + print ('Sum:', str(row[0])) + print ('QueryTime:', c.microseconds, 'ms') \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/python/Unix-based/AzureSqlSample/crud.py b/samples/tutorials/AzureSqlGettingStartedSamples/python/Unix-based/AzureSqlSample/crud.py new file mode 100644 index 00000000..002692c7 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/python/Unix-based/AzureSqlSample/crud.py @@ -0,0 +1,37 @@ +import pyodbc +server = 'your_server.database.windows.net' +database = 'your_database' +username = 'your_user' +password = 'your_password' +cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password) +cursor = cnxn.cursor() + +print ('Inserting a new row into table') +#Insert Query +tsql = "INSERT INTO Employees (Name, Location) VALUES (?,?);" +with cursor.execute(tsql,'Jake','United States'): + print ('Successfully Inserted!') + + +#Update Query +print ('Updating Location for Nikita') +tsql = "UPDATE Employees SET Location = ? WHERE Name = ?" +with cursor.execute(tsql,'Sweden','Nikita'): + print ('Successfully Updated!') + + +#Delete Query +print ('Deleting user Jared') +tsql = "DELETE FROM Employees WHERE Name = ?" +with cursor.execute(tsql,'Jared'): + print ('Successfully Deleted!') + + +#Select Query +print ('Reading data from table') +tsql = "SELECT Name, Location FROM Employees;" +with cursor.execute(tsql): + row = cursor.fetchone() + while row: + print (str(row[0]) + " " + str(row[1])) + row = cursor.fetchone() \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/python/Unix-based/AzureSqlSample/crud_KeyVault.py b/samples/tutorials/AzureSqlGettingStartedSamples/python/Unix-based/AzureSqlSample/crud_KeyVault.py new file mode 100644 index 00000000..1291a8d9 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/python/Unix-based/AzureSqlSample/crud_KeyVault.py @@ -0,0 +1,50 @@ +import pyodbc +server = 'your_server.database.windows.net' +database = 'your_database' +username = 'your_user' + +from azure.identity import DefaultAzureCredential +from azure.keyvault.secrets import SecretClient + +credential = DefaultAzureCredential() + +secret_client = SecretClient(vault_url="https://.vault.azure.net", credential=credential) + +# NOTE: please replace the ("") with the name of the secret in your vault +secret = secret_client.get_secret("AppSecret") + +password = secret.value + +cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password) +cursor = cnxn.cursor() + + +print ('Inserting a new row into table') +#Insert Query +tsql = "INSERT INTO Employees (Name, Location) VALUES (?,?);" +with cursor.execute(tsql,'Jake','United States'): + print ('Successfully Inserted!') + + +#Update Query +print ('Updating Location for Nikita') +tsql = "UPDATE Employees SET Location = ? WHERE Name = ?" +with cursor.execute(tsql,'Sweden','Nikita'): + print ('Successfully Updated!') + + +#Delete Query +print ('Deleting user Jared') +tsql = "DELETE FROM Employees WHERE Name = ?" +with cursor.execute(tsql,'Jared'): + print ('Successfully Deleted!') + + +#Select Query +print ('Reading data from table') +tsql = "SELECT Name, Location FROM Employees;" +with cursor.execute(tsql): + row = cursor.fetchone() + while row: + print (str(row[0]) + " " + str(row[1])) + row = cursor.fetchone() \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/python/Unix-based/Readme.md b/samples/tutorials/AzureSqlGettingStartedSamples/python/Unix-based/Readme.md new file mode 100644 index 00000000..1b73b75d --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/python/Unix-based/Readme.md @@ -0,0 +1,11 @@ +## Sample details + +Please visit the [Python tutorials](https://www.microsoft.com/en-us/sql-server/developer-get-started) and select RHEL, Ubuntu, SLES, or macOs to run through the sample in full with more detail. + + + +The scripts and this guide are provided as samples. They are not part of any Azure service and are not covered by any SLA or other Azure-related agreements. They are provided as-is with no warranties express or implied. Microsoft takes no responsibility for the use of the scripts or the accuracy of this document. Familiarize yourself with the scripts before using them. +## Related Links + +For more information, see these articles: +* To see more getting started tutorials, visit our [tutorials page](https://www.microsoft.com/en-us/sql-server/developer-get-started/) diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/python/Windows/AzureSqlColumnstoreSample/columnstore.py b/samples/tutorials/AzureSqlGettingStartedSamples/python/Windows/AzureSqlColumnstoreSample/columnstore.py new file mode 100644 index 00000000..216b5eb8 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/python/Windows/AzureSqlColumnstoreSample/columnstore.py @@ -0,0 +1,29 @@ +import pyodbc +import datetime +server = 'your_server.database.windows.net' +database = 'your_database' +username = 'your_user' + + +from azure.identity import DefaultAzureCredential +from azure.keyvault.secrets import SecretClient + +credential = DefaultAzureCredential() + +secret_client = SecretClient(vault_url="https://.vault.azure.net", credential=credential) + +# NOTE: please replace the ("") with the name of the secret in your vault +secret = secret_client.get_secret("AppSecret") + +password = secret.value + +cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password) +cursor = cnxn.cursor() +tsql = "SELECT SUM(Price) as sum FROM Table_with_3M_rows" +a = datetime.datetime.now() +with cursor.execute(tsql): + b = datetime.datetime.now() + c = b - a + for row in cursor: + print ('Sum:', str(row[0])) + print ('QueryTime:', c.microseconds, 'ms') \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/python/Windows/AzureSqlSample/crud.py b/samples/tutorials/AzureSqlGettingStartedSamples/python/Windows/AzureSqlSample/crud.py new file mode 100644 index 00000000..64ee1082 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/python/Windows/AzureSqlSample/crud.py @@ -0,0 +1,37 @@ +import pyodbc +server = 'your_server.database.windows.net' +database = 'your_database' +username = 'your_user' +password = 'your_password' +cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password) +cursor = cnxn.cursor() + +print ('Inserting a new row into table') +#Insert Query +tsql = "INSERT INTO Employees (Name, Location) VALUES (?,?);" +with cursor.execute(tsql,'Jake','United States'): + print ('Successfully Inserted!') + + +#Update Query +print ('Updating Location for Nikita') +tsql = "UPDATE Employees SET Location = ? WHERE Name = ?" +with cursor.execute(tsql,'Sweden','Nikita'): + print ('Successfully Updated!') + + +#Delete Query +print ('Deleting user Jared') +tsql = "DELETE FROM Employees WHERE Name = ?" +with cursor.execute(tsql,'Jared'): + print ('Successfully Deleted!') + + +#Select Query +print ('Reading data from table') +tsql = "SELECT Name, Location FROM Employees;" +with cursor.execute(tsql): + row = cursor.fetchone() + while row: + print (str(row[0]) + " " + str(row[1])) + row = cursor.fetchone() \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/python/Windows/AzureSqlSample/crud_KeyVault.py b/samples/tutorials/AzureSqlGettingStartedSamples/python/Windows/AzureSqlSample/crud_KeyVault.py new file mode 100644 index 00000000..1291a8d9 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/python/Windows/AzureSqlSample/crud_KeyVault.py @@ -0,0 +1,50 @@ +import pyodbc +server = 'your_server.database.windows.net' +database = 'your_database' +username = 'your_user' + +from azure.identity import DefaultAzureCredential +from azure.keyvault.secrets import SecretClient + +credential = DefaultAzureCredential() + +secret_client = SecretClient(vault_url="https://.vault.azure.net", credential=credential) + +# NOTE: please replace the ("") with the name of the secret in your vault +secret = secret_client.get_secret("AppSecret") + +password = secret.value + +cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password) +cursor = cnxn.cursor() + + +print ('Inserting a new row into table') +#Insert Query +tsql = "INSERT INTO Employees (Name, Location) VALUES (?,?);" +with cursor.execute(tsql,'Jake','United States'): + print ('Successfully Inserted!') + + +#Update Query +print ('Updating Location for Nikita') +tsql = "UPDATE Employees SET Location = ? WHERE Name = ?" +with cursor.execute(tsql,'Sweden','Nikita'): + print ('Successfully Updated!') + + +#Delete Query +print ('Deleting user Jared') +tsql = "DELETE FROM Employees WHERE Name = ?" +with cursor.execute(tsql,'Jared'): + print ('Successfully Deleted!') + + +#Select Query +print ('Reading data from table') +tsql = "SELECT Name, Location FROM Employees;" +with cursor.execute(tsql): + row = cursor.fetchone() + while row: + print (str(row[0]) + " " + str(row[1])) + row = cursor.fetchone() \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/python/Windows/Readme.md b/samples/tutorials/AzureSqlGettingStartedSamples/python/Windows/Readme.md new file mode 100644 index 00000000..f12820ae --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/python/Windows/Readme.md @@ -0,0 +1,11 @@ +## Sample details + +Please visit the [Python on Windows tutorial](https://www.microsoft.com/en-us/sql-server/developer-get-started/php/windows/az) to run through the sample in full with more detail. + + + +The scripts and this guide are provided as samples. They are not part of any Azure service and are not covered by any SLA or other Azure-related agreements. They are provided as-is with no warranties express or implied. Microsoft takes no responsibility for the use of the scripts or the accuracy of this document. Familiarize yourself with the scripts before using them. +## Related Links + +For more information, see these articles: +* To see more getting started tutorials, visit our [tutorials page](https://www.microsoft.com/en-us/sql-server/developer-get-started/) diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/ruby/AzureSqlColumnstoreSample/columnstore.rb b/samples/tutorials/AzureSqlGettingStartedSamples/ruby/AzureSqlColumnstoreSample/columnstore.rb new file mode 100644 index 00000000..f4e5b0fe --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/ruby/AzureSqlColumnstoreSample/columnstore.rb @@ -0,0 +1,53 @@ +require 'tiny_tds' +@client = TinyTds::Client.new username: 'your_user@your_server', password: 'your_password', + dataserver: 'your_server.database.windows.net', database: 'your_database', azure: true, timeout: 600 + + +# Calculate time difference in milliseconds +def time_diff_milli(start, finish) + ((finish - start) * 1000).floor +end + +def execute(sql) + @client.execute(sql).do + true +end + +# Ensure the table doesn't already exist. +puts "Drop the table if it exists" +execute("Drop table if exists Table_with_3M_rows") + +# Insert 3 million rows into the table 'Table_with_3M_rows' +puts "Inserting 3 million rows into table 'Table_with_3M_rows'. This takes ~1 minute, please wait." +execute("WITH a AS (SELECT * FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) AS a(a)) + SELECT TOP(3000000) + ROW_NUMBER() OVER (ORDER BY a.a) AS OrderItemId + ,a.a + b.a + c.a + d.a + e.a + f.a + g.a + h.a AS OrderId + ,a.a * 10 AS Price + ,CONCAT(a.a, N' ', b.a, N' ', c.a, N' ', d.a, N' ', e.a, N' ', f.a, N' ', g.a, N' ', h.a) AS ProductName + INTO Table_with_3M_rows + FROM a, a AS b, a AS c, a AS d, a AS e, a AS f, a AS g, a AS h;") + +# Execute query without columnstore index +t1 = Time.now +execute("SELECT SUM(Price) as sum FROM Table_with_3M_rows") +t2 = Time.now +elapsedTimeWithoutIndex = time_diff_milli t1, t2 +puts "Query time without columnstore index: #{elapsedTimeWithoutIndex}ms" + +# Create columnnstore index on table 'Table_with_3M_rows' +puts("Adding a columnstore index to table 'Table_with_3M_rows'") +execute("CREATE CLUSTERED COLUMNSTORE INDEX columnstoreindex ON Table_with_3M_rows;") + +# Execute the same query with columnstore index +t3 = Time.now +execute("SELECT SUM(Price) as sum FROM Table_with_3M_rows") +t4 = Time.now +elapsedTimeWithIndex = time_diff_milli t3, t4 +puts "Query time WITH columnstore index: #{elapsedTimeWithIndex}ms" + +# Calculate performance improvement with columnstore index +perf_improvement = (elapsedTimeWithoutIndex / elapsedTimeWithIndex).floor +puts "Performance improvement with columnstore index: #{perf_improvement}x!" + +@client.close \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/ruby/AzureSqlSample/activerecordcrud.rb b/samples/tutorials/AzureSqlGettingStartedSamples/ruby/AzureSqlSample/activerecordcrud.rb new file mode 100644 index 00000000..d73eb2c0 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/ruby/AzureSqlSample/activerecordcrud.rb @@ -0,0 +1,56 @@ +require 'active_record' +require 'tiny_tds' +require 'activerecord-sqlserver-adapter' +require 'pp' + +ActiveRecord::Base.establish_connection( + :adapter=> "sqlserver", + :host => "localhost", + :username => "sa", + :password => "your_password" +) + +#Create new database SampleDB +puts "Drop and create new database 'SampleDB'" +ActiveRecord::Base.connection.drop_database('SampleDB') rescue nil +ActiveRecord::Base.connection.create_database('SampleDB') +ActiveRecord::Base.connection.use_database('SampleDB') + +#Create a new table called Tasks +ActiveRecord::Schema.define do + create_table :tasks, force: true do |t| + t.string :taskname + t.string :user + t.date :duedate + end +end + +class Task < ActiveRecord::Base +end + +#Create new tasks and users +Task.create!(taskname:'Install SQL Server 2017 on Windows', user:'Andrea', duedate: '2017-07-01') +Task.create!(taskname:'Upgrade from SQL Server 2014 to 2017', user:'Meet', duedate: '2017-07-01') +Task.create!(taskname:'Write new SQL Server content', user:'Luis', duedate: '2017-07-01') +pp "Created new tasks:" +pp Task.all + +#Update due date for specific task +task_to_update = Task.where(taskname: 'Install SQL Server 2017 on Windows').where(user: 'Andrea').first +puts "Updating the following task:" +pp task_to_update +task_to_update.update_attribute(:duedate, '2017-07-31') +puts "Due date changed:" +pp task_to_update + +#Destroy all tasks for specific user +tasks_to_delete = Task.where(user: 'Meet').first +puts "Deleting all tasks for user:" +pp tasks_to_delete +tasks_to_delete.destroy! + +#Read all tasks +puts "Printing all tasks:" +pp Task.all + +ActiveRecord::Base.connection.close \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/ruby/AzureSqlSample/connect.rb b/samples/tutorials/AzureSqlGettingStartedSamples/ruby/AzureSqlSample/connect.rb new file mode 100644 index 00000000..fc81c276 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/ruby/AzureSqlSample/connect.rb @@ -0,0 +1,9 @@ + require 'tiny_tds' +@client = TinyTds::Client.new username: 'your_user@your_server', password: 'your_password', + dataserver: 'your_server.database.windows.net', database: 'your_database', azure: true + +puts 'Connecting to Azure SQL' + +if @client.active? == true then puts 'Done' end + +@client.close \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/ruby/AzureSqlSample/crud.rb b/samples/tutorials/AzureSqlGettingStartedSamples/ruby/AzureSqlSample/crud.rb new file mode 100644 index 00000000..e3173e74 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/ruby/AzureSqlSample/crud.rb @@ -0,0 +1,45 @@ +require 'tiny_tds' +@client = TinyTds::Client.new username: 'sa', password: 'your_password', + host: 'localhost', port: 1433 +puts 'Connecting to SQL Server' + +if @client.active? == true then puts 'Done' end + +def execute(sql) + result = @client.execute(sql) + result.each + if result.affected_rows > 0 then puts "#{result.affected_rows} row(s) affected" end +end + +# Create database SampleDB +puts "Dropping and creating database 'SampleDB'" +execute("DROP DATABASE IF EXISTS [SampleDB]; CREATE DATABASE [SampleDB];") + +# Create sample table with data +puts "Creating sample table with data" +execute("USE SampleDB; CREATE TABLE Employees (Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, + Name NVARCHAR(50), Location NVARCHAR(50)) + INSERT INTO Employees (Name, Location) VALUES (N'Jared', N'Australia'), + (N'Nikita', N'India'), (N'Tom', N'Germany')") + +# Insert new employee +puts "Inserting new employee Jake into Employees table" +execute("INSERT INTO Employees (Name, Location) VALUES (N'Jake', N'United States')") + +# Update location for employee +puts "Updating Location for Nikita" +execute("UPDATE Employees SET Location = N'United States' WHERE NAME = N'Nikita'") + +# Delete employee +puts "Deleting employee Jared" +execute("DELETE FROM Employees WHERE NAME = N'Jared'") + +# Read all employees +puts "Reading data from table" +@client.execute("SELECT * FROM Employees").each do |row| + puts row +end + +puts "All done." + +@client.close \ No newline at end of file diff --git a/samples/tutorials/AzureSqlGettingStartedSamples/ruby/Readme.md b/samples/tutorials/AzureSqlGettingStartedSamples/ruby/Readme.md new file mode 100644 index 00000000..047225b3 --- /dev/null +++ b/samples/tutorials/AzureSqlGettingStartedSamples/ruby/Readme.md @@ -0,0 +1,12 @@ +--- +page_type: sample +languages: +- ruby +products: +- azure-sql-database +--- + +# Developing applications with Ruby and Azure SQL + + +Please visit our [getting started tutorials](https://www.microsoft.com/en-us/sql-server/developer-get-started/) diff --git a/samples/tutorials/README.md b/samples/tutorials/README.md index e4d025e4..15f0e506 100644 --- a/samples/tutorials/README.md +++ b/samples/tutorials/README.md @@ -12,5 +12,4 @@ Contains samples that show how to connect to Microsoft SQL databases, including * Ruby - - +You can find many Azure-specific samples in the AzureSqlGettingStarted folder. diff --git a/samples/tutorials/c#/README.md b/samples/tutorials/c#/README.md index 6b5a5e6a..92e0e9f9 100644 --- a/samples/tutorials/c#/README.md +++ b/samples/tutorials/c#/README.md @@ -1,3 +1,11 @@ +--- +page_type: sample +languages: +- csharp +products: +- azure-sql-database +--- + # Developing applications with C# and SQL Server Pick a platform below to get started: diff --git a/samples/tutorials/f#/README.md b/samples/tutorials/f#/README.md index daa36dd6..d80ee594 100644 --- a/samples/tutorials/f#/README.md +++ b/samples/tutorials/f#/README.md @@ -1,3 +1,11 @@ +--- +page_type: sample +languages: +- fsharp +products: +- azure-sql-database +--- + # Get started with SQL Server and F# Get started quickly with developing applications in F# on any OS with SQL Server diff --git a/samples/tutorials/go/README.md b/samples/tutorials/go/README.md index 13b186f5..f6f82571 100644 --- a/samples/tutorials/go/README.md +++ b/samples/tutorials/go/README.md @@ -1,3 +1,11 @@ +--- +page_type: sample +languages: +- go +products: +- azure-sql-database +--- + # Set up instructions 1. `go get github.com/denisenkom/go-mssqldb` diff --git a/samples/tutorials/java/README.md b/samples/tutorials/java/README.md index 15b2c175..ee91dd2a 100644 --- a/samples/tutorials/java/README.md +++ b/samples/tutorials/java/README.md @@ -1,3 +1,11 @@ +--- +page_type: sample +languages: +- java +products: +- azure-sql-database +--- + # Developing applications with Java and SQL Server Pick a platform below to get started: diff --git a/samples/tutorials/node.js/README.md b/samples/tutorials/node.js/README.md index 83595486..f7b07960 100644 --- a/samples/tutorials/node.js/README.md +++ b/samples/tutorials/node.js/README.md @@ -1,3 +1,11 @@ +--- +page_type: sample +languages: +- nodejs +products: +- azure-sql-database +--- + # Developing applications with Node.js and SQL Server Pick a platform below to get started: diff --git a/samples/tutorials/php/README.md b/samples/tutorials/php/README.md index b46f012a..cb18fcc5 100644 --- a/samples/tutorials/php/README.md +++ b/samples/tutorials/php/README.md @@ -1,3 +1,11 @@ +--- +page_type: sample +languages: +- php +products: +- azure-sql-database +--- + # Developing applications with php and SQL Server Pick a platform below to get started: diff --git a/samples/tutorials/python/README.md b/samples/tutorials/python/README.md index 6abd5878..c9c3fd67 100644 --- a/samples/tutorials/python/README.md +++ b/samples/tutorials/python/README.md @@ -1,3 +1,11 @@ +--- +page_type: sample +languages: +- python +products: +- azure-sql-database +--- + # Python samples Simple Python applications to connect to Microsoft SQL databases, including SQL Server, Azure SQL Database, and Azure SQL Data Warehouse. Samples for operating systems including Linux, Windows, and macOS. diff --git a/samples/tutorials/ruby/README.md b/samples/tutorials/ruby/README.md index e94aa563..15a24d71 100644 --- a/samples/tutorials/ruby/README.md +++ b/samples/tutorials/ruby/README.md @@ -1,3 +1,12 @@ +--- +page_type: sample +languages: +- ruby +products: +- azure-sql-database +--- + + # Ruby samples Simple Ruby applications to connect to Microsoft SQL databases, including SQL Server, Azure SQL Database, and Azure SQL Data Warehouse. Samples for operating systems including Linux, Windows, and macOS.